archsight 0.3.2 → 0.4.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 (189) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -1
  3. data/docs/archimate.md +21 -1
  4. data/docs/configuration.md +1 -0
  5. data/docs/diagram.md +15 -3
  6. data/docs/docker.md +4 -1
  7. data/docs/icons.md +32 -0
  8. data/docs/import.md +178 -55
  9. data/docs/index.md.erb +31 -8
  10. data/docs/modeling.md +772 -24
  11. data/docs/pages.md +44 -13
  12. data/docs/search.md +21 -1
  13. data/docs/togaf.md +5 -1
  14. data/lib/archsight/analysis/result.rb +8 -2
  15. data/lib/archsight/analysis/sandbox.rb +8 -0
  16. data/lib/archsight/analysis/typst_renderer.rb +246 -0
  17. data/lib/archsight/analysis.rb +1 -0
  18. data/lib/archsight/annotations/annotation.rb +30 -3
  19. data/lib/archsight/annotations/architecture_annotations.rb +47 -0
  20. data/lib/archsight/annotations/asset_annotations.rb +34 -0
  21. data/lib/archsight/annotations/link_annotations.rb +15 -0
  22. data/lib/archsight/annotations/resource_reference.rb +12 -0
  23. data/lib/archsight/annotations/risk_annotations.rb +21 -0
  24. data/lib/archsight/cli.rb +124 -23
  25. data/lib/archsight/database.rb +40 -0
  26. data/lib/archsight/diagram/cli.rb +50 -2
  27. data/lib/archsight/diagram/formatter.rb +112 -0
  28. data/lib/archsight/diagram/routing/edge_router/orthogonal_path.rb +38 -10
  29. data/lib/archsight/diagram/routing/edge_router.rb +29 -4
  30. data/lib/archsight/diagram/routing/edge_routing.rb +61 -5
  31. data/lib/archsight/diagram/style/theme.rb +7 -2
  32. data/lib/archsight/documentation.rb +3 -2
  33. data/lib/archsight/editor/page_source.rb +13 -1
  34. data/lib/archsight/export/confluence/analysis_output.rb +101 -0
  35. data/lib/archsight/export/confluence/client.rb +13 -0
  36. data/lib/archsight/export/confluence/diagram_links.rb +1 -1
  37. data/lib/archsight/export/confluence/exporter.rb +40 -13
  38. data/lib/archsight/export/confluence/labels.rb +25 -0
  39. data/lib/archsight/export/confluence/page_properties.rb +4 -6
  40. data/lib/archsight/export/confluence/storage.rb +38 -2
  41. data/lib/archsight/helpers/embeds.rb +18 -7
  42. data/lib/archsight/helpers/resource_resolver.rb +25 -0
  43. data/lib/archsight/import/executor.rb +139 -16
  44. data/lib/archsight/import/handler.rb +55 -6
  45. data/lib/archsight/import/handler_loader.rb +64 -0
  46. data/lib/archsight/import/handlers/cache_pruner.rb +30 -7
  47. data/lib/archsight/import/handlers/command.rb +120 -0
  48. data/lib/archsight/import/handlers/github.rb +4 -1
  49. data/lib/archsight/import/handlers/gitlab.rb +4 -1
  50. data/lib/archsight/import/handlers/go_dep_resolver.rb +10 -2
  51. data/lib/archsight/import/handlers/go_grapher.rb +102 -5
  52. data/lib/archsight/import/handlers/go_module_parser.rb +88 -0
  53. data/lib/archsight/import/handlers/grapher.rb +40 -1
  54. data/lib/archsight/import/handlers/repository.rb +3 -0
  55. data/lib/archsight/import/handlers/rest_api_index.rb +3 -0
  56. data/lib/archsight/import/registry.rb +22 -1
  57. data/lib/archsight/import.rb +64 -1
  58. data/lib/archsight/linter/structure.rb +239 -0
  59. data/lib/archsight/linter.rb +217 -6
  60. data/lib/archsight/page_loader.rb +12 -1
  61. data/lib/archsight/query/evaluator.rb +13 -6
  62. data/lib/archsight/query/parser.rb +73 -6
  63. data/lib/archsight/query.rb +1 -1
  64. data/lib/archsight/references.rb +3 -3
  65. data/lib/archsight/renderer.rb +80 -23
  66. data/lib/archsight/resources/analysis.rb +3 -2
  67. data/lib/archsight/resources/application_component.rb +83 -8
  68. data/lib/archsight/resources/application_event.rb +79 -0
  69. data/lib/archsight/resources/application_service.rb +18 -2
  70. data/lib/archsight/resources/base.rb +58 -5
  71. data/lib/archsight/resources/business_actor.rb +14 -1
  72. data/lib/archsight/resources/business_contract.rb +72 -0
  73. data/lib/archsight/resources/business_control.rb +10 -2
  74. data/lib/archsight/resources/business_event.rb +79 -0
  75. data/lib/archsight/resources/business_process.rb +8 -1
  76. data/lib/archsight/resources/business_product.rb +12 -0
  77. data/lib/archsight/resources/business_role.rb +70 -0
  78. data/lib/archsight/resources/compliance_evidence.rb +8 -2
  79. data/lib/archsight/resources/data_object.rb +6 -1
  80. data/lib/archsight/resources/implementation_deliverable.rb +63 -0
  81. data/lib/archsight/resources/implementation_event.rb +52 -0
  82. data/lib/archsight/resources/implementation_gap.rb +49 -0
  83. data/lib/archsight/resources/implementation_plateau.rb +67 -0
  84. data/lib/archsight/resources/implementation_work_package.rb +84 -0
  85. data/lib/archsight/resources/import.rb +37 -11
  86. data/lib/archsight/resources/location.rb +56 -0
  87. data/lib/archsight/resources/motivation_assessment.rb +121 -0
  88. data/lib/archsight/resources/motivation_constraint.rb +7 -1
  89. data/lib/archsight/resources/motivation_driver.rb +50 -0
  90. data/lib/archsight/resources/motivation_goal.rb +13 -1
  91. data/lib/archsight/resources/motivation_principle.rb +75 -0
  92. data/lib/archsight/resources/motivation_requirement.rb +18 -2
  93. data/lib/archsight/resources/motivation_stakeholder.rb +21 -0
  94. data/lib/archsight/resources/page.rb +9 -7
  95. data/lib/archsight/resources/strategy_capability.rb +9 -0
  96. data/lib/archsight/resources/technology_artifact.rb +11 -4
  97. data/lib/archsight/resources/technology_communication_network.rb +89 -0
  98. data/lib/archsight/resources/technology_device.rb +88 -0
  99. data/lib/archsight/resources/technology_equipment.rb +75 -0
  100. data/lib/archsight/resources/technology_event.rb +80 -0
  101. data/lib/archsight/resources/technology_facility.rb +70 -0
  102. data/lib/archsight/resources/technology_node.rb +57 -1
  103. data/lib/archsight/resources/technology_service.rb +33 -0
  104. data/lib/archsight/resources/technology_system_software.rb +28 -0
  105. data/lib/archsight/resources.rb +12 -0
  106. data/lib/archsight/version.rb +1 -1
  107. data/lib/archsight/web/api/analysis_helpers.rb +55 -0
  108. data/lib/archsight/web/api/json_helpers.rb +3 -37
  109. data/lib/archsight/web/api/openapi/spec.yaml +10 -8
  110. data/lib/archsight/web/api/page_helpers.rb +1 -8
  111. data/lib/archsight/web/api/routes.rb +7 -2
  112. data/lib/archsight/web/application.rb +38 -2
  113. data/lib/archsight/web/editor/routes.rb +2 -1
  114. data/lib/archsight/web/public/vue/ApiDocsPage-COp4onwn.js +1 -0
  115. data/lib/archsight/web/public/vue/DocPage-D52OwaKc.js +1 -0
  116. data/lib/archsight/web/public/vue/EditorPage-3aqL7yVf.js +35 -0
  117. data/lib/archsight/web/public/vue/ErrorPage--b9XeSYa.js +2 -0
  118. data/lib/archsight/web/public/vue/GraphView-qh_EtRrQ.js +1 -0
  119. data/lib/archsight/web/public/vue/HomePage-C2TNh2U-.js +2 -0
  120. data/lib/archsight/web/public/vue/InstanceRouter-ZaCcjlIX.css +1 -0
  121. data/lib/archsight/web/public/vue/InstanceRouter-uzb_OMG0.js +1 -0
  122. data/lib/archsight/web/public/vue/KindList-CyJuP_uq.js +1 -0
  123. data/lib/archsight/web/public/vue/KindList-yYcRT2BV.css +1 -0
  124. data/lib/archsight/web/public/vue/PageView-B93woeN3.css +1 -0
  125. data/lib/archsight/web/public/vue/PageView-FyygrS-b.js +1 -0
  126. data/lib/archsight/web/public/vue/QueryError-B4Ex_csZ.js +1 -0
  127. data/lib/archsight/web/public/vue/ResourceList-BY6Z1Kcb.js +2 -0
  128. data/lib/archsight/web/public/vue/ResourceList-D75O87zG.css +1 -0
  129. data/lib/archsight/web/public/vue/{SearchResults-CyPUZZSC.css → SearchResults-BV6UHriJ.css} +1 -1
  130. data/lib/archsight/web/public/vue/SearchResults-CkFpHF8m.js +1 -0
  131. data/lib/archsight/web/public/vue/WikiPage-BoHNewCX.js +3 -0
  132. data/lib/archsight/web/public/vue/WikiPage-TpmM1VAF.css +1 -0
  133. data/lib/archsight/web/public/vue/architecture-7GRP2DOG-BvzKZE4e.js +1 -0
  134. data/lib/archsight/web/public/vue/cynefin-OW5HDTMX-D-xs_Hxh.js +1 -0
  135. data/lib/archsight/web/public/vue/eventmodeling-NTZA5JFV-nbjxG01S.js +1 -0
  136. data/lib/archsight/web/public/vue/gitGraph-4MIJSDKK-CW6mw2ab.js +1 -0
  137. data/lib/archsight/web/public/vue/index-BGlYCbi7.js +3 -0
  138. data/lib/archsight/web/public/vue/index-eUHmJ7K2.css +1 -0
  139. data/lib/archsight/web/public/vue/info-A6RAGUB7-C12sjlHe.js +1 -0
  140. data/lib/archsight/web/public/vue/{mermaid-BjEi5URd.js → mermaid-DjsXQ_XN.js} +35 -35
  141. data/lib/archsight/web/public/vue/packet-AYTQ26CC-wMwKwHmA.js +1 -0
  142. data/lib/archsight/web/public/vue/pie-WAS4IAKB-w1-sAU_K.js +1 -0
  143. data/lib/archsight/web/public/vue/radar-RG4KPBEZ-DpwqIFoy.js +1 -0
  144. data/lib/archsight/web/public/vue/railroad-74A4TZTK-Ce5XC24d.js +1 -0
  145. data/lib/archsight/web/public/vue/railroad-abnf-HS5TGJTU-BSQO2pds.js +1 -0
  146. data/lib/archsight/web/public/vue/railroad-ebnf-LZEXJU2U-Dq1c2YtD.js +1 -0
  147. data/lib/archsight/web/public/vue/railroad-peg-WCYAUIDC-DKj6dli0.js +1 -0
  148. data/lib/archsight/web/public/vue/rolldown-runtime-hePW80VL.js +1 -0
  149. data/lib/archsight/web/public/vue/treeView-Q6P3EWNA-BmHNTWxU.js +1 -0
  150. data/lib/archsight/web/public/vue/treemap-WGGIJYW6-DsEI7sSD.js +1 -0
  151. data/lib/archsight/web/public/vue/{useGraphviz-DweKV7Kg.js → useGraphviz-4evusK9i.js} +13 -1
  152. data/lib/archsight/web/public/vue/{useHighlight-D5Gf8DLl.js → useHighlight-DPguaxfm.js} +8 -8
  153. data/lib/archsight/web/public/vue/usePanZoom-seQE1TPk.js +12 -0
  154. data/lib/archsight/web/public/vue/wardley-WFR3VGLG-CSCW83-M.js +1 -0
  155. data/lib/archsight/web/public/vue.html +5 -5
  156. metadata +72 -38
  157. data/lib/archsight/web/public/vue/ApiDocsPage-DoOxKjG0.js +0 -1
  158. data/lib/archsight/web/public/vue/DocPage-CfsC3CeQ.js +0 -1
  159. data/lib/archsight/web/public/vue/EditorPage-CsJA0q8n.js +0 -35
  160. data/lib/archsight/web/public/vue/ErrorPage-OJpJz9df.js +0 -2
  161. data/lib/archsight/web/public/vue/GraphView-CBq6oFRV.js +0 -1
  162. data/lib/archsight/web/public/vue/HomePage-BwgMLgVC.js +0 -2
  163. data/lib/archsight/web/public/vue/InstanceRouter-DQz-SsQq.js +0 -1
  164. data/lib/archsight/web/public/vue/InstanceRouter-jeavM6PW.css +0 -1
  165. data/lib/archsight/web/public/vue/KindList-4q0K9Cll.js +0 -1
  166. data/lib/archsight/web/public/vue/PageView-DzeGnvoS.js +0 -1
  167. data/lib/archsight/web/public/vue/QueryError-kg6Yf-pW.js +0 -1
  168. data/lib/archsight/web/public/vue/ResourceList-B0FLaFR3.css +0 -1
  169. data/lib/archsight/web/public/vue/ResourceList-Df_0e0qt.js +0 -2
  170. data/lib/archsight/web/public/vue/SearchResults-CKgY6_wH.js +0 -1
  171. data/lib/archsight/web/public/vue/WikiPage-DoFJ0dbW.css +0 -1
  172. data/lib/archsight/web/public/vue/WikiPage-DrvCHwJ7.js +0 -13
  173. data/lib/archsight/web/public/vue/architecture-7GRP2DOG-BfA1TPxQ.js +0 -1
  174. data/lib/archsight/web/public/vue/cynefin-OW5HDTMX-BmgdUKVD.js +0 -1
  175. data/lib/archsight/web/public/vue/eventmodeling-NTZA5JFV-DbXDvAWF.js +0 -1
  176. data/lib/archsight/web/public/vue/gitGraph-4MIJSDKK-BkVhrKS1.js +0 -1
  177. data/lib/archsight/web/public/vue/index-D0Q5GZRs.js +0 -3
  178. data/lib/archsight/web/public/vue/index-oF-iyZvk.css +0 -1
  179. data/lib/archsight/web/public/vue/info-A6RAGUB7-BIlCVuUY.js +0 -1
  180. data/lib/archsight/web/public/vue/packet-AYTQ26CC-eoQTjY3j.js +0 -1
  181. data/lib/archsight/web/public/vue/pie-WAS4IAKB-DEOotGhh.js +0 -1
  182. data/lib/archsight/web/public/vue/radar-RG4KPBEZ-C2yucuUN.js +0 -1
  183. data/lib/archsight/web/public/vue/railroad-74A4TZTK-CzONK5VY.js +0 -1
  184. data/lib/archsight/web/public/vue/railroad-abnf-HS5TGJTU-9zRPsDsx.js +0 -1
  185. data/lib/archsight/web/public/vue/railroad-ebnf-LZEXJU2U-BJ4dkz9l.js +0 -1
  186. data/lib/archsight/web/public/vue/railroad-peg-WCYAUIDC-DFy_rqAj.js +0 -1
  187. data/lib/archsight/web/public/vue/treeView-Q6P3EWNA-2cq5CyD2.js +0 -1
  188. data/lib/archsight/web/public/vue/treemap-WGGIJYW6-DK-e9Ez4.js +0 -1
  189. data/lib/archsight/web/public/vue/wardley-WFR3VGLG-BQwqUqfB.js +0 -1
