@rse/specbook 1.2.3 → 1.2.5

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.
@@ -72,6 +72,15 @@
72
72
  # - All artifacts have a unique 2-word name (e.g. "Context View") and a
73
73
  # corresponding unique 2-letter identifier.
74
74
  #
75
+ # - The artifacts are ordered coarse to fine wherever a granularity
76
+ # relation exists (REQS from the Solution Vision down to the Use
77
+ # Cases, UXUI from the Interaction Concept down to the Visual
78
+ # Design) and by concern otherwise (DATA structure/behavior/access,
79
+ # the ARCH viewpoints), while the back-reference rule below settles
80
+ # the rest. E.g. the Domain Workflows (summary level: many actors,
81
+ # many sittings) precede the Use Cases (user-goal level: one actor,
82
+ # one sitting), which reference back into the workflow activities.
83
+ #
75
84
  # - All object references are strictly back-references, i.e., later
76
85
  # objects reference earlier ones. Only the "referenced" coverage
77
86
  # constraints and the diagram node sets (e.g. the inputs of a "hub"
@@ -107,6 +116,12 @@
107
116
  nodes: "[[REQS:*]], [[DATA:*]], [[APIS:*]], [[UXUI:*]], [[ARCH:*]], [[TEST:*]]"
108
117
  deep: true
109
118
  qualified: true
119
+ ordered: true
120
+ nest:
121
+ kind: true
122
+ crossing: target
123
+ config:
124
+ graph-columns-max: 2
110
125
  props:
111
126
  - name: LOGO
112
127
  desc: The logo of the specification.
@@ -211,6 +226,10 @@
211
226
  resting on a premise are known and revisited once it turns out to be false. The
212
227
  artifact complements the Solution Vision: the vision states what the solution aims
213
228
  for, the premises state what it takes as given on the way there.
229
+
230
+ The premises are not constraints: a constraint is imposed on the solution and belongs
231
+ to the Non-Functional Requirements or the Domain Rules, whereas a premise lies outside
232
+ the control of the solution.
214
233
  optional: true
215
234
  refs: >
216
235
  - ISO/IEC/IEEE 29148:2018: Systems and software engineering -- Life cycle processes -- Requirements engineering (2018),
@@ -226,13 +245,13 @@
226
245
  nodes: "[[PREMISE:*]]"
227
246
  properties:
228
247
  - TYPE
229
- - LIKELIHOOD
230
- - IMPACT
248
+ - FAILURE-LIKELIHOOD
249
+ - FAILURE-IMPACT
231
250
  config:
232
251
  size-node-width-max: 440
233
252
  size-node-height-scale: 1.75
234
253
  grid-columns-max: 5
235
- childs:
254
+ children:
236
255
  - kind: PREMISE
237
256
  desc: >
238
257
  A single premise, named with a short (3-8 word) summary phrased as the fact taken
@@ -259,23 +278,24 @@
259
278
  behave as agreed), or `Risk` (an uncertain event which, if it occurs,
260
279
  harms the achievement of the vision).
261
280
  value: enum(Assumption,Dependency,Risk)
262
- - name: LIKELIHOOD
281
+ - name: FAILURE-LIKELIHOOD
263
282
  desc: >
264
283
  The likelihood that the premise fails, i.e. that the assumption turns out
265
284
  to be false, the dependency is not honored, or the risk occurs: `Low`,
266
- `Medium`, or `High`.
285
+ `Medium`, or `High`. It rates the failure and not the premise itself, so
286
+ `Low` says that the premise most probably holds.
267
287
  value: enum(Low,Medium,High)
268
- - name: IMPACT
288
+ - name: FAILURE-IMPACT
269
289
  desc: >
270
290
  The severity of the `CONSEQUENCE` for the solution once the premise fails:
271
- `Low`, `Medium`, or `High`, so that the product of likelihood and impact
272
- ranks the premises by the attention they need.
291
+ `Low`, `Medium`, or `High`, so that the product of the failure likelihood
292
+ and the failure impact ranks the premises by the attention they need.
273
293
  value: enum(Low,Medium,High)
274
294
  - name: CONSEQUENCE
275
295
  desc: >
276
296
  What concretely follows for the solution if the premise fails, stated
