@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.
Files changed (63) hide show
  1. package/LICENSE.txt +201 -0
  2. package/README.md +288 -43
  3. package/dst/specbook-api.d.ts +23 -3
  4. package/dst/specbook-api.js +133 -59
  5. package/dst/specbook-cli.js +93 -26
  6. package/dst/specbook-cmd-describe.js +4 -4
  7. package/dst/specbook-cmd-export-schema.d.ts +8 -0
  8. package/dst/specbook-cmd-export-schema.js +441 -0
  9. package/dst/specbook-cmd-export.js +23 -6
  10. package/dst/specbook-cmd-init-sample.d.ts +4 -0
  11. package/dst/specbook-cmd-init-sample.js +322 -0
  12. package/dst/specbook-cmd-init.d.ts +1 -0
  13. package/dst/specbook-cmd-init.js +42 -10
  14. package/dst/specbook-cmd-lint.js +46 -48
  15. package/dst/specbook-cmd-query.d.ts +30 -0
  16. package/dst/specbook-cmd-query.js +165 -0
  17. package/dst/specbook-config.d.ts +9 -1
  18. package/dst/specbook-config.js +135 -10
  19. package/dst/specbook-coverage.js +2 -2
  20. package/dst/specbook-diagram.d.ts +7 -5
  21. package/dst/specbook-diagram.js +546 -143
  22. package/dst/specbook-export-ast.d.ts +1 -1
  23. package/dst/specbook-export-ast.js +11 -8
  24. package/dst/specbook-export-code.js +3 -3
  25. package/dst/specbook-export-common.d.ts +1 -1
  26. package/dst/specbook-export-common.js +3 -2
  27. package/dst/specbook-export-diagram.d.ts +1 -1
  28. package/dst/specbook-export-diagram.js +25 -7
  29. package/dst/specbook-export-html-fold.d.ts +16 -6
  30. package/dst/specbook-export-html-fold.js +65 -44
  31. package/dst/specbook-export-html-render.js +107 -26
  32. package/dst/specbook-export-html-search.js +18 -20
  33. package/dst/specbook-export-html-template.js +38 -9
  34. package/dst/specbook-export-html-widget.d.ts +2 -0
  35. package/dst/specbook-export-html-widget.js +219 -19
  36. package/dst/specbook-export-html.css +208 -38
  37. package/dst/specbook-export-html.js +96 -53
  38. package/dst/specbook-export-md.d.ts +2 -1
  39. package/dst/specbook-export-md.js +7 -8
  40. package/dst/specbook-export-pdf.js +1 -1
  41. package/dst/specbook-files.d.ts +2 -0
  42. package/dst/specbook-files.js +41 -0
  43. package/dst/specbook-format-meta.yaml +401 -0
  44. package/dst/specbook-format-pm.yaml +1240 -0
  45. package/dst/specbook-format-schema.d.ts +33 -3
  46. package/dst/specbook-format-schema.js +49 -3
  47. package/dst/specbook-format.md +427 -47
  48. package/dst/specbook-format.yaml +524 -228
  49. package/dst/specbook-ignore.js +2 -2
  50. package/dst/specbook-link.d.ts +4 -0
  51. package/dst/specbook-link.js +61 -6
  52. package/dst/specbook-mcp.js +103 -19
  53. package/dst/specbook-parse-semantic.d.ts +1 -0
  54. package/dst/specbook-parse-semantic.js +11 -4
  55. package/dst/specbook-parse-syntax.d.ts +1 -0
  56. package/dst/specbook-parse-syntax.js +1 -1
  57. package/dst/specbook-parse.d.ts +1 -1
  58. package/dst/specbook-parse.js +3 -3
  59. package/dst/specbook-project.d.ts +2 -0
  60. package/dst/specbook-project.js +15 -5
  61. package/dst/specbook-remote.d.ts +28 -0
  62. package/dst/specbook-remote.js +429 -0
  63. package/package.json +32 -20
@@ -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
- nodes: "[[TERM:*]]"
334
- properties:
335
- - TYPE
336
- config:
337
- size-node-width-max: 440
338
- grid-columns-max: 4
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
- nodes: "[[ROLE:*]], [[PERSONA:*]]"
435
- labeled: true
436
- qualified: true
437
- config:
438
- size-node-width-max: 440
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
- nodes: "[[FR.REQUIREMENT:*]]"
660
- nest:
688
+ - type: grid
689
+ nodes: "[[FR.REQUIREMENT:*]]"
690
+ markUncovered: referenced
691
+ nest:
692
+ properties:
693
+ - GROUP
661
694
  properties:
662
- - GROUP
663
- properties:
664
- - PRIORITY
665
- config:
666
- size-node-width-max: 440
667
- grid-columns-max: 2
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
- nodes: "[[DM.ENTITY:*]]"
1365
- edges: "[[RELATION:*]]"
1366
- nest:
1367
- properties:
1368
- - GROUP
1369
- config:
1370
- graph-columns-max: 2
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: graph
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
- nodes: "[[TYPE:*]]"
1906
- deep: true
1907
- onlyConnected: true
1908
- labeled: true
1909
- qualified: true
1910
- config:
1911
- size-node-width-max: 440
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
- nodes: "[[DIALOG-PATTERN:*]]"
2499
- properties:
2500
- - CATEGORY
2501
- config:
2502
- size-node-width-max: 440
2503
- size-node-height-scale: 2
2504
- grid-columns-max: 4
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
- nodes: "[[FV.COMPONENT:*]]"
3176
- labeled: true
3177
- nest:
3261
+ - type: graph
3262
+ nodes: "[[FV.COMPONENT:*]]"
3263
+ labeled: true
3264
+ nest:
3265
+ properties:
3266
+ - PART-OF
3178
3267
  properties:
3179
- - PART-OF
3180
- properties:
3181
- - KIND
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:*]], [[FR.REQUIREMENT:*]], [[PATTERN:*]], [[INTERFACE:*]],
3200
- [[DM.ENTITY:*]], [[UNIT:*]], [[NODE:*]], [[CONCERN:*]], [[TACTIC:*]],
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; omitted when the component provides no modeled interface
3261
- (e.g. a user interface or an internal module).
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: 26-ARCH-TS-Technology-Stack.md
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: grid
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: 27-ARCH-DA-Development-Aspects.md
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: 29-ARCH-DV-Deployment-View.md
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
- nodes: "[[NODE:*]]"
3831
- labeled: true
3832
- qualified: true
3833
- nest:
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
- - PART-OF
3836
- - TIER
3837
- properties:
3838
- - AREA
3839
- - KIND
3840
- - PLATFORM
3841
- config:
3842
- size-node-width-max: 350
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: 30-ARCH-OV-Operations-View.md
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: 31-ARCH-QP-Quality-Perspectives.md
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: 32-ARCH-DD-Design-Decisions.md
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: 33-ARCH-CP-Code-Patterns.md
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: 34-TEST-TC-Test-Cases.md
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