@@ -35,26 +35,52 @@ class Archsight::Resources::Import < Archsight::Resources::Base
35
35
  icon "download"
36
36
  layer "other"
37
37
 
38
- # Handler selection
38
+ # Handler selection: a built-in handler or one the resources repository registers (import/handlerPath)
39
39
  annotation "import/handler",
40
- description: "Handler class name to execute this import",
40
+ description: "Name of the handler that executes this import: a built-in one or one registered by the file " \
41
+ "in import/handlerPath",
41
42
  title: "Handler",
42
43
  summary: true,
43
- enum: %w[
44
- gitlab github repository
45
- rest-api rest-api-index
46
- jira-discover jira-metrics
47
- go-grapher go-dep-resolver
48
- cpp-grapher ruby-grapher python-grapher
49
- java-grapher javascript-grapher
50
- rust-grapher crystal-grapher elixir-grapher
51
- ]
44
+ filter: :word,
45
+ validator: lambda { |value|
46
+ require "archsight/import/handler_loader"
47
+ Archsight::Import::HandlerLoader.load_builtin!
48
+ next if Archsight::Import::Registry[value]
49
+
50
+ "unknown import handler '#{value}'. Registered: #{Archsight::Import::Registry.handlers.sort.join(", ")}; " \
51
+ "a handler of the resources repository needs import/handlerPath"
52
+ }
53
+
54
+ annotation "import/handlerPath",
55
+ description: "Ruby file of a handler that lives in the resources repository, relative to the resources " \
56
+ "root (e.g., 'importers/deployments.rb'). It registers the name used in import/handler.",
57
+ title: "Handler Path"
58
+
59
+ annotation "import/dependsOn",
60
+ description: "Imports that must run first, by name or glob pattern (e.g., 'Import:Repo:*'), comma " \
61
+ "separated. Adds to the dependency on the import that generated this one.",
62
+ title: "Depends On",
63
+ filter: :list,
64
+ sidebar: false
52
65
 
