@rse/specbook 1.2.4 → 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.
- package/README.md +12 -0
- package/dst/specbook-diagram.js +151 -19
- package/dst/specbook-export-html.css +178 -5
- package/dst/specbook-export-html.js +266 -4
- package/dst/specbook-export-pdf.js +30 -6
- package/dst/specbook-format-schema.d.ts +10 -0
- package/dst/specbook-format-schema.js +10 -0
- package/dst/specbook-format.md +76 -5
- package/dst/specbook-format.yaml +255 -158
- package/package.json +5 -5
package/dst/specbook-format.yaml
CHANGED
|
@@ -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,8 +245,8 @@
|
|
|
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
|
|
@@ -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
|
|
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
|
|
@@ -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
|
|
342
|
-
|
|
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
|
|
383
|
-
|
|
384
|
-
the
|
|
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:
|
|
395
|
-
nodes: "[[PERSONA:*]]"
|
|
396
|
-
|
|
397
|
-
|
|
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
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:
|
|
505
|
+
- name: ROLES
|
|
437
506
|
desc: >
|
|
438
|
-
|
|
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.
|
|
@@ -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
|
-
|
|
839
|
-
|
|
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
|
|
846
|
-
workflow, in the order of their first appearance, so that every
|
|
847
|
-
an activity is listed here.
|
|
848
|
-
value: list([[
|
|
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
|
|
@@ -895,12 +975,12 @@
|
|
|
895
975
|
props:
|
|
896
976
|
- name: ACTOR
|
|
897
977
|
desc: >
|
|
898
|
-
Reference to the User Personas object performing the activity,
|
|
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([[
|
|
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,11 +1049,13 @@
|
|
|
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:
|
|
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-
|
|
976
|
-
grid-columns-max: 4
|
|
1058
|
+
size-node-width-max: 440
|
|
977
1059
|
children:
|
|
978
1060
|
- kind: USE-CASE
|
|
979
1061
|
desc: >
|
|
@@ -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
|
|
1005
|
-
goal.
|
|
1006
|
-
|
|
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
|
|
@@ -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,
|
|
@@ -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: >
|
|
@@ -1354,11 +1462,12 @@
|
|
|
1354
1462
|
local: true
|
|
1355
1463
|
- name: ACTOR
|
|
1356
1464
|
desc: >
|
|
1357
|
-
Comma-separated references to the
|
|
1358
|
-
the transition, and/or `System` for a transition the
|
|
1359
|
-
triggers on its own or `Time` for one triggered by the
|
|
1360
|
-
time (e.g. an expiry); omitted when the trigger is
|
|
1361
|
-
|
|
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
|
|
1382
|
-
triggers
|
|
1383
|
-
|
|
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,
|
|
1392
|
-
each role the operations it may perform on each entity, confined to the lifecycle
|
|
1393
|
-
of the entity and to a further condition where necessary, so that "who may do what
|
|
1394
|
-
which entity in which state" is answered in one place instead of being scattered over
|
|
1395
|
-
actors of the state transitions, the actors of the use cases, and the prose of the
|
|
1396
|
-
rules. The model is closed: an operation not granted to a role is forbidden,
|
|
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,6 +1521,7 @@
|
|
|
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
|
|
@@ -1416,103 +1529,73 @@
|
|
|
1416
1529
|
size-node-width-max: 440
|
|
1417
1530
|
graph-channel-width-max: 340
|
|
1418
1531
|
children:
|
|
1419
|
-
- kind:
|
|
1532
|
+
- kind: PERMISSION
|
|
1420
1533
|
desc: >
|
|
1421
|
-
A single
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
in which
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
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:
|
|
1545
|
+
- name: ROLE
|
|
1440
1546
|
desc: >
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
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
|
-
|
|
1452
|
-
the
|
|
1453
|
-
|
|
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:
|
|
1587
|
+
- name: USE-CASES
|
|
1456
1588
|
desc: >
|
|
1457
|
-
Comma-separated references to the
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
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
|
-
children:
|
|
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
|
|
@@ -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
|
|
2575
|
-
entity: a `Person` entity is the boundary-level
|
|
2576
|
-
|
|
2577
|
-
the `
|
|
2578
|
-
|
|
2579
|
-
|
|
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,6 +2694,9 @@
|
|
|
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
2702
|
children:
|
|
@@ -2717,7 +2802,15 @@
|
|
|
2717
2802
|
https://c4model.com/diagrams/container
|
|
2718
2803
|
diagram:
|
|
2719
2804
|
type: grid
|
|
2720
|
-
nodes: "[[TS.TIER:*]]"
|
|
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
|
|
2721
2814
|
children:
|
|
2722
2815
|
- kind: TIER
|
|
2723
2816
|
desc: |
|
|
@@ -3207,8 +3300,12 @@
|
|
|
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
|