277
297
  as a 1-2 sentence description of the harm (e.g. `attendees cannot enter
278
- the event`), justifying the `IMPACT` rating.
298
+ the event`), justifying the `FAILURE-IMPACT` rating.
279
299
  - name: MITIGATION
280
300
  desc: >
281
301
  What is done to lower the likelihood or the impact of the failure or to
@@ -307,7 +327,7 @@
307
327
  config:
308
328
  size-node-width-max: 440
309
329
  grid-columns-max: 4
310
- childs:
330
+ children:
311
331
  - kind: TERM
312
332
  name: "[A-Z][A-Za-z0-9-]*( [A-Z][A-Za-z0-9-]*)*"
313
333
  desc: >
@@ -327,7 +347,7 @@
327
347
  diagram:
328
348
  type: hub
329
349
  center: self
330
- nodes: "[[TERM:*]], [[PREMISE:*]], [[RULE:*]], [[DM.ENTITY:*]], [[PERSONA:*]]"
350
+ nodes: "[[TERM:*]], [[PREMISE:*]], [[RULE:*]], [[DM.ENTITY:*]], [[ROLE:*]], [[PERSONA:*]]"
331
351
  labeled: true
332
352
  qualified: true
333
353
  config:
@@ -338,8 +358,9 @@
338
358
  desc: >
339
359
  The kind of concept the term denotes: `Entity` (a thing of the domain,
340
360
  usually materialized by a DATA-MODEL entity), `Actor` (a party acting in
341
- the domain, be it a human role usually embodied by a PERSONA or an external
342
- system), or `Activity` (a process or procedure of the domain).
361
+ the domain, be it a human role or an external system, usually played as a
362
+ ROLE of the User Personas), or `Activity` (a process or procedure of the
363
+ domain).
343
364
  value: enum(Entity,Actor,Activity)
344
365
  - name: SYNONYMS
345
366
  desc: >
@@ -379,11 +400,16 @@
379
400
  id: UP
380
401
  file: 04-REQS-UP-User-Personas.md
381
402
  desc: >
382
- The *archetypal* user profiles representing distinct user groups, capturing their goals,
383
- needs, behaviors, and context, complemented by the non-user stakeholders whose interests
384
- the solution has to serve.
403
+ The roles the parties play towards the solution and the *archetypal* user profiles
404
+ embodying them: a role names the part played (by a human or by an external system) and
405
+ is the actor of the Use Cases and the Domain Workflows and the unit in which the
406
+ Authorization Model grants rights, while a persona represents a distinct user group
407
+ holding one or more roles, capturing its goals, needs, behaviors, and context,
408
+ complemented by the non-user stakeholders whose interests the solution has to serve.
385
409
  optional: true
386
410
  refs: >
411
+ - Cockburn: Writing Effective Use Cases (2001),
412
+ https://www.informit.com/store/writing-effective-use-cases-9780201702255
387
413
  - Cooper: The Inmates Are Running the Asylum, 2nd ed. (2004),
388
414
  https://www.informit.com/store/inmates-are-running-the-asylum-why-high-tech-products-9780672326141
389
415
  - Cooper et al.: About Face: The Essentials of Interaction Design, 4th ed. (2014),
@@ -391,15 +417,60 @@
391
417
  - Pruitt/Adlin: The Persona Lifecycle: Keeping People in Mind Throughout Product Design (2006),
392
418
  https://www.sciencedirect.com/book/9780125662512/the-persona-lifecycle
393
419
  diagram:
394
- type: grid
395
- nodes: "[[PERSONA:*]]"
396
- properties:
397
- - TYPE
398
- - ROLE
420
+ type: graph
421
+ nodes: "[[ROLE:*]], [[PERSONA:*]]"
422
+ labeled: true
423
+ qualified: true
399
424
  config:
400
425
  size-node-width-max: 440
401
- grid-columns-max: 4
402
- childs:
426
+ children:
427
+ - kind: ROLE
428
+ desc: >
429
+ A single role, named with the canonical name of the part a party plays towards
430
+ the solution (e.g. `Moderator`, matching its GLOSSARY term of type `Actor`) and
431
+ described in a concise (1-2 sentence) paragraph by the responsibility the role
432
+ carries, plus a 1-sentence rationale ("why") stating why the part is cut this way.
433
+ A role is the name of a part and not of a person: the personas embodying it act in
434
+ exactly this part and hold exactly the rights the Authorization Model grants to it
435
+ (plus those of the roles it `INHERITS`), while a persona holding several roles
436
+ holds the union of them.
437
+ format:
438
+ maxTableColumns: 5
439
+ referenced:
440
+ - "[[*]]"
441
+ diagram:
442
+ type: hub
443
+ center: self
444
+ nodes: "[[ROLE:*]], [[TERM:*]], [[PERSONA:*]], [[ACTIVITY:*]], [[USE-CASE:*]],
445
+ [[CV.ENTITY:*]]"
446
+ labeled: true
447
+ qualified: true
448
+ config:
449
+ size-node-width-max: 440
450
+ size-node-height-scale: 1.75
451
+ props:
452
+ - name: TYPE
453
+ desc: >
454
+ Whether the role is played by a `Person`, i.e. a human part embodied by at
455
+ least one persona, or by a `System`, i.e. an external system acting towards
456
+ the solution (e.g. a registration system calling the machine-facing
457
+ interface), which no persona embodies.
458
+ value: enum(Person,System)
459
+ - name: TERM
460
+ desc: >
461
+ Reference to the GLOSSARY term of type `Actor` the role plays, anchoring
462
+ the role in the ubiquitous language.
463
+ value: "[[TERM:*]]"
464
+ optional: true
465
+ - name: INHERITS
466
+ desc: >
467
+ Comma-separated references to the other ROLE objects this role holds in
468
+ addition to its own (a role hierarchy, e.g. a manager inheriting the
469
+ rights of a moderator), where an inherited permission is not restated in
470
+ the Authorization Model.
471
+ value: list([[ROLE:*]])
472
+ optional: true
473
+ acyclic: true
403
474
  - kind: PERSONA
404
475
  desc: >
405
476
  An archetypal user profile, named with a per-artifact unique first name of the
@@ -409,8 +480,6 @@
409
480
  line. Non-user stakeholders are modeled as personas of type `Stakeholder`.
410
481
  format:
411
482
  maxTableColumns: 5
412
- referenced:
413
- - "[[ROLE:*]]"
414
483
  props:
415
484
  - name: TYPE
416
485
  desc: >
@@ -433,9 +502,14 @@
433
502
  The age in years of the persona.
434
503
  value: /^[0-9]+$/
435
504
  optional: true
436
- - name: ROLE
505
+ - name: ROLES
437
506
  desc: >
438
- The role of the persona.
507
+ Comma-separated references to the ROLE objects the persona embodies, i.e.
508
+ the parts it plays towards the solution and hence the rights it acts with,
509
+ so that every `User` persona holds at least one role; omitted for a
510
+ `Stakeholder` persona playing no part towards the solution itself.
511
+ value: list([[ROLE:*]])
512
+ optional: true
439
513
  - name: TERMS
440
514
  desc: >
441
515
  Comma-separated references to the GLOSSARY terms the persona embodies, i.e.
@@ -490,7 +564,7 @@
490
564
  nodes: "[[JOURNEY:*]]"
491
565
  properties:
492
566
  - ACTORS
493
- childs:
567
+ children:
494
568
  - kind: JOURNEY
495
569
  desc: >
496
570
  The end-to-end journey of a single persona (or of multiple personas sharing the same
@@ -501,7 +575,7 @@
501
575
  Comma-separated references to the User Personas objects experiencing the
502
576
  journey.
503
577
  value: list([[PERSONA:*]])
504
- childs:
578
+ children:
505
579
  - kind: STEP
506
580
  desc: >
507
581
  A single step of the journey, named with a 5-10 word summary of the step at
@@ -569,7 +643,7 @@
569
643
  config:
570
644
  size-node-width-max: 440
571
645
  grid-columns-max: 5
572
- childs:
646
+ children:
573
647
  - kind: REQUIREMENT
574
648
  desc: >
575
649
  A single functional requirement, named with a short (3-8 word) summary and described
@@ -628,7 +702,7 @@
628
702
  config:
629
703
  size-node-width-max: 440
630
704
  grid-columns-max: 5
631
- childs:
705
+ children:
632
706
  - kind: REQUIREMENT
633
707
  desc: >
634
708
  A single non-functional requirement, named with a short (3-8 word) summary and
@@ -703,7 +777,7 @@
703
777
  config:
704
778
  size-node-width-max: 440
705
779
  grid-columns-max: 5
706
- childs:
780
+ children:
707
781
  - kind: RULE
708
782
  desc: >
709
783
  A single domain rule, named with a short (3-8 word) summary and described in a
@@ -806,7 +880,7 @@
806
880
  size-node-width-max: 440
807
881
  size-node-height-scale: 2
808
882
  grid-columns-max: 4
809
- childs:
883
+ children:
810
884
  - kind: WORKFLOW
811
885
  desc: >
812
886
  A single workflow, named with a short (2-5 word) summary phrased as the outcome
@@ -822,6 +896,10 @@
822
896
  The workflow is at summary level, above the user-goal level of the Use Cases: it
823
897
  spans several actors and several sittings, and its activities leave the
824
898
  step-by-step interaction with the solution to the use cases referencing them.
899
+ An activity and a use case relate n:m -- an activity is covered by several use
900
+ cases, a use case spans several activities, and an activity performed outside the
901
+ solution is covered by none at all -- so the workflow is no mere sequence of use
902
+ cases and cannot be assembled from them.
825
903
  automaton:
826
904
  nodes: ACTIVITY
827
905
  edges: HANDOFF
@@ -835,17 +913,19 @@
835
913
  edgeSource: FROM
836
914
  edgeTarget: TO
837
915
  onlyConnected: true
838
- properties:
839
- - ACTOR
916
+ qualified: true
917
+ nest:
918
+ properties:
919
+ - ACTOR
840
920
  config:
841
921
  size-node-width-max: 440
842
922
  props:
843
923
  - name: ACTORS
844
924
  desc: >
845
- Comma-separated references to the User Personas objects taking part in the
846
- workflow, in the order of their first appearance, so that every `ACTOR` of
847
- an activity is listed here.
848
- value: list([[PERSONA:*]])
925
+ Comma-separated references to the User Personas ROLE objects taking part
926
+ in the workflow, in the order of their first appearance, so that every
927
+ `ACTOR` of an activity is listed here.
928
+ value: list([[ROLE:*]])
849
929
  - name: OWNER
850
930
  desc: >
851
931
  Reference to the User Personas object (usually a `Stakeholder`) accountable
@@ -881,7 +961,7 @@
881
961
  checked at a single handoff is referenced from the handoff instead.
882
962
  value: list([[RULE:*]])
883
963
  optional: true
884
- childs:
964
+ children:
885
965
  - kind: ACTIVITY
886
966
  desc: >
887
967
  A single unit of work within the workflow, performed by one party without a
@@ -895,12 +975,12 @@
895
975
  props:
896
976
  - name: ACTOR
897
977
  desc: >
898
- Reference to the User Personas object performing the activity, or
899
- `System` for an activity the solution performs on its own (e.g.
978
+ Reference to the User Personas ROLE object performing the activity,
979
+ or `System` for an activity the solution performs on its own (e.g.
900
980
  sending the invitations) or `Time` for a waiting period ending with
901
981
  a deadline; several parties are given only for an activity they
902
982
  perform jointly, as a change of the acting party is a handoff.
903
- value: list([[PERSONA:*]], enum(System,Time))
983
+ value: list([[ROLE:*]], enum(System,Time))
904
984
  - name: INITIAL
905
985
  desc: >
906
986
  Whether the activity is the initial one, i.e. the single activity
@@ -969,12 +1049,14 @@
969
1049
  - Jacobson/Spence/Bittner: Use-Case 2.0: The Guide to Succeeding with Use Cases (2011),
970
1050
  https://www.ivarjacobson.com/publications/white-papers/use-case-20-e-book
971
1051
  diagram:
972
- type: grid
973
- nodes: "[[USE-CASE:*]]"
1052
+ type: graph
1053
+ nodes: "[[USE-CASE:*]], [[ROLE:*]]"
1054
+ labeled: true
1055
+ qualified: true
1056
+ onlyConnected: true
974
1057
  config:
975
- size-node-height-scale: 4
976
- grid-columns-max: 4
977
- childs:
1058
+ size-node-width-max: 440
1059
+ children:
978
1060
  - kind: USE-CASE
979
1061
  desc: >
980
1062
  A discrete goal a user pursues with the solution, named with a short (3-8 word)
@@ -987,12 +1069,15 @@
987
1069
  The use case is at user-goal level: a goal the actor completes in one sitting,
988
1070
  neither a summary of many sittings and actors (which belongs to a Domain Workflow
989
1071
  as a whole, or to a User Journey when seen by a single persona) nor a single
990
- interaction (which belongs to a scenario as one of its steps).
1072
+ interaction (which belongs to a scenario as one of its steps). Its `ACTIVITIES`
1073
+ relate it n:m to the Domain Workflow activities -- a use case spans several
1074
+ activities and an activity is covered by several use cases -- so the two decompose
1075
+ the same domain independently instead of nesting into each other.
991
1076
  diagram:
992
1077
  type: hub
993
1078
  center: self
994
- nodes: "[[USE-CASE:*]], [[PERSONA:*]], [[STEP:*]], [[ACTIVITY:*]],
995
- [[FR.REQUIREMENT:*]], [[RULE:*]], [[TRANSITION:*]]"
1079
+ nodes: "[[USE-CASE:*]], [[ROLE:*]], [[PERSONA:*]], [[STEP:*]], [[ACTIVITY:*]],
1080
+ [[FR.REQUIREMENT:*]], [[RULE:*]], [[TRANSITION:*]], [[PERMISSION:*]]"
996
1081
  labeled: true
997
1082
  qualified: true
998
1083
  config:
@@ -1001,9 +1086,18 @@
1001
1086
  props:
1002
1087
  - name: ACTOR
1003
1088
  desc: >
1004
- Reference to the PERSONAS object denoting the primary actor pursuing the
1005
- goal.
1006
- value: "[[PERSONA:*]]"
1089
+ Reference to the User Personas ROLE object denoting the primary actor
1090
+ pursuing the goal, i.e. the part played and not the person playing it, so
1091
+ that a use case is written once per role and not once per persona.
1092
+ value: "[[ROLE:*]]"
1093
+ - name: PERSONAS
1094
+ desc: >
1095
+ Comma-separated references to the User Personas objects taking the
1096
+ `ACTOR` role in this use case, i.e. the archetypes for which its flow is
1097
+ worked out in the Dialog Storyboard and the Test Cases; omitted when every
1098
+ persona holding the role pursues the goal alike.
1099
+ value: list([[PERSONA:*]])
1100
+ optional: true
1007
1101
  - name: JOURNEYS
1008
1102
  desc: >
1009
1103
  Comma-separated references to the User Journey STEP objects the use case
@@ -1056,7 +1150,7 @@
1056
1150
  desc: >
1057
1151
  The condition that holds after the use case completes successfully.
1058
1152
  optional: true
1059
- childs:
1153
+ children:
1060
1154
  - kind: SCENARIO
1061
1155
  desc: >
1062
1156
  A concrete step-by-step flow of the use case, named with a short (3-8 word)
@@ -1122,7 +1216,7 @@
1122
1216
  type: graph
1123
1217
  nodes: "[[DM.ENTITY:*]]"
1124
1218
  edges: "[[RELATION:*]]"
1125
- childs:
1219
+ children:
1126
1220
  - kind: ENTITY
1127
1221
  name: "[A-Z][a-zA-Z0-9]*"
1128
1222
  desc: >
@@ -1132,10 +1226,13 @@
1132
1226
  diagram:
1133
1227
  type: hub
1134
1228
  center: self
1135
- nodes: "[[DM.ENTITY:*]]"
1229
+ nodes: "[[DM.ENTITY:*]], [[FR.REQUIREMENT:*]], [[USE-CASE:*]]"
1136
1230
  edges: "[[RELATION:*]]"
1231
+ labeled: true
1232
+ qualified: true
1137
1233
  config:
1138
1234
  size-node-width-max: 440
1235
+ size-node-height-scale: 1.75
1139
1236
  props:
1140
1237
  - name: REQUIREMENTS
1141
1238
  desc: >
@@ -1144,6 +1241,16 @@
1144
1241
  tracing the requirements into the data model.
1145
1242
  value: list([[FR.*]])
1146
1243
  optional: true
1244
+ - name: USE-CASES
1245
+ desc: >
1246
+ Comma-separated references to the USE-CASES objects whose scenarios
1247
+ create, read, update, or delete instances of the entity, tracing the use
1248
+ cases into the data model, so that every entity shows where its data
1249
+ comes from and where it goes; omitted for an entity no actor goal touches
1250
+ (e.g. a purely system-maintained one, justified by its `REQUIREMENTS`
1251
+ alone).
1252
+ value: list([[USE-CASE:*]])
1253
+ optional: true
1147
1254
  - name: TERMS
1148
1255
  desc: >
1149
1256
  Comma-separated references to the GLOSSARY terms the entity materializes,
@@ -1151,7 +1258,7 @@
1151
1258
  is anchored in the ubiquitous language and every term shows its data.
1152
1259
  value: list([[TERM:*]])
1153
1260
  optional: true
1154
- childs:
1261
+ children:
1155
1262
  - kind: ATTRIBUTE
1156
1263
  name: "[a-z][a-zA-Z0-9]*"
1157
1264
  desc: >
@@ -1264,7 +1371,7 @@
1264
1371
  size-node-width-max: 440
1265
1372
  size-node-height-scale: 2
1266
1373
  grid-columns-max: 5
1267
- childs:
1374
+ children:
1268
1375
  - kind: LIFECYCLE
1269
1376
  desc: >
1270
1377
  The lifecycle of a single entity, named with the short (1-3 word) name of the
@@ -1290,6 +1397,7 @@
1290
1397
  - FINAL
1291
1398
  config:
1292
1399
  size-node-width-max: 440
1400
+ size-node-height-scale: 1.75
1293
1401
  props:
1294
1402
  - name: ENTITY
1295
1403
  desc: >
@@ -1297,7 +1405,7 @@
1297
1405
  lifecycle per entity (an entity without a lifecycle has a trivial one).
1298
1406
  value: "[[DM.ENTITY:*]]"
1299
1407
  unique: true
1300
- childs:
1408
+ children:
1301
1409
  - kind: STATE
1302
1410
  name: "[A-Z][a-zA-Z0-9]*"
1303
1411
  desc: >
@@ -1354,11 +1462,12 @@
1354
1462
  local: true
1355
1463
  - name: ACTOR
1356
1464
  desc: >
1357
- Comma-separated references to the PERSONAS objects able to trigger
1358
- the transition, and/or `System` for a transition the solution
1359
- triggers on its own or `Time` for one triggered by the passing of
1360
- time (e.g. an expiry); omitted when the trigger is irrelevant.
1361
- value: list([[PERSONA:*]], enum(System,Time))
1465
+ Comma-separated references to the User Personas ROLE objects able
1466
+ to trigger the transition, and/or `System` for a transition the
1467
+ solution triggers on its own or `Time` for one triggered by the
1468
+ passing of time (e.g. an expiry); omitted when the trigger is
1469
+ irrelevant.
1470
+ value: list([[ROLE:*]], enum(System,Time))
1362
1471
  optional: true
1363
1472
  - name: GUARD
1364
1473
  desc: >
@@ -1378,9 +1487,12 @@
1378
1487
  Comma-separated references to the USE-CASES objects whose
1379
1488
  scenarios trigger the transition, i.e. in which a scenario step
1380
1489
  causes the state change, tracing the transition into the use
1381
- cases exercising it; omitted for a transition no use case
1382
- triggers (e.g. one triggered by `Time` or by the system alone).
1383
- value: list([[USE-CASE:*]])
1490
+ cases exercising it, or, where not every scenario of a use case
1491
+ triggers it, to the very `SCENARIO` objects doing so, tracing
1492
+ the transition into the step-by-step flows causing it; omitted
1493
+ for a transition no use case triggers (e.g. one triggered by
1494
+ `Time` or by the system alone).
1495
+ value: list([[USE-CASE:*]], [[SCENARIO:*]])
1384
1496
  optional: true
1385
1497
 
1386
1498
  - kind: DATA
@@ -1388,13 +1500,13 @@
1388
1500
  id: AM
1389
1501
  file: 13-DATA-AM-Authorization-Model.md
1390
1502
  desc: >
1391
- The access rights of the solution, bundled into the roles a person acts in and stating for
1392
- each role the operations it may perform on each entity, confined to the lifecycle states
1393
- of the entity and to a further condition where necessary, so that "who may do what on
1394
- which entity in which state" is answered in one place instead of being scattered over the
1395
- actors of the state transitions, the actors of the use cases, and the prose of the domain
1396
- rules. The model is closed: an operation not granted to a role is forbidden, exactly like
1397
- a move not listed as a state transition.
1503
+ The access rights of the solution, granted to the roles of the User Personas and stating
1504
+ for each role the operations it may perform on each entity, confined to the lifecycle
1505
+ states of the entity and to a further condition where necessary, so that "who may do what
1506
+ on which entity in which state" is answered in one place instead of being scattered over
1507
+ the actors of the state transitions, the actors of the use cases, and the prose of the
1508
+ domain rules. The model is closed: an operation not granted to a role is forbidden,
1509
+ exactly like a move not listed as a state transition.
1398
1510
  optional: true
1399
1511
  refs: >
1400
1512
  - Ferraiolo/Kuhn: Role-Based Access Controls, 15th National Computer Security Conference (1992),
@@ -1409,110 +1521,81 @@
1409
1521
  type: graph
1410
1522
  nodes: "[[ROLE:*]], [[DM.ENTITY:*]]"
1411
1523
  edges: "[[PERMISSION:*]]"
1524
+ edgeSource: ROLE
1412
1525
  edgeTarget: ENTITY
1413
1526
  onlyConnected: true
1414
1527
  qualified: true
1415
1528
  config:
1416
1529
  size-node-width-max: 440
1417
1530
  graph-channel-width-max: 340
1418
- childs:
1419
- - kind: ROLE
1531
+ children:
1532
+ - kind: PERMISSION
1420
1533
  desc: >
1421
- A single role, named with the canonical name of the domain role it grants (e.g.
1422
- `Moderator`, matching its GLOSSARY term of type `Actor`) and described in a concise
1423
- (1-2 sentence) paragraph by the responsibility the role carries, plus a 1-sentence
1424
- rationale ("why") stating why the rights are bundled this way. A role is the unit
1425
- in which rights are granted to a person: the personas embodying it hold exactly
1426
- its `PERMISSION` objects (plus those of the roles it `INHERITS`), while a persona
1427
- holding several roles holds the union of their permissions.
1428
- diagram:
1429
- type: hub
1430
- center: self
1431
- deep: true
1432
- nodes: "[[ROLE:*]], [[PERSONA:*]], [[TERM:*]], [[DM.ENTITY:*]], [[RULE:*]]"
1433
- labeled: true
1434
- qualified: true
1435
- config:
1436
- size-node-width-max: 440
1437
- size-node-height-scale: 1.75
1534
+ A single right of a role on a single entity, named with a short (2-5 word) verb
1535
+ phrase of what the role may do (e.g. `Decide Pending Messages`) and described by
1536
+ a 1-sentence description of the right, in particular of the reach of its
1537
+ `CONDITION`. One permission covers one entity: the operations it grants, the
1538
+ states of the entity in which they are granted, and the condition under which
1539
+ they are granted, so that the permissions of all roles form the access matrix of
1540
+ roles against entities. Any operation, state, or condition not covered by a
1541
+ permission of the role (or of a role it `INHERITS`) is forbidden.
1542
+ format:
1543
+ maxTableColumns: 8
1438
1544
  props:
1439
- - name: ACTORS
1545
+ - name: ROLE
1440
1546
  desc: >
1441
- Comma-separated references to the User Personas objects embodying the
1442
- role, i.e. the personas acting with exactly its rights, so that every
1443
- persona holds at least one role and its rights are stated here rather than
1444
- implied by its `ROLE` description, and/or to the GLOSSARY terms of type
1445
- `Actor` denoting the external systems holding the role (e.g. a registration
1446
- system calling the machine-facing interface), as an external system is no
1447
- persona.
1448
- value: list([[PERSONA:*]], [[TERM:*]])
1449
- - name: TERM
1547
+ Reference to the User Personas ROLE object the permission is granted to,
1548
+ so that the permissions of a role are found by its references.
1549
+ value: "[[ROLE:*]]"
1550
+ - name: ENTITY
1551
+ desc: Reference to the DATA-MODEL entity the permission is granted on.
1552
+ value: "[[DM.ENTITY:*]]"
1553
+ - name: OPERATIONS
1554
+ desc: >
1555
+ Comma-separated operations the role may perform on the entity: the
1556
+ generic `Create`, `Read`, `Update`, and `Delete`, and/or references to
1557
+ the STATE-MODEL transitions of the entity the role may trigger (a state
1558
+ change is not an `Update`: it is granted by its transition only), where
1559
+ every role named as `ACTOR` of a transition holds a permission granting
1560
+ it.
1561
+ value: list(enum(Create,Read,Update,Delete), [[TRANSITION:*]])
1562
+ - name: STATES
1563
+ desc: >
1564
+ Comma-separated references to the STATE-MODEL states of the entity in
1565
+ which the operations are granted (`Create` needs none, as a creation
1566
+ enters the initial state); omitted when granted in every state or when
1567
+ the entity has no lifecycle.
1568
+ value: list([[STATE:*]])
1569
+ optional: true
1570
+ - name: CONDITION
1571
+ desc: >
1572
+ The condition which, beyond the role and the `STATES`, has to hold for
1573
+ the operations to be granted, stated as a 1-sentence statement of what
1574
+ has to hold, typically the ownership of the instance (e.g. `The attendee
1575
+ is the sender of the message.`), a confinement to certain attributes
1576
+ (e.g. `The update is confined to the presenter alert.`), or a
1577
+ configuration of the surrounding entity; omitted when the role and the
1578
+ states alone grant the operations.
1579
+ optional: true
1580
+ - name: RULES
1450
1581
  desc: >
1451
- Reference to the GLOSSARY term of type `Actor` the role grants, anchoring
1452
- the role in the ubiquitous language.
1453
- value: "[[TERM:*]]"
1582
+ Comma-separated references to the DOMAIN-RULES objects justifying or
1583
+ bounding the permission, i.e. the rules whose statement grants or limits
1584
+ the right.
1585
+ value: list([[RULE:*]])
1454
1586
  optional: true
1455
- - name: INHERITS
1587
+ - name: USE-CASES
1456
1588
  desc: >
1457
- Comma-separated references to the other ROLE objects whose permissions
1458
- this role holds in addition to its own (a role hierarchy, e.g. a manager
1459
- inheriting the rights of a moderator), where an inherited permission is
1460
- not restated.
1461
- value: list([[ROLE:*]])
1589
+ Comma-separated references to the USE-CASES objects whose scenarios
1590
+ exercise the permission, i.e. in which a scenario step performs one of
1591
+ the granted operations, or, where not every scenario of a use case does
1592
+ so, to the very `SCENARIO` objects doing so, including the exceptional
1593
+ scenarios in which the solution refuses an operation at the boundary of
1594
+ the permission, tracing the permission into the step-by-step flows
1595
+ exercising and enforcing it; omitted for a permission exercised outside
1596
+ any use case (e.g. through the configuration).
1597
+ value: list([[USE-CASE:*]], [[SCENARIO:*]])
1462
1598
  optional: true
1463
- acyclic: true
1464
- childs:
1465
- - kind: PERMISSION
1466
- desc: >
1467
- A single right of the role on a single entity, named with a short (2-5
1468
- word) verb phrase of what the role may do (e.g. `Decide Pending Messages`)
1469
- and described by a 1-sentence description of the right, in particular of
1470
- the reach of its `CONDITION`. One permission covers one entity: the
1471
- operations it grants, the states of the entity in which they are granted,
1472
- and the condition under which they are granted, so that the permissions
1473
- of all roles form the access matrix of roles against entities. Any
1474
- operation, state, or condition not covered by a permission of the role (or
1475
- of an inherited one) is forbidden.
1476
- format:
1477
- maxTableColumns: 7
1478
- props:
1479
- - name: ENTITY
1480
- desc: Reference to the DATA-MODEL entity the permission is granted on.
1481
- value: "[[DM.ENTITY:*]]"
1482
- - name: OPERATIONS
1483
- desc: >
1484
- Comma-separated operations the role may perform on the entity: the
1485
- generic `Create`, `Read`, `Update`, and `Delete`, and/or references
1486
- to the STATE-MODEL transitions of the entity the role may trigger
1487
- (a state change is not an `Update`: it is granted by its transition
1488
- only), where every persona named as `ACTOR` of a transition holds
1489
- a role granting it.
1490
- value: list(enum(Create,Read,Update,Delete), [[TRANSITION:*]])
1491
- - name: STATES
1492
- desc: >
1493
- Comma-separated references to the STATE-MODEL states of the entity
1494
- in which the operations are granted (`Create` needs none, as a
1495
- creation enters the initial state); omitted when granted in every
1496
- state or when the entity has no lifecycle.
1497
- value: list([[STATE:*]])
1498
- optional: true
1499
- - name: CONDITION
1500
- desc: >
1501
- The condition which, beyond the role and the `STATES`, has to hold
1502
- for the operations to be granted, stated as a 1-sentence statement
1503
- of what has to hold, typically the ownership of the instance (e.g.
1504
- `The attendee is the sender of the message.`), a confinement to
1505
- certain attributes (e.g. `The update is confined to the presenter
1506
- alert.`), or a configuration of the surrounding entity; omitted
1507
- when the role and the states alone grant the operations.
1508
- optional: true
1509
- - name: RULES
1510
- desc: >
1511
- Comma-separated references to the DOMAIN-RULES objects justifying
1512
- or bounding the permission, i.e. the rules whose statement grants
1513
- or limits the right.
1514
- value: list([[RULE:*]])
1515
- optional: true
1516
1599
 
1517
1600
  - kind: APIS
1518
1601
  name: Interface Model
@@ -1544,7 +1627,7 @@
1544
1627
  properties:
1545
1628
  - KIND
1546
1629
  - DIRECTION
1547
- childs:
1630
+ children:
1548
1631
  - kind: INTERFACE
1549
1632
  desc: >
1550
1633
  A single interface, named with a short (2-5 word) summary (e.g. `Public REST API`,
@@ -1629,7 +1712,7 @@
1629
1712
  qualified: true
1630
1713
  config:
1631
1714
  size-node-width-max: 440
1632
- childs:
1715
+ children:
1633
1716
  - kind: TYPE
1634
1717
  name: "[A-Z][A-Za-z0-9_]*"
1635
1718
  desc: >
@@ -1691,7 +1774,7 @@
1691
1774
  entities), tracing the interface into the data model.
1692
1775
  value: list([[DM.ENTITY:*]])
1693
1776
  optional: true
1694
- childs:
1777
+ children:
1695
1778
  - kind: FIELD
1696
1779
  name: "[A-Za-z_][A-Za-z0-9_-]*"
1697
1780
  desc: >
@@ -1792,7 +1875,7 @@
1792
1875
  qualified: true
1793
1876
  config:
1794
1877
  size-node-width-max: 440
1795
- childs:
1878
+ children:
1796
1879
  - kind: ENDPOINT
1797
1880
  name: "[A-Za-z_][A-Za-z0-9_-]*"
1798
1881
  desc: >
@@ -1872,7 +1955,7 @@
1872
1955
  realizes, tracing the requirements into the interface.
1873
1956
  value: list([[USE-CASE:*]])
1874
1957
  optional: true
1875
- childs:
1958
+ children:
1876
1959
  - kind: OPTION
1877
1960
  name: "-{0,2}[A-Za-z_][A-Za-z0-9_-]*"
1878
1961
  desc: >
@@ -2034,7 +2117,7 @@
2034
2117
  size-node-width-max: 440
2035
2118
  size-node-height-scale: 2
2036
2119
  grid-columns-max: 4
2037
- childs:
2120
+ children:
2038
2121
  - kind: PRINCIPLE
2039
2122
  desc: >
2040
2123
  A single interaction principle, named with a short (2-5 word) summary (e.g.
@@ -2115,7 +2198,7 @@
2115
2198
  size-node-width-max: 440
2116
2199
  size-node-height-scale: 2
2117
2200
  grid-columns-max: 4
2118
- childs:
2201
+ children:
2119
2202
  - kind: CONVENTION
2120
2203
  desc: >
2121
2204
  A single language convention, named with a short (2-5 word) summary (e.g. `Neutral