53
66
  # Output configuration
54
67
  annotation "import/outputPath",
55
68
  description: "Output file path relative to resources root (e.g., 'imports/generated/gitlab.yaml')",
56
69
  title: "Output Path"
57
70
 
71
+ annotation "generated/inputsHash",
72
+ description: "Hash of the files matched by import/config/inputs at the last run (for change detection)",
73
+ title: "Inputs Hash",
74
+ sidebar: false,
75
+ editor: false
76
+
77
+ annotation "generated/outputs",
78
+ description: "Files the last run wrote, relative to the resources root",
79
+ title: "Outputs",
80
+ filter: :list,
81
+ sidebar: false,
82
+ editor: false
83
+
58
84
  # Control flags
59
85
  annotation "import/enabled",
60
86
  description: "Whether this import is enabled",
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Location represents a geographic or conceptual place
4
+ class Archsight::Resources::Location < Archsight::Resources::Base
5
+ include_annotations :git, :architecture
6
+
7
+ description <<~MD
8
+ Represents a place: a country, a metro area, a region or any other geographic or conceptual position.
9
+
10
+ ## ArchiMate Definition
11
+
12
+ **Layer:** Other (ArchiMate: composite element)
13
+ **Aspect:** Composite
14
+
15
+ A location is a conceptual or physical place or position where concepts are located (structure elements)
16
+ or performed (behavior elements). In archsight it is the coarse place that facilities sit in.
17
+
18
+ ## Usage
19
+
20
+ Use Location to represent:
21
+
22
+ - Countries and regions (Germany, EU)
23
+ - Metro areas and cities (Frankfurt)
24
+ - Conceptual places (a cloud region, a jurisdiction)
25
+
26
+ ## Not this kind
27
+
28
+ - A building, campus or hall is a `TechnologyFacility` that is `locatedAt` the location
29
+ - A cloud region that is really a set of data centers: a location, with the data centers as facilities in it
30
+
31
+ Which kind to pick: "Choosing the Kind: Infrastructure" in the modeling guide.
32
+
33
+ ## How it connects
34
+
35
+ - A `TechnologyFacility` is `locatedAt` a location (many facilities, one location)
36
+ - Everything located at a facility of the location is found through the facility; the location page lists the
37
+ facilities that are located there, grouped by kind
38
+
39
+ Model the sites themselves as `TechnologyFacility`, not as locations: a data center is a physical structure.
40
+ MD
41
+
42
+ icon "map-pin"
43
+ layer "other"
44
+
45
+ annotation "location/country",
46
+ description: "Country of the location (name or ISO 3166 code)",
47
+ title: "Country",
48
+ filter: :word,
49
+ summary: true
50
+
51
+ annotation "location/city",
52
+ description: "City or metro area of the location",
53
+ title: "City",
54
+ filter: :word,
55
+ summary: true
56
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ # MotivationAssessment represents the outcome of an analysis: a risk, a vulnerability, a finding
4
+ class Archsight::Resources::MotivationAssessment < Archsight::Resources::Base
5
+ include_annotations :git, :architecture, :risk
6
+
7
+ description <<~MD
8
+ Represents the outcome of an analysis of some aspect of the architecture with respect to a driver: a risk, a
9
+ vulnerability, an audit finding, a supplier or protection-need assessment.
10
+
11
+ ## ArchiMate Definition
12
+
13
+ **Layer:** Motivation
14
+ **Aspect:** Behavior
15
+
16
+ An assessment is the outcome of an analysis of the state of affairs of the enterprise with respect to some
17
+ driver. In the risk and security overlay of the Open Group paper (*Modeling Enterprise Risk Management and
18
+ Security with the ArchiMate Language*) a **risk** is a quantification of a threat and a **vulnerability** is
19
+ the result of analysing weaknesses of architecture elements; both are assessments with a type. Set
20
+ `assessment/type` to say which.
21
+
22
+ ## Usage
23
+
24
+ Use MotivationAssessment to represent:
25
+
26
+ - Risks (`risk`) with an initial and a residual profile and a treatment decision
27
+ - Vulnerabilities (`vulnerability`), also the results of a scan or penetration test
28
+ - Audit and review findings (`finding`)
29
+ - Supplier assessments (`supplier`) and protection-need analyses (`protection-need`)
30
+
31
+ ## Risk profile
32
+
33
+ Initial risk is the risk before mitigation, residual risk the one after. Describe both with likelihood and
34
+ impact (`risk/initial-*`, `risk/residual-*`) and record the decision in `risk/treatment` (avoid, transfer,
35
+ mitigate, accept).
36
+
37
+ ## How it connects
38
+
39
+ - A `MotivationDriver` (the threat) `influences` the risk
40
+ - The assessment `assesses` the assets it is about (applications, nodes, processes, data, suppliers)
41
+ - A vulnerability `influences` the loss events it makes possible; a risk `influences` other risks
42
+ - It is `mitigatedBy` a `MotivationGoal` (control objective), a `MotivationRequirement` (control measure), a
43
+ `BusinessControl` or an `ImplementationWorkPackage` (remediation); read top-down: risk, objective, measure,
44
+ control
45
+ - It is `ownedBy` the accountable actor or role
46
+ MD
47
+
48
+ icon "stats-up-square"
49
+ layer "motivation"
50
+
51
+ likelihood = %w[very-low low medium high very-high]
52
+
53
+ annotation "assessment/id",
54
+ description: "Identifier of the assessment in its register (risk id, CVE, finding number)",
55
+ title: "Assessment ID"
56
+
57
+ annotation "assessment/type",
58
+ description: "What kind of assessment this is (specialization of the assessment)",
59
+ enum: %w[risk vulnerability finding supplier protection-need],
60
+ filter: :word,
61
+ summary: true
62
+
63
+ annotation "assessment/status",
64
+ description: "Where the assessment is in its life cycle",
65
+ enum: %w[open treating accepted closed],
66
+ filter: :word,
67
+ summary: true
68
+
69
+ annotation "assessment/severity",
70
+ description: "Severity of a vulnerability or finding",
71
+ enum: %w[info low medium high critical],
72
+ filter: :word
73
+
74
+ annotation "assessment/assessed",
75
+ description: "When the assessment was made (ISO 8601 date or time)",
76
+ title: "Assessed",
77
+ validator: ->(value) { Archsight::Resources::Page.timestamp_error(value) }
78
+
79
+ annotation "risk/initial-likelihood",
80
+ description: "Likelihood of the loss before mitigation",
81
+ enum: likelihood,
82
+ filter: :word
83
+
84
+ annotation "risk/initial-impact",
85
+ description: "Impact of the loss before mitigation",
86
+ enum: likelihood,
87
+ filter: :word
88
+
89
+ annotation "risk/residual-likelihood",
90
+ description: "Likelihood of the loss after mitigation",
91
+ enum: likelihood,
92
+ filter: :word
93
+
94
+ annotation "risk/residual-impact",
95
+ description: "Impact of the loss after mitigation",
96
+ enum: likelihood,
97
+ filter: :word
98
+
99
+ annotation "risk/treatment",
100
+ description: "How the risk is treated",
101
+ enum: %w[avoid transfer mitigate accept],
102
+ filter: :word,
103
+ summary: true
104
+
105
+ relation :ownedBy, :businessActors, :BusinessActor
106
+ relation :ownedBy, :businessRoles, :BusinessRole
107
+ relation :assesses, :businessProcesses, :BusinessProcess
108
+ relation :assesses, :businessActors, :BusinessActor
109
+ relation :assesses, :applicationComponents, :ApplicationComponent
110
+ relation :assesses, :applicationServices, :ApplicationService
111
+ relation :assesses, :technologyNodes, :TechnologyNode
112
+ relation :assesses, :dataObjects, :DataObject
113
+ relation :influences, :businessEvents, :BusinessEvent
114
+ relation :influences, :applicationEvents, :ApplicationEvent
115
+ relation :influences, :technologyEvents, :TechnologyEvent
116
+ relation :influences, :motivationAssessments, :MotivationAssessment
117
+ relation :mitigatedBy, :goals, :MotivationGoal
118
+ relation :mitigatedBy, :motivationRequirements, :MotivationRequirement
119
+ relation :mitigatedBy, :businessControls, :BusinessControl
120
+ relation :mitigatedBy, :implementationWorkPackages, :ImplementationWorkPackage
121
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  # MotivationConstraint represents restrictions or limitations on architecture
4
4
  class Archsight::Resources::MotivationConstraint < Archsight::Resources::Base
