@rse/ase 1.0.6 → 2.0.0
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/dst/ase-agent-definition-api.d.ts +184 -0
- package/dst/ase-agent-definition-api.js +6 -0
- package/dst/ase-agent-definition-builtin/condenser.js +42 -0
- package/dst/ase-agent-definition-builtin/editor.js +45 -0
- package/dst/ase-agent-definition-builtin/estimator.js +98 -0
- package/dst/ase-agent-definition-builtin/implementer.js +121 -0
- package/dst/ase-agent-definition-builtin/integrator.js +56 -0
- package/dst/ase-agent-definition-builtin/qualifier.js +61 -0
- package/dst/ase-agent-definition-builtin/rebooter.js +41 -0
- package/dst/ase-agent-definition-builtin/researcher.js +77 -0
- package/dst/ase-agent-definition-core.js +827 -0
- package/dst/ase-agent-fleet.js +772 -0
- package/dst/ase-agent-process.js +232 -0
- package/dst/ase-agent-relay-client.js +509 -0
- package/dst/ase-agent-relay-core.js +213 -0
- package/dst/ase-agent-relay-server-bind.js +242 -0
- package/dst/ase-agent-relay-server-cli.js +50 -0
- package/dst/ase-agent-runtime-claim.js +189 -0
- package/dst/ase-agent-runtime-engine.js +1100 -0
- package/dst/ase-agent-runtime-exec.js +275 -0
- package/dst/ase-agent-runtime-phase.js +581 -0
- package/dst/ase-agent-runtime-request.js +272 -0
- package/dst/ase-agent-runtime-tool.js +207 -0
- package/dst/ase-agent-runtime.js +1316 -0
- package/dst/ase-agent.js +65 -0
- package/dst/ase-artifact.js +6 -5
- package/dst/ase-config-core.js +465 -0
- package/dst/ase-config-schema.js +351 -0
- package/dst/ase-config-scope.js +172 -0
- package/dst/ase-config.js +25 -585
- package/dst/ase-hook.js +230 -116
- package/dst/ase-lib-daemon-cli.js +130 -0
- package/dst/ase-lib-hash.js +20 -0
- package/dst/{ase-log.js → ase-lib-log.js} +40 -7
- package/dst/ase-lib-server-bind.js +115 -0
- package/dst/ase-lib-server-cli.js +474 -0
- package/dst/{ase-table.js → ase-lib-table.js} +1 -1
- package/dst/{ase-version.js → ase-lib-version.js} +3 -0
- package/dst/ase-man.js +96 -0
- package/dst/ase-mcp.js +166 -13
- package/dst/{ase-getopt.js → ase-service-getopt.js} +82 -80
- package/dst/{ase-markdown.js → ase-service-markdown.js} +18 -11
- package/dst/ase-service-otel.js +1246 -0
- package/dst/{ase-skills.js → ase-service-skills.js} +29 -64
- package/dst/ase-service-state.js +101 -0
- package/dst/ase-service.js +251 -76
- package/dst/ase-setup-common.js +141 -0
- package/dst/ase-setup-mcp.js +359 -0
- package/dst/ase-setup-settings.js +837 -0
- package/dst/ase-setup.js +113 -869
- package/dst/ase-spec.js +31 -19
- package/dst/ase-statusline.js +108 -43
- package/dst/ase-task-board-core.js +739 -0
- package/dst/ase-task-board-filter.js +127 -0
- package/dst/ase-task-board-flow.js +237 -0
- package/dst/ase-task-board-graph.js +497 -0
- package/dst/ase-task-board-stats.js +263 -0
- package/dst/ase-task-board-tui-control.js +775 -0
- package/dst/ase-task-board-tui-model.js +1008 -0
- package/dst/ase-task-board-tui-popup.js +626 -0
- package/dst/ase-task-board-tui-style.js +106 -0
- package/dst/ase-task-board-tui-view.js +847 -0
- package/dst/ase-task-board-tui.js +189 -0
- package/dst/ase-task-board-web-client.css +1 -0
- package/dst/ase-task-board-web-client.html +20 -0
- package/dst/ase-task-board-web-client.js +81 -0
- package/dst/ase-task-board-web-server.js +823 -0
- package/dst/ase-task-board.js +134 -0
- package/dst/ase-task-format.js +757 -0
- package/dst/ase-task-request.js +208 -0
- package/dst/ase-task-store-client.js +495 -0
- package/dst/ase-task-store-core.js +804 -0
- package/dst/ase-task-store-issues.js +237 -0
- package/dst/ase-task-store-plugin-api.js +6 -0
- package/dst/ase-task-store-plugin-ase.js +484 -0
- package/dst/ase-task-store-plugin-delegate.js +137 -0
- package/dst/ase-task-store-plugin-gitea.js +666 -0
- package/dst/ase-task-store-plugin-github.js +696 -0
- package/dst/ase-task-store-plugin-gitlab.js +668 -0
- package/dst/ase-task-store-server-bind.js +538 -0
- package/dst/ase-task-store-server-cli.js +154 -0
- package/dst/ase-task.js +1335 -357
- package/dst/{ase-compat.js → ase-util-compat.js} +2 -2
- package/dst/{ase-diagram.js → ase-util-diagram.js} +107 -32
- package/dst/{ase-meta.js → ase-util-meta.js} +2 -2
- package/dst/{ase-metric.js → ase-util-metric.js} +2 -2
- package/dst/{ase-mint.js → ase-util-mint.js} +19 -12
- package/dst/{ase-worktree.js → ase-util-worktree.js} +30 -19
- package/dst/ase-util.js +20 -0
- package/dst/ase.js +108 -32
- package/dst/man/ase-agent-adhoc.1 +515 -0
- package/dst/man/ase-agent-condenser.1 +193 -0
- package/dst/man/ase-agent-editor.1 +212 -0
- package/dst/man/ase-agent-estimator.1 +214 -0
- package/dst/man/ase-agent-fleet.1 +185 -0
- package/dst/man/ase-agent-implementer.1 +233 -0
- package/dst/man/ase-agent-integrator.1 +213 -0
- package/dst/man/ase-agent-qualifier.1 +214 -0
- package/dst/man/ase-agent-rebooter.1 +193 -0
- package/dst/man/ase-agent-relay.1 +128 -0
- package/dst/man/ase-agent-researcher.1 +217 -0
- package/dst/man/ase-agent.1 +264 -0
- package/dst/man/ase-artifact-list.1 +38 -0
- package/dst/man/ase-artifact-name.1 +39 -0
- package/dst/man/ase-artifact.1 +56 -0
- package/dst/man/ase-config-delete.1 +45 -0
- package/dst/man/ase-config-edit.1 +48 -0
- package/dst/man/ase-config-get.1 +46 -0
- package/dst/man/ase-config-init.1 +60 -0
- package/dst/man/ase-config-list.1 +42 -0
- package/dst/man/ase-config-set.1 +52 -0
- package/dst/man/ase-config.1 +225 -0
- package/dst/man/ase-hook-permission-request.1 +36 -0
- package/dst/man/ase-hook-pre-tool-use.1 +59 -0
- package/dst/man/ase-hook-session-end.1 +47 -0
- package/dst/man/ase-hook-session-persona.1 +37 -0
- package/dst/man/ase-hook-session-start.1 +81 -0
- package/dst/man/ase-hook-stop.1 +34 -0
- package/dst/man/ase-hook-user-prompt-submit.1 +34 -0
- package/dst/man/ase-hook.1 +51 -0
- package/dst/man/ase-man.1 +67 -0
- package/dst/man/ase-mcp.1 +61 -0
- package/dst/man/ase-service-log.1 +43 -0
- package/dst/man/ase-service-send.1 +47 -0
- package/dst/man/ase-service-start.1 +54 -0
- package/dst/man/ase-service-status.1 +46 -0
- package/dst/man/ase-service-stop.1 +37 -0
- package/dst/man/ase-service.1 +85 -0
- package/dst/man/ase-setup-disable.1 +44 -0
- package/dst/man/ase-setup-enable.1 +45 -0
- package/dst/man/ase-setup-install.1 +73 -0
- package/dst/man/ase-setup-mcp.1 +124 -0
- package/dst/man/ase-setup-status.1 +60 -0
- package/dst/man/ase-setup-statusline.1 +92 -0
- package/dst/man/ase-setup-telemetry.1 +92 -0
- package/dst/man/ase-setup-uninstall.1 +59 -0
- package/dst/man/ase-setup-update.1 +64 -0
- package/dst/man/ase-setup.1 +93 -0
- package/dst/man/ase-spec-export.1 +62 -0
- package/dst/man/ase-spec-lint.1 +40 -0
- package/dst/man/ase-spec-preview.1 +40 -0
- package/dst/man/ase-spec.1 +46 -0
- package/dst/man/ase-statusline.1 +189 -0
- package/dst/man/ase-task-assign.1 +71 -0
- package/dst/man/ase-task-board.1 +384 -0
- package/dst/man/ase-task-delete.1 +35 -0
- package/dst/man/ase-task-edit.1 +46 -0
- package/dst/man/ase-task-idscheme.1 +65 -0
- package/dst/man/ase-task-lifecycle.1 +57 -0
- package/dst/man/ase-task-list.1 +47 -0
- package/dst/man/ase-task-load.1 +36 -0
- package/dst/man/ase-task-newid.1 +61 -0
- package/dst/man/ase-task-purge.1 +37 -0
- package/dst/man/ase-task-rename.1 +44 -0
- package/dst/man/ase-task-request.1 +61 -0
- package/dst/man/ase-task-save.1 +48 -0
- package/dst/man/ase-task-status.1 +55 -0
- package/dst/man/ase-task-store.1 +194 -0
- package/dst/man/ase-task-view.1 +40 -0
- package/dst/man/ase-task.1 +160 -0
- package/dst/man/ase-util-compat.1 +25 -0
- package/dst/man/ase-util-diagram.1 +76 -0
- package/dst/man/ase-util-meta.1 +45 -0
- package/dst/man/ase-util-metric.1 +54 -0
- package/dst/man/ase-util-mint.1 +59 -0
- package/dst/man/ase-util-worktree.1 +72 -0
- package/dst/man/ase-util.1 +50 -0
- package/dst/man/ase.1 +124 -0
- package/package.json +79 -21
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/.github/plugin/plugin.json +1 -1
- package/plugin/agents/ase-meta-diagram.md +12 -8
- package/plugin/agents/ase-repo-review.md +322 -0
- package/plugin/hooks/hooks-codex.json +5 -0
- package/plugin/hooks/hooks-copilot.json +5 -0
- package/plugin/hooks/hooks.json +8 -0
- package/plugin/meta/ase-common-approach.md +117 -0
- package/plugin/meta/ase-common-changeset.md +256 -0
- package/plugin/meta/ase-common-code.md +10 -173
- package/plugin/meta/ase-common-grill.md +317 -0
- package/plugin/meta/ase-common-resolve.md +305 -0
- package/plugin/meta/ase-common-task.md +83 -4
- package/plugin/meta/ase-constitution.md +0 -2
- package/plugin/meta/ase-format-specbook.md +208 -25
- package/plugin/meta/ase-format-specbook.yaml +242 -851
- package/plugin/meta/ase-format-task.md +669 -125
- package/plugin/meta/ase-persona.md +3 -4
- package/plugin/meta/ase-skill.md +9 -0
- package/plugin/mods/ase-mods.ts +409 -0
- package/plugin/mods/claude-code.d.ts +13417 -0
- package/plugin/skills/ase-arch-analyze/SKILL.md +1 -1
- package/plugin/skills/ase-arch-analyze/help.md +2 -2
- package/plugin/skills/ase-code-analyze/SKILL.md +59 -8
- package/plugin/skills/ase-code-analyze/help.md +29 -4
- package/plugin/skills/ase-code-edit/SKILL.md +107 -181
- package/plugin/skills/ase-code-edit/help.md +118 -31
- package/plugin/skills/ase-code-lint/SKILL.md +64 -13
- package/plugin/skills/ase-code-lint/help.md +32 -2
- package/plugin/skills/ase-docs-proofread/SKILL.md +4 -4
- package/plugin/skills/ase-docs-proofread/help.md +1 -1
- package/plugin/skills/ase-docs-refine/SKILL.md +4 -4
- package/plugin/skills/ase-docs-shorten/SKILL.md +4 -4
- package/plugin/skills/ase-help-intent/data.md +2164 -1087
- package/plugin/skills/ase-help-intent/help.md +1 -1
- package/plugin/skills/ase-help-skill/catalog.md +12 -9
- package/plugin/skills/ase-meta-brainstorm/SKILL.md +1 -1
- package/plugin/skills/ase-meta-config/SKILL.md +3 -4
- package/plugin/skills/ase-meta-config/help.md +31 -10
- package/plugin/skills/ase-meta-mint/SKILL.md +5 -5
- package/plugin/skills/ase-meta-mint/help.md +10 -5
- package/plugin/skills/ase-meta-why/help.md +1 -1
- package/plugin/skills/ase-meta-workflow/SKILL.md +7 -7
- package/plugin/skills/ase-meta-workflow/help.md +4 -4
- package/plugin/skills/ase-meta-workflow/sample.md +3 -3
- package/plugin/skills/ase-meta-workflow/workflow.txt +22 -18
- package/plugin/skills/{ase-meta-changelog → ase-repo-changelog}/SKILL.md +4 -3
- package/plugin/skills/{ase-meta-changelog → ase-repo-changelog}/help.md +5 -5
- package/plugin/skills/{ase-meta-commit → ase-repo-commit}/SKILL.md +6 -6
- package/plugin/skills/{ase-meta-commit → ase-repo-commit}/help.md +5 -5
- package/plugin/skills/{ase-meta-diff → ase-repo-diff}/SKILL.md +6 -6
- package/plugin/skills/{ase-meta-diff → ase-repo-diff}/help.md +8 -8
- package/plugin/skills/{ase-code-dissect → ase-repo-dissect}/SKILL.md +19 -19
- package/plugin/skills/{ase-code-dissect → ase-repo-dissect}/help.md +10 -12
- package/plugin/skills/ase-repo-merge/SKILL.md +346 -0
- package/plugin/skills/ase-repo-merge/help.md +107 -0
- package/plugin/skills/ase-repo-resolve/SKILL.md +158 -0
- package/plugin/skills/ase-repo-resolve/help.md +102 -0
- package/plugin/skills/ase-repo-review/SKILL.md +406 -0
- package/plugin/skills/ase-repo-review/help.md +181 -0
- package/plugin/skills/ase-spec-edit/SKILL.md +117 -183
- package/plugin/skills/ase-spec-edit/help.md +107 -26
- package/plugin/skills/ase-sync-reconcile/help.md +1 -1
- package/plugin/skills/ase-task-assign/SKILL.md +111 -0
- package/plugin/skills/ase-task-assign/help.md +119 -0
- package/plugin/skills/ase-task-condense/SKILL.md +21 -21
- package/plugin/skills/ase-task-condense/help.md +12 -10
- package/plugin/skills/ase-task-delete/SKILL.md +1 -1
- package/plugin/skills/ase-task-dissect/SKILL.md +71 -48
- package/plugin/skills/ase-task-dissect/help.md +10 -9
- package/plugin/skills/ase-task-edit/SKILL.md +379 -94
- package/plugin/skills/ase-task-edit/help.md +95 -22
- package/plugin/skills/ase-task-estimate/SKILL.md +492 -0
- package/plugin/skills/ase-task-estimate/help.md +158 -0
- package/plugin/skills/ase-task-grill/SKILL.md +246 -138
- package/plugin/skills/ase-task-grill/help.md +129 -26
- package/plugin/skills/ase-task-id/SKILL.md +8 -1
- package/plugin/skills/ase-task-id/help.md +6 -3
- package/plugin/skills/ase-task-implement/SKILL.md +535 -145
- package/plugin/skills/ase-task-implement/help.md +138 -47
- package/plugin/skills/ase-task-integrate/SKILL.md +549 -0
- package/plugin/skills/ase-task-integrate/help.md +187 -0
- package/plugin/skills/ase-task-list/SKILL.md +55 -23
- package/plugin/skills/ase-task-list/help.md +45 -21
- package/plugin/skills/ase-task-reboot/SKILL.md +84 -43
- package/plugin/skills/ase-task-reboot/help.md +28 -8
- package/plugin/skills/ase-task-rename/SKILL.md +10 -2
- package/plugin/skills/ase-task-research/SKILL.md +386 -0
- package/plugin/skills/ase-task-research/help.md +102 -0
- package/plugin/skills/ase-task-status/SKILL.md +137 -0
- package/plugin/skills/ase-task-status/help.md +80 -0
- package/plugin/skills/ase-task-view/SKILL.md +49 -24
- package/plugin/skills/ase-task-view/help.md +19 -9
- package/plugin/agents/ase-meta-review.md +0 -187
- package/plugin/skills/ase-code-craft/SKILL.md +0 -264
- package/plugin/skills/ase-code-craft/help.md +0 -122
- package/plugin/skills/ase-code-refactor/SKILL.md +0 -232
- package/plugin/skills/ase-code-refactor/help.md +0 -109
- package/plugin/skills/ase-code-resolve/SKILL.md +0 -289
- package/plugin/skills/ase-code-resolve/help.md +0 -116
- package/plugin/skills/ase-meta-review/SKILL.md +0 -210
- package/plugin/skills/ase-meta-review/help.md +0 -96
- package/plugin/skills/ase-task-preflight/SKILL.md +0 -166
- package/plugin/skills/ase-task-preflight/help.md +0 -82
- /package/dst/{ase-ignore.js → ase-lib-ignore.js} +0 -0
- /package/dst/{ase-stdio.js → ase-lib-stdio.js} +0 -0
- /package/dst/{ase-kv.js → ase-service-kv.js} +0 -0
- /package/dst/{ase-sleep.js → ase-service-sleep.js} +0 -0
- /package/dst/{ase-timestamp.js → ase-service-timestamp.js} +0 -0
|
@@ -5,23 +5,13 @@
|
|
|
5
5
|
desc: >
|
|
6
6
|
The top-level specification meta information. Some of the information is rendered onto the title page.
|
|
7
7
|
optional: true
|
|
8
|
-
diagram:
|
|
9
|
-
type: graph
|
|
10
|
-
nodes: "[[REQS:*]], [[DATA:*]], [[APIS:*]], [[UXUI:*]], [[ARCH:*]], [[TEST:*]]"
|
|
11
|
-
deep: true
|
|
12
|
-
qualified: true
|
|
13
|
-
ordered: true
|
|
14
|
-
nest:
|
|
15
|
-
kind: true
|
|
16
|
-
crossing: target
|
|
17
|
-
config:
|
|
18
|
-
graph-columns-max: 2
|
|
19
8
|
props:
|
|
20
9
|
- name: LOGO
|
|
21
10
|
desc: The logo of the specification.
|
|
22
11
|
optional: true
|
|
23
12
|
- name: TITLE
|
|
24
13
|
desc: The title of the specification.
|
|
14
|
+
optional: true
|
|
25
15
|
- name: SUBTITLE
|
|
26
16
|
desc: The subtitle of the specification.
|
|
27
17
|
optional: true
|
|
@@ -48,8 +38,8 @@
|
|
|
48
38
|
value: enum(Dark,Light)
|
|
49
39
|
optional: true
|
|
50
40
|
- name: THEME-TONE
|
|
51
|
-
desc: The theme color tone.
|
|
52
|
-
value: /^#[0-9a-fA-F]{6}
|
|
41
|
+
desc: The theme color tone, optionally followed by the complement color tone (else derived).
|
|
42
|
+
value: /^#[0-9a-fA-F]{6}(\s+#[0-9a-fA-F]{6})?$/
|
|
53
43
|
optional: true
|
|
54
44
|
|
|
55
45
|
- kind: REQS
|
|
@@ -59,26 +49,23 @@
|
|
|
59
49
|
desc: >
|
|
60
50
|
The high-level, aspirational description of the solution, capturing why it exists, whom it serves, what it is, which benefit it offers, how it differs from the alternatives, where its boundary runs, how its achievement is measured, and the desired future state it aims to achieve. Every vision aspect is stated in a concise (1-3 sentence) paragraph in an aspirational but unambiguous tone.
|
|
61
51
|
optional: true
|
|
62
|
-
refs: >
|
|
63
|
-
- ISO/IEC/IEEE 29148:2018: Systems and software engineering -- Life cycle processes -- Requirements engineering (2018),
|
|
64
|
-
https://www.iso.org/standard/72089.html
|
|
65
|
-
- Moore: Crossing the Chasm, 3rd ed. (2014),
|
|
66
|
-
https://www.harperbusiness.com/book/9780062293008/Crossing-the-Chasm-3rd-Edition-Geoffrey-A.-Moore/
|
|
67
|
-
- Pichler: The Product Vision Board (2011),
|
|
68
|
-
https://www.romanpichler.com/tools/product-vision-board/
|
|
69
52
|
props:
|
|
70
53
|
- name: PURPOSE
|
|
71
54
|
desc: >
|
|
72
55
|
Why the solution exists.
|
|
56
|
+
optional: true
|
|
73
57
|
- name: TARGET-AUDIENCE
|
|
74
58
|
desc: >
|
|
75
59
|
Whom the solution serves.
|
|
60
|
+
optional: true
|
|
76
61
|
- name: SOLUTION
|
|
77
62
|
desc: >
|
|
78
63
|
What the solution is, in a single sentence naming its kind or category (e.g. a self-hosted, browser-based streaming platform).
|
|
64
|
+
optional: true
|
|
79
65
|
- name: VALUE-PROPOSITION
|
|
80
66
|
desc: >
|
|
81
67
|
The benefit the solution offers its target audience, stated in absolute terms without reference to alternatives.
|
|
68
|
+
optional: true
|
|
82
69
|
- name: DIFFERENTIATORS
|
|
83
70
|
desc: >
|
|
84
71
|
How the solution stands apart from the alternatives, naming the alternatives it is compared against (including the status quo).
|
|
@@ -105,34 +92,13 @@
|
|
|
105
92
|
|
|
106
93
|
The premises are not constraints: a constraint is imposed on the solution and belongs to the Non-Functional Requirements or the Domain Rules, whereas a premise lies outside the control of the solution.
|
|
107
94
|
optional: true
|
|
108
|
-
refs: >
|
|
109
|
-
- ISO/IEC/IEEE 29148:2018: Systems and software engineering -- Life cycle processes -- Requirements engineering (2018),
|
|
110
|
-
https://www.iso.org/standard/72089.html
|
|
111
|
-
- Robertson/Robertson: Volere Requirements Specification Template, 18th ed. (2018),
|
|
112
|
-
https://www.volere.org/templates/volere-requirements-specification-template/
|
|
113
|
-
- ISO 31000:2018: Risk management -- Guidelines (2018),
|
|
114
|
-
https://www.iso.org/standard/65694.html
|
|
115
|
-
- Boehm: Software Risk Management: Principles and Practices, IEEE Software 8(1) (1991),
|
|
116
|
-
https://doi.org/10.1109/52.62930
|
|
117
|
-
diagram:
|
|
118
|
-
type: grid
|
|
119
|
-
nodes: "[[PREMISE:*]]"
|
|
120
|
-
properties:
|
|
121
|
-
- TYPE
|
|
122
|
-
- FAILURE-LIKELIHOOD
|
|
123
|
-
- FAILURE-IMPACT
|
|
124
|
-
config:
|
|
125
|
-
size-node-width-max: 440
|
|
126
|
-
size-node-height-scale: 1.75
|
|
127
|
-
grid-columns-max: 5
|
|
128
95
|
children:
|
|
129
96
|
- kind: PREMISE
|
|
130
97
|
desc: >
|
|
131
98
|
A single premise, named with a short (3-8 word) summary phrased as the fact taken as given or the event feared (e.g. `Streaming Providers Deliver the Video`, `Access URLs Forwarded Beyond the Audience`) and described in a concise (1-3 sentence) paragraph as a declarative statement of what is held true (an `Assumption` or `Dependency`) or what may happen (a `Risk`), plus a 1-sentence rationale ("why") stating the evidence or agreement the premise rests on or the cause the risk stems from.
|
|
132
99
|
|
|
133
100
|
A premise is outside the control of the solution (a condition the solution enforces itself is a Domain Rule or a Non-Functional Requirement instead) and states a fact or event, not a decision (a deliberate exclusion is the `SCOPE` of the Solution Vision or a `WONT` requirement instead).
|
|
134
|
-
|
|
135
|
-
maxTableColumns: 5
|
|
101
|
+
optional: true
|
|
136
102
|
props:
|
|
137
103
|
- name: TYPE
|
|
138
104
|
desc: >
|
|
@@ -161,21 +127,6 @@
|
|
|
161
127
|
desc: >
|
|
162
128
|
The ubiquitous language of the domain, defining the meaning of each domain term in business language, together with its synonyms, its place in the hierarchy of terms, and the terms it has to be kept apart from, shared consistently across all Artifacts.
|
|
163
129
|
optional: true
|
|
164
|
-
refs: >
|
|
165
|
-
- ISO 704:2022: Terminology work -- Principles and methods (2022),
|
|
166
|
-
https://www.iso.org/standard/79077.html
|
|
167
|
-
- ISO 1087:2019: Terminology work and terminology science -- Vocabulary (2019),
|
|
168
|
-
https://www.iso.org/standard/62330.html
|
|
169
|
-
- Evans: Domain-Driven Design: Tackling Complexity in the Heart of Software (2003),
|
|
170
|
-
https://www.domainlanguage.com/ddd/
|
|
171
|
-
diagram:
|
|
172
|
-
type: grid
|
|
173
|
-
nodes: "[[TERM:*]]"
|
|
174
|
-
properties:
|
|
175
|
-
- TYPE
|
|
176
|
-
config:
|
|
177
|
-
size-node-width-max: 440
|
|
178
|
-
grid-columns-max: 4
|
|
179
130
|
children:
|
|
180
131
|
- kind: TERM
|
|
181
132
|
name: "[A-Z][A-Za-z0-9-]*( [A-Z][A-Za-z0-9-]*)*"
|
|
@@ -183,19 +134,9 @@
|
|
|
183
134
|
A single domain term, named with its canonical, preferred form (each word capitalized, as it should appear in all artifacts) and defined in a concise (1-3 sentence) paragraph in business language, independent of any implementation, referencing other terms by their name where helpful.
|
|
184
135
|
|
|
185
136
|
The definition is intensional (ISO 704): it opens with the superordinate concept (the `BROADER` term where one exists) and adds the characteristics delimiting the term from its siblings (e.g. `A Message submitted by an Attendee as ...`), so that the hierarchy and the definitions cross-check each other.
|
|
186
|
-
|
|
187
|
-
maxTableColumns: 5
|
|
137
|
+
optional: true
|
|
188
138
|
referenced:
|
|
189
139
|
- "[[*]]"
|
|
190
|
-
diagram:
|
|
191
|
-
type: hub
|
|
192
|
-
center: self
|
|
193
|
-
nodes: "[[TERM:*]], [[PREMISE:*]], [[RULE:*]], [[DM.ENTITY:*]], [[ROLE:*]], [[PERSONA:*]], [[WORKFLOW:*]], [[CONVENTION:*]], [[CV.ENTITY:*]]"
|
|
194
|
-
labeled: true
|
|
195
|
-
qualified: true
|
|
196
|
-
config:
|
|
197
|
-
size-node-width-max: 440
|
|
198
|
-
size-node-height-scale: 1.75
|
|
199
140
|
props:
|
|
200
141
|
- name: TYPE
|
|
201
142
|
desc: >
|
|
@@ -230,39 +171,13 @@
|
|
|
230
171
|
desc: >
|
|
231
172
|
The roles the parties play towards the solution and the *archetypal* user profiles embodying them: a role names the part played (by a human or by an external system) and is the actor of the Use Cases and the Domain Workflows and the unit in which the Authorization Model grants rights, while a persona represents a distinct user group holding one or more roles, capturing its goals, needs, behaviors, and context, complemented by the non-user stakeholders whose interests the solution has to serve.
|
|
232
173
|
optional: true
|
|
233
|
-
refs: >
|
|
234
|
-
- Cockburn: Writing Effective Use Cases (2001),
|
|
235
|
-
https://www.informit.com/store/writing-effective-use-cases-9780201702255
|
|
236
|
-
- Cooper: The Inmates Are Running the Asylum, 2nd ed. (2004),
|
|
237
|
-
https://www.informit.com/store/inmates-are-running-the-asylum-why-high-tech-products-9780672326141
|
|
238
|
-
- Cooper et al.: About Face: The Essentials of Interaction Design, 4th ed. (2014),
|
|
239
|
-
https://www.wiley.com/en-gb/About+Face:+The+Essentials+of+Interaction+Design,+4th+Edition-p-9781118766576
|
|
240
|
-
- Pruitt/Adlin: The Persona Lifecycle: Keeping People in Mind Throughout Product Design (2006),
|
|
241
|
-
https://www.sciencedirect.com/book/9780125662512/the-persona-lifecycle
|
|
242
|
-
diagram:
|
|
243
|
-
type: graph
|
|
244
|
-
nodes: "[[ROLE:*]], [[PERSONA:*]]"
|
|
245
|
-
labeled: true
|
|
246
|
-
qualified: true
|
|
247
|
-
config:
|
|
248
|
-
size-node-width-max: 440
|
|
249
174
|
children:
|
|
250
175
|
- kind: ROLE
|
|
251
176
|
desc: >
|
|
252
177
|
A single role, named with the canonical name of the part a party plays towards the solution (e.g. `Moderator`, matching its GLOSSARY term of type `Actor`) and described in a concise (1-2 sentence) paragraph by the responsibility the role carries, plus a 1-sentence rationale ("why") stating why the part is cut this way. A role is the name of a part and not of a person: the personas embodying it act in exactly this part and hold exactly the rights the Authorization Model grants to it (plus those of the roles it `INHERITS`), while a persona holding several roles holds the union of them.
|
|
253
|
-
|
|
254
|
-
maxTableColumns: 5
|
|
178
|
+
optional: true
|
|
255
179
|
referenced:
|
|
256
180
|
- "[[*]]"
|
|
257
|
-
diagram:
|
|
258
|
-
type: hub
|
|
259
|
-
center: self
|
|
260
|
-
nodes: "[[ROLE:*]], [[TERM:*]], [[PERSONA:*]], [[WORKFLOW:*]], [[ACTIVITY:*]], [[USE-CASE:*]], [[TRANSITION:*]], [[CV.ENTITY:*]]"
|
|
261
|
-
labeled: true
|
|
262
|
-
qualified: true
|
|
263
|
-
config:
|
|
264
|
-
size-node-width-max: 440
|
|
265
|
-
size-node-height-scale: 1.75
|
|
266
181
|
props:
|
|
267
182
|
- name: TYPE
|
|
268
183
|
desc: >
|
|
@@ -282,8 +197,7 @@
|
|
|
282
197
|
- kind: PERSONA
|
|
283
198
|
desc: >
|
|
284
199
|
An archetypal user profile, named with a per-artifact unique first name of the fictional person and carrying a short, bold first-person quote -- written in the persona's own voice, like a "tagline", "mantra", or "defining statement" -- that captures their core attitude, motivation, frustration, or need in a single memorable line. Non-user stakeholders are modeled as personas of type `Stakeholder`.
|
|
285
|
-
|
|
286
|
-
maxTableColumns: 5
|
|
200
|
+
optional: true
|
|
287
201
|
props:
|
|
288
202
|
- name: TYPE
|
|
289
203
|
desc: >
|
|
@@ -335,22 +249,11 @@
|
|
|
335
249
|
desc: >
|
|
336
250
|
The end-to-end experience a user has while discovering, adopting, and using the solution, mapping their steps, touchpoints, and emotions over time. The journey is the *target* journey with the solution in place, so the friction it records is what the solution has to mitigate, not the status quo it replaces.
|
|
337
251
|
optional: true
|
|
338
|
-
refs: >
|
|
339
|
-
- NN/g: Journey Mapping 101 (2018),
|
|
340
|
-
https://www.nngroup.com/articles/journey-mapping-101/
|
|
341
|
-
- Kalbach: Mapping Experiences, 2nd ed. (2020),
|
|
342
|
-
https://www.oreilly.com/library/view/mapping-experiences-2nd/9781492076629/
|
|
343
|
-
- Stickdorn et al.: This Is Service Design Doing (2018),
|
|
344
|
-
https://www.thisisservicedesigndoing.com/
|
|
345
|
-
diagram:
|
|
346
|
-
type: grid
|
|
347
|
-
nodes: "[[JOURNEY:*]]"
|
|
348
|
-
properties:
|
|
349
|
-
- ACTORS
|
|
350
252
|
children:
|
|
351
253
|
- kind: JOURNEY
|
|
352
254
|
desc: >
|
|
353
255
|
The end-to-end journey of a single persona (or of multiple personas sharing the same experience as role variants), named with a 2-5 word summary of the pursued scenario.
|
|
256
|
+
optional: true
|
|
354
257
|
props:
|
|
355
258
|
- name: ACTORS
|
|
356
259
|
desc: >
|
|
@@ -390,31 +293,21 @@
|
|
|
390
293
|
id: FR
|
|
391
294
|
file: 06-REQS-FR-Functional-Requirements.md
|
|
392
295
|
desc: >
|
|
393
|
-
The concrete behaviors and capabilities the solution must provide, describing *what* the system does in terms of functions, features, and operations, while the quality bounds and constraints on them belong to the Non-Functional Requirements.
|
|
296
|
+
The concrete behaviors and capabilities the solution must provide, describing *what* the system does in terms of functions, features, and operations, while the quality bounds and constraints on them belong to the Non-Functional Requirements. The requirements are optionally grouped into the coherent capabilities they add up to (the epics of agile planning, the features of product management), which the overview diagram draws as boxes around their requirements.
|
|
394
297
|
optional: true
|
|
395
|
-
refs: >
|
|
396
|
-
- Mavin et al.: Easy Approach to Requirements Syntax (EARS) (2009),
|
|
397
|
-
https://ieeexplore.ieee.org/document/5328509
|
|
398
|
-
- ISO/IEC/IEEE 29148:2018: Systems and software engineering -- Life cycle processes -- Requirements engineering (2018),
|
|
399
|
-
https://www.iso.org/standard/72089.html
|
|
400
|
-
- DSDM: MoSCoW Prioritisation, DSDM Agile Project Framework (2014),
|
|
401
|
-
https://www.agilebusiness.org/dsdm-project-framework/moscow-prioritisation.html
|
|
402
|
-
diagram:
|
|
403
|
-
type: grid
|
|
404
|
-
nodes: "[[FR.REQUIREMENT:*]]"
|
|
405
|
-
properties:
|
|
406
|
-
- PRIORITY
|
|
407
|
-
config:
|
|
408
|
-
size-node-width-max: 440
|
|
409
|
-
grid-columns-max: 5
|
|
410
298
|
children:
|
|
299
|
+
- kind: GROUP
|
|
300
|
+
desc: >
|
|
301
|
+
A named group of strongly related requirements, carrying a short (1-3 word), per-artifact unique name distinct from the names of its requirements (e.g. `Moderation` for the moderating, forwarding, and answering of attendee inputs, `Event Access` for the access URLs), and described by a 1-sentence description ("what") of the capability the requirements add up to plus a 1-sentence rationale ("why") of the cohesion. A group is an epic in the agile sense and a feature in the product sense, but carries no obligation of its own: it has no priority, states no behavior, and is verified through its requirements alone, so it affects the overview diagram only, where its requirements are drawn next to each other inside a box. The groups are listed before the requirements, and every requirement belongs to at most one group.
|
|
302
|
+
optional: true
|
|
303
|
+
referenced:
|
|
304
|
+
- "[[FR.REQUIREMENT:*]]"
|
|
411
305
|
- kind: REQUIREMENT
|
|
412
306
|
desc: >
|
|
413
307
|
A single functional requirement, named with a short (3-8 word) summary and described in a concise (1-3 sentence) paragraph as *what* the solution must do, stating exactly one obligation (split into several requirements otherwise) as an observable behavior a test case can verify, written with exactly one keyword `MUST`, `SHOULD`, or `COULD` matching its `PRIORITY`, plus a 1-sentence rationale ("why").
|
|
414
308
|
|
|
415
309
|
The statement follows one of the EARS patterns: ubiquitous (`The system MUST ...`), event-driven (`When <trigger>, the system MUST ...`), state-driven (`While <state>, the system MUST ...`), optional-feature (`Where <feature>, the system MUST ...`), or unwanted-behavior (`If <condition>, then the system MUST ...`).
|
|
416
|
-
|
|
417
|
-
maxTableColumns: 6
|
|
310
|
+
optional: true
|
|
418
311
|
referenced:
|
|
419
312
|
- "[[USE-CASE:*]]"
|
|
420
313
|
props:
|
|
@@ -422,6 +315,17 @@
|
|
|
422
315
|
desc: >
|
|
423
316
|
The MoSCoW priority of the requirement: `MUST`, `SHOULD`, `COULD`, or `WONT`, matching the keyword of the statement. The `WONT` priority records a requirement deliberately excluded from the current scope ("won't have this time"), preserving the conscious decision rather than silently dropping it, with the statement still phrased as it would be if in scope.
|
|
424
317
|
value: enum(MUST,SHOULD,COULD,WONT)
|
|
318
|
+
- name: GROUP
|
|
319
|
+
desc: >
|
|
320
|
+
Reference to the FUNCTIONAL-REQUIREMENTS group the requirement belongs to, placing it next to the other requirements of the group in the overview diagram; omitted for a requirement standing on its own.
|
|
321
|
+
value: "[[FR.GROUP:*]]"
|
|
322
|
+
optional: true
|
|
323
|
+
- name: DEPENDS-ON
|
|
324
|
+
desc: >
|
|
325
|
+
Comma-separated references to the FUNCTIONAL-REQUIREMENTS objects the requirement presupposes, i.e. whose behavior has to exist before its own makes sense (e.g. replying to chat messages presupposes chat messages), so that dropping or deferring a requirement reveals what falls with it; omitted for a requirement presupposing no other one.
|
|
326
|
+
value: list([[FR.REQUIREMENT:*]])
|
|
327
|
+
optional: true
|
|
328
|
+
acyclic: true
|
|
425
329
|
- name: PREMISES
|
|
426
330
|
desc: >
|
|
427
331
|
Comma-separated references to the SOLUTION-PREMISES objects the requirement rests on, i.e. the assumptions, dependencies, and risks whose failure calls for revisiting it.
|
|
@@ -433,44 +337,25 @@
|
|
|
433
337
|
id: NR
|
|
434
338
|
file: 07-REQS-NR-Non-Functional-Requirements.md
|
|
435
339
|
desc: >
|
|
436
|
-
The quality attributes and constraints the solution must satisfy, such as performance, security, scalability, reliability, and usability.
|
|
340
|
+
The quality attributes and constraints the solution must satisfy, such as performance, security, scalability, reliability, and usability. The requirements are optionally grouped into the project-specific quality goals they refine (the upper levels of a quality attribute utility tree), which the overview diagram draws as boxes around their requirements.
|
|
437
341
|
optional: true
|
|
438
|
-
refs: >
|
|
439
|
-
- ISO/IEC 25010:2023: Systems and software engineering -- Systems and software Quality Requirements and Evaluation (SQuaRE) -- Product quality model (2023),
|
|
440
|
-
https://www.iso.org/standard/78176.html
|
|
441
|
-
- ISO/IEC/IEEE 29148:2018: Systems and software engineering -- Life cycle processes -- Requirements engineering (2018),
|
|
442
|
-
https://www.iso.org/standard/72089.html
|
|
443
|
-
- DSDM: MoSCoW Prioritisation, DSDM Agile Project Framework (2014),
|
|
444
|
-
https://www.agilebusiness.org/dsdm-project-framework/moscow-prioritisation.html
|
|
445
|
-
- Doran: There's a S.M.A.R.T. Way to Write Management's Goals and Objectives, Management Review 70(11) (1981)
|
|
446
|
-
diagram:
|
|
447
|
-
type: grid
|
|
448
|
-
nodes: "[[NR.REQUIREMENT:*]]"
|
|
449
|
-
properties:
|
|
450
|
-
- PRIORITY
|
|
451
|
-
- CATEGORY
|
|
452
|
-
config:
|
|
453
|
-
size-node-width-max: 440
|
|
454
|
-
grid-columns-max: 5
|
|
455
342
|
children:
|
|
343
|
+
- kind: GROUP
|
|
344
|
+
desc: >
|
|
345
|
+
A named group of requirements jointly refining one project-specific quality goal, carrying a short (1-3 word), per-artifact unique name distinct from the names of its requirements (e.g. `Observability` for the completeness, causality, integrity, and availability of the recorded traces, `Data Protection` for the lawful, minimal, and guarded processing of personal data), and described by a 1-sentence description ("what") of the quality goal the requirements add up to plus a 1-sentence rationale ("why") of the cohesion. A group is a quality goal in the sense of a quality attribute utility tree: unlike the fixed `CATEGORY` of a requirement, which classifies it for comparability, it names the quality the project itself strives for and may span requirements of several categories. It is distinct from a Functional Requirements group, which bundles the functions and mechanisms realizing such a quality. A group carries no obligation of its own: it has no priority, no metric, and is verified through its requirements alone, so it affects the overview diagram only, where its requirements are drawn next to each other inside a box. The groups are listed before the requirements, and every requirement belongs to at most one group.
|
|
346
|
+
optional: true
|
|
347
|
+
referenced:
|
|
348
|
+
- "[[NR.REQUIREMENT:*]]"
|
|
456
349
|
- kind: REQUIREMENT
|
|
457
350
|
desc: >
|
|
458
351
|
A single non-functional requirement, named with a short (3-8 word) summary and described in a concise (1-3 sentence) paragraph as the quality attribute or constraint the solution must satisfy, stating exactly one obligation (split into several requirements otherwise) which is verifiable against its `METRIC`, written with exactly one keyword `MUST`, `SHOULD`, or `COULD` matching its `PRIORITY`, plus a 1-sentence rationale ("why").
|
|
459
352
|
|
|
460
353
|
The requirement is answered by the architecture, never the other way round: a Quality Perspectives tactic addresses it through its mechanism, a Design Decisions decision is driven by it as a force, and an Operations View concern fulfills it through its procedure, so every requirement is referenced from at least one of them (a `WONT` requirement, which the architecture rightly ignores, is the tolerated exception the lint warning cannot tell apart) and its hub diagram shows what answers it.
|
|
354
|
+
optional: true
|
|
461
355
|
referenced:
|
|
462
356
|
- "[[TACTIC:*]]"
|
|
463
357
|
- "[[DECISION:*]]"
|
|
464
358
|
- "[[CONCERN:*]]"
|
|
465
|
-
diagram:
|
|
466
|
-
type: hub
|
|
467
|
-
center: self
|
|
468
|
-
nodes: "[[NR.REQUIREMENT:*]], [[FR.REQUIREMENT:*]], [[PREMISE:*]], [[RULE:*]], [[TACTIC:*]], [[DECISION:*]], [[CONCERN:*]], [[TEST-CASE:*]]"
|
|
469
|
-
labeled: true
|
|
470
|
-
qualified: true
|
|
471
|
-
config:
|
|
472
|
-
size-node-width-max: 440
|
|
473
|
-
size-node-height-scale: 1.75
|
|
474
359
|
props:
|
|
475
360
|
- name: PRIORITY
|
|
476
361
|
desc: >
|
|
@@ -480,6 +365,11 @@
|
|
|
480
365
|
desc: >
|
|
481
366
|
The category of the requirement: the quality attribute it addresses, according to the top-level characteristics of the ISO/IEC 25010:2023 Software-Quality Model (except for `Functional Suitability`, which is covered by the Functional Requirements instead, and with `Usability` kept as the name of `Interaction Capability`), plus the two non-quality categories `Compliance` (a legal or regulatory obligation) and `Constraint` (a technical, business, or environmental constraint on the *solution*, e.g. a hosting, budget, or technology mandate, as opposed to a constraint on the domain, which is a Domain Rule).
|
|
482
367
|
value: enum(Performance,Compatibility,Usability,Reliability,Security,Safety,Maintainability,Flexibility,Compliance,Constraint)
|
|
368
|
+
- name: GROUP
|
|
369
|
+
desc: >
|
|
370
|
+
Reference to the NON-FUNCTIONAL-REQUIREMENTS group (the quality goal) the requirement belongs to, placing it next to the other requirements of the group in the overview diagram, independent of its `CATEGORY`; omitted for a requirement standing on its own.
|
|
371
|
+
value: "[[NR.GROUP:*]]"
|
|
372
|
+
optional: true
|
|
483
373
|
- name: QUALIFIES
|
|
484
374
|
desc: >
|
|
485
375
|
Comma-separated references to the FUNCTIONAL-REQUIREMENTS objects whose capability the requirement bounds or constrains.
|
|
@@ -501,22 +391,6 @@
|
|
|
501
391
|
desc: >
|
|
502
392
|
The domain invariants, policies, and decision logic that must always hold true in the problem domain, independent of any single feature, constraining the Functional and Non-Functional Requirements.
|
|
503
393
|
optional: true
|
|
504
|
-
refs: >
|
|
505
|
-
- Hay/Healy: Defining Business Rules ~ What Are They Really? (2000),
|
|
506
|
-
https://www.businessrulesgroup.org/first_paper/br01c0.htm
|
|
507
|
-
- BRG: Business Rules Manifesto (2003),
|
|
508
|
-
https://www.businessrulesgroup.org/brmanifesto.htm
|
|
509
|
-
- OMG DMN 1.5: Decision Model and Notation (2024),
|
|
510
|
-
https://www.omg.org/spec/DMN/
|
|
511
|
-
diagram:
|
|
512
|
-
type: grid
|
|
513
|
-
nodes: "[[RULE:*]]"
|
|
514
|
-
properties:
|
|
515
|
-
- CATEGORY
|
|
516
|
-
- SOURCE
|
|
517
|
-
config:
|
|
518
|
-
size-node-width-max: 440
|
|
519
|
-
grid-columns-max: 5
|
|
520
394
|
children:
|
|
521
395
|
- kind: RULE
|
|
522
396
|
desc: >
|
|
@@ -525,8 +399,7 @@
|
|
|
525
399
|
The subject of the statement is a domain term, never the system: a rule holds in the problem domain even if the solution were replaced, so if the sentence needs `The system` as its subject, it is a Functional Requirement, not a rule.
|
|
526
400
|
|
|
527
401
|
A rule whose outcome depends on more than two conditions is stated as a decision list instead of prose, in the manner of a DMN decision table: a lead sentence naming the governed term and the obligation, an ordered list with one `<condition>: <outcome>` item per case, applied in order with the first matching case winning, and a closing sentence stating the outcome of the remaining cases ("otherwise") and carrying the rationale.
|
|
528
|
-
|
|
529
|
-
maxTableColumns: 5
|
|
402
|
+
optional: true
|
|
530
403
|
referenced:
|
|
531
404
|
- "[[TEST-CASE:*]]"
|
|
532
405
|
props:
|
|
@@ -562,28 +435,13 @@
|
|
|
562
435
|
desc: >
|
|
563
436
|
The cross-actor, multi-sitting workflows of the domain (also known as business processes) the solution takes part in, each an ordered set of activities connected by handoffs between the acting parties, making the collaboration across roles and over time explicit, which neither the User Journey (the experience of a single persona) nor the Use Cases (the goal of a single actor in one sitting) capture. The artifact is absent for a tool-like solution without any workflow spanning several actors or sittings.
|
|
564
437
|
optional: true
|
|
565
|
-
refs: >
|
|
566
|
-
- OMG: Business Process Model and Notation (BPMN) 2.0.2 (2013),
|
|
567
|
-
https://www.omg.org/spec/BPMN/2.0.2
|
|
568
|
-
- Dumas/La Rosa/Mendling/Reijers: Fundamentals of Business Process Management, 2nd ed. (2018),
|
|
569
|
-
https://link.springer.com/book/10.1007/978-3-662-56509-4
|
|
570
|
-
- van der Aalst: Process Mining: Data Science in Action, 2nd ed. (2016),
|
|
571
|
-
https://link.springer.com/book/10.1007/978-3-662-49851-4
|
|
572
|
-
diagram:
|
|
573
|
-
type: grid
|
|
574
|
-
nodes: "[[WORKFLOW:*]]"
|
|
575
|
-
properties:
|
|
576
|
-
- ACTORS
|
|
577
|
-
config:
|
|
578
|
-
size-node-width-max: 440
|
|
579
|
-
size-node-height-scale: 2
|
|
580
|
-
grid-columns-max: 4
|
|
581
438
|
children:
|
|
582
439
|
- kind: WORKFLOW
|
|
583
440
|
desc: >
|
|
584
441
|
A single workflow, named with a short (2-5 word) summary phrased as the outcome pursued (e.g. `Run Broadcast Event`) and described in a concise (1-3 sentence) paragraph at a glance, plus a 1-sentence rationale ("why") stating the value the organization gains. A workflow is a flat control flow of `ACTIVITY` objects (the work done by one party at a time) connected by `HANDOFF` objects (the passing of control from one activity to the next): exactly one initial activity, at least one final activity, every activity reachable from the initial one, and some final activity reachable from every activity, while a handoff back to an earlier activity (a rework loop) is permitted.
|
|
585
442
|
|
|
586
443
|
The workflow is at summary level, above the user-goal level of the Use Cases: it spans several actors and several sittings, and its activities leave the step-by-step interaction with the solution to the use cases referencing them. An activity and a use case relate n:m -- an activity is covered by several use cases, a use case spans several activities, and an activity performed outside the solution is covered by none at all -- so the workflow is no mere sequence of use cases and cannot be assembled from them.
|
|
444
|
+
optional: true
|
|
587
445
|
automaton:
|
|
588
446
|
nodes: ACTIVITY
|
|
589
447
|
edges: HANDOFF
|
|
@@ -591,18 +449,6 @@
|
|
|
591
449
|
target: TO
|
|
592
450
|
initial: INITIAL
|
|
593
451
|
final: FINAL
|
|
594
|
-
diagram:
|
|
595
|
-
type: graph
|
|
596
|
-
edges: "[[HANDOFF:*]]"
|
|
597
|
-
edgeSource: FROM
|
|
598
|
-
edgeTarget: TO
|
|
599
|
-
onlyConnected: true
|
|
600
|
-
qualified: true
|
|
601
|
-
nest:
|
|
602
|
-
properties:
|
|
603
|
-
- ACTOR
|
|
604
|
-
config:
|
|
605
|
-
size-node-width-max: 440
|
|
606
452
|
props:
|
|
607
453
|
- name: ACTORS
|
|
608
454
|
desc: >
|
|
@@ -638,8 +484,6 @@
|
|
|
638
484
|
- kind: ACTIVITY
|
|
639
485
|
desc: >
|
|
640
486
|
A single unit of work within the workflow, performed by one party without a handoff in between, named with a short (2-5 word) verb phrase (e.g. `Invite Attendees`) and described by a 1-2 sentence description of what is done and what it yields. Every activity used in a handoff *MUST* be declared, every activity *MUST* be reachable from the initial one, and every activity with no outgoing handoff *MUST* be final.
|
|
641
|
-
format:
|
|
642
|
-
maxTableColumns: 5
|
|
643
487
|
props:
|
|
644
488
|
- name: ACTOR
|
|
645
489
|
desc: >
|
|
@@ -662,8 +506,6 @@
|
|
|
662
506
|
name: "[a-z][a-z-]*"
|
|
663
507
|
desc: >
|
|
664
508
|
A single passing of control from one activity to the next, named with a short, lower-cased verb of the completing event (e.g. `approve`, `publish`) and described by a 1-sentence description of what is passed on (information, artifact, or notification) and how the receiving party learns about it. Several handoffs departing from the same activity form a decision (told apart by their `CONDITION`) or a parallel split, several arriving at the same activity a merge, and a handoff back to an earlier activity a rework loop.
|
|
665
|
-
format:
|
|
666
|
-
maxTableColumns: 6
|
|
667
509
|
props:
|
|
668
510
|
- name: FROM
|
|
669
511
|
desc: The activity (of the same workflow) the handoff departs from.
|
|
@@ -690,36 +532,13 @@
|
|
|
690
532
|
desc: >
|
|
691
533
|
The discrete goals users pursue with the solution, each describing an actor's interaction to achieve a specific outcome, together with the concrete step-by-step flows for main, alternative, and exceptional paths.
|
|
692
534
|
optional: true
|
|
693
|
-
refs: >
|
|
694
|
-
- Cockburn: Writing Effective Use Cases (2001),
|
|
695
|
-
https://www.informit.com/store/writing-effective-use-cases-9780201702255
|
|
696
|
-
- Jacobson et al.: Object-Oriented Software Engineering: A Use Case Driven Approach (1992),
|
|
697
|
-
https://www.informit.com/store/object-oriented-software-engineering-a-use-case-driven-9780201544350
|
|
698
|
-
- Jacobson/Spence/Bittner: Use-Case 2.0: The Guide to Succeeding with Use Cases (2011),
|
|
699
|
-
https://www.ivarjacobson.com/publications/white-papers/use-case-20-e-book
|
|
700
|
-
diagram:
|
|
701
|
-
type: graph
|
|
702
|
-
nodes: "[[USE-CASE:*]], [[ROLE:*]]"
|
|
703
|
-
labeled: true
|
|
704
|
-
qualified: true
|
|
705
|
-
onlyConnected: true
|
|
706
|
-
config:
|
|
707
|
-
size-node-width-max: 440
|
|
708
535
|
children:
|
|
709
536
|
- kind: USE-CASE
|
|
710
537
|
desc: >
|
|
711
538
|
A discrete goal a user pursues with the solution, named with a short (3-8 word) summary phrased as an actor goal (e.g. `Reset Forgotten Password`) and described in a concise (1-3 sentence) paragraph at a glance, plus a 1-sentence rationale ("why") stating the value the actor gains, without prescribing the step-by-step flow, which belongs to its `SCENARIO` objects: exactly one `Main` scenario, listed first, followed by any number of `Alternative` and `Exceptional` scenarios.
|
|
712
539
|
|
|
713
540
|
The use case is at user-goal level: a goal the actor completes in one sitting, neither a summary of many sittings and actors (which belongs to a Domain Workflow as a whole, or to a User Journey when seen by a single persona) nor a single interaction (which belongs to a scenario as one of its steps). Its `ACTIVITIES` relate it n:m to the Domain Workflow activities -- a use case spans several activities and an activity is covered by several use cases -- so the two decompose the same domain independently instead of nesting into each other.
|
|
714
|
-
|
|
715
|
-
type: hub
|
|
716
|
-
center: self
|
|
717
|
-
nodes: "[[USE-CASE:*]], [[ROLE:*]], [[PERSONA:*]], [[STEP:*]], [[ACTIVITY:*]], [[FR.REQUIREMENT:*]], [[RULE:*]], [[DM.ENTITY:*]], [[TRANSITION:*]], [[PERMISSION:*]], [[PRINCIPLE:*]], [[STORYBOARD:*]], [[CV.ENTITY:*]], [[TEST-CASE:*]]"
|
|
718
|
-
labeled: true
|
|
719
|
-
qualified: true
|
|
720
|
-
config:
|
|
721
|
-
size-node-width-max: 440
|
|
722
|
-
size-node-height-scale: 1.75
|
|
541
|
+
optional: true
|
|
723
542
|
props:
|
|
724
543
|
- name: ACTOR
|
|
725
544
|
desc: >
|
|
@@ -801,20 +620,6 @@
|
|
|
801
620
|
desc: >
|
|
802
621
|
The structure of named entities, with named attributes and directed relationships, of the data the solution manages, defining how information is organized and connected.
|
|
803
622
|
optional: true
|
|
804
|
-
refs: >
|
|
805
|
-
- Chen: The Entity-Relationship Model -- Toward a Unified View of Data (1976),
|
|
806
|
-
https://dl.acm.org/doi/10.1145/320434.320440
|
|
807
|
-
- OMG UML 2.5.1: Unified Modeling Language (2017),
|
|
808
|
-
https://www.omg.org/spec/UML/2.5.1
|
|
809
|
-
diagram:
|
|
810
|
-
type: graph
|
|
811
|
-
nodes: "[[DM.ENTITY:*]]"
|
|
812
|
-
edges: "[[RELATION:*]]"
|
|
813
|
-
nest:
|
|
814
|
-
properties:
|
|
815
|
-
- GROUP
|
|
816
|
-
config:
|
|
817
|
-
graph-columns-max: 2
|
|
818
623
|
children:
|
|
819
624
|
- kind: GROUP
|
|
820
625
|
name: "[A-Z][a-zA-Z0-9]*"
|
|
@@ -827,16 +632,7 @@
|
|
|
827
632
|
name: "[A-Z][a-zA-Z0-9]*"
|
|
828
633
|
desc: >
|
|
829
634
|
A named entity of the data model, carrying a Pascal-cased, 1-3 word long, per-artifact unique name, and described by a 1-sentence description ("what") plus a 1-sentence rationale ("why").
|
|
830
|
-
|
|
831
|
-
type: hub
|
|
832
|
-
center: self
|
|
833
|
-
nodes: "[[DM.ENTITY:*]], [[FR.REQUIREMENT:*]], [[USE-CASE:*]], [[LIFECYCLE:*]], [[FV.COMPONENT:*]], [[CONCERN:*]], [[TACTIC:*]], [[DECISION:*]], [[TEST-CASE:*]]"
|
|
834
|
-
edges: "[[RELATION:*]]"
|
|
835
|
-
labeled: true
|
|
836
|
-
qualified: true
|
|
837
|
-
config:
|
|
838
|
-
size-node-width-max: 440
|
|
839
|
-
size-node-height-scale: 1.75
|
|
635
|
+
optional: true
|
|
840
636
|
props:
|
|
841
637
|
- name: REQUIREMENTS
|
|
842
638
|
desc: >
|
|
@@ -863,8 +659,6 @@
|
|
|
863
659
|
name: "[a-z][a-zA-Z0-9]*"
|
|
864
660
|
desc: >
|
|
865
661
|
A named attribute of the entity, carrying a camel-cased, 1-3 word long, per-entity unique identifier, and described by a 1-sentence description ("what") plus a 1-sentence rationale ("why").
|
|
866
|
-
format:
|
|
867
|
-
maxTableColumns: 6
|
|
868
662
|
props:
|
|
869
663
|
- name: TYPE
|
|
870
664
|
desc: >
|
|
@@ -894,8 +688,6 @@
|
|
|
894
688
|
desc: >
|
|
895
689
|
A named directed relation of the entity, carrying a camel-cased, 1-3 word long, per-entity unique identifier and targeting another entity, and described by a 1-sentence description ("what") plus a 1-sentence rationale ("why"). A relation carries no attributes of its own: a relation needing attributes (an "association class") is reified as an entity of its own, related from both sides.
|
|
896
690
|
optional: true
|
|
897
|
-
format:
|
|
898
|
-
maxTableColumns: 5
|
|
899
691
|
props:
|
|
900
692
|
- name: TARGET
|
|
901
693
|
desc: Reference to the DATA-MODEL entity the directed relation targets.
|
|
@@ -918,24 +710,11 @@
|
|
|
918
710
|
desc: >
|
|
919
711
|
For each entity with a non-trivial lifecycle, the legal states it can occupy and the permitted transitions between them over its lifetime, making the forbidden moves as explicit as the allowed ones.
|
|
920
712
|
optional: true
|
|
921
|
-
refs: >
|
|
922
|
-
- Shlaer/Mellor: Object Lifecycles: Modeling the World in States (1992) - Harel: Statecharts: A Visual Formalism for Complex Systems (1987),
|
|
923
|
-
https://doi.org/10.1016/0167-6423(87)90035-9
|
|
924
|
-
- OMG UML 2.5.1: Unified Modeling Language (2017),
|
|
925
|
-
https://www.omg.org/spec/UML/2.5.1
|
|
926
|
-
diagram:
|
|
927
|
-
type: grid
|
|
928
|
-
nodes: "[[LIFECYCLE:*]]"
|
|
929
|
-
properties:
|
|
930
|
-
- ENTITY
|
|
931
|
-
config:
|
|
932
|
-
size-node-width-max: 440
|
|
933
|
-
size-node-height-scale: 2
|
|
934
|
-
grid-columns-max: 5
|
|
935
713
|
children:
|
|
936
714
|
- kind: LIFECYCLE
|
|
937
715
|
desc: >
|
|
938
716
|
The lifecycle of a single entity, named with the short (1-3 word) name of the lifecycle, normally the name of the entity it governs. A lifecycle is a flat finite state machine: exactly one initial state, at least one final state, every state reachable from the initial state, and some final state reachable from every state (a state from which no final state can be reached anymore is a livelock).
|
|
717
|
+
optional: true
|
|
939
718
|
automaton:
|
|
940
719
|
nodes: STATE
|
|
941
720
|
edges: TRANSITION
|
|
@@ -943,18 +722,6 @@
|
|
|
943
722
|
target: TO
|
|
944
723
|
initial: INITIAL
|
|
945
724
|
final: FINAL
|
|
946
|
-
diagram:
|
|
947
|
-
type: graph
|
|
948
|
-
edges: "[[TRANSITION:*]]"
|
|
949
|
-
edgeSource: FROM
|
|
950
|
-
edgeTarget: TO
|
|
951
|
-
onlyConnected: true
|
|
952
|
-
properties:
|
|
953
|
-
- INITIAL
|
|
954
|
-
- FINAL
|
|
955
|
-
config:
|
|
956
|
-
size-node-width-max: 440
|
|
957
|
-
size-node-height-scale: 1.75
|
|
958
725
|
props:
|
|
959
726
|
- name: ENTITY
|
|
960
727
|
desc: >
|
|
@@ -1022,32 +789,11 @@
|
|
|
1022
789
|
desc: >
|
|
1023
790
|
The access rights of the solution, granted to the roles of the User Personas and stating for each role the operations it may perform on each entity, confined to the lifecycle states of the entity and to a further condition where necessary, so that "who may do what on which entity in which state" is answered in one place instead of being scattered over the actors of the state transitions, the actors of the use cases, and the prose of the domain rules. The model is closed: an operation not granted to a role is forbidden, exactly like a move not listed as a state transition.
|
|
1024
791
|
optional: true
|
|
1025
|
-
refs: >
|
|
1026
|
-
- Ferraiolo/Kuhn: Role-Based Access Controls, 15th National Computer Security Conference (1992),
|
|
1027
|
-
https://csrc.nist.gov/publications/detail/conference-paper/1992/10/13/role-based-access-controls
|
|
1028
|
-
- Sandhu/Coyne/Feinstein/Youman: Role-Based Access Control Models, IEEE Computer 29(2) (1996),
|
|
1029
|
-
https://doi.org/10.1109/2.485845
|
|
1030
|
-
- ANSI INCITS 359-2012: Information Technology -- Role Based Access Control (2012),
|
|
1031
|
-
https://csrc.nist.gov/projects/role-based-access-control
|
|
1032
|
-
- OASIS: eXtensible Access Control Markup Language (XACML) Version 3.0 (2013),
|
|
1033
|
-
https://docs.oasis-open.org/xacml/3.0/xacml-3.0-core-spec-os-en.html
|
|
1034
|
-
diagram:
|
|
1035
|
-
type: graph
|
|
1036
|
-
nodes: "[[ROLE:*]], [[DM.ENTITY:*]]"
|
|
1037
|
-
edges: "[[PERMISSION:*]]"
|
|
1038
|
-
edgeSource: ROLE
|
|
1039
|
-
edgeTarget: ENTITY
|
|
1040
|
-
onlyConnected: true
|
|
1041
|
-
qualified: true
|
|
1042
|
-
config:
|
|
1043
|
-
size-node-width-max: 440
|
|
1044
|
-
graph-channel-width-max: 340
|
|
1045
792
|
children:
|
|
1046
793
|
- kind: PERMISSION
|
|
1047
794
|
desc: >
|
|
1048
795
|
A single right of a role on a single entity, named with a short (2-5 word) verb phrase of what the role may do (e.g. `Decide Pending Messages`) and described by a 1-sentence description of the right, in particular of the reach of its `CONDITION`. One permission covers one entity: the operations it grants, the states of the entity in which they are granted, and the condition under which they are granted, so that the permissions of all roles form the access matrix of roles against entities. Any operation, state, or condition not covered by a permission of the role (or of a role it `INHERITS`) is forbidden.
|
|
1049
|
-
|
|
1050
|
-
maxTableColumns: 8
|
|
796
|
+
optional: true
|
|
1051
797
|
props:
|
|
1052
798
|
- name: ROLE
|
|
1053
799
|
desc: >
|
|
@@ -1087,35 +833,11 @@
|
|
|
1087
833
|
desc: >
|
|
1088
834
|
The machine-facing interfaces the solution provides to, or requires from, other programs (REST, GraphQL, gRPC, WebSocket, MQTT, AMQP, MCP, CLI, library, or custom ones), each described by its kind, direction, location, and consumers, while the named types, constants, and endpoints of all interfaces are modeled generically in the INTERFACE-DATATYPES and INTERFACE-ENDPOINTS artifacts, whose objects reference the interfaces they belong to. The artifact is absent when the solution neither provides nor requires any machine-facing interface.
|
|
1089
835
|
optional: true
|
|
1090
|
-
refs: >
|
|
1091
|
-
- OpenAPI Initiative: OpenAPI Specification 3.1 (2021),
|
|
1092
|
-
https://spec.openapis.org/oas/v3.1.0
|
|
1093
|
-
- GraphQL Foundation: GraphQL Specification (2021),
|
|
1094
|
-
https://spec.graphql.org/October2021/
|
|
1095
|
-
- OASIS: MQTT Version 5.0 (2019),
|
|
1096
|
-
https://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-v5.0.html
|
|
1097
|
-
- Anthropic: Model Context Protocol Specification (2025),
|
|
1098
|
-
https://modelcontextprotocol.io/specification/
|
|
1099
|
-
- IEEE/The Open Group: POSIX.1-2024, Utility Conventions (2024),
|
|
1100
|
-
https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap12.html
|
|
1101
|
-
diagram:
|
|
1102
|
-
type: grid
|
|
1103
|
-
nodes: "[[INTERFACE:*]]"
|
|
1104
|
-
properties:
|
|
1105
|
-
- KIND
|
|
1106
|
-
- DIRECTION
|
|
1107
836
|
children:
|
|
1108
837
|
- kind: INTERFACE
|
|
1109
838
|
desc: >
|
|
1110
839
|
A single interface, named with a short (2-5 word) summary (e.g. `Public REST API`, `Event Topics`, `Command Line`) and described in a concise (1-3 sentence) paragraph by its purpose and its consumers, plus a 1-sentence rationale ("why") for the interface's existence and boundary. All kinds of interfaces share the same model: the INTERFACE-DATATYPES `TYPE` objects are the data shapes exchanged (carrying the fixed values agreed upon as their `CONSTANT` objects) and the INTERFACE-ENDPOINTS `ENDPOINT` objects the operations offered, each referencing the interfaces it belongs to, where the kind-specific parts (HTTP method, GraphQL operation, topic direction, command) are carried by the `OPERATION` and `LOCATOR` properties of the endpoints only.
|
|
1111
|
-
|
|
1112
|
-
type: hub
|
|
1113
|
-
center: self
|
|
1114
|
-
nodes: "[[INTERFACE:*]], [[TYPE:*]], [[ENDPOINT:*]], [[FV.COMPONENT:*]]"
|
|
1115
|
-
labeled: true
|
|
1116
|
-
qualified: true
|
|
1117
|
-
config:
|
|
1118
|
-
size-node-width-max: 440
|
|
840
|
+
optional: true
|
|
1119
841
|
props:
|
|
1120
842
|
- name: KIND
|
|
1121
843
|
desc: |
|
|
@@ -1154,36 +876,12 @@
|
|
|
1154
876
|
desc: >
|
|
1155
877
|
The named data types exchanged through the machine-facing interfaces of the INTERFACES artifact, modeled generically for all kinds of interfaces: a type is either an object type composed of fields or a scalar, enumeration, alias, or union type, carries the fixed values agreed upon as its constants, and references the interfaces it is exchanged through, so that one type serves several interfaces. The artifact is absent when the solution neither provides nor requires any machine-facing interface.
|
|
1156
878
|
optional: true
|
|
1157
|
-
refs: >
|
|
1158
|
-
- OpenAPI Initiative: OpenAPI Specification 3.1 (2021),
|
|
1159
|
-
https://spec.openapis.org/oas/v3.1.0
|
|
1160
|
-
- GraphQL Foundation: GraphQL Specification (2021),
|
|
1161
|
-
https://spec.graphql.org/October2021/
|
|
1162
|
-
diagram:
|
|
1163
|
-
type: graph
|
|
1164
|
-
nodes: "[[TYPE:*]]"
|
|
1165
|
-
deep: true
|
|
1166
|
-
onlyConnected: true
|
|
1167
|
-
labeled: true
|
|
1168
|
-
qualified: true
|
|
1169
|
-
config:
|
|
1170
|
-
size-node-width-max: 440
|
|
1171
879
|
children:
|
|
1172
880
|
- kind: TYPE
|
|
1173
881
|
name: "[A-Z][A-Za-z0-9_]*"
|
|
1174
882
|
desc: >
|
|
1175
883
|
A named data type exchanged through one or more interfaces, carrying a Pascal-cased, unique name (e.g. `Event`, `ChatMessage`, `Diagnostic`) and described by a 1-sentence description ("what") plus a 1-sentence rationale ("why"). A type without a `BASE` is an object type composed of its `FIELD` objects (plus the fields of the object types it `EXTENDS`); a type with a `BASE` is a scalar, enumeration, alias, or union type without fields. Either kind of type additionally carries the named fixed values agreed upon through its interfaces as its `CONSTANT` objects.
|
|
1176
884
|
optional: true
|
|
1177
|
-
diagram:
|
|
1178
|
-
type: hub
|
|
1179
|
-
center: self
|
|
1180
|
-
nodes: "[[TYPE:*]], [[INTERFACE:*]], [[ENDPOINT:*]]"
|
|
1181
|
-
deep: true
|
|
1182
|
-
labeled: true
|
|
1183
|
-
qualified: true
|
|
1184
|
-
config:
|
|
1185
|
-
size-node-width-max: 600
|
|
1186
|
-
size-node-height-scale: 1.75
|
|
1187
885
|
props:
|
|
1188
886
|
- name: INTERFACES
|
|
1189
887
|
desc: >
|
|
@@ -1211,8 +909,6 @@
|
|
|
1211
909
|
desc: >
|
|
1212
910
|
A named field of an object type, carrying a per-type unique identifier in the naming convention of the interface (e.g. `eventId`, `event_id`, `event-id`) and described by a 1-sentence description ("what") plus a 1-sentence rationale ("why").
|
|
1213
911
|
optional: true
|
|
1214
|
-
format:
|
|
1215
|
-
maxTableColumns: 5
|
|
1216
912
|
props:
|
|
1217
913
|
- name: TYPE
|
|
1218
914
|
desc: >
|
|
@@ -1237,8 +933,6 @@
|
|
|
1237
933
|
desc: >
|
|
1238
934
|
A named fixed value of the type, agreed upon through the interfaces of the type, carrying a per-type unique identifier in the naming convention of the interfaces (e.g. `MAX_PAGE_SIZE`, `defaultPort`, `topic-prefix`) and described by a 1-sentence description ("what") plus a 1-sentence rationale ("why").
|
|
1239
935
|
optional: true
|
|
1240
|
-
format:
|
|
1241
|
-
maxTableColumns: 5
|
|
1242
936
|
props:
|
|
1243
937
|
- name: TYPE
|
|
1244
938
|
desc: >
|
|
@@ -1255,26 +949,6 @@
|
|
|
1255
949
|
desc: >
|
|
1256
950
|
The operations offered by the machine-facing interfaces of the INTERFACE-MODEL artifact, modeled generically for all kinds of interfaces: an endpoint references the interface it belongs to and consumes the INTERFACE-DATATYPES types and constants through its positional arguments and named options and returns them through its results. The artifact is absent when the solution neither provides nor requires any machine-facing interface.
|
|
1257
951
|
optional: true
|
|
1258
|
-
refs: >
|
|
1259
|
-
- OpenAPI Initiative: OpenAPI Specification 3.1 (2021),
|
|
1260
|
-
https://spec.openapis.org/oas/v3.1.0
|
|
1261
|
-
- GraphQL Foundation: GraphQL Specification (2021),
|
|
1262
|
-
https://spec.graphql.org/October2021/
|
|
1263
|
-
- OASIS: MQTT Version 5.0 (2019),
|
|
1264
|
-
https://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-v5.0.html
|
|
1265
|
-
- Anthropic: Model Context Protocol Specification (2025),
|
|
1266
|
-
https://modelcontextprotocol.io/specification/
|
|
1267
|
-
- IEEE/The Open Group: POSIX.1-2024, Utility Conventions (2024),
|
|
1268
|
-
https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap12.html
|
|
1269
|
-
diagram:
|
|
1270
|
-
type: graph
|
|
1271
|
-
nodes: "[[ENDPOINT:*]], [[TYPE:*]]"
|
|
1272
|
-
deep: true
|
|
1273
|
-
onlyConnected: true
|
|
1274
|
-
labeled: true
|
|
1275
|
-
qualified: true
|
|
1276
|
-
config:
|
|
1277
|
-
size-node-width-max: 440
|
|
1278
952
|
children:
|
|
1279
953
|
- kind: ENDPOINT
|
|
1280
954
|
name: "[A-Za-z_][A-Za-z0-9_-]*"
|
|
@@ -1284,16 +958,7 @@
|
|
|
1284
958
|
An endpoint consumes its input through its positional `ARGUMENT` objects (in document order, e.g. the URL path placeholders, a request body, a message payload, or the operands of a command) and its named `OPTION` objects (e.g. the query parameters, the arguments of a GraphQL field or MCP tool, or the options of a command), and returns its output through its `RESULT` objects (e.g. a response body, a subscription message, or the output and exit code of a command).
|
|
1285
959
|
|
|
1286
960
|
Endpoints form a flat list: a hierarchy of sub-commands or sub-resources is expressed by a path-style `LOCATOR` (e.g. `remote add`, `/events/{eventId}/chat`) only.
|
|
1287
|
-
|
|
1288
|
-
type: hub
|
|
1289
|
-
center: self
|
|
1290
|
-
nodes: "[[ENDPOINT:*]], [[TYPE:*]], [[CONSTANT:*]], [[INTERFACE:*]], [[PERMISSION:*]]"
|
|
1291
|
-
deep: true
|
|
1292
|
-
labeled: true
|
|
1293
|
-
qualified: true
|
|
1294
|
-
config:
|
|
1295
|
-
size-node-width-max: 600
|
|
1296
|
-
size-node-height-scale: 1.75
|
|
961
|
+
optional: true
|
|
1297
962
|
props:
|
|
1298
963
|
- name: INTERFACE
|
|
1299
964
|
desc: The INTERFACES object the endpoint belongs to and is addressed within.
|
|
@@ -1337,8 +1002,6 @@
|
|
|
1337
1002
|
desc: >
|
|
1338
1003
|
A named input of the endpoint, carrying a per-endpoint unique identifier in the syntax of the interface (e.g. `--output`, `first`, `file_path`) and described by a 1-sentence description ("what") plus a 1-sentence rationale ("why").
|
|
1339
1004
|
optional: true
|
|
1340
|
-
format:
|
|
1341
|
-
maxTableColumns: 6
|
|
1342
1005
|
props:
|
|
1343
1006
|
- name: TYPE
|
|
1344
1007
|
desc: >
|
|
@@ -1368,8 +1031,6 @@
|
|
|
1368
1031
|
desc: >
|
|
1369
1032
|
A positional input of the endpoint, in document order, carrying a per-endpoint unique identifier (e.g. `eventId`, `body`, `file`) and described by a 1-sentence description ("what") plus a 1-sentence rationale ("why").
|
|
1370
1033
|
optional: true
|
|
1371
|
-
format:
|
|
1372
|
-
maxTableColumns: 6
|
|
1373
1034
|
props:
|
|
1374
1035
|
- name: TYPE
|
|
1375
1036
|
desc: >
|
|
@@ -1394,8 +1055,6 @@
|
|
|
1394
1055
|
desc: >
|
|
1395
1056
|
A named output of the endpoint, carrying a per-endpoint unique identifier (e.g. `body`, `message`, `stdout`, `exit-code`) and described by a 1-sentence description ("what") plus a 1-sentence rationale ("why"). An error outcome is a result of its own (e.g. `error` with an HTTP status in its `CONSTRAINT`).
|
|
1396
1057
|
optional: true
|
|
1397
|
-
format:
|
|
1398
|
-
maxTableColumns: 5
|
|
1399
1058
|
props:
|
|
1400
1059
|
- name: TYPE
|
|
1401
1060
|
desc: >
|
|
@@ -1418,37 +1077,14 @@
|
|
|
1418
1077
|
file: 17-UXUI-IC-Interaction-Concept.md
|
|
1419
1078
|
desc: >
|
|
1420
1079
|
The interaction philosophy of the solution, stated as the set of cross-cutting principles (e.g. auto-save instead of explicit saving) which govern how users interact with the solution and which the Dialog Patterns, Dialog Storyboard, and Visual Design have to obey, while the concrete workflows belong to the User Journey, Use Cases, and Dialog Storyboard. The principles are listed in decreasing precedence, so that whenever two principles conflict in a particular design decision, the earlier one wins.
|
|
1421
|
-
refs: >
|
|
1422
|
-
- ISO 9241-110:2020: Ergonomics of human-system interaction -- Part 110: Interaction principles (2020),
|
|
1423
|
-
https://www.iso.org/standard/75258.html
|
|
1424
|
-
- Nielsen: 10 Usability Heuristics for User Interface Design (1994),
|
|
1425
|
-
https://www.nngroup.com/articles/ten-usability-heuristics/
|
|
1426
|
-
- Shneiderman: The Eight Golden Rules of Interface Design (1987),
|
|
1427
|
-
https://www.cs.umd.edu/users/ben/goldenrules.html
|
|
1428
1080
|
optional: true
|
|
1429
|
-
diagram:
|
|
1430
|
-
type: grid
|
|
1431
|
-
nodes: "[[PRINCIPLE:*]]"
|
|
1432
|
-
properties:
|
|
1433
|
-
- CATEGORY
|
|
1434
|
-
config:
|
|
1435
|
-
size-node-width-max: 440
|
|
1436
|
-
size-node-height-scale: 2
|
|
1437
|
-
grid-columns-max: 4
|
|
1438
1081
|
children:
|
|
1439
1082
|
- kind: PRINCIPLE
|
|
1440
1083
|
desc: >
|
|
1441
|
-
A single interaction principle, named with a short (2-5 word) summary (e.g. `Auto-Save`, `Optimistic Updates`, `Undo over Confirm`) and described in a concise (1-3 sentence) paragraph by how it governs the user's experience across the solution, plus a 1-sentence rationale ("why"). A principle is solution-wide and independent of any particular screen or flow (a structure recurring within one flow is a Dialog Pattern instead), decides between design alternatives (the alternative it rejects is its `TRADE-OFF`),
|
|
1084
|
+
A single interaction principle, named with a short (2-5 word) summary (e.g. `Auto-Save`, `Optimistic Updates`, `Undo over Confirm`) and described in a concise (1-3 sentence) paragraph by how it governs the user's experience across the solution, plus a 1-sentence rationale ("why"). A principle is solution-wide and independent of any particular screen or flow (a structure recurring within one flow is a Dialog Pattern instead), decides between design alternatives (the alternative it rejects is its `TRADE-OFF`), is not verifiable by a metric (a measurable quality bound is a Non-Functional Requirement instead), and governs the user's experience (a principle governing the architecture is an Architecture Tenets principle instead).
|
|
1085
|
+
optional: true
|
|
1442
1086
|
referenced:
|
|
1443
|
-
- "[[PATTERN:*]]"
|
|
1444
|
-
diagram:
|
|
1445
|
-
type: hub
|
|
1446
|
-
center: self
|
|
1447
|
-
nodes: "[[PRINCIPLE:*]], [[PERSONA:*]], [[STEP:*]], [[USE-CASE:*]], [[CONVENTION:*]], [[PATTERN:*]], [[ELEMENT:*]], [[DECISION:*]]"
|
|
1448
|
-
labeled: true
|
|
1449
|
-
qualified: true
|
|
1450
|
-
config:
|
|
1451
|
-
size-node-width-max: 440
|
|
1087
|
+
- "[[DIALOG-PATTERN:*]]"
|
|
1452
1088
|
props:
|
|
1453
1089
|
- name: CATEGORY
|
|
1454
1090
|
desc: >
|
|
@@ -1479,29 +1115,12 @@
|
|
|
1479
1115
|
file: 18-UXUI-LC-Language-Conventions.md
|
|
1480
1116
|
desc: >
|
|
1481
1117
|
The voice, tone, and wording of the user-facing text of the solution (labels, messages, notifications, help), governing how the solution speaks to its users, so that the Interaction Concept states how it behaves, the Language Conventions how it talks, and the Visual Design how it looks. Domain terms are *defined* in the Domain Glossary and only *surfaced* here, while the conventions of the specification text itself and of code identifiers are out of scope (they belong to the Development Aspects).
|
|
1482
|
-
refs: >
|
|
1483
|
-
- Podmajersky: Strategic Writing for UX (2019),
|
|
1484
|
-
https://www.oreilly.com/library/view/strategic-writing-for/9781492049388/
|
|
1485
|
-
- Metts/Welfle: Writing Is Designing: Words and the User Experience (2020),
|
|
1486
|
-
https://rosenfeldmedia.com/books/writing-is-designing/
|
|
1487
|
-
- Mailchimp: Content Style Guide -- Voice and Tone (2015),
|
|
1488
|
-
https://styleguide.mailchimp.com/
|
|
1489
|
-
- Microsoft: Microsoft Writing Style Guide (2018),
|
|
1490
|
-
https://learn.microsoft.com/en-us/style-guide/welcome/
|
|
1491
1118
|
optional: true
|
|
1492
|
-
diagram:
|
|
1493
|
-
type: grid
|
|
1494
|
-
nodes: "[[CONVENTION:*]]"
|
|
1495
|
-
properties:
|
|
1496
|
-
- CATEGORY
|
|
1497
|
-
config:
|
|
1498
|
-
size-node-width-max: 440
|
|
1499
|
-
size-node-height-scale: 2
|
|
1500
|
-
grid-columns-max: 4
|
|
1501
1119
|
children:
|
|
1502
1120
|
- kind: CONVENTION
|
|
1503
1121
|
desc: >
|
|
1504
1122
|
A single language convention, named with a short (2-5 word) summary (e.g. `Neutral Error Tone`, `Second-Person Address`) and described in a concise (1-3 sentence) paragraph as the rule the user-facing text of the solution has to follow consistently, plus a 1-sentence rationale ("why"). A convention governs how the solution phrases what it says, not what it does (a behavior is an Interaction Concept principle instead) and not what a term means (a definition is a Domain Glossary term instead).
|
|
1123
|
+
optional: true
|
|
1505
1124
|
props:
|
|
1506
1125
|
- name: CATEGORY
|
|
1507
1126
|
desc: >
|
|
@@ -1515,7 +1134,7 @@
|
|
|
1515
1134
|
- name: PRINCIPLES
|
|
1516
1135
|
desc: >
|
|
1517
1136
|
Comma-separated references to the INTERACTION-CONCEPT objects the convention supports in wording, so that a convention is grounded in the interaction philosophy rather than in taste alone.
|
|
1518
|
-
value: list([[PRINCIPLE:*]])
|
|
1137
|
+
value: list([[IC.PRINCIPLE:*]])
|
|
1519
1138
|
optional: true
|
|
1520
1139
|
- name: TERMS
|
|
1521
1140
|
desc: >
|
|
@@ -1532,36 +1151,12 @@
|
|
|
1532
1151
|
file: 19-UXUI-DP-Dialog-Patterns.md
|
|
1533
1152
|
desc: >
|
|
1534
1153
|
The reusable interaction structures governing how the system and user exchange information across recurring UI flows (e.g. master-detail dialog).
|
|
1535
|
-
refs: >
|
|
1536
|
-
- Alexander et al.: A Pattern Language: Towns, Buildings, Construction (1977),
|
|
1537
|
-
https://global.oup.com/academic/product/a-pattern-language-9780195019193
|
|
1538
|
-
- Borchers: A Pattern Approach to Interaction Design (2001),
|
|
1539
|
-
https://www.wiley.com/en-us/A+Pattern+Approach+to+Interaction+Design-p-9780471498285
|
|
1540
|
-
- Tidwell et al.: Designing Interfaces: Patterns for Effective Interaction Design, 3rd ed. (2020),
|
|
1541
|
-
https://www.oreilly.com/library/view/designing-interfaces-3rd/9781492051954/
|
|
1542
1154
|
optional: true
|
|
1543
|
-
diagram:
|
|
1544
|
-
type: grid
|
|
1545
|
-
nodes: "[[PATTERN:*]]"
|
|
1546
|
-
properties:
|
|
1547
|
-
- CATEGORY
|
|
1548
|
-
config:
|
|
1549
|
-
size-node-width-max: 440
|
|
1550
|
-
size-node-height-scale: 2
|
|
1551
|
-
grid-columns-max: 4
|
|
1552
1155
|
children:
|
|
1553
|
-
- kind: PATTERN
|
|
1156
|
+
- kind: DIALOG-PATTERN
|
|
1554
1157
|
desc: >
|
|
1555
1158
|
A single reusable dialog pattern, named with a short (2-5 word) summary (e.g. `Master-Detail`, `Wizard`, `Inline Edit`) and described in a concise (1-3 sentence) paragraph by the interaction structure and how the system and user exchange information within it, plus a 1-sentence rationale ("why") stating why this particular structure is worth adopting -- the benefit it secures or the trade-off it wins. A pattern is a structure recurring in at least two flows (a structure occurring in a single flow is a Dialog Storyboard frame instead) and is bound to a particular kind of screen or flow (a solution-wide rule independent of any screen is an Interaction Concept principle instead).
|
|
1556
|
-
|
|
1557
|
-
type: hub
|
|
1558
|
-
center: self
|
|
1559
|
-
nodes: "[[PATTERN:*]], [[PRINCIPLE:*]], [[STORYBOARD:*]], [[DECISION:*]]"
|
|
1560
|
-
deep: true
|
|
1561
|
-
labeled: true
|
|
1562
|
-
qualified: true
|
|
1563
|
-
config:
|
|
1564
|
-
size-node-width-max: 440
|
|
1159
|
+
optional: true
|
|
1565
1160
|
props:
|
|
1566
1161
|
- name: CATEGORY
|
|
1567
1162
|
desc: >
|
|
@@ -1581,12 +1176,12 @@
|
|
|
1581
1176
|
- name: PRINCIPLES
|
|
1582
1177
|
desc: >
|
|
1583
1178
|
Comma-separated references to the INTERACTION-CONCEPT objects the pattern embodies, so that every principle is shown to be honored by at least one pattern rather than merely declared.
|
|
1584
|
-
value: list([[PRINCIPLE:*]])
|
|
1179
|
+
value: list([[IC.PRINCIPLE:*]])
|
|
1585
1180
|
optional: true
|
|
1586
1181
|
- name: USES
|
|
1587
1182
|
desc: >
|
|
1588
1183
|
Comma-separated references to the smaller DIALOG-PATTERNS objects the pattern is composed of (e.g. a `Master-Detail` using an `Inline Edit` in its detail), so that the patterns form a language of related structures rather than a flat catalogue.
|
|
1589
|
-
value: list([[PATTERN:*]])
|
|
1184
|
+
value: list([[DIALOG-PATTERN:*]])
|
|
1590
1185
|
optional: true
|
|
1591
1186
|
- name: TRADE-OFF
|
|
1592
1187
|
desc: >
|
|
@@ -1598,37 +1193,12 @@
|
|
|
1598
1193
|
file: 20-UXUI-DS-Dialog-Storyboard.md
|
|
1599
1194
|
desc: >
|
|
1600
1195
|
The sequenced visual or textual depiction of a specific dialog flow, illustrating how an interaction unfolds screen by screen or turn by turn.
|
|
1601
|
-
refs: >
|
|
1602
|
-
- Truong et al.: Storyboarding: An Empirical Determination of Best Practices and Effective Guidelines (2006),
|
|
1603
|
-
https://dl.acm.org/doi/10.1145/1142405.1142410
|
|
1604
|
-
- Buxton: Sketching User Experiences: Getting the Design Right and the Right Design (2007),
|
|
1605
|
-
https://shop.elsevier.com/books/sketching-user-experiences-getting-the-design-right-and-the-right-design/buxton/978-0-12-374037-3
|
|
1606
|
-
- NN/g: Storyboards Help Visualize UX Ideas (2018),
|
|
1607
|
-
https://www.nngroup.com/articles/storyboards-visualize-ideas/
|
|
1608
1196
|
optional: true
|
|
1609
|
-
diagram:
|
|
1610
|
-
type: grid
|
|
1611
|
-
nodes: "[[STORYBOARD:*]]"
|
|
1612
|
-
properties:
|
|
1613
|
-
- ACTORS
|
|
1614
|
-
config:
|
|
1615
|
-
size-node-width-max: 440
|
|
1616
|
-
size-node-height-scale: 2
|
|
1617
|
-
grid-columns-max: 4
|
|
1618
1197
|
children:
|
|
1619
1198
|
- kind: STORYBOARD
|
|
1620
1199
|
desc: >
|
|
1621
1200
|
A single depicted dialog flow, named with a short (3-8 word) summary of the flow and comprised of frames in sequence. A storyboard shows the concrete user interface of one flow, as seen by its actors (the intent and the information exchanged are a Use Cases scenario instead, and a structure recurring across flows is a Dialog Pattern instead).
|
|
1622
|
-
|
|
1623
|
-
type: hub
|
|
1624
|
-
center: self
|
|
1625
|
-
nodes: "[[STORYBOARD:*]], [[PERSONA:*]], [[SCENARIO:*]], [[PATTERN:*]], [[MOCKUP:*]]"
|
|
1626
|
-
deep: true
|
|
1627
|
-
labeled: true
|
|
1628
|
-
qualified: true
|
|
1629
|
-
config:
|
|
1630
|
-
size-node-width-max: 440
|
|
1631
|
-
size-node-height-scale: 1.75
|
|
1201
|
+
optional: true
|
|
1632
1202
|
props:
|
|
1633
1203
|
- name: ACTORS
|
|
1634
1204
|
desc: >
|
|
@@ -1643,9 +1213,6 @@
|
|
|
1643
1213
|
- kind: FRAME
|
|
1644
1214
|
desc: >
|
|
1645
1215
|
A single frame of the storyboard, named with a short (2-5 word) label for the screen, turn, or state depicted, shown by its `SKETCH`, and described in a concise (1-2 sentence) paragraph by what the actor sees and does at this frame of the interaction.
|
|
1646
|
-
format:
|
|
1647
|
-
type: concise
|
|
1648
|
-
maxTableColumns: 5
|
|
1649
1216
|
props:
|
|
1650
1217
|
- name: SCENARIO-STEP
|
|
1651
1218
|
desc: >
|
|
@@ -1660,7 +1227,7 @@
|
|
|
1660
1227
|
- name: PATTERNS
|
|
1661
1228
|
desc: >
|
|
1662
1229
|
Comma-separated references to the DIALOG-PATTERNS objects the frame instantiates, so that a pattern is shown to recur across the concrete flows rather than merely being catalogued.
|
|
1663
|
-
value: list([[PATTERN:*]])
|
|
1230
|
+
value: list([[DIALOG-PATTERN:*]])
|
|
1664
1231
|
optional: true
|
|
1665
1232
|
- name: SKETCH
|
|
1666
1233
|
desc: >
|
|
@@ -1673,37 +1240,12 @@
|
|
|
1673
1240
|
file: 21-UXUI-VD-Visual-Design.md
|
|
1674
1241
|
desc: >
|
|
1675
1242
|
The visual design decisions of the solution (brand, color, typography, spacing, shape, iconography, imagery, and motion), each stated as a rule with its rationale, plus the high-fidelity mockups showing the decisions applied to concrete screens, so that the Interaction Concept states how the solution behaves, the Language Conventions how it talks, and the Visual Design how it looks. The concrete token values live in the design system (token file, design tool library) and are referenced rather than restated, the arrangement of the regions of a screen is a Dialog Pattern, the screen of a particular flow step is a Dialog Storyboard frame, and a measurable visual bound (e.g. a contrast ratio) is a Non-Functional Requirement.
|
|
1676
|
-
refs: >
|
|
1677
|
-
- DTCG: Design Tokens Format Module (2025),
|
|
1678
|
-
https://www.designtokens.org/tr/format/
|
|
1679
|
-
- Google: Material Design 3 -- Styles: Color, Typography, Shape, Motion, Icons, Elevation (2021),
|
|
1680
|
-
https://m3.material.io/styles
|
|
1681
|
-
- Kholmatova: Design Systems: A practical guide for creating design languages for digital products (2017),
|
|
1682
|
-
https://www.smashingmagazine.com/printed-books/design-systems/
|
|
1683
1243
|
optional: true
|
|
1684
|
-
diagram:
|
|
1685
|
-
type: grid
|
|
1686
|
-
nodes: "[[ELEMENT:*]]"
|
|
1687
|
-
properties:
|
|
1688
|
-
- CATEGORY
|
|
1689
|
-
config:
|
|
1690
|
-
size-node-width-max: 440
|
|
1691
|
-
size-node-height-scale: 2
|
|
1692
|
-
grid-columns-max: 4
|
|
1693
1244
|
children:
|
|
1694
1245
|
- kind: ELEMENT
|
|
1695
1246
|
desc: >
|
|
1696
1247
|
A single visual design element, named with a short (2-5 word) summary (e.g. `Brand Color Palette`, `Self-Hosted Typography`) and described in a concise (1-3 sentence) paragraph as the rule the appearance of the solution has to follow consistently, naming its stable concrete values (e.g. the primary color, the font family, the type scale) and deferring the remaining ones to its `SOURCE`, plus a 1-sentence rationale ("why"). An element decides how the solution looks (a behavior is an Interaction Concept principle instead, a wording is a Language Conventions convention instead), solution-wide rather than for one screen (a screen is a `MOCKUP` or a Dialog Storyboard frame instead), and is a decision rather than a list of token values (the values are in the design system) or a measurable bound (a bound is a Non-Functional Requirement instead).
|
|
1697
|
-
|
|
1698
|
-
maxTableColumns: 5
|
|
1699
|
-
diagram:
|
|
1700
|
-
type: hub
|
|
1701
|
-
center: self
|
|
1702
|
-
nodes: "[[ELEMENT:*]], [[PERSONA:*]], [[PRINCIPLE:*]], [[MOCKUP:*]]"
|
|
1703
|
-
labeled: true
|
|
1704
|
-
qualified: true
|
|
1705
|
-
config:
|
|
1706
|
-
size-node-width-max: 440
|
|
1248
|
+
optional: true
|
|
1707
1249
|
props:
|
|
1708
1250
|
- name: CATEGORY
|
|
1709
1251
|
desc: >
|
|
@@ -1717,7 +1259,7 @@
|
|
|
1717
1259
|
- name: PRINCIPLES
|
|
1718
1260
|
desc: >
|
|
1719
1261
|
Comma-separated references to the INTERACTION-CONCEPT objects the element supports in appearance, so that an element is grounded in the interaction philosophy rather than in taste alone.
|
|
1720
|
-
value: list([[PRINCIPLE:*]])
|
|
1262
|
+
value: list([[IC.PRINCIPLE:*]])
|
|
1721
1263
|
optional: true
|
|
1722
1264
|
- name: SOURCE
|
|
1723
1265
|
desc: >
|
|
@@ -1729,8 +1271,7 @@
|
|
|
1729
1271
|
- kind: MOCKUP
|
|
1730
1272
|
desc: >
|
|
1731
1273
|
A single high-fidelity mockup, named with a short (2-5 word) label for the screen depicted, shown by its `IMAGE`, and described in a concise (1-2 sentence) paragraph by which visual design elements it shows applied and where on the screen. A mockup is a reference rendering of the final look of one screen (a low-fidelity sketch of a screen within its flow is a Dialog Storyboard frame instead) and shows rules applied rather than stating them (a rule is an `ELEMENT` instead).
|
|
1732
|
-
|
|
1733
|
-
type: complex
|
|
1274
|
+
optional: true
|
|
1734
1275
|
props:
|
|
1735
1276
|
- name: ACTORS
|
|
1736
1277
|
desc: >
|
|
@@ -1749,44 +1290,92 @@
|
|
|
1749
1290
|
desc: >
|
|
1750
1291
|
An image (``) of the mockup, a high-fidelity rendering from the design tool or a screenshot of an already existing user interface, so that the look is seen rather than only read.
|
|
1751
1292
|
|
|
1293
|
+
- kind: ARCH
|
|
1294
|
+
name: Architecture Tenets
|
|
1295
|
+
id: AT
|
|
1296
|
+
file: 22-ARCH-AT-Architecture-Tenets.md
|
|
1297
|
+
desc: >
|
|
1298
|
+
The architecture philosophy of the solution, stated as the few overarching maxims and the standing principles derived from them, which every pattern, view, tactic, decision, and aspect of the architecture has to obey, while the reusable structures belong to the Architecture Patterns and the concrete ones to the views following them. The maxims are listed in decreasing precedence, so that whenever two maxims conflict in a particular design decision, the earlier one wins, and a principle conflict is settled by the precedence of the maxims the principles derive from.
|
|
1299
|
+
|
|
1300
|
+
The tenets are prescriptive and reusable, not verifiable and not decided once: a quality bound verifiable by a metric is a Non-Functional Requirement, the mechanism achieving a quality is a Quality Perspectives tactic, the rule about the source structure and process is a Development Aspects aspect, the one-off trade-off between genuine alternatives is a Design Decisions decision (which applies the tenets through `GUIDED-BY`), and the principle governing the user's experience is an Interaction Concept principle.
|
|
1301
|
+
optional: true
|
|
1302
|
+
children:
|
|
1303
|
+
- kind: MAXIM
|
|
1304
|
+
desc: >
|
|
1305
|
+
A single architecture maxim, named with a short (2-5 word) preference or imperative (e.g. `Simplicity over Flexibility`, `Buy before Build`, `Own the Data`) and described in a concise (1-3 sentence) paragraph by how it guides the architecture of the solution as a whole, plus a 1-sentence rationale ("why"). A solution has only a few (3-7) maxims: a maxim is solution-wide and independent of any particular view or element (a rule bound to a structure is a principle instead), decides between design alternatives (the subordinated side usually named by its `X over Y` form), and is not verifiable by a metric (a measurable quality bound is a Non-Functional Requirement instead).
|
|
1306
|
+
optional: true
|
|
1307
|
+
props:
|
|
1308
|
+
- name: DRIVEN-BY
|
|
1309
|
+
desc: >
|
|
1310
|
+
Comma-separated references to the NON-FUNCTIONAL-REQUIREMENTS or SOLUTION-PREMISES objects the maxim answers (e.g. the maintainability requirement, the small-team premise), so that a maxim is grounded in the forces on the solution rather than in taste alone; omitted for a maxim rooted in the Solution Vision alone.
|
|
1311
|
+
value: list([[NR.*]], [[PREMISE:*]])
|
|
1312
|
+
optional: true
|
|
1313
|
+
- kind: PRINCIPLE
|
|
1314
|
+
desc: >
|
|
1315
|
+
A single architecture principle, named with a short (2-5 word) summary (e.g. `Stateless Services`, `One Owner per Entity`, `Async between Contexts`) and described in a concise (1-3 sentence) paragraph as the standing rule the architecture follows whenever its concern arises, stated with `MUST`/`MUST NOT` or `SHOULD`/`SHOULD NOT`, plus a 1-sentence rationale ("why"). A principle is bound to a particular structure of the architecture (a rule independent of any structure is a maxim instead), reusable across many decisions (a trade-off made once between genuine alternatives is a Design Decisions decision instead), names no mechanism and no product (the mechanism is a Quality Perspectives tactic, the product a Technology Stack component), and governs the architecture, not the source process (a Development Aspects aspect), the code (a Code Patterns pattern), or the user's experience (an Interaction Concept principle).
|
|
1316
|
+
optional: true
|
|
1317
|
+
props:
|
|
1318
|
+
- name: MAXIMS
|
|
1319
|
+
desc: >
|
|
1320
|
+
Comma-separated references to the MAXIM objects the principle concretizes (e.g. a `Stateless Services` principle concretizing a `Scale Out over Scale Up` maxim), so that the principles form a hierarchy below the maxims rather than a flat catalogue; omitted for a principle standing on its own forces alone.
|
|
1321
|
+
value: list([[MAXIM:*]])
|
|
1322
|
+
optional: true
|
|
1323
|
+
- name: DRIVEN-BY
|
|
1324
|
+
desc: >
|
|
1325
|
+
Comma-separated references to the NON-FUNCTIONAL-REQUIREMENTS or SOLUTION-PREMISES objects the principle answers beyond the maxims it concretizes (e.g. the availability requirement, the hosting constraint); omitted for a principle grounded in its maxims alone.
|
|
1326
|
+
value: list([[NR.*]], [[PREMISE:*]])
|
|
1327
|
+
optional: true
|
|
1328
|
+
- name: IMPLICATIONS
|
|
1329
|
+
desc: >
|
|
1330
|
+
What following the principle obliges the architecture to, stated as a 1-2 sentence description of the consequences for the elements it governs (e.g. `session state lives in the shared store, so every component instance is replaceable at any time`), as opposed to the rationale which states why the principle is worth these consequences; omitted when nothing non-obvious follows from the principle.
|
|
1331
|
+
optional: true
|
|
1332
|
+
|
|
1333
|
+
- kind: ARCH
|
|
1334
|
+
name: Architecture Patterns
|
|
1335
|
+
id: AP
|
|
1336
|
+
file: 23-ARCH-AP-Architecture-Patterns.md
|
|
1337
|
+
desc: >
|
|
1338
|
+
The reusable structural solutions the architecture of the solution follows, each a named pattern of the literature or of the organization (e.g. hexagonal architecture, transactional outbox, backend for frontend) applied to the solution as a whole, which the views following them realize, the tactics build upon, the decisions choose, and the code patterns code. The artifact completes the guidance of the architecture: the Architecture Tenets state what the architecture values and obeys, the patterns state the structures it takes to do so.
|
|
1339
|
+
|
|
1340
|
+
A pattern names a structure, nothing else: the mechanism achieving one quality attribute is a Quality Perspectives tactic (which may be built from patterns), the one-off trade-off choosing a pattern over its alternatives is a Design Decisions decision, the coded form of a pattern is a Code Patterns pattern shown as a listing, and a structure of the user interface is a Dialog Patterns pattern.
|
|
1341
|
+
optional: true
|
|
1342
|
+
children:
|
|
1343
|
+
- kind: PATTERN
|
|
1344
|
+
desc: >
|
|
1345
|
+
A single architecture pattern, named with its established short (2-5 word) name (e.g. `Hexagonal Architecture`, `Transactional Outbox`, `Backend for Frontend`) and described in a concise (1-3 sentence) paragraph by the structure the pattern prescribes and the problem it solves in the solution, plus a 1-sentence rationale ("why") for adopting it. A pattern is a structure reusable beyond one quality attribute (a mechanism for one quality is a Quality Perspectives tactic instead) and beyond one decision (a trade-off made once is a Design Decisions decision instead), applies the Architecture Tenets rather than restating them, and is realized by the elements of the views following it, which reference it, so its hub diagram shows where it took effect.
|
|
1346
|
+
optional: true
|
|
1347
|
+
props:
|
|
1348
|
+
- name: PRINCIPLES
|
|
1349
|
+
desc: >
|
|
1350
|
+
Comma-separated references to the ARCHITECTURE-TENETS principles the pattern applies (e.g. a `Transactional Outbox` applying an `Async between Contexts` principle), so that a pattern is adopted for a stated stance of the architecture rather than for its popularity; omitted for a pattern applying no modeled principle.
|
|
1351
|
+
value: list([[AT.PRINCIPLE:*]])
|
|
1352
|
+
optional: true
|
|
1353
|
+
- name: DRIVEN-BY
|
|
1354
|
+
desc: >
|
|
1355
|
+
Comma-separated references to the NON-FUNCTIONAL-REQUIREMENTS or SOLUTION-PREMISES objects the pattern answers beyond the principles it applies (e.g. the scalability requirement, the hosting constraint); omitted for a pattern grounded in its principles alone.
|
|
1356
|
+
value: list([[NR.*]], [[PREMISE:*]])
|
|
1357
|
+
optional: true
|
|
1358
|
+
- name: USES
|
|
1359
|
+
desc: >
|
|
1360
|
+
Comma-separated references to the smaller ARCHITECTURE-PATTERNS objects the pattern is composed of (e.g. a `Saga` using a `Transactional Outbox` for its steps), so that the patterns form a language of related structures rather than a flat catalogue.
|
|
1361
|
+
value: list([[PATTERN:*]])
|
|
1362
|
+
optional: true
|
|
1363
|
+
acyclic: true
|
|
1364
|
+
|
|
1752
1365
|
- kind: ARCH
|
|
1753
1366
|
name: Context View
|
|
1754
1367
|
id: CV
|
|
1755
|
-
file:
|
|
1368
|
+
file: 24-ARCH-CV-Context-View.md
|
|
1756
1369
|
desc: >
|
|
1757
1370
|
The relationships, dependencies, and interactions between the solution and its environment, defining the system's boundary by enumerating the external entities sitting at it. The artifact complements the Solution Vision: its `SCOPE` states what is deliberately *out* of the solution, the Context View enumerates what the solution touches *at* the boundary.
|
|
1758
1371
|
optional: true
|
|
1759
|
-
refs: >
|
|
1760
|
-
- Rozanski/Woods: Software Systems Architecture, 2nd ed.: The Context Viewpoint (2011),
|
|
1761
|
-
https://www.viewpoints-and-perspectives.info/home/viewpoints/context/
|
|
1762
|
-
- Brown: The C4 Model: System Context Diagram (2018),
|
|
1763
|
-
https://c4model.com/diagrams/system-context
|
|
1764
|
-
- ISO/IEC/IEEE 42010:2022: Software, systems and enterprise -- Architecture description (2022),
|
|
1765
|
-
https://www.iso.org/standard/74393.html
|
|
1766
|
-
diagram:
|
|
1767
|
-
type: hub
|
|
1768
|
-
nodes: "[[CV.ENTITY:*]]"
|
|
1769
|
-
center:
|
|
1770
|
-
source: "[[TI]]"
|
|
1771
|
-
property: TITLE
|
|
1772
|
-
kind: Solution
|
|
1773
|
-
centerEdges:
|
|
1774
|
-
property: DIRECTION
|
|
1775
|
-
inbound: Inbound
|
|
1776
|
-
outbound: Outbound
|
|
1777
|
-
both: Bidirectional
|
|
1778
|
-
via: VIA
|
|
1779
|
-
qualified: true
|
|
1780
|
-
properties:
|
|
1781
|
-
- KIND
|
|
1782
1372
|
children:
|
|
1783
1373
|
- kind: ENTITY
|
|
1784
1374
|
desc: >
|
|
1785
1375
|
A single external entity the solution interacts with, named with a short (2-5 word) summary (e.g. `Payment Gateway`, `Identity Provider`, `End User`) and described in a concise (1-3 sentence) paragraph by the relationship and dependency between the solution and the entity, plus a 1-sentence rationale ("why") for the entity being part of the system context.
|
|
1786
1376
|
|
|
1787
1377
|
An entity is outside the solution and exchanges information with it across the boundary: a party with a mere interest in the solution but no such exchange is a `Stakeholder` persona of the User Personas instead, and a platform element the solution deploys and operates itself (e.g. a managed database of its own) is a Deployment View node instead -- only a party or system the solution merely consumes or serves belongs to the system context.
|
|
1788
|
-
|
|
1789
|
-
maxTableColumns: 5
|
|
1378
|
+
optional: true
|
|
1790
1379
|
props:
|
|
1791
1380
|
- name: KIND
|
|
1792
1381
|
desc: |
|
|
@@ -1840,43 +1429,15 @@
|
|
|
1840
1429
|
- kind: ARCH
|
|
1841
1430
|
name: Functionality View
|
|
1842
1431
|
id: FV
|
|
1843
|
-
file:
|
|
1432
|
+
file: 25-ARCH-FV-Functionality-View.md
|
|
1844
1433
|
desc: >
|
|
1845
1434
|
The functional components of the solution, their responsibilities, interfaces, and primary interactions, describing *how* the solution's runtime elements are structured and which responsibility each owns, delivering the behaviors the Functional Requirements state.
|
|
1846
1435
|
optional: true
|
|
1847
|
-
refs: >
|
|
1848
|
-
- Rozanski/Woods: Software Systems Architecture, 2nd ed.: The Functional Viewpoint (2011),
|
|
1849
|
-
https://www.viewpoints-and-perspectives.info/home/viewpoints/functional/
|
|
1850
|
-
- Kruchten: Architectural Blueprints -- The "4+1" View Model of Software Architecture (1995),
|
|
1851
|
-
https://ieeexplore.ieee.org/document/469759
|
|
1852
|
-
- Brown: The C4 Model (2018),
|
|
1853
|
-
https://c4model.com/
|
|
1854
|
-
diagram:
|
|
1855
|
-
type: graph
|
|
1856
|
-
nodes: "[[FV.COMPONENT:*]]"
|
|
1857
|
-
labeled: true
|
|
1858
|
-
nest:
|
|
1859
|
-
properties:
|
|
1860
|
-
- PART-OF
|
|
1861
|
-
properties:
|
|
1862
|
-
- KIND
|
|
1863
1436
|
children:
|
|
1864
1437
|
- kind: COMPONENT
|
|
1865
1438
|
desc: >
|
|
1866
1439
|
A single functional component, named with a short (2-5 word) summary (e.g. `Authentication Service`, `Order Processor`, `Notification Dispatcher`) and described in a concise (1-3 sentence) paragraph whose first sentence names the single, primary responsibility the component owns (split into several components otherwise) and which elaborates how the component fulfills it and collaborates with the components it depends on, plus a 1-sentence rationale ("why") for the component's existence and boundary.
|
|
1867
|
-
|
|
1868
|
-
maxTableColumns: 5
|
|
1869
|
-
diagram:
|
|
1870
|
-
type: hub
|
|
1871
|
-
center: self
|
|
1872
|
-
nodes: "[[FV.COMPONENT:*]], [[FR.REQUIREMENT:*]], [[INTERFACE:*]], [[DM.ENTITY:*]], [[UNIT:*]], [[NODE:*]], [[CONCERN:*]], [[TACTIC:*]], [[DECISION:*]]"
|
|
1873
|
-
labeled: true
|
|
1874
|
-
qualified: true
|
|
1875
|
-
properties:
|
|
1876
|
-
- KIND
|
|
1877
|
-
config:
|
|
1878
|
-
size-node-width-max: 440
|
|
1879
|
-
size-node-height-scale: 1.75
|
|
1440
|
+
optional: true
|
|
1880
1441
|
props:
|
|
1881
1442
|
- name: KIND
|
|
1882
1443
|
desc: |
|
|
@@ -1900,6 +1461,11 @@
|
|
|
1900
1461
|
Comma-separated references to the FUNCTIONAL-REQUIREMENTS objects the component realizes, i.e. whose capability its functionality delivers, so that every Functional Requirement is owned by at least one component.
|
|
1901
1462
|
value: list([[FR.*]])
|
|
1902
1463
|
optional: true
|
|
1464
|
+
- name: PATTERNS
|
|
1465
|
+
desc: >
|
|
1466
|
+
Comma-separated references to the ARCHITECTURE-PATTERNS objects the structure of the component follows (e.g. the service shaped by a `Hexagonal Architecture`, the publisher keeping a `Transactional Outbox`); omitted for a component following no modeled pattern.
|
|
1467
|
+
value: list([[PATTERN:*]])
|
|
1468
|
+
optional: true
|
|
1903
1469
|
- name: OWNS
|
|
1904
1470
|
desc: >
|
|
1905
1471
|
Comma-separated references to the DATA-MODEL entities the component owns, i.e. for which it is the single authoritative source of truth (other components access an owned entity through the owner's interfaces or hold derived copies only), so that every entity is owned by at most one component; omitted when the component owns no entity.
|
|
@@ -1924,26 +1490,10 @@
|
|
|
1924
1490
|
- kind: ARCH
|
|
1925
1491
|
name: Technology Stack
|
|
1926
1492
|
id: TS
|
|
1927
|
-
file:
|
|
1493
|
+
file: 26-ARCH-TS-Technology-Stack.md
|
|
1928
1494
|
desc: >
|
|
1929
1495
|
The concrete technology products the solution is built upon, organized by tier and lifecycle phase, recording for each component its chosen product, its purpose, and the alternatives that were considered but not chosen.
|
|
1930
1496
|
optional: true
|
|
1931
|
-
refs: >
|
|
1932
|
-
- Starke/Hruschka: arc42 Template: Solution Strategy and Crosscutting Concepts (2005),
|
|
1933
|
-
https://arc42.org/overview
|
|
1934
|
-
- Brown: The C4 Model: Container Diagram (2018),
|
|
1935
|
-
https://c4model.com/diagrams/container
|
|
1936
|
-
diagram:
|
|
1937
|
-
type: grid
|
|
1938
|
-
nodes: "[[TS.TIER:*]], [[TS.TIER:*.COMPONENT:*]]"
|
|
1939
|
-
nest:
|
|
1940
|
-
parent: true
|
|
1941
|
-
layout: grid
|
|
1942
|
-
properties:
|
|
1943
|
-
- PRODUCT
|
|
1944
|
-
config:
|
|
1945
|
-
size-node-width-max: 440
|
|
1946
|
-
grid-columns-max: 2
|
|
1947
1497
|
children:
|
|
1948
1498
|
- kind: TIER
|
|
1949
1499
|
desc: |
|
|
@@ -1959,34 +1509,13 @@
|
|
|
1959
1509
|
or a shared module used by client and server), so a product
|
|
1960
1510
|
used on several tiers is a single component here instead of
|
|
1961
1511
|
one per tier; referenced by no Deployment View tier.
|
|
1962
|
-
|
|
1963
|
-
type: hub
|
|
1964
|
-
center: self
|
|
1965
|
-
nodes: "[[TS.TIER:*]], [[TS.TIER:*.COMPONENT:*]], [[DV.TIER:*]]"
|
|
1966
|
-
hierarchy: true
|
|
1967
|
-
properties:
|
|
1968
|
-
- PRODUCT
|
|
1969
|
-
config:
|
|
1970
|
-
size-node-width-max: 440
|
|
1971
|
-
size-node-height-scale: 1.75
|
|
1512
|
+
optional: true
|
|
1972
1513
|
children:
|
|
1973
1514
|
- kind: COMPONENT
|
|
1974
1515
|
desc: >
|
|
1975
1516
|
A single technology component, named with a short (2-5 word) summary (e.g. `UI Framework`, `Web Server`, `Relational Database`) and described in a concise (1-3 sentence) paragraph by how the product is used within the solution and how it fits into the overall technology stack, plus a 1-sentence rationale ("why") for choosing this product over the alternatives.
|
|
1976
1517
|
|
|
1977
1518
|
A component states one product in one role on one tier: the product used by several tiers alike belongs to the `Common` tier once, the lock-in carrying trade-off behind the choice is a Design Decisions decision referencing the component through `DECIDES`, and the functional components depending on the product reference it through `USED-BY`.
|
|
1978
|
-
diagram:
|
|
1979
|
-
type: hub
|
|
1980
|
-
center: self
|
|
1981
|
-
nodes: "[[TS.TIER:*.COMPONENT:*]], [[FV.COMPONENT:*]], [[CONCERN:*]], [[TACTIC:*]], [[DECISION:*]]"
|
|
1982
|
-
labeled: true
|
|
1983
|
-
qualified: true
|
|
1984
|
-
properties:
|
|
1985
|
-
- PRODUCT
|
|
1986
|
-
- PHASE
|
|
1987
|
-
config:
|
|
1988
|
-
size-node-width-max: 440
|
|
1989
|
-
size-node-height-scale: 1.75
|
|
1990
1519
|
props:
|
|
1991
1520
|
- name: PRODUCT
|
|
1992
1521
|
desc: >
|
|
@@ -2235,82 +1764,42 @@
|
|
|
2235
1764
|
- kind: ARCH
|
|
2236
1765
|
name: Development Aspects
|
|
2237
1766
|
id: DA
|
|
2238
|
-
file:
|
|
1767
|
+
file: 27-ARCH-DA-Development-Aspects.md
|
|
2239
1768
|
desc: >
|
|
2240
1769
|
The architecture supporting the software development process, defining the module organization, build approach, and codeline conventions. The artifact is absent when the development conventions are governed outside the specification (e.g. by repository-level contributor instructions).
|
|
2241
1770
|
optional: true
|
|
2242
|
-
refs: >
|
|
2243
|
-
- Rozanski/Woods: Software Systems Architecture, 2nd ed.: The Development Viewpoint (2011),
|
|
2244
|
-
https://www.viewpoints-and-perspectives.info/home/viewpoints/development/
|
|
2245
|
-
- Kruchten: Architectural Blueprints -- The "4+1" View Model of Software Architecture (1995),
|
|
2246
|
-
https://ieeexplore.ieee.org/document/469759
|
|
2247
|
-
- Clements et al.: Documenting Software Architectures: Views and Beyond, 2nd ed. (2010),
|
|
2248
|
-
https://www.informit.com/store/documenting-software-architectures-views-and-beyond-9780321552686
|
|
2249
|
-
diagram:
|
|
2250
|
-
type: grid
|
|
2251
|
-
nodes: "[[ASPECT:*]]"
|
|
2252
|
-
properties:
|
|
2253
|
-
- CATEGORY
|
|
2254
1771
|
children:
|
|
2255
1772
|
- kind: ASPECT
|
|
2256
1773
|
desc: >
|
|
2257
1774
|
A single development aspect, named with a short (2-5 word) summary (e.g. `Module Layering`, `Build Pipeline`, `Branching Model`) and described in a concise (1-3 sentence) paragraph by the development convention or structure and the rule developers must follow, plus a 1-sentence rationale ("why").
|
|
2258
1775
|
|
|
2259
|
-
An aspect states a standing developer-facing rule about the source structure and process: it names no concrete products (a Technology Stack `Build-Time` component states the product choice), does not restate the runtime structure (a Functionality View `Module` or `Subsystem` groups the logic), does not cover production procedures (an Operations View concern does), and the trade-off that produced a rule is a Design Decisions decision referencing the aspect through `AFFECTS`, while the quality the rule protects (usually a `Maintainability` requirement) is addressed by a Quality Perspectives tactic referencing the aspect through `AFFECTS`, too, so the hub diagram of an aspect shows the decision and the tactic behind it.
|
|
2260
|
-
|
|
2261
|
-
type: hub
|
|
2262
|
-
center: self
|
|
2263
|
-
nodes: "[[ASPECT:*]], [[TACTIC:*]], [[DECISION:*]]"
|
|
2264
|
-
labeled: true
|
|
2265
|
-
qualified: true
|
|
2266
|
-
properties:
|
|
2267
|
-
- CATEGORY
|
|
2268
|
-
config:
|
|
2269
|
-
size-node-width-max: 440
|
|
2270
|
-
size-node-height-scale: 1.75
|
|
1776
|
+
An aspect states a standing developer-facing rule about the source structure and process: it names no concrete products (a Technology Stack `Build-Time` component states the product choice), does not restate the runtime structure (a Functionality View `Module` or `Subsystem` groups the logic), does not cover production procedures (an Operations View concern does), does not prescribe how a concern is coded (a Code Patterns pattern shows that as a listing), the tenet the rule concretizes is an Architecture Tenets maxim or principle referenced through `GUIDED-BY`, and the trade-off that produced a rule is a Design Decisions decision referencing the aspect through `AFFECTS`, while the quality the rule protects (usually a `Maintainability` requirement) is addressed by a Quality Perspectives tactic referencing the aspect through `AFFECTS`, too, so the hub diagram of an aspect shows the tenet, the decision, and the tactic behind it.
|
|
1777
|
+
optional: true
|
|
2271
1778
|
props:
|
|
2272
1779
|
- name: CATEGORY
|
|
2273
1780
|
desc: >
|
|
2274
1781
|
The development concern the aspect governs: `Structure` (the physical source module/package layout), `Build` (compilation and packaging), `Dependency` (the allowed dependency edges between the structures), `Codeline` (branching, merging, versioning), `Standardization` (coding standards and conventions), `Testing` (test conventions, layout, and coverage rules), or `Tooling` (development tools and automation).
|
|
2275
1782
|
value: enum(Structure,Build,Dependency,Codeline,Standardization,Testing,Tooling)
|
|
1783
|
+
- name: GUIDED-BY
|
|
1784
|
+
desc: >
|
|
1785
|
+
Comma-separated references to the ARCHITECTURE-TENETS objects the aspect concretizes for the source structure and process (e.g. the module layering following a `Dependencies Point Inward` principle); omitted for an aspect concretizing no modeled tenet.
|
|
1786
|
+
value: list([[MAXIM:*]], [[AT.PRINCIPLE:*]])
|
|
1787
|
+
optional: true
|
|
2276
1788
|
|
|
2277
1789
|
- kind: ARCH
|
|
2278
1790
|
name: Concurrency View
|
|
2279
1791
|
id: CO
|
|
2280
|
-
file:
|
|
1792
|
+
file: 28-ARCH-CO-Concurrency-View.md
|
|
2281
1793
|
desc: >
|
|
2282
1794
|
The concurrency structure of the solution, mapping functional components to processes and threads, and defining how they coordinate and communicate. The artifact is absent when the solution runs as a single sequential unit of execution and has no concurrency structure worth describing.
|
|
2283
1795
|
optional: true
|
|
2284
|
-
refs: >
|
|
2285
|
-
- Rozanski/Woods: Software Systems Architecture, 2nd ed.: The Concurrency Viewpoint (2011),
|
|
2286
|
-
https://www.viewpoints-and-perspectives.info/home/viewpoints/concurrency/
|
|
2287
|
-
- Kruchten: Architectural Blueprints -- The "4+1" View Model of Software Architecture (1995),
|
|
2288
|
-
https://ieeexplore.ieee.org/document/469759
|
|
2289
|
-
- Schmidt et al.: Pattern-Oriented Software Architecture, Volume 2: Patterns for Concurrent and Networked Objects (2000),
|
|
2290
|
-
https://www.wiley.com/en-us/Pattern+Oriented+Software+Architecture,+Volume+2,+Patterns+for+Concurrent+and+Networked+Objects-p-9781118725177
|
|
2291
|
-
diagram:
|
|
2292
|
-
type: graph
|
|
2293
|
-
nodes: "[[UNIT:*]]"
|
|
2294
|
-
labeled: true
|
|
2295
|
-
properties:
|
|
2296
|
-
- KIND
|
|
2297
1796
|
children:
|
|
2298
1797
|
- kind: UNIT
|
|
2299
1798
|
desc: >
|
|
2300
1799
|
A single concurrency unit, named with a short (2-5 word) summary (e.g. `Web Worker Pool`, `Background Scheduler`, `Ingest Queue Consumer`) and described in a concise (1-3 sentence) paragraph by how it executes and how it avoids or manages contention, races, and deadlocks (including its start order and failure/restart behavior where non-obvious), plus a 1-sentence rationale ("why") for the chosen concurrency structure.
|
|
2301
1800
|
|
|
2302
1801
|
A unit executes work at runtime: a queue or channel between units is not a unit but the coordination mechanism stated in `COORDINATION`, its contract an Interface Model interface (e.g. of kind `MQTT` or `WebSocket`), and the platform element hosting a managed broker a Deployment View `Managed` node -- only the executing structure itself belongs to the Concurrency View.
|
|
2303
|
-
|
|
2304
|
-
type: hub
|
|
2305
|
-
center: self
|
|
2306
|
-
nodes: "[[UNIT:*]], [[FV.COMPONENT:*]], [[NODE:*]], [[TACTIC:*]], [[DECISION:*]]"
|
|
2307
|
-
labeled: true
|
|
2308
|
-
qualified: true
|
|
2309
|
-
properties:
|
|
2310
|
-
- KIND
|
|
2311
|
-
config:
|
|
2312
|
-
size-node-width-max: 440
|
|
2313
|
-
size-node-height-scale: 1.75
|
|
1802
|
+
optional: true
|
|
2314
1803
|
props:
|
|
2315
1804
|
- name: KIND
|
|
2316
1805
|
desc: |
|
|
@@ -2348,52 +1837,17 @@
|
|
|
2348
1837
|
- kind: ARCH
|
|
2349
1838
|
name: Deployment View
|
|
2350
1839
|
id: DV
|
|
2351
|
-
file:
|
|
1840
|
+
file: 29-ARCH-DV-Deployment-View.md
|
|
2352
1841
|
desc: >
|
|
2353
1842
|
The environment into which the solution is deployed, partitioning it into tiers and mapping software elements to the runtime platform, hardware, and network topology.
|
|
2354
1843
|
optional: true
|
|
2355
|
-
refs: >
|
|
2356
|
-
- Rozanski/Woods: Software Systems Architecture, 2nd ed.: The Deployment Viewpoint (2011),
|
|
2357
|
-
https://www.viewpoints-and-perspectives.info/home/viewpoints/deployment/
|
|
2358
|
-
- Kruchten: Architectural Blueprints -- The "4+1" View Model of Software Architecture (1995),
|
|
2359
|
-
https://ieeexplore.ieee.org/document/469759
|
|
2360
|
-
- Brown: The C4 Model: Deployment Diagram (2018),
|
|
2361
|
-
https://c4model.com/diagrams/deployment
|
|
2362
|
-
diagram:
|
|
2363
|
-
type: graph
|
|
2364
|
-
nodes: "[[NODE:*]]"
|
|
2365
|
-
labeled: true
|
|
2366
|
-
qualified: true
|
|
2367
|
-
nest:
|
|
2368
|
-
properties:
|
|
2369
|
-
- PART-OF
|
|
2370
|
-
- TIER
|
|
2371
|
-
properties:
|
|
2372
|
-
- AREA
|
|
2373
|
-
- KIND
|
|
2374
|
-
- PLATFORM
|
|
2375
|
-
config:
|
|
2376
|
-
size-node-width-max: 350
|
|
2377
1844
|
children:
|
|
2378
1845
|
- kind: TIER
|
|
2379
1846
|
desc: >
|
|
2380
1847
|
A single deployment tier, named with a short (1-3 word) summary (e.g. `Client`, `Server`, `Database`, `Data Center`) and described in a concise (1-3 sentence) paragraph by the code or data it hosts and its spatial and network separation from the other tiers, plus a 1-sentence rationale ("why") for the partitioning.
|
|
2381
1848
|
|
|
2382
1849
|
A tier is a logically and spatially distinct, network-connected, technology-induced partition of the solution, the *horizontal* split when drawn (an `AREA` is the *vertical*, domain-induced one): every node belongs to exactly one tier via its `TIER`, a location-level tier (e.g. a data center) groups the tiers referencing it via `PART-OF`, and a single deployment unit within a tier is a `NODE` -- only the partition itself belongs here.
|
|
2383
|
-
|
|
2384
|
-
type: concise
|
|
2385
|
-
diagram:
|
|
2386
|
-
type: hub
|
|
2387
|
-
center: self
|
|
2388
|
-
nodes: "[[DV.TIER:*]], [[NODE:*]], [[TACTIC:*]], [[DECISION:*]]"
|
|
2389
|
-
labeled: true
|
|
2390
|
-
qualified: true
|
|
2391
|
-
properties:
|
|
2392
|
-
- LOCATION
|
|
2393
|
-
- KIND
|
|
2394
|
-
config:
|
|
2395
|
-
size-node-width-max: 440
|
|
2396
|
-
size-node-height-scale: 1.75
|
|
1850
|
+
optional: true
|
|
2397
1851
|
props:
|
|
2398
1852
|
- name: PART-OF
|
|
2399
1853
|
desc: >
|
|
@@ -2416,38 +1870,12 @@
|
|
|
2416
1870
|
|
|
2417
1871
|
An area is a logically distinct, domain-induced partition of the solution deployed as physical units of its own, the *vertical* split when drawn (a `TIER` is the *horizontal*, technology-induced one): a node dedicated to the area references it via its `AREA`, a node shared by several areas references none, and a domain grouping without deployment units of its own is a Functionality View `Subsystem` instead. The kind is absent when the solution is not split vertically.
|
|
2418
1872
|
optional: true
|
|
2419
|
-
format:
|
|
2420
|
-
type: concise
|
|
2421
|
-
diagram:
|
|
2422
|
-
type: hub
|
|
2423
|
-
center: self
|
|
2424
|
-
nodes: "[[AREA:*]], [[NODE:*]], [[TACTIC:*]], [[DECISION:*]]"
|
|
2425
|
-
labeled: true
|
|
2426
|
-
qualified: true
|
|
2427
|
-
properties:
|
|
2428
|
-
- KIND
|
|
2429
|
-
config:
|
|
2430
|
-
size-node-width-max: 440
|
|
2431
|
-
size-node-height-scale: 1.75
|
|
2432
1873
|
- kind: NODE
|
|
2433
1874
|
desc: >
|
|
2434
1875
|
A single deployment node, named with a short (2-5 word) summary (e.g. `Web Servers`, `Database Cluster`, `Edge CDN`) and described in a concise (1-3 sentence) paragraph by the node, its sizing, and its place in the deployment topology, plus a 1-sentence rationale ("why") for the node's placement and platform choice.
|
|
2435
1876
|
|
|
2436
1877
|
A node is a platform element the solution deploys onto and operates itself: a managed third-party service the solution merely consumes is a Context View `Service` entity, the software products running on the node are Technology Stack components (referencing the hosted components through `USED-BY`), and the procedures operating the node are Operations View concerns -- only the runtime environment itself belongs to the Deployment View, with the tier and area the node belongs to and the network segments it is attached to as its `TIER`, `AREA`, and `NETWORK` siblings.
|
|
2437
|
-
|
|
2438
|
-
type: hub
|
|
2439
|
-
center: self
|
|
2440
|
-
nodes: "[[DV.TIER:*]], [[AREA:*]], [[NODE:*]], [[NETWORK:*]], [[FV.COMPONENT:*]], [[UNIT:*]], [[CONCERN:*]], [[TACTIC:*]], [[DECISION:*]]"
|
|
2441
|
-
labeled: true
|
|
2442
|
-
qualified: true
|
|
2443
|
-
properties:
|
|
2444
|
-
- LOCATION
|
|
2445
|
-
- KIND
|
|
2446
|
-
- PLATFORM
|
|
2447
|
-
- SCOPE
|
|
2448
|
-
config:
|
|
2449
|
-
size-node-width-max: 440
|
|
2450
|
-
size-node-height-scale: 1.75
|
|
1878
|
+
optional: true
|
|
2451
1879
|
props:
|
|
2452
1880
|
- name: KIND
|
|
2453
1881
|
desc: |
|
|
@@ -2503,20 +1931,6 @@
|
|
|
2503
1931
|
|
|
2504
1932
|
A segment is the medium the nodes communicate over: the attached nodes reference it via `NETWORKS`, the directed links between them are their `CONNECTS-TO` references, and the contract of the carried traffic is an Interface Model interface -- only the network itself belongs here. The kind is absent when the topology has no segmentation worth describing.
|
|
2505
1933
|
optional: true
|
|
2506
|
-
format:
|
|
2507
|
-
type: concise
|
|
2508
|
-
diagram:
|
|
2509
|
-
type: hub
|
|
2510
|
-
center: self
|
|
2511
|
-
nodes: "[[NETWORK:*]], [[NODE:*]], [[TACTIC:*]], [[DECISION:*]]"
|
|
2512
|
-
labeled: true
|
|
2513
|
-
qualified: true
|
|
2514
|
-
properties:
|
|
2515
|
-
- KIND
|
|
2516
|
-
- SCOPE
|
|
2517
|
-
config:
|
|
2518
|
-
size-node-width-max: 440
|
|
2519
|
-
size-node-height-scale: 1.75
|
|
2520
1934
|
props:
|
|
2521
1935
|
- name: SCOPE
|
|
2522
1936
|
desc: |
|
|
@@ -2536,39 +1950,17 @@
|
|
|
2536
1950
|
- kind: ARCH
|
|
2537
1951
|
name: Operations View
|
|
2538
1952
|
id: OV
|
|
2539
|
-
file:
|
|
1953
|
+
file: 30-ARCH-OV-Operations-View.md
|
|
2540
1954
|
desc: >
|
|
2541
1955
|
The way the solution is operated, administered, and supported in production, defining the standing procedures by which the operating organization installs, configures, migrates, observes, protects, upgrades, scales, and supports the running solution.
|
|
2542
1956
|
optional: true
|
|
2543
|
-
refs: >
|
|
2544
|
-
- Rozanski/Woods: Software Systems Architecture, 2nd ed.: The Operational Viewpoint (2011),
|
|
2545
|
-
https://www.viewpoints-and-perspectives.info/home/viewpoints/operational/
|
|
2546
|
-
- Beyer et al.: Site Reliability Engineering: How Google Runs Production Systems (2016),
|
|
2547
|
-
https://sre.google/sre-book/table-of-contents/
|
|
2548
|
-
- ISO/IEC 20000-1:2018: Information technology -- Service management -- Part 1: Service management system requirements (2018),
|
|
2549
|
-
https://www.iso.org/standard/70636.html
|
|
2550
|
-
diagram:
|
|
2551
|
-
type: grid
|
|
2552
|
-
nodes: "[[CONCERN:*]]"
|
|
2553
|
-
properties:
|
|
2554
|
-
- CATEGORY
|
|
2555
1957
|
children:
|
|
2556
1958
|
- kind: CONCERN
|
|
2557
1959
|
desc: >
|
|
2558
1960
|
A single operational concern, named with a short (2-5 word) summary (e.g. `Rolling Deployment`, `Metrics Collection`, `Backup and Restore`) and described in a concise (1-3 sentence) paragraph by the procedure through which it is handled in production and the steps and tools supporting it, plus a 1-sentence rationale ("why") for the operational approach.
|
|
2559
1961
|
|
|
2560
1962
|
A concern states a standing production procedure the operating organization performs on the running solution: a capability the solution offers its users (even an administrating one) is a Functional Requirement or Use Case, an automatic behavior of the solution is a Domain Rule, the design tactic making the solution operable (e.g. replication, statelessness) is a Quality Perspectives tactic referencing the concern through `OPERATED-BY`, the deployment shape acted upon (instances, environments) is the Deployment View, the pipeline producing the deployable artifact is a `Build` aspect of the Development Aspects, and the products used are Technology Stack `Operate-Time` components referenced through `TOOLS` -- only the procedure itself, its trigger, and its responsible operator belong here.
|
|
2561
|
-
|
|
2562
|
-
type: hub
|
|
2563
|
-
center: self
|
|
2564
|
-
nodes: "[[CONCERN:*]], [[NR.REQUIREMENT:*]], [[PERSONA:*]], [[TACTIC:*]], [[FV.COMPONENT:*]], [[UNIT:*]], [[NODE:*]], [[DM.ENTITY:*]], [[TS.TIER:*.COMPONENT:*]]"
|
|
2565
|
-
labeled: true
|
|
2566
|
-
qualified: true
|
|
2567
|
-
properties:
|
|
2568
|
-
- CATEGORY
|
|
2569
|
-
config:
|
|
2570
|
-
size-node-width-max: 440
|
|
2571
|
-
size-node-height-scale: 1.75
|
|
1963
|
+
optional: true
|
|
2572
1964
|
props:
|
|
2573
1965
|
- name: CATEGORY
|
|
2574
1966
|
desc: |
|
|
@@ -2620,38 +2012,17 @@
|
|
|
2620
2012
|
- kind: ARCH
|
|
2621
2013
|
name: Quality Perspectives
|
|
2622
2014
|
id: QP
|
|
2623
|
-
file:
|
|
2015
|
+
file: 31-ARCH-QP-Quality-Perspectives.md
|
|
2624
2016
|
desc: >
|
|
2625
2017
|
How the Non-Functional Requirements (NR) are addressed by the architecture, through the tactics built into the solution across the views.
|
|
2626
2018
|
optional: true
|
|
2627
|
-
refs: >
|
|
2628
|
-
- Rozanski/Woods: Software Systems Architecture, 2nd ed.: The Perspectives (2011),
|
|
2629
|
-
https://www.viewpoints-and-perspectives.info/home/perspectives/
|
|
2630
|
-
- Bass/Clements/Kazman: Software Architecture in Practice, 4th ed. (2021),
|
|
2631
|
-
https://www.informit.com/store/software-architecture-in-practice-9780136886099
|
|
2632
|
-
- ISO/IEC 25010:2023: Systems and software engineering -- Systems and software Quality Requirements and Evaluation (SQuaRE) -- Product quality model (2023),
|
|
2633
|
-
https://www.iso.org/standard/78176.html
|
|
2634
|
-
diagram:
|
|
2635
|
-
type: grid
|
|
2636
|
-
nodes: "[[TACTIC:*]]"
|
|
2637
|
-
properties:
|
|
2638
|
-
- QUALITY
|
|
2639
2019
|
children:
|
|
2640
2020
|
- kind: TACTIC
|
|
2641
2021
|
desc: >
|
|
2642
2022
|
A single quality tactic, one architectural tactic applied to one quality attribute (the perspective in the sense of Rozanski/Woods, i.e. the cross-cutting quality concern applied to the elements of all views, identified by `QUALITY`), named with a short (2-5 word) summary (e.g. `Horizontal Scaling`, `Defense in Depth`, `Graceful Degradation`) and described in a concise (1-3 sentence) paragraph by how the tactic satisfies the quality attribute across the affected elements, plus a 1-sentence rationale ("why") for the tactic satisfying the addressed requirements (not for choosing it over alternatives, which is the rationale of a Design Decisions decision).
|
|
2643
2023
|
|
|
2644
|
-
A tactic states a design mechanism built into the solution: the threshold the mechanism has to meet is the `METRIC` of the addressed Non-Functional Requirement and is not restated, the production procedure performed against the mechanism (e.g. scaling out, restoring) is an Operations View concern referenced through `OPERATED-BY`, the trade-off that chose the mechanism over alternatives is a Design Decisions decision referencing the tactic through `DECIDES`, the product realizing the mechanism is a Technology Stack component referenced through `TOOLS`, the developer-facing rule about the source structure is an aspect of the Development Aspects, and a mechanism driven solely by a `Constraint` requirement (e.g. a hosting or budget mandate) protects no quality and is a Design Decisions decision alone -- only the mechanism, the quality it achieves, and the elements it shapes belong here.
|
|
2645
|
-
|
|
2646
|
-
type: hub
|
|
2647
|
-
center: self
|
|
2648
|
-
nodes: "[[TACTIC:*]], [[NR.REQUIREMENT:*]], [[FV.COMPONENT:*]], [[UNIT:*]], [[ASPECT:*]], [[NODE:*]], [[DM.ENTITY:*]], [[CONCERN:*]], [[DECISION:*]], [[TS.TIER:*.COMPONENT:*]], [[TEST-CASE:*]]"
|
|
2649
|
-
labeled: true
|
|
2650
|
-
qualified: true
|
|
2651
|
-
properties:
|
|
2652
|
-
- QUALITY
|
|
2653
|
-
config:
|
|
2654
|
-
size-node-width-max: 440
|
|
2024
|
+
A tactic states a design mechanism built into the solution: the threshold the mechanism has to meet is the `METRIC` of the addressed Non-Functional Requirement and is not restated, the production procedure performed against the mechanism (e.g. scaling out, restoring) is an Operations View concern referenced through `OPERATED-BY`, the tenet the mechanism follows is an Architecture Tenets maxim or principle referenced through `GUIDED-BY`, the structure it is built from is an Architecture Patterns pattern referenced through `PATTERNS`, the trade-off that chose the mechanism over alternatives is a Design Decisions decision referencing the tactic through `DECIDES`, the product realizing the mechanism is a Technology Stack component referenced through `TOOLS`, the developer-facing rule about the source structure is an aspect of the Development Aspects, the coded form of the mechanism is a Code Patterns pattern referencing the tactic through `REALIZES`, and a mechanism driven solely by a `Constraint` requirement (e.g. a hosting or budget mandate) protects no quality and is a Design Decisions decision alone -- only the mechanism, the quality it achieves, and the elements it shapes belong here.
|
|
2025
|
+
optional: true
|
|
2655
2026
|
props:
|
|
2656
2027
|
- name: QUALITY
|
|
2657
2028
|
desc: >
|
|
@@ -2663,6 +2034,16 @@
|
|
|
2663
2034
|
desc: >
|
|
2664
2035
|
Comma-separated references to the NON-FUNCTIONAL-REQUIREMENTS objects the tactic addresses.
|
|
2665
2036
|
value: list([[NR.*]])
|
|
2037
|
+
- name: GUIDED-BY
|
|
2038
|
+
desc: >
|
|
2039
|
+
Comma-separated references to the ARCHITECTURE-TENETS objects the mechanism of the tactic follows (e.g. the stateless replication following a `Stateless Services` principle); omitted for a tactic following no modeled tenet.
|
|
2040
|
+
value: list([[MAXIM:*]], [[AT.PRINCIPLE:*]])
|
|
2041
|
+
optional: true
|
|
2042
|
+
- name: PATTERNS
|
|
2043
|
+
desc: >
|
|
2044
|
+
Comma-separated references to the ARCHITECTURE-PATTERNS objects the mechanism of the tactic is built from (e.g. the failover built on a `Circuit Breaker`), while `MECHANISM` states the mechanism itself; omitted for a tactic built from no modeled pattern.
|
|
2045
|
+
value: list([[PATTERN:*]])
|
|
2046
|
+
optional: true
|
|
2666
2047
|
- name: MECHANISM
|
|
2667
2048
|
desc: >
|
|
2668
2049
|
The design mechanism through which the tactic is applied to achieve the quality (e.g. `stateless replication behind a load balancer`, `read-through cache`, `circuit breaker`).
|
|
@@ -2689,25 +2070,10 @@
|
|
|
2689
2070
|
- kind: ARCH
|
|
2690
2071
|
name: Design Decisions
|
|
2691
2072
|
id: DD
|
|
2692
|
-
file:
|
|
2073
|
+
file: 32-ARCH-DD-Design-Decisions.md
|
|
2693
2074
|
desc: >
|
|
2694
|
-
The major decisions related to the solution design, each recording the forces at play, the chosen response, and the reasoning that justifies it. The artifact is the last one of the architecture, as a decision references the requirements forcing it, the elements it shapes, and the tactics and products it chose, all of which precede it.
|
|
2075
|
+
The major decisions related to the solution design, each recording the forces at play, the chosen response, and the reasoning that justifies it. The artifact is the last decision-level one of the architecture, as a decision references the requirements forcing it, the elements it shapes, and the tactics and products it chose, all of which precede it, while the Code Patterns following it reference the decisions they implement.
|
|
2695
2076
|
optional: true
|
|
2696
|
-
refs: >
|
|
2697
|
-
- Nygard: Documenting Architecture Decisions (2011),
|
|
2698
|
-
https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions
|
|
2699
|
-
- Tyree/Akerman: Architecture Decisions: Demystifying Architecture (2005),
|
|
2700
|
-
https://ieeexplore.ieee.org/document/1407822
|
|
2701
|
-
- ADR: Architectural Decision Records (2017),
|
|
2702
|
-
https://adr.github.io/
|
|
2703
|
-
diagram:
|
|
2704
|
-
type: grid
|
|
2705
|
-
nodes: "[[DECISION:*]]"
|
|
2706
|
-
properties:
|
|
2707
|
-
- STATUS
|
|
2708
|
-
config:
|
|
2709
|
-
size-node-width-max: 440
|
|
2710
|
-
grid-columns-max: 5
|
|
2711
2077
|
children:
|
|
2712
2078
|
- kind: DECISION
|
|
2713
2079
|
desc: |
|
|
@@ -2752,7 +2118,10 @@
|
|
|
2752
2118
|
A constraint itself is not a decision: a compliance obligation, a hosting mandate,
|
|
2753
2119
|
or a partner-imposed threshold is a Non-Functional Requirement (of category
|
|
2754
2120
|
`Compliance`, `Constraint`, or the affected quality), and the decision is the
|
|
2755
|
-
response to it, referencing it through `DRIVEN-BY`.
|
|
2121
|
+
response to it, referencing it through `DRIVEN-BY`. A standing rule is not a
|
|
2122
|
+
decision either: a maxim or principle reusable across many decisions is an
|
|
2123
|
+
Architecture Tenets object, and the decision applies it, referencing it through
|
|
2124
|
+
`GUIDED-BY`.
|
|
2756
2125
|
|
|
2757
2126
|
`WHEN`, `WHAT`, and `WHY` are each just a single paragraph of concise and brief
|
|
2758
2127
|
prose text, usually comprised of just 1 to 3 sentences. The value of a decision is
|
|
@@ -2767,16 +2136,7 @@
|
|
|
2767
2136
|
decision is under-justified. The rationale should make the decision feel earned,
|
|
2768
2137
|
not asserted - if you delete the rationale and the decision suddenly looks
|
|
2769
2138
|
arbitrary, the rationale was doing its job.
|
|
2770
|
-
|
|
2771
|
-
type: hub
|
|
2772
|
-
center: self
|
|
2773
|
-
nodes: "[[DECISION:*]], [[NR.REQUIREMENT:*]], [[PREMISE:*]], [[DM.ENTITY:*]], [[LIFECYCLE:*]], [[ROLE:*]], [[INTERFACE:*]], [[TYPE:*]], [[ENDPOINT:*]], [[PRINCIPLE:*]], [[CONVENTION:*]], [[PATTERN:*]], [[STORYBOARD:*]], [[ELEMENT:*]], [[CV.ENTITY:*]], [[FV.COMPONENT:*]], [[UNIT:*]], [[ASPECT:*]], [[DV.TIER:*]], [[AREA:*]], [[NODE:*]], [[NETWORK:*]], [[TACTIC:*]], [[TS.TIER:*.COMPONENT:*]]"
|
|
2774
|
-
labeled: true
|
|
2775
|
-
qualified: true
|
|
2776
|
-
properties:
|
|
2777
|
-
- STATUS
|
|
2778
|
-
config:
|
|
2779
|
-
size-node-width-max: 440
|
|
2139
|
+
optional: true
|
|
2780
2140
|
props:
|
|
2781
2141
|
- name: STATUS
|
|
2782
2142
|
desc: |
|
|
@@ -2798,15 +2158,20 @@
|
|
|
2798
2158
|
desc: >
|
|
2799
2159
|
Comma-separated references to the NON-FUNCTIONAL-REQUIREMENTS or SOLUTION-PREMISES objects forcing the decision (e.g. the compliance obligation, the budget constraint, the dependency taken as given), anchoring the forces `WHEN` describes in prose: as a decision is the response to forces, at least one is always named, usually a Non-Functional Requirement and only exceptionally a premise alone, and a decision finding no requirement to name reveals a missing one rather than a needless reference.
|
|
2800
2160
|
value: list([[NR.*]], [[PREMISE:*]])
|
|
2161
|
+
- name: GUIDED-BY
|
|
2162
|
+
desc: >
|
|
2163
|
+
Comma-separated references to the ARCHITECTURE-TENETS objects the decision applies (e.g. the `Buy before Build` maxim settling the choice of a managed service, the `Async between Contexts` principle settling the integration style), anchoring the principles the rationale `WHY` rests on; omitted for a decision applying no modeled tenet.
|
|
2164
|
+
value: list([[MAXIM:*]], [[AT.PRINCIPLE:*]])
|
|
2165
|
+
optional: true
|
|
2801
2166
|
- name: AFFECTS
|
|
2802
2167
|
desc: >
|
|
2803
2168
|
Comma-separated references to the objects of the DATA, APIS, UXUI, or ARCH artifacts the decision shapes, i.e. the entities, lifecycles, and roles, the interfaces, datatypes, and endpoints, the interaction principles, language conventions, dialog patterns, storyboards, and visual elements, and the elements of the architecture views (e.g. the entity owned by a single context, the interface styled REST instead of GraphQL, the dialog pattern chosen over a native one, the components split, the external system integrated); omitted for a decision shaping no modeled element.
|
|
2804
|
-
value: list([[DM.ENTITY:*]], [[LIFECYCLE:*]], [[ROLE:*]], [[INTERFACE:*]], [[TYPE:*]], [[ENDPOINT:*]], [[PRINCIPLE:*]], [[CONVENTION:*]], [[PATTERN:*]], [[STORYBOARD:*]], [[ELEMENT:*]], [[CV.ENTITY:*]], [[FV.COMPONENT:*]], [[UNIT:*]], [[ASPECT:*]], [[DV.TIER:*]], [[AREA:*]], [[NODE:*]], [[NETWORK:*]])
|
|
2169
|
+
value: list([[DM.ENTITY:*]], [[LIFECYCLE:*]], [[ROLE:*]], [[INTERFACE:*]], [[TYPE:*]], [[ENDPOINT:*]], [[IC.PRINCIPLE:*]], [[CONVENTION:*]], [[DIALOG-PATTERN:*]], [[STORYBOARD:*]], [[ELEMENT:*]], [[CV.ENTITY:*]], [[FV.COMPONENT:*]], [[UNIT:*]], [[ASPECT:*]], [[DV.TIER:*]], [[AREA:*]], [[NODE:*]], [[NETWORK:*]])
|
|
2805
2170
|
optional: true
|
|
2806
2171
|
- name: DECIDES
|
|
2807
2172
|
desc: >
|
|
2808
|
-
Comma-separated references to the QUALITY-PERSPECTIVES tactics or TECHNOLOGY-STACK components the decision chose over their alternatives, i.e. the mechanism or product which exists because of this decision; omitted when the decision chose no modeled tactic or product.
|
|
2809
|
-
value: list([[TACTIC:*]], [[TS.TIER:*.COMPONENT:*]])
|
|
2173
|
+
Comma-separated references to the ARCHITECTURE-PATTERNS objects, QUALITY-PERSPECTIVES tactics, or TECHNOLOGY-STACK components the decision chose over their alternatives, i.e. the pattern, mechanism, or product which exists because of this decision; omitted when the decision chose no modeled pattern, tactic, or product.
|
|
2174
|
+
value: list([[PATTERN:*]], [[TACTIC:*]], [[TS.TIER:*.COMPONENT:*]])
|
|
2810
2175
|
optional: true
|
|
2811
2176
|
- name: ALTERNATIVES
|
|
2812
2177
|
desc: >
|
|
@@ -2888,10 +2253,58 @@
|
|
|
2888
2253
|
matrix of considered alternatives); and
|
|
2889
2254
|
- links to strongly related decisions.
|
|
2890
2255
|
optional: true
|
|
2256
|
+
|
|
2257
|
+
- kind: ARCH
|
|
2258
|
+
name: Code Patterns
|
|
2259
|
+
id: CP
|
|
2260
|
+
file: 33-ARCH-CP-Code-Patterns.md
|
|
2261
|
+
desc: >
|
|
2262
|
+
The implementation patterns the source code of the solution follows, each prescribing how one recurring concern (e.g. authorization enforcement, entity persistence, error propagation) is coded and showing it as a code listing. The artifact follows the Design Decisions, as a pattern is the coded form of the tactics and decisions preceding it, and is absent when the coding conventions are governed outside the specification (e.g. by repository-level contributor instructions).
|
|
2263
|
+
optional: true
|
|
2264
|
+
children:
|
|
2265
|
+
- kind: CODE-PATTERN
|
|
2266
|
+
desc: >
|
|
2267
|
+
A single code pattern, named with a short (2-5 word) summary of the concern it codes (e.g. `Endpoint Authorization`, `Entity Persistence`, `Error Propagation`) and described in a concise (1-3 sentence) paragraph by the rule the code follows whenever the concern arises, plus a 1-sentence rationale ("why") for the rule.
|
|
2268
|
+
|
|
2269
|
+
The listing showing the pattern follows the description and its rationale as the elaboration of the pattern: either a fenced code block in the language of the pattern (e.g. ` ```ts start=10 mark=3-5 `, the parameters numbering the lines from `start` and marking the essential ones) or an embedded excerpt of an existing source file (e.g. ``, the fragment selecting and marking the lines), the latter preferred once the code exists, as the specification then never drifts from it. The listing is the canonical, idealized form of the pattern, not an exhaustive example, so it is kept short (typically 10-30 lines) and the prose names what the listing cannot: the places the pattern applies and the deviation it rules out (`AVOID`).
|
|
2270
|
+
|
|
2271
|
+
A pattern states how a concern is coded, and nothing else: the structure or the quality mechanism it implements is an Architecture Patterns pattern or a Quality Perspectives tactic referenced through `REALIZES`, the trade-off that chose its approach over alternatives is a Design Decisions decision referenced through `DECIDED-BY` (a pattern weighs no alternatives itself), the product it codes against is a Technology Stack component referenced through `TOOLS`, and the rule about the source layout, build, or process it lives in is a Development Aspects aspect -- only the recurring code shape, the elements written that way, and the deviation ruled out belong here.
|
|
2272
|
+
optional: true
|
|
2273
|
+
props:
|
|
2274
|
+
- name: APPLIES-TO
|
|
2275
|
+
desc: >
|
|
2276
|
+
Comma-separated references to the FUNCTIONALITY-VIEW, CONCURRENCY-VIEW, DATA-MODEL, AUTHORIZATION-MODEL, INTERFACE-MODEL, or INTERFACE-ENDPOINTS objects whose code follows the pattern (e.g. the components persisting their entities this way, the roles and endpoints guarded by the check); omitted for a pattern applied throughout the code base.
|
|
2277
|
+
value: list([[FV.COMPONENT:*]], [[UNIT:*]], [[DM.ENTITY:*]], [[ROLE:*]], [[INTERFACE:*]], [[ENDPOINT:*]])
|
|
2278
|
+
optional: true
|
|
2279
|
+
- name: REALIZES
|
|
2280
|
+
desc: >
|
|
2281
|
+
Comma-separated references to the ARCHITECTURE-PATTERNS objects or QUALITY-PERSPECTIVES tactics the pattern is the coded form of (e.g. the port interface coding the hexagonal architecture, the token check implementing the access security tactic); omitted for a pattern serving no modeled architecture pattern or tactic.
|
|
2282
|
+
value: list([[PATTERN:*]], [[TACTIC:*]])
|
|
2283
|
+
optional: true
|
|
2284
|
+
- name: DECIDED-BY
|
|
2285
|
+
desc: >
|
|
2286
|
+
Comma-separated references to the DESIGN-DECISIONS objects the pattern implements (e.g. the query builder usage following the decision against an ORM); omitted for a pattern behind which no recorded decision stands.
|
|
2287
|
+
value: list([[DECISION:*]])
|
|
2288
|
+
optional: true
|
|
2289
|
+
- name: TOOLS
|
|
2290
|
+
desc: >
|
|
2291
|
+
Comma-separated references to the TECHNOLOGY-STACK components the pattern codes against (e.g. the query builder, the logging library); omitted for a pattern using the language alone.
|
|
2292
|
+
value: list([[TS.TIER:*.COMPONENT:*]])
|
|
2293
|
+
optional: true
|
|
2294
|
+
- name: USES
|
|
2295
|
+
desc: >
|
|
2296
|
+
Comma-separated references to the smaller CODE-PATTERNS objects the pattern is composed of (e.g. an `Endpoint Authorization` using the `Error Propagation` for its rejections), so that the patterns form a language of related shapes rather than a flat catalogue.
|
|
2297
|
+
value: list([[CODE-PATTERN:*]])
|
|
2298
|
+
optional: true
|
|
2299
|
+
acyclic: true
|
|
2300
|
+
- name: AVOID
|
|
2301
|
+
desc: >
|
|
2302
|
+
The deviation the pattern rules out, stated as the concrete shape a developer would otherwise reach for (e.g. `SQL strings assembled in the request handlers`, `role checks in the client alone`); omitted when the rule has no tempting alternative.
|
|
2303
|
+
optional: true
|
|
2891
2304
|
- kind: TEST
|
|
2892
2305
|
name: Test Cases
|
|
2893
2306
|
id: TC
|
|
2894
|
-
file:
|
|
2307
|
+
file: 34-TEST-TC-Test-Cases.md
|
|
2895
2308
|
desc: >
|
|
2896
2309
|
The verifiable conditions and steps used to confirm that requirements, domain rules, use case scenarios, state transitions, and the mechanisms, procedures, and decisions of the architecture are correctly implemented, with mandatory defined inputs, mandatory expected outcomes, and optional pre- and post-conditions. The artifact is the last one, as a test case verifies objects of every preceding kind.
|
|
2897
2310
|
|
|
@@ -2902,20 +2315,6 @@
|
|
|
2902
2315
|
- "[[SCENARIO:*]]"
|
|
2903
2316
|
- "[[REQUIREMENT:*]]"
|
|
2904
2317
|
- "[[RULE:*]]"
|
|
2905
|
-
refs: >
|
|
2906
|
-
- ISO/IEC/IEEE 29119-3:2021: Software and systems engineering -- Software testing -- Part 3: Test documentation (2021),
|
|
2907
|
-
https://www.iso.org/standard/79429.html
|
|
2908
|
-
- ISO/IEC/IEEE 29119-4:2021: Software and systems engineering -- Software testing -- Part 4: Test techniques (2021),
|
|
2909
|
-
https://www.iso.org/standard/79430.html
|
|
2910
|
-
- ISTQB CTFL 4.0: Certified Tester Foundation Level Syllabus (2023),
|
|
2911
|
-
https://istqb.org/certifications/certified-tester-foundation-level-ctfl-v4-0/
|
|
2912
|
-
diagram:
|
|
2913
|
-
type: grid
|
|
2914
|
-
nodes: "[[TEST-CASE:*]]"
|
|
2915
|
-
config:
|
|
2916
|
-
size-node-width-max: 440
|
|
2917
|
-
size-node-height-scale: 2
|
|
2918
|
-
grid-columns-max: 4
|
|
2919
2318
|
children:
|
|
2920
2319
|
- kind: TEST-CASE
|
|
2921
2320
|
desc: >
|
|
@@ -2928,15 +2327,7 @@
|
|
|
2928
2327
|
A test case whose stimulus is a sequence rather than a single action carries the procedure in its body as sequentially numbered, imperative steps, mirroring the steps of a use case scenario (e.g. `1. The user logs in on device A. 2. The same user logs in on device B.`), with `INPUT` naming the decisive stimulus among them.
|
|
2929
2328
|
|
|
2930
2329
|
A test case verifying an architecture element asserts the element itself, not the threshold behind it: a threshold is the `METRIC` of a Non-Functional Requirement and verified by referencing the requirement, while a Quality Perspectives tactic is referenced only when its mechanism is the assertion (e.g. that the failover switch happens, not how fast), an Operations View concern when its procedure is rehearsed (e.g. a restore drill), a Deployment View node or network when its topology is inspected (e.g. a port scan proving an `Isolated` segment), a component or concurrency unit when its collaboration or contention is exercised, an aspect of the Development Aspects or a Design Decisions decision when its rule is checked by an architectural fitness function (e.g. no dependency edge against the layering).
|
|
2931
|
-
|
|
2932
|
-
type: hub
|
|
2933
|
-
center: self
|
|
2934
|
-
nodes: "[[TEST-CASE:*]], [[FR.REQUIREMENT:*]], [[NR.REQUIREMENT:*]], [[RULE:*]], [[SCENARIO:*]], [[WORKFLOW:*]], [[TRANSITION:*]], [[ATTRIBUTE:*]], [[PERMISSION:*]], [[ENDPOINT:*]], [[FRAME:*]], [[FV.COMPONENT:*]], [[UNIT:*]], [[ASPECT:*]], [[NODE:*]], [[NETWORK:*]], [[CONCERN:*]], [[TACTIC:*]], [[DECISION:*]]"
|
|
2935
|
-
labeled: true
|
|
2936
|
-
qualified: true
|
|
2937
|
-
config:
|
|
2938
|
-
size-node-width-max: 440
|
|
2939
|
-
size-node-height-scale: 1.75
|
|
2330
|
+
optional: true
|
|
2940
2331
|
props:
|
|
2941
2332
|
- name: VERIFIES
|
|
2942
2333
|
desc: >
|