@rse/specbook 1.5.2 → 1.6.1
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/LICENSE.txt +201 -0
- package/README.md +288 -43
- package/dst/specbook-api.d.ts +23 -3
- package/dst/specbook-api.js +133 -59
- package/dst/specbook-cli.js +93 -26
- package/dst/specbook-cmd-describe.js +4 -4
- package/dst/specbook-cmd-export-schema.d.ts +8 -0
- package/dst/specbook-cmd-export-schema.js +441 -0
- package/dst/specbook-cmd-export.js +23 -6
- package/dst/specbook-cmd-init-sample.d.ts +4 -0
- package/dst/specbook-cmd-init-sample.js +322 -0
- package/dst/specbook-cmd-init.d.ts +1 -0
- package/dst/specbook-cmd-init.js +42 -10
- package/dst/specbook-cmd-lint.js +46 -48
- package/dst/specbook-cmd-query.d.ts +30 -0
- package/dst/specbook-cmd-query.js +165 -0
- package/dst/specbook-config.d.ts +9 -1
- package/dst/specbook-config.js +135 -10
- package/dst/specbook-coverage.js +2 -2
- package/dst/specbook-diagram.d.ts +7 -5
- package/dst/specbook-diagram.js +546 -143
- package/dst/specbook-export-ast.d.ts +1 -1
- package/dst/specbook-export-ast.js +11 -8
- package/dst/specbook-export-code.js +3 -3
- package/dst/specbook-export-common.d.ts +1 -1
- package/dst/specbook-export-common.js +3 -2
- package/dst/specbook-export-diagram.d.ts +1 -1
- package/dst/specbook-export-diagram.js +25 -7
- package/dst/specbook-export-html-fold.d.ts +16 -6
- package/dst/specbook-export-html-fold.js +65 -44
- package/dst/specbook-export-html-render.js +107 -26
- package/dst/specbook-export-html-search.js +18 -20
- package/dst/specbook-export-html-template.js +38 -9
- package/dst/specbook-export-html-widget.d.ts +2 -0
- package/dst/specbook-export-html-widget.js +219 -19
- package/dst/specbook-export-html.css +208 -38
- package/dst/specbook-export-html.js +96 -53
- package/dst/specbook-export-md.d.ts +2 -1
- package/dst/specbook-export-md.js +7 -8
- package/dst/specbook-export-pdf.js +1 -1
- package/dst/specbook-files.d.ts +2 -0
- package/dst/specbook-files.js +41 -0
- package/dst/specbook-format-meta.yaml +401 -0
- package/dst/specbook-format-pm.yaml +1240 -0
- package/dst/specbook-format-schema.d.ts +33 -3
- package/dst/specbook-format-schema.js +49 -3
- package/dst/specbook-format.md +427 -47
- package/dst/specbook-format.yaml +524 -228
- package/dst/specbook-ignore.js +2 -2
- package/dst/specbook-link.d.ts +4 -0
- package/dst/specbook-link.js +61 -6
- package/dst/specbook-mcp.js +103 -19
- package/dst/specbook-parse-semantic.d.ts +1 -0
- package/dst/specbook-parse-semantic.js +11 -4
- package/dst/specbook-parse-syntax.d.ts +1 -0
- package/dst/specbook-parse-syntax.js +1 -1
- package/dst/specbook-parse.d.ts +1 -1
- package/dst/specbook-parse.js +3 -3
- package/dst/specbook-project.d.ts +2 -0
- package/dst/specbook-project.js +15 -5
- package/dst/specbook-remote.d.ts +28 -0
- package/dst/specbook-remote.js +429 -0
- package/package.json +32 -20
package/dst/specbook-format.yaml
CHANGED
|
@@ -329,13 +329,21 @@
|
|
|
329
329
|
- Evans: Domain-Driven Design: Tackling Complexity in the Heart of Software (2003),
|
|
330
330
|
https://www.domainlanguage.com/ddd/
|
|
331
331
|
diagram:
|
|
332
|
-
type: grid
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
332
|
+
- type: grid
|
|
333
|
+
nodes: "[[TERM:*]]"
|
|
334
|
+
markUncovered: referenced
|
|
335
|
+
properties:
|
|
336
|
+
- TYPE
|
|
337
|
+
config:
|
|
338
|
+
size-node-width-max: 440
|
|
339
|
+
grid-columns-max: 4
|
|
340
|
+
- type: tree
|
|
341
|
+
nodes: "[[TERM:*]]"
|
|
342
|
+
links: []
|
|
343
|
+
onlyConnected: true
|
|
344
|
+
nest:
|
|
345
|
+
properties:
|
|
346
|
+
- BROADER
|
|
339
347
|
children:
|
|
340
348
|
- kind: TERM
|
|
341
349
|
name: "[A-Z][A-Za-z0-9-]*( [A-Z][A-Za-z0-9-]*)*"
|
|
@@ -430,12 +438,22 @@
|
|
|
430
438
|
- Pruitt/Adlin: The Persona Lifecycle: Keeping People in Mind Throughout Product Design (2006),
|
|
431
439
|
https://www.sciencedirect.com/book/9780125662512/the-persona-lifecycle
|
|
432
440
|
diagram:
|
|
433
|
-
type: graph
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
441
|
+
- type: graph
|
|
442
|
+
nodes: "[[ROLE:*]], [[PERSONA:*]]"
|
|
443
|
+
labeled: true
|
|
444
|
+
qualified: true
|
|
445
|
+
markUncovered: referenced
|
|
446
|
+
config:
|
|
447
|
+
size-node-width-max: 440
|
|
448
|
+
- type: tree
|
|
449
|
+
nodes: "[[ROLE:*]]"
|
|
450
|
+
links: []
|
|
451
|
+
onlyConnected: true
|
|
452
|
+
nest:
|
|
453
|
+
properties:
|
|
454
|
+
- INHERITS
|
|
455
|
+
config:
|
|
456
|
+
mark-violation: false
|
|
439
457
|
children:
|
|
440
458
|
- kind: ROLE
|
|
441
459
|
desc: >
|
|
@@ -452,11 +470,18 @@
|
|
|
452
470
|
maxTableColumns: 5
|
|
453
471
|
referenced:
|
|
454
472
|
- "[[*]]"
|
|
473
|
+
badge:
|
|
474
|
+
property: TYPE
|
|
475
|
+
map:
|
|
476
|
+
Person: person
|
|
477
|
+
System: bot
|
|
455
478
|
diagram:
|
|
456
479
|
type: hub
|
|
457
480
|
center: self
|
|
458
481
|
nodes: "[[ROLE:*]], [[TERM:*]], [[PERSONA:*]], [[WORKFLOW:*]], [[ACTIVITY:*]],
|
|
459
|
-
[[USE-CASE:*]], [[TRANSITION:*]], [[CV.ENTITY:*]]"
|
|
482
|
+
[[USE-CASE:*]], [[TRANSITION:*]], [[CV.ENTITY:*]], [[INTERACTION:*]]"
|
|
483
|
+
descend:
|
|
484
|
+
- MESSAGE
|
|
460
485
|
labeled: true
|
|
461
486
|
qualified: true
|
|
462
487
|
config:
|
|
@@ -495,6 +520,11 @@
|
|
|
495
520
|
optional: true
|
|
496
521
|
format:
|
|
497
522
|
maxTableColumns: 5
|
|
523
|
+
badge:
|
|
524
|
+
property: TYPE
|
|
525
|
+
map:
|
|
526
|
+
Stakeholder: team
|
|
527
|
+
default: person
|
|
498
528
|
props:
|
|
499
529
|
- name: TYPE
|
|
500
530
|
desc: >
|
|
@@ -655,16 +685,26 @@
|
|
|
655
685
|
- DSDM: MoSCoW Prioritisation, DSDM Agile Project Framework (2014),
|
|
656
686
|
https://www.agilebusiness.org/dsdm-project-framework/moscow-prioritisation.html
|
|
657
687
|
diagram:
|
|
658
|
-
type: grid
|
|
659
|
-
|
|
660
|
-
|
|
688
|
+
- type: grid
|
|
689
|
+
nodes: "[[FR.REQUIREMENT:*]]"
|
|
690
|
+
markUncovered: referenced
|
|
691
|
+
nest:
|
|
692
|
+
properties:
|
|
693
|
+
- GROUP
|
|
661
694
|
properties:
|
|
662
|
-
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
695
|
+
- PRIORITY
|
|
696
|
+
config:
|
|
697
|
+
size-node-width-max: 440
|
|
698
|
+
grid-columns-max: 2
|
|
699
|
+
- type: matrix
|
|
700
|
+
nodes: "[[FR.REQUIREMENT:*]]"
|
|
701
|
+
links:
|
|
702
|
+
- DEPENDS-ON
|
|
703
|
+
onlyConnected: true
|
|
704
|
+
qualified: true
|
|
705
|
+
nest:
|
|
706
|
+
properties:
|
|
707
|
+
- GROUP
|
|
668
708
|
children:
|
|
669
709
|
- kind: GROUP
|
|
670
710
|
desc: >
|
|
@@ -768,6 +808,7 @@
|
|
|
768
808
|
diagram:
|
|
769
809
|
type: grid
|
|
770
810
|
nodes: "[[NR.REQUIREMENT:*]]"
|
|
811
|
+
markUncovered: referenced
|
|
771
812
|
nest:
|
|
772
813
|
properties:
|
|
773
814
|
- GROUP
|
|
@@ -901,6 +942,7 @@
|
|
|
901
942
|
diagram:
|
|
902
943
|
type: grid
|
|
903
944
|
nodes: "[[RULE:*]]"
|
|
945
|
+
markUncovered: referenced
|
|
904
946
|
properties:
|
|
905
947
|
- CATEGORY
|
|
906
948
|
- SOURCE
|
|
@@ -1360,14 +1402,23 @@
|
|
|
1360
1402
|
- OMG UML 2.5.1: Unified Modeling Language (2017),
|
|
1361
1403
|
https://www.omg.org/spec/UML/2.5.1
|
|
1362
1404
|
diagram:
|
|
1363
|
-
type: graph
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1405
|
+
- type: graph
|
|
1406
|
+
nodes: "[[DM.ENTITY:*]]"
|
|
1407
|
+
edges: "[[RELATION:*]]"
|
|
1408
|
+
nest:
|
|
1409
|
+
properties:
|
|
1410
|
+
- GROUP
|
|
1411
|
+
config:
|
|
1412
|
+
graph-columns-max: 2
|
|
1413
|
+
- type: matrix
|
|
1414
|
+
nodes: "[[DM.ENTITY:*]]"
|
|
1415
|
+
edges: "[[RELATION:*]]"
|
|
1416
|
+
qualified: true
|
|
1417
|
+
nest:
|
|
1418
|
+
properties:
|
|
1419
|
+
- GROUP
|
|
1420
|
+
config:
|
|
1421
|
+
mark-violation: false
|
|
1371
1422
|
children:
|
|
1372
1423
|
- kind: GROUP
|
|
1373
1424
|
name: "[A-Z][a-zA-Z0-9]*"
|
|
@@ -1391,6 +1442,7 @@
|
|
|
1391
1442
|
per-artifact unique name, and described by a 1-sentence description ("what") plus a
|
|
1392
1443
|
1-sentence rationale ("why").
|
|
1393
1444
|
optional: true
|
|
1445
|
+
badge: database
|
|
1394
1446
|
diagram:
|
|
1395
1447
|
type: hub
|
|
1396
1448
|
center: self
|
|
@@ -1567,14 +1619,11 @@
|
|
|
1567
1619
|
initial: INITIAL
|
|
1568
1620
|
final: FINAL
|
|
1569
1621
|
diagram:
|
|
1570
|
-
type:
|
|
1622
|
+
type: state
|
|
1571
1623
|
edges: "[[TRANSITION:*]]"
|
|
1572
1624
|
edgeSource: FROM
|
|
1573
1625
|
edgeTarget: TO
|
|
1574
1626
|
onlyConnected: true
|
|
1575
|
-
properties:
|
|
1576
|
-
- INITIAL
|
|
1577
|
-
- FINAL
|
|
1578
1627
|
config:
|
|
1579
1628
|
size-node-width-max: 440
|
|
1580
1629
|
size-node-height-scale: 1.75
|
|
@@ -1688,6 +1737,9 @@
|
|
|
1688
1737
|
domain rules. The model is closed: an operation not granted to a role is forbidden,
|
|
1689
1738
|
exactly like a move not listed as a state transition.
|
|
1690
1739
|
optional: true
|
|
1740
|
+
coverage:
|
|
1741
|
+
- "[[DM.ENTITY:*]]"
|
|
1742
|
+
- "[[USE-CASE:*]]"
|
|
1691
1743
|
refs: >
|
|
1692
1744
|
- Ferraiolo/Kuhn: Role-Based Access Controls, 15th National Computer Security Conference (1992),
|
|
1693
1745
|
https://csrc.nist.gov/publications/detail/conference-paper/1992/10/13/role-based-access-controls
|
|
@@ -1837,6 +1889,7 @@
|
|
|
1837
1889
|
direction, command) are carried by the `OPERATION` and `LOCATOR` properties of the
|
|
1838
1890
|
endpoints only.
|
|
1839
1891
|
optional: true
|
|
1892
|
+
badge: api
|
|
1840
1893
|
diagram:
|
|
1841
1894
|
type: hub
|
|
1842
1895
|
center: self
|
|
@@ -1901,14 +1954,23 @@
|
|
|
1901
1954
|
- GraphQL Foundation: GraphQL Specification (2021),
|
|
1902
1955
|
https://spec.graphql.org/October2021/
|
|
1903
1956
|
diagram:
|
|
1904
|
-
type: graph
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1957
|
+
- type: graph
|
|
1958
|
+
nodes: "[[TYPE:*]]"
|
|
1959
|
+
deep: true
|
|
1960
|
+
onlyConnected: true
|
|
1961
|
+
labeled: true
|
|
1962
|
+
qualified: true
|
|
1963
|
+
config:
|
|
1964
|
+
size-node-width-max: 440
|
|
1965
|
+
- type: tree
|
|
1966
|
+
nodes: "[[TYPE:*]]"
|
|
1967
|
+
links: []
|
|
1968
|
+
onlyConnected: true
|
|
1969
|
+
nest:
|
|
1970
|
+
properties:
|
|
1971
|
+
- EXTENDS
|
|
1972
|
+
config:
|
|
1973
|
+
mark-violation: false
|
|
1912
1974
|
children:
|
|
1913
1975
|
- kind: TYPE
|
|
1914
1976
|
name: "[A-Z][A-Za-z0-9_]*"
|
|
@@ -2093,6 +2155,7 @@
|
|
|
2093
2155
|
is expressed by a path-style `LOCATOR` (e.g. `remote add`,
|
|
2094
2156
|
`/events/{eventId}/chat`) only.
|
|
2095
2157
|
optional: true
|
|
2158
|
+
badge: api
|
|
2096
2159
|
diagram:
|
|
2097
2160
|
type: hub
|
|
2098
2161
|
center: self
|
|
@@ -2309,6 +2372,7 @@
|
|
|
2309
2372
|
diagram:
|
|
2310
2373
|
type: grid
|
|
2311
2374
|
nodes: "[[IC.PRINCIPLE:*]]"
|
|
2375
|
+
markUncovered: referenced
|
|
2312
2376
|
properties:
|
|
2313
2377
|
- CATEGORY
|
|
2314
2378
|
config:
|
|
@@ -2494,14 +2558,20 @@
|
|
|
2494
2558
|
https://www.oreilly.com/library/view/designing-interfaces-3rd/9781492051954/
|
|
2495
2559
|
optional: true
|
|
2496
2560
|
diagram:
|
|
2497
|
-
type: grid
|
|
2498
|
-
|
|
2499
|
-
|
|
2500
|
-
|
|
2501
|
-
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
|
|
2561
|
+
- type: grid
|
|
2562
|
+
nodes: "[[DIALOG-PATTERN:*]]"
|
|
2563
|
+
properties:
|
|
2564
|
+
- CATEGORY
|
|
2565
|
+
config:
|
|
2566
|
+
size-node-width-max: 440
|
|
2567
|
+
size-node-height-scale: 2
|
|
2568
|
+
grid-columns-max: 4
|
|
2569
|
+
- type: matrix
|
|
2570
|
+
nodes: "[[DIALOG-PATTERN:*]]"
|
|
2571
|
+
links:
|
|
2572
|
+
- USES
|
|
2573
|
+
onlyConnected: true
|
|
2574
|
+
qualified: true
|
|
2505
2575
|
children:
|
|
2506
2576
|
- kind: DIALOG-PATTERN
|
|
2507
2577
|
desc: >
|
|
@@ -2588,6 +2658,8 @@
|
|
|
2588
2658
|
- NN/g: Storyboards Help Visualize UX Ideas (2018),
|
|
2589
2659
|
https://www.nngroup.com/articles/storyboards-visualize-ideas/
|
|
2590
2660
|
optional: true
|
|
2661
|
+
coverage:
|
|
2662
|
+
- "[[USE-CASE:*]]"
|
|
2591
2663
|
diagram:
|
|
2592
2664
|
type: grid
|
|
2593
2665
|
nodes: "[[STORYBOARD:*]]"
|
|
@@ -3074,6 +3146,18 @@
|
|
|
3074
3146
|
format:
|
|
3075
3147
|
type: compact
|
|
3076
3148
|
maxTableColumns: 5
|
|
3149
|
+
diagram:
|
|
3150
|
+
type: hub
|
|
3151
|
+
center: self
|
|
3152
|
+
nodes: "[[CV.ENTITY:*]], [[PREMISE:*]], [[TERM:*]], [[ROLE:*]], [[USE-CASE:*]],
|
|
3153
|
+
[[INTERFACE:*]], [[INTERACTION:*]], [[DECISION:*]]"
|
|
3154
|
+
descend:
|
|
3155
|
+
- MESSAGE
|
|
3156
|
+
labeled: true
|
|
3157
|
+
qualified: true
|
|
3158
|
+
config:
|
|
3159
|
+
size-node-width-max: 440
|
|
3160
|
+
size-node-height-scale: 1.75
|
|
3077
3161
|
props:
|
|
3078
3162
|
- name: KIND
|
|
3079
3163
|
desc: |
|
|
@@ -3163,6 +3247,9 @@
|
|
|
3163
3247
|
interactions, describing *how* the solution's runtime elements are structured and which
|
|
3164
3248
|
responsibility each owns, delivering the behaviors the Functional Requirements state.
|
|
3165
3249
|
optional: true
|
|
3250
|
+
coverage:
|
|
3251
|
+
- "[[FR.REQUIREMENT:*]]"
|
|
3252
|
+
- "[[DM.ENTITY:*]]"
|
|
3166
3253
|
refs: >
|
|
3167
3254
|
- Rozanski/Woods: Software Systems Architecture, 2nd ed.: The Functional Viewpoint (2011),
|
|
3168
3255
|
https://www.viewpoints-and-perspectives.info/home/viewpoints/functional/
|
|
@@ -3171,14 +3258,22 @@
|
|
|
3171
3258
|
- Brown: The C4 Model (2018),
|
|
3172
3259
|
https://c4model.com/
|
|
3173
3260
|
diagram:
|
|
3174
|
-
type: graph
|
|
3175
|
-
|
|
3176
|
-
|
|
3177
|
-
|
|
3261
|
+
- type: graph
|
|
3262
|
+
nodes: "[[FV.COMPONENT:*]]"
|
|
3263
|
+
labeled: true
|
|
3264
|
+
nest:
|
|
3265
|
+
properties:
|
|
3266
|
+
- PART-OF
|
|
3178
3267
|
properties:
|
|
3179
|
-
-
|
|
3180
|
-
|
|
3181
|
-
|
|
3268
|
+
- KIND
|
|
3269
|
+
- type: matrix
|
|
3270
|
+
nodes: "[[FV.COMPONENT:*]]"
|
|
3271
|
+
links:
|
|
3272
|
+
- DEPENDS-ON
|
|
3273
|
+
qualified: true
|
|
3274
|
+
nest:
|
|
3275
|
+
properties:
|
|
3276
|
+
- PART-OF
|
|
3182
3277
|
children:
|
|
3183
3278
|
- kind: COMPONENT
|
|
3184
3279
|
desc: >
|
|
@@ -3193,12 +3288,22 @@
|
|
|
3193
3288
|
format:
|
|
3194
3289
|
type: compact
|
|
3195
3290
|
maxTableColumns: 5
|
|
3291
|
+
badge:
|
|
3292
|
+
property: KIND
|
|
3293
|
+
map:
|
|
3294
|
+
Component: package
|
|
3295
|
+
Service: service
|
|
3296
|
+
Module: code
|
|
3297
|
+
Connector: communication
|
|
3298
|
+
Subsystem: network
|
|
3196
3299
|
diagram:
|
|
3197
3300
|
type: hub
|
|
3198
3301
|
center: self
|
|
3199
|
-
nodes: "[[FV.COMPONENT:*]], [[
|
|
3200
|
-
[[
|
|
3201
|
-
[[DECISION:*]], [[CODE-PATTERN:*]]"
|
|
3302
|
+
nodes: "[[FV.COMPONENT:*]], [[INTERACTION:*]], [[FR.REQUIREMENT:*]], [[PATTERN:*]],
|
|
3303
|
+
[[INTERFACE:*]], [[DM.ENTITY:*]], [[UNIT:*]], [[NODE:*]], [[CONCERN:*]],
|
|
3304
|
+
[[TACTIC:*]], [[DECISION:*]], [[CODE-PATTERN:*]]"
|
|
3305
|
+
descend:
|
|
3306
|
+
- MESSAGE
|
|
3202
3307
|
labeled: true
|
|
3203
3308
|
qualified: true
|
|
3204
3309
|
properties:
|
|
@@ -3257,8 +3362,10 @@
|
|
|
3257
3362
|
desc: >
|
|
3258
3363
|
Comma-separated references to the INTERFACE-MODEL objects the component
|
|
3259
3364
|
provides, i.e. through which other components and external entities
|
|
3260
|
-
interact with it
|
|
3261
|
-
|
|
3365
|
+
interact with it, which are always `Provided` ones, as a `Required`
|
|
3366
|
+
interface is offered by an external entity instead; omitted when the
|
|
3367
|
+
component provides no modeled interface (e.g. a user interface or an
|
|
3368
|
+
internal module).
|
|
3262
3369
|
value: list([[INTERFACE:*]])
|
|
3263
3370
|
optional: true
|
|
3264
3371
|
- name: CONSUMES
|
|
@@ -3279,10 +3386,274 @@
|
|
|
3279
3386
|
value: list([[FV.COMPONENT:*]])
|
|
3280
3387
|
optional: true
|
|
3281
3388
|
|
|
3389
|
+
- kind: ARCH
|
|
3390
|
+
name: Runtime View
|
|
3391
|
+
id: RV
|
|
3392
|
+
file: 26-ARCH-RV-Runtime-View.md
|
|
3393
|
+
desc: >
|
|
3394
|
+
The runtime interactions of the solution: for each significant use case scenario or
|
|
3395
|
+
technical situation, the ordered messages its participants -- roles, Functionality View
|
|
3396
|
+
components, and Context View entities -- exchange, describing *how* the components
|
|
3397
|
+
collaborate at runtime to deliver the behaviors their static structure merely enables.
|
|
3398
|
+
optional: true
|
|
3399
|
+
coverage:
|
|
3400
|
+
- "[[USE-CASE:*]]"
|
|
3401
|
+
- "[[SCENARIO:*]]"
|
|
3402
|
+
refs: >
|
|
3403
|
+
- Starke/Hruschka: arc42 Template: Runtime View (2005),
|
|
3404
|
+
https://docs.arc42.org/section-6/
|
|
3405
|
+
- OMG UML 2.5.1: Unified Modeling Language: Interactions (2017),
|
|
3406
|
+
https://www.omg.org/spec/UML/2.5.1
|
|
3407
|
+
- Brown: The C4 Model: Dynamic Diagram (2018),
|
|
3408
|
+
https://c4model.com/diagrams/dynamic
|
|
3409
|
+
- Kruchten: Architectural Blueprints -- The "4+1" View Model of Software Architecture (1995),
|
|
3410
|
+
https://ieeexplore.ieee.org/document/469759
|
|
3411
|
+
- Rozanski/Woods: Software Systems Architecture, 2nd ed.: The Functional Viewpoint (2011),
|
|
3412
|
+
https://www.viewpoints-and-perspectives.info/home/viewpoints/functional/
|
|
3413
|
+
diagram:
|
|
3414
|
+
type: grid
|
|
3415
|
+
nodes: "[[INTERACTION:*]]"
|
|
3416
|
+
config:
|
|
3417
|
+
size-node-width-max: 440
|
|
3418
|
+
grid-columns-max: 3
|
|
3419
|
+
children:
|
|
3420
|
+
- kind: INTERACTION
|
|
3421
|
+
desc: >
|
|
3422
|
+
A single runtime interaction, named with a short (2-5 word) summary of the
|
|
3423
|
+
situation it shows (e.g. `Ask a Question`, `Login with Token`) and described in a
|
|
3424
|
+
concise (1-3 sentence) paragraph by its trigger and its outcome, plus a 1-sentence
|
|
3425
|
+
rationale ("why") stating what the interaction makes explicit, while its MESSAGE
|
|
3426
|
+
children, in document order, are the messages its participants exchange.
|
|
3427
|
+
optional: true
|
|
3428
|
+
diagram:
|
|
3429
|
+
type: sequence
|
|
3430
|
+
edges: "[[MESSAGE:*]]"
|
|
3431
|
+
local: true
|
|
3432
|
+
edgeSource: FROM
|
|
3433
|
+
edgeTarget: TO
|
|
3434
|
+
edgeKind: KIND
|
|
3435
|
+
edgeDuration: DURATION
|
|
3436
|
+
edgeTime: TIME
|
|
3437
|
+
qualified: true
|
|
3438
|
+
props:
|
|
3439
|
+
- name: REALIZES
|
|
3440
|
+
desc: >
|
|
3441
|
+
Comma-separated references to the USE-CASES objects (use cases or their
|
|
3442
|
+
scenarios) the interaction realizes, tracing the runtime behavior back to
|
|
3443
|
+
the behavior the requirements state; omitted for a purely technical
|
|
3444
|
+
interaction (e.g. a startup or a failover).
|
|
3445
|
+
value: list([[USE-CASE:*]], [[SCENARIO:*]])
|
|
3446
|
+
optional: true
|
|
3447
|
+
children:
|
|
3448
|
+
- kind: MESSAGE
|
|
3449
|
+
desc: >
|
|
3450
|
+
A single message of the interaction, named with a short (1-4 word),
|
|
3451
|
+
per-interaction unique summary of the operation, event, or response it
|
|
3452
|
+
carries (e.g. `submit question`, `question stored`) and described by a
|
|
3453
|
+
1-sentence description of its effect.
|
|
3454
|
+
format:
|
|
3455
|
+
type: concise
|
|
3456
|
+
maxTableColumns: 7
|
|
3457
|
+
withUnusedProps: true
|
|
3458
|
+
props:
|
|
3459
|
+
- name: FROM
|
|
3460
|
+
desc: >
|
|
3461
|
+
Reference to the participant sending the message: a USER-PERSONAS
|
|
3462
|
+
role, a FUNCTIONALITY-VIEW component, or a CONTEXT-VIEW entity.
|
|
3463
|
+
value: list([[ROLE:*]], [[FV.COMPONENT:*]], [[CV.ENTITY:*]])
|
|
3464
|
+
- name: TO
|
|
3465
|
+
desc: >
|
|
3466
|
+
Comma-separated references to the participants receiving the
|
|
3467
|
+
message (several ones yielding one message each): USER-PERSONAS
|
|
3468
|
+
roles, FUNCTIONALITY-VIEW components, or CONTEXT-VIEW entities.
|
|
3469
|
+
value: list([[ROLE:*]], [[FV.COMPONENT:*]], [[CV.ENTITY:*]])
|
|
3470
|
+
- name: KIND
|
|
3471
|
+
desc: |
|
|
3472
|
+
The kind of the message, one of:
|
|
3473
|
+
- `Call`: Synchronous request the sender waits for (the default).
|
|
3474
|
+
- `Signal`: Asynchronous notification the sender does not wait for.
|
|
3475
|
+
- `Return`: Response to the latest unanswered call of its receiver.
|
|
3476
|
+
- `Create`: Instantiation of its receiver, which starts there.
|
|
3477
|
+
- `Destroy`: Termination of its receiver, which ends there.
|
|
3478
|
+
value: enum(Call,Signal,Return,Create,Destroy)
|
|
3479
|
+
optional: true
|
|
3480
|
+
- name: DURATION
|
|
3481
|
+
desc: >
|
|
3482
|
+
Duration constraint of a call up to its return (e.g. `< 200ms`),
|
|
3483
|
+
drawn as a bracket beside the lifeline of the caller.
|
|
3484
|
+
optional: true
|
|
3485
|
+
- name: TIME
|
|
3486
|
+
desc: >
|
|
3487
|
+
Time constraint or observation at the start of the message (e.g.
|
|
3488
|
+
`t = now`), drawn beside the lifeline of the sender.
|
|
3489
|
+
optional: true
|
|
3490
|
+
|
|
3491
|
+
- kind: ARCH
|
|
3492
|
+
name: Concurrency View
|
|
3493
|
+
id: CO
|
|
3494
|
+
file: 27-ARCH-CO-Concurrency-View.md
|
|
3495
|
+
desc: >
|
|
3496
|
+
The concurrency structure of the solution, mapping functional components to processes and
|
|
3497
|
+
threads, and defining how they coordinate and communicate. The artifact is absent when the
|
|
3498
|
+
solution runs as a single sequential unit of execution and has no concurrency structure
|
|
3499
|
+
worth describing.
|
|
3500
|
+
optional: true
|
|
3501
|
+
coverage:
|
|
3502
|
+
- "[[FV.COMPONENT:*]]"
|
|
3503
|
+
refs: >
|
|
3504
|
+
- Rozanski/Woods: Software Systems Architecture, 2nd ed.: The Concurrency Viewpoint (2011),
|
|
3505
|
+
https://www.viewpoints-and-perspectives.info/home/viewpoints/concurrency/
|
|
3506
|
+
- Kruchten: Architectural Blueprints -- The "4+1" View Model of Software Architecture (1995),
|
|
3507
|
+
https://ieeexplore.ieee.org/document/469759
|
|
3508
|
+
- Schmidt et al.: Pattern-Oriented Software Architecture, Volume 2: Patterns for Concurrent and Networked Objects (2000),
|
|
3509
|
+
https://www.wiley.com/en-us/Pattern+Oriented+Software+Architecture,+Volume+2,+Patterns+for+Concurrent+and+Networked+Objects-p-9781118725177
|
|
3510
|
+
diagram:
|
|
3511
|
+
- type: graph
|
|
3512
|
+
nodes: "[[UNIT:*]]"
|
|
3513
|
+
labeled: true
|
|
3514
|
+
properties:
|
|
3515
|
+
- KIND
|
|
3516
|
+
- type: petri
|
|
3517
|
+
nodes: "[[RESOURCE:*]], [[UNIT:*]]"
|
|
3518
|
+
places: "[[RESOURCE:*]]"
|
|
3519
|
+
links:
|
|
3520
|
+
- CONSUMES
|
|
3521
|
+
- PRODUCES
|
|
3522
|
+
reverse:
|
|
3523
|
+
- CONSUMES
|
|
3524
|
+
tokens: TOKENS
|
|
3525
|
+
capacity: CAPACITY
|
|
3526
|
+
onlyConnected: true
|
|
3527
|
+
children:
|
|
3528
|
+
- kind: RESOURCE
|
|
3529
|
+
desc: >
|
|
3530
|
+
A single coordination resource the concurrency units share, named with a short (2-5
|
|
3531
|
+
word) summary (e.g. `Ingest Queue`, `Database Connections`, `Render Lock`) and
|
|
3532
|
+
described in a concise (1-3 sentence) paragraph by what its items are and how full
|
|
3533
|
+
it may get, plus a 1-sentence rationale ("why") for its bound.
|
|
3534
|
+
|
|
3535
|
+
The resources and the units form a Petri net: a resource is a place holding items
|
|
3536
|
+
(tokens), a unit a transition taking items out of the resources it names in
|
|
3537
|
+
`CONSUMES` and putting items into the resources it names in `PRODUCES`, so the
|
|
3538
|
+
analysis of the net reveals unbounded resources (missing backpressure), deadlocks,
|
|
3539
|
+
and units never or no longer able to work.
|
|
3540
|
+
optional: true
|
|
3541
|
+
props:
|
|
3542
|
+
- name: KIND
|
|
3543
|
+
desc: |
|
|
3544
|
+
The kind of the coordination resource, one of:
|
|
3545
|
+
|
|
3546
|
+
- `Queue`: A buffer of work items between producers and consumers.
|
|
3547
|
+
- `Topic`: A publish/subscribe channel delivering messages.
|
|
3548
|
+
- `Pool`: A bounded set of reusable instances (e.g. connections).
|
|
3549
|
+
- `Mutex`: An exclusive lock (a single token).
|
|
3550
|
+
- `Semaphore`: A counting lock (several tokens).
|
|
3551
|
+
value: enum(Queue,Topic,Pool,Mutex,Semaphore)
|
|
3552
|
+
- name: CAPACITY
|
|
3553
|
+
desc: >
|
|
3554
|
+
The maximum number of items the resource holds (e.g. a queue limit or the
|
|
3555
|
+
size of a pool), omitted for an unbounded resource.
|
|
3556
|
+
value: /^[1-9][0-9]*$/
|
|
3557
|
+
optional: true
|
|
3558
|
+
- name: TOKENS
|
|
3559
|
+
desc: >
|
|
3560
|
+
The number of items the resource initially holds (e.g. the free
|
|
3561
|
+
connections of a pool or the `1` of a free mutex), omitted for none.
|
|
3562
|
+
value: /^(?:0|[1-9][0-9]*)$/
|
|
3563
|
+
optional: true
|
|
3564
|
+
- kind: UNIT
|
|
3565
|
+
desc: >
|
|
3566
|
+
A single concurrency unit, named with a short (2-5 word) summary (e.g. `Web Worker
|
|
3567
|
+
Pool`, `Background Scheduler`, `Ingest Queue Consumer`) and described in a concise
|
|
3568
|
+
(1-3 sentence) paragraph by how it executes and how it avoids or manages contention,
|
|
3569
|
+
races, and deadlocks (including its start order and failure/restart behavior where
|
|
3570
|
+
non-obvious), plus a 1-sentence rationale ("why") for the chosen concurrency
|
|
3571
|
+
structure.
|
|
3572
|
+
|
|
3573
|
+
A unit executes work at runtime: a queue or channel between units is not a unit
|
|
3574
|
+
but the coordination mechanism stated in `COORDINATION`, its contract an Interface
|
|
3575
|
+
Model interface (e.g. of kind `MQTT` or `WebSocket`), and the platform element
|
|
3576
|
+
hosting a managed broker a Deployment View `Managed` node -- only the executing
|
|
3577
|
+
structure itself belongs to the Concurrency View.
|
|
3578
|
+
optional: true
|
|
3579
|
+
multiple:
|
|
3580
|
+
property: MULTIPLICITY
|
|
3581
|
+
pattern: ^\s*(?:\d*\.\.\s*(?:n|\*|[2-9]|\d{2,})|[2-9]|\d{2,}|n\b)
|
|
3582
|
+
diagram:
|
|
3583
|
+
type: hub
|
|
3584
|
+
center: self
|
|
3585
|
+
nodes: "[[UNIT:*]], [[RESOURCE:*]], [[FV.COMPONENT:*]], [[NODE:*]], [[TACTIC:*]], [[DECISION:*]]"
|
|
3586
|
+
labeled: true
|
|
3587
|
+
qualified: true
|
|
3588
|
+
properties:
|
|
3589
|
+
- KIND
|
|
3590
|
+
config:
|
|
3591
|
+
size-node-width-max: 440
|
|
3592
|
+
size-node-height-scale: 1.75
|
|
3593
|
+
hub-node-count-max: 3
|
|
3594
|
+
props:
|
|
3595
|
+
- name: KIND
|
|
3596
|
+
desc: |
|
|
3597
|
+
The kind of the concurrency unit, one of:
|
|
3598
|
+
|
|
3599
|
+
- `Process`: An independent OS process with its own address space.
|
|
3600
|
+
- `Thread`: A thread of execution within a process.
|
|
3601
|
+
- `Task`: A lightweight cooperative task (e.g. coroutine, fiber).
|
|
3602
|
+
- `Pool`: A managed group of interchangeable workers.
|
|
3603
|
+
- `EventLoop`: A single-threaded cooperative scheduler of tasks.
|
|
3604
|
+
value: enum(Process,Thread,Task,Pool,EventLoop)
|
|
3605
|
+
- name: PART-OF
|
|
3606
|
+
desc: >
|
|
3607
|
+
Reference to the CONCURRENCY-VIEW object this unit is contained in,
|
|
3608
|
+
expressing the containment the kinds imply: a `Thread`, `Task`, `Pool`, or
|
|
3609
|
+
`EventLoop` references the `Process` it executes within, and a `Task` the
|
|
3610
|
+
`EventLoop` or `Pool` scheduling it; omitted for a top-level unit.
|
|
3611
|
+
value: "[[UNIT:*]]"
|
|
3612
|
+
optional: true
|
|
3613
|
+
acyclic: true
|
|
3614
|
+
- name: HOSTS
|
|
3615
|
+
desc: >
|
|
3616
|
+
Comma-separated references to the FUNCTIONALITY-VIEW objects that run inside
|
|
3617
|
+
this concurrency unit; omitted when no modeled component runs inside it.
|
|
3618
|
+
value: list([[FV.COMPONENT:*]])
|
|
3619
|
+
optional: true
|
|
3620
|
+
- name: MULTIPLICITY
|
|
3621
|
+
desc: >
|
|
3622
|
+
How many instances of the unit run (e.g. `1`, `1 per CPU core`, `0..n
|
|
3623
|
+
auto-scaled`).
|
|
3624
|
+
- name: COORDINATES-WITH
|
|
3625
|
+
desc: >
|
|
3626
|
+
Comma-separated references to the CONCURRENCY-VIEW objects this unit
|
|
3627
|
+
coordinates or communicates with at runtime, naming the peer unit only
|
|
3628
|
+
(e.g. a producer names the consumer it feeds through a shared queue),
|
|
3629
|
+
while the mechanism is stated by `COORDINATION`.
|
|
3630
|
+
value: list([[UNIT:*]])
|
|
3631
|
+
optional: true
|
|
3632
|
+
- name: COORDINATION
|
|
3633
|
+
desc: >
|
|
3634
|
+
The mechanism by which the unit coordinates or communicates with other
|
|
3635
|
+
units, usually those referenced in `COORDINATES-WITH` (e.g. `shared
|
|
3636
|
+
queue`, `mutex`, `message passing`, `optimistic locking`).
|
|
3637
|
+
- name: CONSUMES
|
|
3638
|
+
desc: >
|
|
3639
|
+
Comma-separated references to the CONCURRENCY-VIEW resources the unit takes
|
|
3640
|
+
work items or instances out of (e.g. the queue it drains, the pool it takes
|
|
3641
|
+
a connection from), modeling the unit as a transition of the Petri net its
|
|
3642
|
+
resources form; omitted when it consumes from none.
|
|
3643
|
+
value: list([[RESOURCE:*]])
|
|
3644
|
+
optional: true
|
|
3645
|
+
- name: PRODUCES
|
|
3646
|
+
desc: >
|
|
3647
|
+
Comma-separated references to the CONCURRENCY-VIEW resources the unit puts
|
|
3648
|
+
work items or freed instances into (e.g. the queue it feeds, the pool it
|
|
3649
|
+
returns a connection to); omitted when it produces into none.
|
|
3650
|
+
value: list([[RESOURCE:*]])
|
|
3651
|
+
optional: true
|
|
3652
|
+
|
|
3282
3653
|
- kind: ARCH
|
|
3283
3654
|
name: Technology Stack
|
|
3284
3655
|
id: TS
|
|
3285
|
-
file:
|
|
3656
|
+
file: 28-ARCH-TS-Technology-Stack.md
|
|
3286
3657
|
desc: >
|
|
3287
3658
|
The concrete technology products the solution is built upon, organized by tier and lifecycle
|
|
3288
3659
|
phase, recording for each component its chosen product, its purpose, and the alternatives
|
|
@@ -3294,16 +3665,14 @@
|
|
|
3294
3665
|
- Brown: The C4 Model: Container Diagram (2018),
|
|
3295
3666
|
https://c4model.com/diagrams/container
|
|
3296
3667
|
diagram:
|
|
3297
|
-
type:
|
|
3668
|
+
type: layer
|
|
3298
3669
|
nodes: "[[TS.TIER:*]], [[TS.TIER:*.COMPONENT:*]]"
|
|
3299
3670
|
nest:
|
|
3300
3671
|
parent: true
|
|
3301
|
-
layout: grid
|
|
3302
3672
|
properties:
|
|
3303
3673
|
- PRODUCT
|
|
3304
3674
|
config:
|
|
3305
3675
|
size-node-width-max: 440
|
|
3306
|
-
grid-columns-max: 2
|
|
3307
3676
|
children:
|
|
3308
3677
|
- kind: TIER
|
|
3309
3678
|
desc: |
|
|
@@ -3643,7 +4012,7 @@
|
|
|
3643
4012
|
- kind: ARCH
|
|
3644
4013
|
name: Development Aspects
|
|
3645
4014
|
id: DA
|
|
3646
|
-
file:
|
|
4015
|
+
file: 29-ARCH-DA-Development-Aspects.md
|
|
3647
4016
|
desc: >
|
|
3648
4017
|
The architecture supporting the software development process, defining the module
|
|
3649
4018
|
organization, build approach, and codeline conventions. The artifact is absent when the
|
|
@@ -3715,109 +4084,16 @@
|
|
|
3715
4084
|
value: list([[MAXIM:*]], [[AT.PRINCIPLE:*]])
|
|
3716
4085
|
optional: true
|
|
3717
4086
|
|
|
3718
|
-
- kind: ARCH
|
|
3719
|
-
name: Concurrency View
|
|
3720
|
-
id: CO
|
|
3721
|
-
file: 28-ARCH-CO-Concurrency-View.md
|
|
3722
|
-
desc: >
|
|
3723
|
-
The concurrency structure of the solution, mapping functional components to processes and
|
|
3724
|
-
threads, and defining how they coordinate and communicate. The artifact is absent when the
|
|
3725
|
-
solution runs as a single sequential unit of execution and has no concurrency structure
|
|
3726
|
-
worth describing.
|
|
3727
|
-
optional: true
|
|
3728
|
-
refs: >
|
|
3729
|
-
- Rozanski/Woods: Software Systems Architecture, 2nd ed.: The Concurrency Viewpoint (2011),
|
|
3730
|
-
https://www.viewpoints-and-perspectives.info/home/viewpoints/concurrency/
|
|
3731
|
-
- Kruchten: Architectural Blueprints -- The "4+1" View Model of Software Architecture (1995),
|
|
3732
|
-
https://ieeexplore.ieee.org/document/469759
|
|
3733
|
-
- Schmidt et al.: Pattern-Oriented Software Architecture, Volume 2: Patterns for Concurrent and Networked Objects (2000),
|
|
3734
|
-
https://www.wiley.com/en-us/Pattern+Oriented+Software+Architecture,+Volume+2,+Patterns+for+Concurrent+and+Networked+Objects-p-9781118725177
|
|
3735
|
-
diagram:
|
|
3736
|
-
type: graph
|
|
3737
|
-
nodes: "[[UNIT:*]]"
|
|
3738
|
-
labeled: true
|
|
3739
|
-
properties:
|
|
3740
|
-
- KIND
|
|
3741
|
-
children:
|
|
3742
|
-
- kind: UNIT
|
|
3743
|
-
desc: >
|
|
3744
|
-
A single concurrency unit, named with a short (2-5 word) summary (e.g. `Web Worker
|
|
3745
|
-
Pool`, `Background Scheduler`, `Ingest Queue Consumer`) and described in a concise
|
|
3746
|
-
(1-3 sentence) paragraph by how it executes and how it avoids or manages contention,
|
|
3747
|
-
races, and deadlocks (including its start order and failure/restart behavior where
|
|
3748
|
-
non-obvious), plus a 1-sentence rationale ("why") for the chosen concurrency
|
|
3749
|
-
structure.
|
|
3750
|
-
|
|
3751
|
-
A unit executes work at runtime: a queue or channel between units is not a unit
|
|
3752
|
-
but the coordination mechanism stated in `COORDINATION`, its contract an Interface
|
|
3753
|
-
Model interface (e.g. of kind `MQTT` or `WebSocket`), and the platform element
|
|
3754
|
-
hosting a managed broker a Deployment View `Managed` node -- only the executing
|
|
3755
|
-
structure itself belongs to the Concurrency View.
|
|
3756
|
-
optional: true
|
|
3757
|
-
diagram:
|
|
3758
|
-
type: hub
|
|
3759
|
-
center: self
|
|
3760
|
-
nodes: "[[UNIT:*]], [[FV.COMPONENT:*]], [[NODE:*]], [[TACTIC:*]], [[DECISION:*]]"
|
|
3761
|
-
labeled: true
|
|
3762
|
-
qualified: true
|
|
3763
|
-
properties:
|
|
3764
|
-
- KIND
|
|
3765
|
-
config:
|
|
3766
|
-
size-node-width-max: 440
|
|
3767
|
-
size-node-height-scale: 1.75
|
|
3768
|
-
hub-node-count-max: 3
|
|
3769
|
-
props:
|
|
3770
|
-
- name: KIND
|
|
3771
|
-
desc: |
|
|
3772
|
-
The kind of the concurrency unit, one of:
|
|
3773
|
-
|
|
3774
|
-
- `Process`: An independent OS process with its own address space.
|
|
3775
|
-
- `Thread`: A thread of execution within a process.
|
|
3776
|
-
- `Task`: A lightweight cooperative task (e.g. coroutine, fiber).
|
|
3777
|
-
- `Pool`: A managed group of interchangeable workers.
|
|
3778
|
-
- `EventLoop`: A single-threaded cooperative scheduler of tasks.
|
|
3779
|
-
value: enum(Process,Thread,Task,Pool,EventLoop)
|
|
3780
|
-
- name: PART-OF
|
|
3781
|
-
desc: >
|
|
3782
|
-
Reference to the CONCURRENCY-VIEW object this unit is contained in,
|
|
3783
|
-
expressing the containment the kinds imply: a `Thread`, `Task`, `Pool`, or
|
|
3784
|
-
`EventLoop` references the `Process` it executes within, and a `Task` the
|
|
3785
|
-
`EventLoop` or `Pool` scheduling it; omitted for a top-level unit.
|
|
3786
|
-
value: "[[UNIT:*]]"
|
|
3787
|
-
optional: true
|
|
3788
|
-
acyclic: true
|
|
3789
|
-
- name: HOSTS
|
|
3790
|
-
desc: >
|
|
3791
|
-
Comma-separated references to the FUNCTIONALITY-VIEW objects that run inside
|
|
3792
|
-
this concurrency unit; omitted when no modeled component runs inside it.
|
|
3793
|
-
value: list([[FV.COMPONENT:*]])
|
|
3794
|
-
optional: true
|
|
3795
|
-
- name: MULTIPLICITY
|
|
3796
|
-
desc: >
|
|
3797
|
-
How many instances of the unit run (e.g. `1`, `1 per CPU core`, `0..n
|
|
3798
|
-
auto-scaled`).
|
|
3799
|
-
- name: COORDINATES-WITH
|
|
3800
|
-
desc: >
|
|
3801
|
-
Comma-separated references to the CONCURRENCY-VIEW objects this unit
|
|
3802
|
-
coordinates or communicates with at runtime, naming the peer unit only
|
|
3803
|
-
(e.g. a producer names the consumer it feeds through a shared queue),
|
|
3804
|
-
while the mechanism is stated by `COORDINATION`.
|
|
3805
|
-
value: list([[UNIT:*]])
|
|
3806
|
-
optional: true
|
|
3807
|
-
- name: COORDINATION
|
|
3808
|
-
desc: >
|
|
3809
|
-
The mechanism by which the unit coordinates or communicates with other
|
|
3810
|
-
units, usually those referenced in `COORDINATES-WITH` (e.g. `shared
|
|
3811
|
-
queue`, `mutex`, `message passing`, `optimistic locking`).
|
|
3812
|
-
|
|
3813
4087
|
- kind: ARCH
|
|
3814
4088
|
name: Deployment View
|
|
3815
4089
|
id: DV
|
|
3816
|
-
file:
|
|
4090
|
+
file: 30-ARCH-DV-Deployment-View.md
|
|
3817
4091
|
desc: >
|
|
3818
4092
|
The environment into which the solution is deployed, partitioning it into tiers and mapping
|
|
3819
4093
|
software elements to the runtime platform, hardware, and network topology.
|
|
3820
4094
|
optional: true
|
|
4095
|
+
coverage:
|
|
4096
|
+
- "[[UNIT:*]]"
|
|
3821
4097
|
refs: >
|
|
3822
4098
|
- Rozanski/Woods: Software Systems Architecture, 2nd ed.: The Deployment Viewpoint (2011),
|
|
3823
4099
|
https://www.viewpoints-and-perspectives.info/home/viewpoints/deployment/
|
|
@@ -3826,20 +4102,28 @@
|
|
|
3826
4102
|
- Brown: The C4 Model: Deployment Diagram (2018),
|
|
3827
4103
|
https://c4model.com/diagrams/deployment
|
|
3828
4104
|
diagram:
|
|
3829
|
-
type: graph
|
|
3830
|
-
|
|
3831
|
-
|
|
3832
|
-
|
|
3833
|
-
|
|
4105
|
+
- type: graph
|
|
4106
|
+
nodes: "[[NODE:*]]"
|
|
4107
|
+
labeled: true
|
|
4108
|
+
qualified: true
|
|
4109
|
+
nest:
|
|
4110
|
+
properties:
|
|
4111
|
+
- PART-OF
|
|
4112
|
+
- TIER
|
|
3834
4113
|
properties:
|
|
3835
|
-
-
|
|
3836
|
-
-
|
|
3837
|
-
|
|
3838
|
-
|
|
3839
|
-
|
|
3840
|
-
|
|
3841
|
-
|
|
3842
|
-
|
|
4114
|
+
- AREA
|
|
4115
|
+
- KIND
|
|
4116
|
+
- PLATFORM
|
|
4117
|
+
config:
|
|
4118
|
+
size-node-width-max: 350
|
|
4119
|
+
- type: tree
|
|
4120
|
+
nodes: "[[NODE:*]]"
|
|
4121
|
+
links: []
|
|
4122
|
+
qualified: true
|
|
4123
|
+
nest:
|
|
4124
|
+
properties:
|
|
4125
|
+
- PART-OF
|
|
4126
|
+
- TIER
|
|
3843
4127
|
children:
|
|
3844
4128
|
- kind: TIER
|
|
3845
4129
|
desc: >
|
|
@@ -3919,6 +4203,52 @@
|
|
|
3919
4203
|
config:
|
|
3920
4204
|
size-node-width-max: 440
|
|
3921
4205
|
size-node-height-scale: 1.75
|
|
4206
|
+
- kind: NETWORK
|
|
4207
|
+
desc: >
|
|
4208
|
+
A single network segment the deployment nodes are attached to, named with a short
|
|
4209
|
+
(2-5 word) summary (e.g. `Public Internet`, `Backend VLAN`, `Database Subnet`) and
|
|
4210
|
+
described in a concise (1-3 sentence) paragraph by its reach, its isolation from the
|
|
4211
|
+
other segments, and the traffic it carries, plus a 1-sentence rationale ("why") for
|
|
4212
|
+
the segmentation.
|
|
4213
|
+
|
|
4214
|
+
A segment is the medium the nodes communicate over: the attached nodes reference it
|
|
4215
|
+
via `NETWORKS`, the directed links between them are their `CONNECTS-TO` references,
|
|
4216
|
+
and the contract of the carried traffic is an Interface Model interface -- only the
|
|
4217
|
+
network itself belongs here. The kind is absent when the topology has no
|
|
4218
|
+
segmentation worth describing.
|
|
4219
|
+
optional: true
|
|
4220
|
+
format:
|
|
4221
|
+
type: concise
|
|
4222
|
+
diagram:
|
|
4223
|
+
type: hub
|
|
4224
|
+
center: self
|
|
4225
|
+
nodes: "[[NETWORK:*]], [[NODE:*]], [[TACTIC:*]], [[DECISION:*]]"
|
|
4226
|
+
labeled: true
|
|
4227
|
+
qualified: true
|
|
4228
|
+
properties:
|
|
4229
|
+
- KIND
|
|
4230
|
+
- SCOPE
|
|
4231
|
+
config:
|
|
4232
|
+
size-node-width-max: 440
|
|
4233
|
+
size-node-height-scale: 1.75
|
|
4234
|
+
hub-node-count-max: 3
|
|
4235
|
+
props:
|
|
4236
|
+
- name: SCOPE
|
|
4237
|
+
desc: |
|
|
4238
|
+
The reach of the segment, one of:
|
|
4239
|
+
- `Public`: Reachable from the Internet.
|
|
4240
|
+
- `Private`: Reachable from the solution's own nodes only.
|
|
4241
|
+
- `Isolated`: Reachable from selected nodes only (e.g. a database subnet).
|
|
4242
|
+
value: enum(Public,Private,Isolated)
|
|
4243
|
+
- name: PROTOCOLS
|
|
4244
|
+
desc: >
|
|
4245
|
+
The protocols and ports carried by the segment (e.g. `HTTPS 443, WSS 443`,
|
|
4246
|
+
`HTTP, WS, TCP 5432`).
|
|
4247
|
+
- name: ADDRESSING
|
|
4248
|
+
desc: >
|
|
4249
|
+
The address range or naming of the segment (e.g. `10.0.0.0/8`, `public IPv4
|
|
4250
|
+
and IPv6`, `*.example.com`).
|
|
4251
|
+
optional: true
|
|
3922
4252
|
- kind: NODE
|
|
3923
4253
|
desc: >
|
|
3924
4254
|
A single deployment node, named with a short (2-5 word) summary (e.g. `Web Servers`,
|
|
@@ -3935,6 +4265,18 @@
|
|
|
3935
4265
|
and the network segments it is attached to as its `TIER`, `AREA`, and `NETWORK`
|
|
3936
4266
|
siblings.
|
|
3937
4267
|
optional: true
|
|
4268
|
+
badge:
|
|
4269
|
+
property: KIND
|
|
4270
|
+
map:
|
|
4271
|
+
Server: service
|
|
4272
|
+
Container: package
|
|
4273
|
+
Cluster: network
|
|
4274
|
+
Function: function
|
|
4275
|
+
Device: device
|
|
4276
|
+
Managed: cloud
|
|
4277
|
+
multiple:
|
|
4278
|
+
property: INSTANCES
|
|
4279
|
+
pattern: ^\s*(?:\d*\.\.\s*(?:n|\*|[2-9]|\d{2,})|[2-9]|\d{2,}|n\b)
|
|
3938
4280
|
diagram:
|
|
3939
4281
|
type: hub
|
|
3940
4282
|
center: self
|
|
@@ -4018,57 +4360,11 @@
|
|
|
4018
4360
|
when the topology models no network segments.
|
|
4019
4361
|
value: list([[NETWORK:*]])
|
|
4020
4362
|
optional: true
|
|
4021
|
-
- kind: NETWORK
|
|
4022
|
-
desc: >
|
|
4023
|
-
A single network segment the deployment nodes are attached to, named with a short
|
|
4024
|
-
(2-5 word) summary (e.g. `Public Internet`, `Backend VLAN`, `Database Subnet`) and
|
|
4025
|
-
described in a concise (1-3 sentence) paragraph by its reach, its isolation from the
|
|
4026
|
-
other segments, and the traffic it carries, plus a 1-sentence rationale ("why") for
|
|
4027
|
-
the segmentation.
|
|
4028
|
-
|
|
4029
|
-
A segment is the medium the nodes communicate over: the attached nodes reference it
|
|
4030
|
-
via `NETWORKS`, the directed links between them are their `CONNECTS-TO` references,
|
|
4031
|
-
and the contract of the carried traffic is an Interface Model interface -- only the
|
|
4032
|
-
network itself belongs here. The kind is absent when the topology has no
|
|
4033
|
-
segmentation worth describing.
|
|
4034
|
-
optional: true
|
|
4035
|
-
format:
|
|
4036
|
-
type: concise
|
|
4037
|
-
diagram:
|
|
4038
|
-
type: hub
|
|
4039
|
-
center: self
|
|
4040
|
-
nodes: "[[NETWORK:*]], [[NODE:*]], [[TACTIC:*]], [[DECISION:*]]"
|
|
4041
|
-
labeled: true
|
|
4042
|
-
qualified: true
|
|
4043
|
-
properties:
|
|
4044
|
-
- KIND
|
|
4045
|
-
- SCOPE
|
|
4046
|
-
config:
|
|
4047
|
-
size-node-width-max: 440
|
|
4048
|
-
size-node-height-scale: 1.75
|
|
4049
|
-
hub-node-count-max: 3
|
|
4050
|
-
props:
|
|
4051
|
-
- name: SCOPE
|
|
4052
|
-
desc: |
|
|
4053
|
-
The reach of the segment, one of:
|
|
4054
|
-
- `Public`: Reachable from the Internet.
|
|
4055
|
-
- `Private`: Reachable from the solution's own nodes only.
|
|
4056
|
-
- `Isolated`: Reachable from selected nodes only (e.g. a database subnet).
|
|
4057
|
-
value: enum(Public,Private,Isolated)
|
|
4058
|
-
- name: PROTOCOLS
|
|
4059
|
-
desc: >
|
|
4060
|
-
The protocols and ports carried by the segment (e.g. `HTTPS 443, WSS 443`,
|
|
4061
|
-
`HTTP, WS, TCP 5432`).
|
|
4062
|
-
- name: ADDRESSING
|
|
4063
|
-
desc: >
|
|
4064
|
-
The address range or naming of the segment (e.g. `10.0.0.0/8`, `public IPv4
|
|
4065
|
-
and IPv6`, `*.example.com`).
|
|
4066
|
-
optional: true
|
|
4067
4363
|
|
|
4068
4364
|
- kind: ARCH
|
|
4069
4365
|
name: Operations View
|
|
4070
4366
|
id: OV
|
|
4071
|
-
file:
|
|
4367
|
+
file: 31-ARCH-OV-Operations-View.md
|
|
4072
4368
|
desc: >
|
|
4073
4369
|
The way the solution is operated, administered, and supported in production, defining the
|
|
4074
4370
|
standing procedures by which the operating organization installs, configures, migrates,
|
|
@@ -4183,7 +4479,7 @@
|
|
|
4183
4479
|
- kind: ARCH
|
|
4184
4480
|
name: Quality Perspectives
|
|
4185
4481
|
id: QP
|
|
4186
|
-
file:
|
|
4482
|
+
file: 32-ARCH-QP-Quality-Perspectives.md
|
|
4187
4483
|
desc: >
|
|
4188
4484
|
How the Non-Functional Requirements (NR) are addressed by the architecture, through the
|
|
4189
4485
|
tactics built into the solution across the views.
|
|
@@ -4328,7 +4624,7 @@
|
|
|
4328
4624
|
- kind: ARCH
|
|
4329
4625
|
name: Design Decisions
|
|
4330
4626
|
id: DD
|
|
4331
|
-
file:
|
|
4627
|
+
file: 33-ARCH-DD-Design-Decisions.md
|
|
4332
4628
|
desc: >
|
|
4333
4629
|
The major decisions related to the solution design, each recording the forces at play, the
|
|
4334
4630
|
chosen response, and the reasoning that justifies it. The artifact is the last
|
|
@@ -4583,7 +4879,7 @@
|
|
|
4583
4879
|
- kind: ARCH
|
|
4584
4880
|
name: Code Patterns
|
|
4585
4881
|
id: CP
|
|
4586
|
-
file:
|
|
4882
|
+
file: 34-ARCH-CP-Code-Patterns.md
|
|
4587
4883
|
desc: >
|
|
4588
4884
|
The implementation patterns the source code of the solution follows, each prescribing how
|
|
4589
4885
|
one recurring concern (e.g. authorization enforcement, entity persistence, error
|
|
@@ -4699,7 +4995,7 @@
|
|
|
4699
4995
|
- kind: TEST
|
|
4700
4996
|
name: Test Cases
|
|
4701
4997
|
id: TC
|
|
4702
|
-
file:
|
|
4998
|
+
file: 35-TEST-TC-Test-Cases.md
|
|
4703
4999
|
desc: >
|
|
4704
5000
|
The verifiable conditions and steps used to confirm that requirements, domain rules, use
|
|
4705
5001
|
case scenarios, state transitions, and the mechanisms, procedures, and decisions of the
|