5
- include_annotations :git, :architecture
5
+ include_annotations :git, :architecture, :risk
6
6
 
7
7
  description <<~MD
8
8
  Represents a factor that limits the realization of goals or influences architecture decisions.
@@ -25,6 +25,12 @@ class Archsight::Resources::MotivationConstraint < Archsight::Resources::Base
25
25
  - Organizational standards
26
26
  - Technical limitations
27
27
  - Budget or resource constraints
28
+
29
+ ## Security and risk modelling
30
+
31
+ Use a constraint for rules that only restrict and are not a design statement: regulation, contractual duties,
32
+ operational policy (the overlay paper has no element for operational policy). Policies stated as principles
33
+ belong in `MotivationPrinciple`.
28
34
  MD
29
35
 
30
36
  icon "prohibition"
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ # MotivationDriver represents an external or internal condition that motivates the enterprise to act
4
+ class Archsight::Resources::MotivationDriver < Archsight::Resources::Base
5
+ include_annotations :git, :architecture, :risk
6
+
7
+ description <<~MD
8
+ Represents an external or internal condition that motivates the enterprise to define its goals and act.
9
+
10
+ ## ArchiMate Definition
11
+
12
+ **Layer:** Motivation
13
+ **Aspect:** Active Structure
14
+
15
+ A driver is something that creates, motivates and fuels the change of an organization. In the risk and
16
+ security overlay of the Open Group paper (*Modeling Enterprise Risk Management and Security with the ArchiMate
17
+ Language*) the general notion of a **threat** (a threatening circumstance) is a driver; opportunities,
18
+ regulations and market forces are drivers too. Set `driver/type` to say which.
19
+
20
+ ## Usage
21
+
22
+ Use MotivationDriver to represent:
23
+
24
+ - Threats ("machines may fail", "attackers target customer data")
25
+ - Opportunities
26
+ - Regulation and legal change
27
+ - Market and customer demand
28
+
29
+ ## How it connects
30
+
31
+ - A driver `influences` the assessments (risks) it leads to and other drivers
32
+ - A threat driver `triggers` threat or loss events
33
+ - A `MotivationStakeholder` `hasConcern` for it
34
+ MD
35
+
36
+ icon "fire-flame"
37
+ layer "motivation"
38
+
39
+ annotation "driver/type",
40
+ description: "What kind of driver this is (specialization of the driver)",
41
+ enum: %w[threat opportunity regulation market internal],
42
+ filter: :word,
43
+ summary: true
44
+
45
+ relation :influences, :motivationAssessments, :MotivationAssessment
46
+ relation :influences, :motivationDrivers, :MotivationDriver
47
+ relation :triggers, :businessEvents, :BusinessEvent
48
+ relation :triggers, :applicationEvents, :ApplicationEvent
49
+ relation :triggers, :technologyEvents, :TechnologyEvent
50
+ end
@@ -3,7 +3,7 @@
3
3
  # MotivationGoal represents a high-level statement of intent, direction, or desired end state
