@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.
- package/README.md +124 -204
- package/dst/specbook-cmd-export.js +4 -1
- package/dst/specbook-config.js +6 -6
- package/dst/specbook-diagram.js +154 -22
- package/dst/specbook-export-ast.js +1 -1
- package/dst/specbook-export-common.js +1 -1
- package/dst/specbook-export-html.css +178 -5
- package/dst/specbook-export-html.d.ts +1 -1
- package/dst/specbook-export-html.js +304 -42
- package/dst/specbook-export-md.js +9 -9
- package/dst/specbook-export-pdf.js +37 -13
- package/dst/specbook-format-schema.d.ts +11 -1
- package/dst/specbook-format-schema.js +12 -2
- package/dst/specbook-format-spec.d.ts +1 -1
- package/dst/specbook-format-spec.js +2 -2
- package/dst/specbook-format.md +80 -9
- package/dst/specbook-format.yaml +294 -197
- package/dst/specbook-link.js +2 -2
- package/dst/specbook-parse-semantic.js +22 -22
- package/dst/specbook-parse-syntax.js +5 -5
- package/dst/specbook-parse.js +1 -1
- package/package.json +6 -6
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,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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
@@ -490,7 +564,7 @@
|
|
|
490
564
|
nodes: "[[JOURNEY:*]]"
|
|
491
565
|
properties:
|
|
492
566
|
- ACTORS
|
|
493
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
@@ -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
|
-
|
|
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,
|
|
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,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:
|
|
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
|
-
|
|
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
|
|
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
|
|
@@ -1056,7 +1150,7 @@
|
|
|
1056
1150
|
desc: >
|
|
1057
1151
|
The condition that holds after the use case completes successfully.
|
|
1058
1152
|
optional: true
|
|
1059
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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,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
|
-
|
|
1419
|
-
- kind:
|
|
1531
|
+
children:
|
|
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
|
-
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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,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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|