@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.
Files changed (279) hide show
  1. package/dst/ase-agent-definition-api.d.ts +184 -0
  2. package/dst/ase-agent-definition-api.js +6 -0
  3. package/dst/ase-agent-definition-builtin/condenser.js +42 -0
  4. package/dst/ase-agent-definition-builtin/editor.js +45 -0
  5. package/dst/ase-agent-definition-builtin/estimator.js +98 -0
  6. package/dst/ase-agent-definition-builtin/implementer.js +121 -0
  7. package/dst/ase-agent-definition-builtin/integrator.js +56 -0
  8. package/dst/ase-agent-definition-builtin/qualifier.js +61 -0
  9. package/dst/ase-agent-definition-builtin/rebooter.js +41 -0
  10. package/dst/ase-agent-definition-builtin/researcher.js +77 -0
  11. package/dst/ase-agent-definition-core.js +827 -0
  12. package/dst/ase-agent-fleet.js +772 -0
  13. package/dst/ase-agent-process.js +232 -0
  14. package/dst/ase-agent-relay-client.js +509 -0
  15. package/dst/ase-agent-relay-core.js +213 -0
  16. package/dst/ase-agent-relay-server-bind.js +242 -0
  17. package/dst/ase-agent-relay-server-cli.js +50 -0
  18. package/dst/ase-agent-runtime-claim.js +189 -0
  19. package/dst/ase-agent-runtime-engine.js +1100 -0
  20. package/dst/ase-agent-runtime-exec.js +275 -0
  21. package/dst/ase-agent-runtime-phase.js +581 -0
  22. package/dst/ase-agent-runtime-request.js +272 -0
  23. package/dst/ase-agent-runtime-tool.js +207 -0
  24. package/dst/ase-agent-runtime.js +1316 -0
  25. package/dst/ase-agent.js +65 -0
  26. package/dst/ase-artifact.js +6 -5
  27. package/dst/ase-config-core.js +465 -0
  28. package/dst/ase-config-schema.js +351 -0
  29. package/dst/ase-config-scope.js +172 -0
  30. package/dst/ase-config.js +25 -585
  31. package/dst/ase-hook.js +230 -116
  32. package/dst/ase-lib-daemon-cli.js +130 -0
  33. package/dst/ase-lib-hash.js +20 -0
  34. package/dst/{ase-log.js → ase-lib-log.js} +40 -7
  35. package/dst/ase-lib-server-bind.js +115 -0
  36. package/dst/ase-lib-server-cli.js +474 -0
  37. package/dst/{ase-table.js → ase-lib-table.js} +1 -1
  38. package/dst/{ase-version.js → ase-lib-version.js} +3 -0
  39. package/dst/ase-man.js +96 -0
  40. package/dst/ase-mcp.js +166 -13
  41. package/dst/{ase-getopt.js → ase-service-getopt.js} +82 -80
  42. package/dst/{ase-markdown.js → ase-service-markdown.js} +18 -11
  43. package/dst/ase-service-otel.js +1246 -0
  44. package/dst/{ase-skills.js → ase-service-skills.js} +29 -64
  45. package/dst/ase-service-state.js +101 -0
  46. package/dst/ase-service.js +251 -76
  47. package/dst/ase-setup-common.js +141 -0
  48. package/dst/ase-setup-mcp.js +359 -0
  49. package/dst/ase-setup-settings.js +837 -0
  50. package/dst/ase-setup.js +113 -869
  51. package/dst/ase-spec.js +31 -19
  52. package/dst/ase-statusline.js +108 -43
  53. package/dst/ase-task-board-core.js +739 -0
  54. package/dst/ase-task-board-filter.js +127 -0
  55. package/dst/ase-task-board-flow.js +237 -0
  56. package/dst/ase-task-board-graph.js +497 -0
  57. package/dst/ase-task-board-stats.js +263 -0
  58. package/dst/ase-task-board-tui-control.js +775 -0
  59. package/dst/ase-task-board-tui-model.js +1008 -0
  60. package/dst/ase-task-board-tui-popup.js +626 -0
  61. package/dst/ase-task-board-tui-style.js +106 -0
  62. package/dst/ase-task-board-tui-view.js +847 -0
  63. package/dst/ase-task-board-tui.js +189 -0
  64. package/dst/ase-task-board-web-client.css +1 -0
  65. package/dst/ase-task-board-web-client.html +20 -0
  66. package/dst/ase-task-board-web-client.js +81 -0
  67. package/dst/ase-task-board-web-server.js +823 -0
  68. package/dst/ase-task-board.js +134 -0
  69. package/dst/ase-task-format.js +757 -0
  70. package/dst/ase-task-request.js +208 -0
  71. package/dst/ase-task-store-client.js +495 -0
  72. package/dst/ase-task-store-core.js +804 -0
  73. package/dst/ase-task-store-issues.js +237 -0
  74. package/dst/ase-task-store-plugin-api.js +6 -0
  75. package/dst/ase-task-store-plugin-ase.js +484 -0
  76. package/dst/ase-task-store-plugin-delegate.js +137 -0
  77. package/dst/ase-task-store-plugin-gitea.js +666 -0
  78. package/dst/ase-task-store-plugin-github.js +696 -0
  79. package/dst/ase-task-store-plugin-gitlab.js +668 -0
  80. package/dst/ase-task-store-server-bind.js +538 -0
  81. package/dst/ase-task-store-server-cli.js +154 -0
  82. package/dst/ase-task.js +1335 -357
  83. package/dst/{ase-compat.js → ase-util-compat.js} +2 -2
  84. package/dst/{ase-diagram.js → ase-util-diagram.js} +107 -32
  85. package/dst/{ase-meta.js → ase-util-meta.js} +2 -2
  86. package/dst/{ase-metric.js → ase-util-metric.js} +2 -2
  87. package/dst/{ase-mint.js → ase-util-mint.js} +19 -12
  88. package/dst/{ase-worktree.js → ase-util-worktree.js} +30 -19
  89. package/dst/ase-util.js +20 -0
  90. package/dst/ase.js +108 -32
  91. package/dst/man/ase-agent-adhoc.1 +515 -0
  92. package/dst/man/ase-agent-condenser.1 +193 -0
  93. package/dst/man/ase-agent-editor.1 +212 -0
  94. package/dst/man/ase-agent-estimator.1 +214 -0
  95. package/dst/man/ase-agent-fleet.1 +185 -0
  96. package/dst/man/ase-agent-implementer.1 +233 -0
  97. package/dst/man/ase-agent-integrator.1 +213 -0
  98. package/dst/man/ase-agent-qualifier.1 +214 -0
  99. package/dst/man/ase-agent-rebooter.1 +193 -0
  100. package/dst/man/ase-agent-relay.1 +128 -0
  101. package/dst/man/ase-agent-researcher.1 +217 -0
  102. package/dst/man/ase-agent.1 +264 -0
  103. package/dst/man/ase-artifact-list.1 +38 -0
  104. package/dst/man/ase-artifact-name.1 +39 -0
  105. package/dst/man/ase-artifact.1 +56 -0
  106. package/dst/man/ase-config-delete.1 +45 -0
  107. package/dst/man/ase-config-edit.1 +48 -0
  108. package/dst/man/ase-config-get.1 +46 -0
  109. package/dst/man/ase-config-init.1 +60 -0
  110. package/dst/man/ase-config-list.1 +42 -0
  111. package/dst/man/ase-config-set.1 +52 -0
  112. package/dst/man/ase-config.1 +225 -0
  113. package/dst/man/ase-hook-permission-request.1 +36 -0
  114. package/dst/man/ase-hook-pre-tool-use.1 +59 -0
  115. package/dst/man/ase-hook-session-end.1 +47 -0
  116. package/dst/man/ase-hook-session-persona.1 +37 -0
  117. package/dst/man/ase-hook-session-start.1 +81 -0
  118. package/dst/man/ase-hook-stop.1 +34 -0
  119. package/dst/man/ase-hook-user-prompt-submit.1 +34 -0
  120. package/dst/man/ase-hook.1 +51 -0
  121. package/dst/man/ase-man.1 +67 -0
  122. package/dst/man/ase-mcp.1 +61 -0
  123. package/dst/man/ase-service-log.1 +43 -0
  124. package/dst/man/ase-service-send.1 +47 -0
  125. package/dst/man/ase-service-start.1 +54 -0
  126. package/dst/man/ase-service-status.1 +46 -0
  127. package/dst/man/ase-service-stop.1 +37 -0
  128. package/dst/man/ase-service.1 +85 -0
  129. package/dst/man/ase-setup-disable.1 +44 -0
  130. package/dst/man/ase-setup-enable.1 +45 -0
  131. package/dst/man/ase-setup-install.1 +73 -0
  132. package/dst/man/ase-setup-mcp.1 +124 -0
  133. package/dst/man/ase-setup-status.1 +60 -0
  134. package/dst/man/ase-setup-statusline.1 +92 -0
  135. package/dst/man/ase-setup-telemetry.1 +92 -0
  136. package/dst/man/ase-setup-uninstall.1 +59 -0
  137. package/dst/man/ase-setup-update.1 +64 -0
  138. package/dst/man/ase-setup.1 +93 -0
  139. package/dst/man/ase-spec-export.1 +62 -0
  140. package/dst/man/ase-spec-lint.1 +40 -0
  141. package/dst/man/ase-spec-preview.1 +40 -0
  142. package/dst/man/ase-spec.1 +46 -0
  143. package/dst/man/ase-statusline.1 +189 -0
  144. package/dst/man/ase-task-assign.1 +71 -0
  145. package/dst/man/ase-task-board.1 +384 -0
  146. package/dst/man/ase-task-delete.1 +35 -0
  147. package/dst/man/ase-task-edit.1 +46 -0
  148. package/dst/man/ase-task-idscheme.1 +65 -0
  149. package/dst/man/ase-task-lifecycle.1 +57 -0
  150. package/dst/man/ase-task-list.1 +47 -0
  151. package/dst/man/ase-task-load.1 +36 -0
  152. package/dst/man/ase-task-newid.1 +61 -0
  153. package/dst/man/ase-task-purge.1 +37 -0
  154. package/dst/man/ase-task-rename.1 +44 -0
  155. package/dst/man/ase-task-request.1 +61 -0
  156. package/dst/man/ase-task-save.1 +48 -0
  157. package/dst/man/ase-task-status.1 +55 -0
  158. package/dst/man/ase-task-store.1 +194 -0
  159. package/dst/man/ase-task-view.1 +40 -0
  160. package/dst/man/ase-task.1 +160 -0
  161. package/dst/man/ase-util-compat.1 +25 -0
  162. package/dst/man/ase-util-diagram.1 +76 -0
  163. package/dst/man/ase-util-meta.1 +45 -0
  164. package/dst/man/ase-util-metric.1 +54 -0
  165. package/dst/man/ase-util-mint.1 +59 -0
  166. package/dst/man/ase-util-worktree.1 +72 -0
  167. package/dst/man/ase-util.1 +50 -0
  168. package/dst/man/ase.1 +124 -0
  169. package/package.json +79 -21
  170. package/plugin/.claude-plugin/plugin.json +1 -1
  171. package/plugin/.codex-plugin/plugin.json +1 -1
  172. package/plugin/.github/plugin/plugin.json +1 -1
  173. package/plugin/agents/ase-meta-diagram.md +12 -8
  174. package/plugin/agents/ase-repo-review.md +322 -0
  175. package/plugin/hooks/hooks-codex.json +5 -0
  176. package/plugin/hooks/hooks-copilot.json +5 -0
  177. package/plugin/hooks/hooks.json +8 -0
  178. package/plugin/meta/ase-common-approach.md +117 -0
  179. package/plugin/meta/ase-common-changeset.md +256 -0
  180. package/plugin/meta/ase-common-code.md +10 -173
  181. package/plugin/meta/ase-common-grill.md +317 -0
  182. package/plugin/meta/ase-common-resolve.md +305 -0
  183. package/plugin/meta/ase-common-task.md +83 -4
  184. package/plugin/meta/ase-constitution.md +0 -2
  185. package/plugin/meta/ase-format-specbook.md +208 -25
  186. package/plugin/meta/ase-format-specbook.yaml +242 -851
  187. package/plugin/meta/ase-format-task.md +669 -125
  188. package/plugin/meta/ase-persona.md +3 -4
  189. package/plugin/meta/ase-skill.md +9 -0
  190. package/plugin/mods/ase-mods.ts +409 -0
  191. package/plugin/mods/claude-code.d.ts +13417 -0
  192. package/plugin/skills/ase-arch-analyze/SKILL.md +1 -1
  193. package/plugin/skills/ase-arch-analyze/help.md +2 -2
  194. package/plugin/skills/ase-code-analyze/SKILL.md +59 -8
  195. package/plugin/skills/ase-code-analyze/help.md +29 -4
  196. package/plugin/skills/ase-code-edit/SKILL.md +107 -181
  197. package/plugin/skills/ase-code-edit/help.md +118 -31
  198. package/plugin/skills/ase-code-lint/SKILL.md +64 -13
  199. package/plugin/skills/ase-code-lint/help.md +32 -2
  200. package/plugin/skills/ase-docs-proofread/SKILL.md +4 -4
  201. package/plugin/skills/ase-docs-proofread/help.md +1 -1
  202. package/plugin/skills/ase-docs-refine/SKILL.md +4 -4
  203. package/plugin/skills/ase-docs-shorten/SKILL.md +4 -4
  204. package/plugin/skills/ase-help-intent/data.md +2164 -1087
  205. package/plugin/skills/ase-help-intent/help.md +1 -1
  206. package/plugin/skills/ase-help-skill/catalog.md +12 -9
  207. package/plugin/skills/ase-meta-brainstorm/SKILL.md +1 -1
  208. package/plugin/skills/ase-meta-config/SKILL.md +3 -4
  209. package/plugin/skills/ase-meta-config/help.md +31 -10
  210. package/plugin/skills/ase-meta-mint/SKILL.md +5 -5
  211. package/plugin/skills/ase-meta-mint/help.md +10 -5
  212. package/plugin/skills/ase-meta-why/help.md +1 -1
  213. package/plugin/skills/ase-meta-workflow/SKILL.md +7 -7
  214. package/plugin/skills/ase-meta-workflow/help.md +4 -4
  215. package/plugin/skills/ase-meta-workflow/sample.md +3 -3
  216. package/plugin/skills/ase-meta-workflow/workflow.txt +22 -18
  217. package/plugin/skills/{ase-meta-changelog → ase-repo-changelog}/SKILL.md +4 -3
  218. package/plugin/skills/{ase-meta-changelog → ase-repo-changelog}/help.md +5 -5
  219. package/plugin/skills/{ase-meta-commit → ase-repo-commit}/SKILL.md +6 -6
  220. package/plugin/skills/{ase-meta-commit → ase-repo-commit}/help.md +5 -5
  221. package/plugin/skills/{ase-meta-diff → ase-repo-diff}/SKILL.md +6 -6
  222. package/plugin/skills/{ase-meta-diff → ase-repo-diff}/help.md +8 -8
  223. package/plugin/skills/{ase-code-dissect → ase-repo-dissect}/SKILL.md +19 -19
  224. package/plugin/skills/{ase-code-dissect → ase-repo-dissect}/help.md +10 -12
  225. package/plugin/skills/ase-repo-merge/SKILL.md +346 -0
  226. package/plugin/skills/ase-repo-merge/help.md +107 -0
  227. package/plugin/skills/ase-repo-resolve/SKILL.md +158 -0
  228. package/plugin/skills/ase-repo-resolve/help.md +102 -0
  229. package/plugin/skills/ase-repo-review/SKILL.md +406 -0
  230. package/plugin/skills/ase-repo-review/help.md +181 -0
  231. package/plugin/skills/ase-spec-edit/SKILL.md +117 -183
  232. package/plugin/skills/ase-spec-edit/help.md +107 -26
  233. package/plugin/skills/ase-sync-reconcile/help.md +1 -1
  234. package/plugin/skills/ase-task-assign/SKILL.md +111 -0
  235. package/plugin/skills/ase-task-assign/help.md +119 -0
  236. package/plugin/skills/ase-task-condense/SKILL.md +21 -21
  237. package/plugin/skills/ase-task-condense/help.md +12 -10
  238. package/plugin/skills/ase-task-delete/SKILL.md +1 -1
  239. package/plugin/skills/ase-task-dissect/SKILL.md +71 -48
  240. package/plugin/skills/ase-task-dissect/help.md +10 -9
  241. package/plugin/skills/ase-task-edit/SKILL.md +379 -94
  242. package/plugin/skills/ase-task-edit/help.md +95 -22
  243. package/plugin/skills/ase-task-estimate/SKILL.md +492 -0
  244. package/plugin/skills/ase-task-estimate/help.md +158 -0
  245. package/plugin/skills/ase-task-grill/SKILL.md +246 -138
  246. package/plugin/skills/ase-task-grill/help.md +129 -26
  247. package/plugin/skills/ase-task-id/SKILL.md +8 -1
  248. package/plugin/skills/ase-task-id/help.md +6 -3
  249. package/plugin/skills/ase-task-implement/SKILL.md +535 -145
  250. package/plugin/skills/ase-task-implement/help.md +138 -47
  251. package/plugin/skills/ase-task-integrate/SKILL.md +549 -0
  252. package/plugin/skills/ase-task-integrate/help.md +187 -0
  253. package/plugin/skills/ase-task-list/SKILL.md +55 -23
  254. package/plugin/skills/ase-task-list/help.md +45 -21
  255. package/plugin/skills/ase-task-reboot/SKILL.md +84 -43
  256. package/plugin/skills/ase-task-reboot/help.md +28 -8
  257. package/plugin/skills/ase-task-rename/SKILL.md +10 -2
  258. package/plugin/skills/ase-task-research/SKILL.md +386 -0
  259. package/plugin/skills/ase-task-research/help.md +102 -0
  260. package/plugin/skills/ase-task-status/SKILL.md +137 -0
  261. package/plugin/skills/ase-task-status/help.md +80 -0
  262. package/plugin/skills/ase-task-view/SKILL.md +49 -24
  263. package/plugin/skills/ase-task-view/help.md +19 -9
  264. package/plugin/agents/ase-meta-review.md +0 -187
  265. package/plugin/skills/ase-code-craft/SKILL.md +0 -264
  266. package/plugin/skills/ase-code-craft/help.md +0 -122
  267. package/plugin/skills/ase-code-refactor/SKILL.md +0 -232
  268. package/plugin/skills/ase-code-refactor/help.md +0 -109
  269. package/plugin/skills/ase-code-resolve/SKILL.md +0 -289
  270. package/plugin/skills/ase-code-resolve/help.md +0 -116
  271. package/plugin/skills/ase-meta-review/SKILL.md +0 -210
  272. package/plugin/skills/ase-meta-review/help.md +0 -96
  273. package/plugin/skills/ase-task-preflight/SKILL.md +0 -166
  274. package/plugin/skills/ase-task-preflight/help.md +0 -82
  275. /package/dst/{ase-ignore.js → ase-lib-ignore.js} +0 -0
  276. /package/dst/{ase-stdio.js → ase-lib-stdio.js} +0 -0
  277. /package/dst/{ase-kv.js → ase-service-kv.js} +0 -0
  278. /package/dst/{ase-sleep.js → ase-service-sleep.js} +0 -0
  279. /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
- format:
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
- format:
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
- format:
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
- format:
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
- format:
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
- format:
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
- diagram:
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
- diagram:
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
- format:
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
- diagram:
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
- diagram:
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`), and is not verifiable by a metric (a measurable quality bound is a Non-Functional Requirement instead).
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
- diagram:
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
- diagram:
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
- format:
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
- format:
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: 22-ARCH-CV-Context-View.md
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
- format:
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: 23-ARCH-FV-Functionality-View.md
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
- format:
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: 24-ARCH-TS-Technology-Stack.md
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
- diagram:
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: 25-ARCH-DA-Development-Aspects.md
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
- diagram:
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: 26-ARCH-CO-Concurrency-View.md
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
- diagram:
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: 27-ARCH-DV-Deployment-View.md
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
- format:
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
- diagram:
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: 28-ARCH-OV-Operations-View.md
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
- diagram:
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: 29-ARCH-QP-Quality-Perspectives.md
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
- diagram:
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: 30-ARCH-DD-Design-Decisions.md
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
- diagram:
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. `![Entity Persistence](src/persistence.ts#lines=10-30&mark=3-5)`, 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: 31-TEST-TC-Test-Cases.md
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
- diagram:
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: >