4
4
  # for an organization and its stakeholders (ArchiMate Motivation Layer)
5
5
  class Archsight::Resources::MotivationGoal < Archsight::Resources::Base
6
- include_annotations :git, :architecture
6
+ include_annotations :git, :architecture, :risk
7
7
 
8
8
  description <<~MD
9
9
  Represents a high-level statement of intent or desired end state for the organization.
@@ -26,11 +26,23 @@ class Archsight::Resources::MotivationGoal < Archsight::Resources::Base
26
26
  - Quality goals
27
27
  - Compliance objectives
28
28
  - Performance targets
29
+
30
+ ## Security and risk modelling
31
+
32
+ In the Open Group risk and security overlay a goal with `goal/type` `control-objective` states what a control
33
+ achieves against a risk. The risk (`MotivationAssessment`) is `mitigatedBy` the goal, and the goal `realizes` the
34
+ requirements that are the control measures: risk, then objective, then measure, read top-down.
29
35
  MD
30
36
 
31
37
  icon "archery"
32
38
  layer "motivation"
33
39
 
40
+ annotation "goal/type",
41
+ description: "What kind of goal this is (specialization of the goal)",
42
+ enum: %w[business control-objective],
43
+ filter: :word,
44
+ summary: true
45
+
34
46
  relation :realizes, :outcomes, :MotivationOutcome