@@ -2186,7 +2269,7 @@
2186
2269
  size-node-width-max: 440
2187
2270
  size-node-height-scale: 2
2188
2271
  grid-columns-max: 4
2189
- childs:
2272
+ children:
2190
2273
  - kind: PATTERN
2191
2274
  desc: >
2192
2275
  A single reusable dialog pattern, named with a short (2-5 word) summary (e.g.
@@ -2280,7 +2363,7 @@
2280
2363
  size-node-width-max: 440
2281
2364
  size-node-height-scale: 2
2282
2365
  grid-columns-max: 4
2283
- childs:
2366
+ children:
2284
2367
  - kind: STORYBOARD
2285
2368
  desc: >
2286
2369
  A single depicted dialog flow, named with a short (3-8 word) summary of the flow and
@@ -2312,7 +2395,7 @@
2312
2395
  interface, omitted for a storyboard of a flow no scenario covers.
2313
2396
  value: "[[SCENARIO:*]]"
2314
2397
  optional: true
2315
- childs:
2398
+ children:
2316
2399
  - kind: FRAME
2317
2400
  desc: >
2318
2401
  A single frame of the storyboard, named with a short (2-5 word) label for
@@ -2385,7 +2468,7 @@
2385
2468
  size-node-width-max: 440
2386
2469
  size-node-height-scale: 2
2387
2470
  grid-columns-max: 4
2388
- childs:
2471
+ children:
2389
2472
  - kind: ELEMENT
2390
2473
  desc: >
2391
2474
  A single visual design element, named with a short (2-5 word) summary (e.g. `Brand
@@ -2515,7 +2598,7 @@
2515
2598
  qualified: true
2516
2599
  properties:
2517
2600
  - KIND
2518
- childs:
2601
+ children:
2519
2602
  - kind: ENTITY
2520
2603
  desc: >
2521
2604
  A single external entity the solution interacts with, named with a short (2-5 word)
@@ -2571,13 +2654,12 @@
2571
2654
  optional: true
2572
2655
  - name: ACTORS
2573
2656
  desc: >
2574
- Comma-separated references to the User Personas objects acting behind the
2575
- entity: a `Person` entity is the boundary-level role class and the referenced
2576
- personas are its archetypes, while an `Organization` entity may reference
2577
- the `Stakeholder` personas representing it, so the entity aggregates the
2578
- personas instead of re-stating them; omitted when no persona stands behind
2579
- the entity.
2580
- value: list([[PERSONA:*]])
2657
+ Comma-separated references to the User Personas ROLE objects acting
2658
+ behind the entity: a `Person` entity is the boundary-level class of the
2659
+ `Person` roles acting through it, while a `System` entity may reference
2660
+ the `System` role it plays, so the entity aggregates the roles instead of
2661
+ re-stating them; omitted when no modeled role stands behind the entity.
2662
+ value: list([[ROLE:*]])
2581
2663
  optional: true
2582
2664
  - name: PREMISES
2583
2665
  desc: >
@@ -2612,9 +2694,12 @@
2612
2694
  type: graph
2613
2695
  nodes: "[[FV.COMPONENT:*]]"
2614
2696
  labeled: true
2697
+ nest:
2698
+ properties:
2699
+ - PART-OF
2615
2700
  properties:
2616
2701
  - KIND
2617
- childs:
2702
+ children:
2618
2703
  - kind: COMPONENT
2619
2704
  desc: >
2620
2705
  A single functional component, named with a short (2-5 word) summary (e.g.
@@ -2717,8 +2802,16 @@
2717
2802
  https://c4model.com/diagrams/container
2718
2803
  diagram:
2719
2804
  type: grid
2720
- nodes: "[[TS.TIER:*]]"
2721
- childs:
2805
+ nodes: "[[TS.TIER:*]], [[TS.TIER:*.COMPONENT:*]]"
2806
+ nest:
2807
+ parent: true
2808
+ layout: grid
2809
+ properties:
2810
+ - PRODUCT
2811
+ config:
2812
+ size-node-width-max: 440
2813
+ grid-columns-max: 3
2814
+ children:
2722
2815
  - kind: TIER
2723
2816
  desc: |
2724
2817
  The architectural tier grouping the technology components belonging to it, named
@@ -2742,7 +2835,7 @@
2742
2835
  config:
2743
2836
  size-node-width-max: 440
2744
2837
  size-node-height-scale: 1.75
2745
- childs:
2838
+ children:
2746
2839
  - kind: COMPONENT
2747
2840
  desc: >
2748
2841
  A single technology component, named with a short (2-5 word) summary (e.g.
@@ -3070,7 +3163,7 @@
3070
3163
  nodes: "[[ASPECT:*]]"
3071
3164
  properties:
3072
3165
  - CATEGORY
3073
- childs:
3166
+ children:
3074
3167
  - kind: ASPECT
3075
3168
  desc: >
3076
3169
  A single development aspect, named with a short (2-5 word) summary (e.g. `Module
@@ -3118,7 +3211,7 @@
3118
3211
  labeled: true
3119
3212
  properties:
3120
3213
  - KIND
3121
- childs:
3214
+ children:
3122
3215
  - kind: UNIT
3123
3216
  desc: >
3124
3217
  A single concurrency unit, named with a short (2-5 word) summary (e.g. `Web Worker
@@ -3207,14 +3300,18 @@
3207
3300
  type: graph
3208
3301
  nodes: "[[NODE:*]]"
3209
3302
  labeled: true
3303
+ qualified: true
3304
+ nest:
3305
+ properties:
3306
+ - PART-OF
3307
+ - TIER
3210
3308
  properties:
3211
- - TIER
3212
3309
  - AREA
3213
3310
  - KIND
3214
3311
  - PLATFORM
3215
3312
  config:
3216
3313
  size-node-width-max: 350
3217
- childs:
3314
+ children:
3218
3315
  - kind: TIER
3219
3316
  desc: >
3220
3317
  A single deployment tier, named with a short (1-3 word) summary (e.g. `Client`,
@@ -3455,7 +3552,7 @@
3455
3552
  nodes: "[[CONCERN:*]]"
3456
3553
  properties:
3457
3554
  - CATEGORY
3458
- childs:
3555
+ children:
3459
3556
  - kind: CONCERN
3460
3557
  desc: >
3461
3558
  A single operational concern, named with a short (2-5 word) summary (e.g. `Rolling
@@ -3567,7 +3664,7 @@
3567
3664
  nodes: "[[TACTIC:*]]"
3568
3665
  properties:
3569
3666
  - QUALITY
3570
- childs:
3667
+ children:
3571
3668
  - kind: TACTIC
3572
3669
  desc: >
3573
3670
  A single quality tactic, one architectural tactic applied to one quality attribute
@@ -3691,7 +3788,7 @@
3691
3788
  config:
3692
3789
  size-node-width-max: 440
3693
3790
  grid-columns-max: 5
3694
- childs:
3791
+ children:
3695
3792
  - kind: DECISION
3696
3793
  desc: |
3697
3794
  A single architecture decision, named with a short summary of the decision, not
@@ -3931,7 +4028,7 @@
3931
4028
  size-node-width-max: 440
3932
4029
  size-node-height-scale: 2
3933
4030
  grid-columns-max: 4
3934
- childs:
4031
+ children:
3935
4032
  - kind: TEST-CASE
3936
4033
  desc: >
3937
4034
  A single verifiable test case, named with a short (3-8 word) summary and defined by