35
47
  relation :refinedBy, :goals, :MotivationGoal
36
48
  relation :realizes, :motivationRequirements, :MotivationRequirement
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ # MotivationPrinciple represents a normative property of all systems in a context, such as a policy
4
+ class Archsight::Resources::MotivationPrinciple < Archsight::Resources::Base
5
+ include_annotations :git, :architecture, :risk
6
+
7
+ description <<~MD
8
+ Represents a statement of intent that defines a general property that applies to any system in a context: a
9
+ principle, and at design level a policy.
10
+
11
+ ## ArchiMate Definition
12
+
13
+ **Layer:** Motivation
14
+ **Aspect:** Passive Structure
15
+
16
+ A principle is a qualitative statement of intent that should be met by the architecture. In the risk and
17
+ security overlay of the Open Group paper (*Modeling Enterprise Risk Management and Security with the ArchiMate
18
+ Language*) a policy maps to a principle; risk policy and security policy are specializations. Set
19
+ `principle/type` to say which.
20
+
21
+ ## Usage
22
+
23
+ Use MotivationPrinciple to represent:
24
+
25
+ - Security and risk policies (information security policy, access control policy)
26
+ - Guidelines and procedures that state how a rule is applied
27
+ - Architecture principles
28
+
29
+ Rules that only restrict (regulation, an operational policy that is not a design statement) stay
30
+ `MotivationConstraint`. The text of a policy belongs in a `Page`; link it with `[[Page]]` in the description.
31
+
32
+ ## How it connects
33
+
34
+ - A principle is `ownedBy` the actor or role that issued it
35
+ - A `MotivationRequirement` (control measure) `realizes` the principle
36
+ MD
37
+
38
+ icon "book"
39
+ layer "motivation"
40
+
41
+ annotation "principle/type",
42
+ description: "What kind of statement this is (specialization of the principle)",
43
+ enum: %w[principle policy security-policy risk-policy guideline procedure],
44
+ filter: :word,
45
+ summary: true
46
+
47
+ annotation "principle/status",
48
+ description: "Whether the statement is in force",
49
+ enum: %w[draft valid retired],
50
+ filter: :word,
51
+ summary: true
52
+
53
+ annotation "principle/classification",
54
+ description: "Confidentiality classification of the statement",
55
+ enum: %w[public internal confidential strictly-confidential],
56
+ filter: :word
57
+
58
+ annotation "principle/valid-from",
59
+ description: "When the statement comes into force (ISO 8601 date or time)",
60
+ title: "Valid from",
61
+ validator: ->(value) { Archsight::Resources::Page.timestamp_error(value) }
62
+
63
+ annotation "principle/valid-until",
64
+ description: "When the statement has to be reviewed or ends (ISO 8601 date or time)",
65
+ title: "Valid until",
66
+ validator: ->(value) { Archsight::Resources::Page.timestamp_error(value) }
67
+
68
+ annotation "principle/framework",
69
+ description: "Standards the statement maps to (comma-separated, e.g. c5-2020, iso27001-2022)",
70
+ title: "Framework mapping",
71
+ filter: :list
72
+
73
+ relation :ownedBy, :businessActors, :BusinessActor
74
+ relation :ownedBy, :businessRoles, :BusinessRole
75
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  # MotivationRequirement represents functional or non-functional requirements
4
4
  class Archsight::Resources::MotivationRequirement < Archsight::Resources::Base
5
- include_annotations :git, :architecture
5
+ include_annotations :git, :architecture, :risk
6
6
 
7
7
  description <<~MD
8
8
  Represents a statement of need that must be realized by the architecture.
@@ -35,6 +35,21 @@ class Archsight::Resources::MotivationRequirement < Archsight::Resources::Base
35
35
  which `satisfies` it
36
36
 
37
37
  Both show as incoming relations on the requirement's page.
38
+
39
+ ## Where it comes from
40
+
41
+ The source of a requirement is the `MotivationStakeholder` that `hasConcern` for it, directly or through the goal
42
+ the requirement answers. The stakeholder is `representedBy` the actor or role behind it, so the chain reaches the
43
+ actual organisation that asked for the requirement.
44
+
45
+ ## Security and risk modelling
46
+
47
+ - **Control measure:** `requirement/type` `control-measure` is a measure that a control objective
48
+ (`MotivationGoal`) `realizes`; the risk is `mitigatedBy` the objective or directly by the measure, and the
49
+ asset or control that implements the measure `realizes` or `satisfies` it.
50
+ - **Control requirement / catalogue control:** a control of a standard (C5, ISO 27001) is a requirement of type
51
+ `compliance`, listed in `requirement/reference`.
52
+ - **Policy:** a requirement can `realize` a `MotivationPrinciple` (the policy it implements).
38
53
  MD
39
54
 
40
55
  icon "task-list"
@@ -42,7 +57,7 @@ class Archsight::Resources::MotivationRequirement < Archsight::Resources::Base
42
57
 
43
58
  annotation "requirement/type",
44
59
  description: "Type of requirement (business or legal)",
45
- enum: %w[business legal compliance functional non-functional],
60
+ enum: %w[business legal compliance functional non-functional control-measure],
46
61
  summary: true
47
62
 
48
63
  annotation "requirement/reference",
@@ -64,4 +79,5 @@ class Archsight::Resources::MotivationRequirement < Archsight::Resources::Base
64
79
  format: :markdown
65
80
 
66
81
  relation :realizes, :outcomes, :MotivationOutcome
82
+ relation :realizes, :motivationPrinciples, :MotivationPrinciple
67
83
  end
@@ -26,6 +26,23 @@ class Archsight::Resources::MotivationStakeholder < Archsight::Resources::Base
26
26
  - Customer representatives
27
27
  - Regulatory bodies
28
28
  - Technical leadership
29
+
30
+ ## How it connects
31
+
32
+ - It `hasConcern` for the capabilities, goals, drivers, assessments, constraints and requirements it cares about.
33
+ That makes it the **source** of those requirements: the requirement's page shows the stakeholder as incoming.
34
+ - It is `representedBy` the `BusinessActor` (the actual organisation or person, e.g. the customer organisation,
35
+ not "customer") or `BusinessRole` that holds this interest. A stakeholder is a role; the actor is the party
36
+ behind it.
37
+
38
+ In ArchiMate a stakeholder is associated with the business actor or role that plays it; in TOGAF the stakeholder
39
+ map of Phase A links stakeholders and their concerns to organisation units and actors, and the requirements
40
+ repository records each requirement's source.
41
+
42
+ ## Security and risk modelling
43
+
44
+ A stakeholder (CISO, risk committee, data protection officer) can `hasConcern` for threats
45
+ (`MotivationDriver`) and risks (`MotivationAssessment`) in addition to goals and requirements.
29
46
  MD
30
47
 
31
48
  icon "user-crown"
@@ -35,4 +52,8 @@ class Archsight::Resources::MotivationStakeholder < Archsight::Resources::Base
35
52
  relation :hasConcern, :motivationRequirements, :MotivationRequirement
36
53
  relation :hasConcern, :motivationConstraints, :MotivationConstraint
37
54
  relation :hasConcern, :goals, :MotivationGoal
55
+ relation :hasConcern, :motivationDrivers, :MotivationDriver
56
+ relation :hasConcern, :motivationAssessments, :MotivationAssessment
57
+ relation :representedBy, :businessActors, :BusinessActor
58
+ relation :representedBy, :businessRoles, :BusinessRole
38
59
  end
@@ -6,6 +6,8 @@ require "time"
6
6
  # Page is a wiki page authored as a markdown file with YAML frontmatter.
7
7
  # It is sourced by Archsight::PageLoader and arranged in a tree by PageMenu.
8
8
  class Archsight::Resources::Page < Archsight::Resources::Base
9
+ include_annotations :links
10
+
9
11
  description <<~MD
10
12
  Represents a wiki page authored as a markdown file with YAML frontmatter.
11
13
 
@@ -18,8 +20,13 @@ class Archsight::Resources::Page < Archsight::Resources::Base
18
20
 
19
21
  ## Frontmatter
20
22
 
21
- `title`, `author`, `owner`, `status`, `tags` (comma-separated), `toc` (yes/no), `confluence`
22
- (URL of the linked Confluence page) and an optional `name` (defaults to the file path).
23
+ `title`, `author`, `owner`, `status`, `tags` (comma-separated), `toc` (yes/no), `links` (a mapping of
24
+ names to URLs, e.g. `confluence`, `jira`) and an optional `name` (defaults to the file path).
25
+
26
+ ## Security and risk modelling
27
+
28
+ The text of a policy, a risk register narrative or an incident report is a `Page`. Link the structured
29
+ resources (`MotivationPrinciple`, `MotivationAssessment`, events) to it with `[[Page]]`.
23
30
  MD
24
31
 
25
32
  icon "page"
@@ -54,11 +61,6 @@ class Archsight::Resources::Page < Archsight::Resources::Base
54
61
  title: "Table of Contents",
55
62
  enum: %w[yes no],
56
63
  sidebar: false
57
- annotation "page/confluence",
58
- description: "URL of the corresponding Confluence page (used for a later export)",
59
- title: "Confluence",
60
- type: URI,
61
- sidebar: false
62
64
  annotation "page/created",
63
65
  description: "When the page was created (ISO 8601 date or time)",
64
66
  title: "Created",
@@ -25,6 +25,15 @@ class Archsight::Resources::StrategyCapability < Archsight::Resources::Base
25
25
  - Organizational abilities
26
26
  - Core competencies
27
27
  - Value-generating functions
28
+
29
+ ## Choosing this kind
30
+
31
+ **Question:** What must the organization be *able* to do?
32
+ **Test:** It survives swapping product, team and technology. It is not a certificate or a quality.
33
+ **Name:** An ability noun phrase ("Payment Processing"), never a product, team or technology.
34
+
35
+ A product `realizes` the capability. Only internal capabilities that no product carries are `servedBy` a service.
36
+ See the modeling guide, "Choosing the Kind".
28
37
  MD
29
38
 
30
39
  icon "strategy"
@@ -27,6 +27,15 @@ class Archsight::Resources::TechnologyArtifact < Archsight::Resources::Base
27
27
  - Container images
28
28
  - Build artifacts
29
29
  - Configuration packages
30
+ - Images (OS, VM template, disk or boot image, `artifact/type: image`)
31
+
32
+ ## Contents and deployment
33
+
34
+ An artifact that contains other artifacts `aggregates` them (ArchiMate aggregation): an image contains packages,
35
+ a chart references container images. A node or system software that runs an artifact `assignedTo` it (ArchiMate
36
+ assignment, written on the node). The artifact's page shows both as incoming relations ("contained in" and
37
+ "deployed on"). `ApplicationComponent realizedThrough TechnologyArtifact` says what a component is built from,
38
+ not where the artifact runs.
30
39
  MD
31
40
 
32
41
  icon "puzzle"
@@ -36,12 +45,9 @@ class Archsight::Resources::TechnologyArtifact < Archsight::Resources::Base
36
45
  annotation "artifact/type",
37
46
  description: "Type of technology artifact",
38
47
  title: "Artifact Type",
39
- enum: %w[repo container chart deb rpm]
48
+ enum: %w[repo container chart deb rpm image binary archive]
40
49
 
41
50
  # Dynamic annotations (patterns with *)
42
- annotation "link/*",
43
- description: "Documentation and resource links",
44
- sidebar: false
45
51
  annotation "scc/language/*/loc",
46
52
  description: "Lines of code per programming language",
47
53
  sidebar: false
@@ -240,6 +246,7 @@ class Archsight::Resources::TechnologyArtifact < Archsight::Resources::Base
240
246
  end
241
247
 
242
248
  relation :servedBy, :technologyComponents, :TechnologyArtifact
249
+ relation :aggregates, :technologyArtifacts, :TechnologyArtifact
243
250
  relation :suppliedBy, :technologyComponents, :TechnologyService
244
251
  relation :maintainedBy, :businessActors, :BusinessActor
245
252
  relation :contributedBy, :businessActors, :BusinessActor