archsight 0.3.1 → 0.3.3

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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +1 -1
  3. data/README.md +6 -1
  4. data/docs/icons.md +29 -2
  5. data/docs/index.md.erb +22 -4
  6. data/docs/modeling.md +268 -6
  7. data/docs/pages.md +12 -3
  8. data/docs/search.md +9 -2
  9. data/docs/togaf.md +8 -1
  10. data/lib/archsight/annotations/asset_annotations.rb +34 -0
  11. data/lib/archsight/annotations/relation_resolver.rb +15 -6
  12. data/lib/archsight/annotations/risk_annotations.rb +21 -0
  13. data/lib/archsight/cli.rb +6 -0
  14. data/lib/archsight/database.rb +57 -3
  15. data/lib/archsight/diagram.rb +7 -0
  16. data/lib/archsight/documentation.rb +10 -6
  17. data/lib/archsight/editor.rb +2 -2
  18. data/lib/archsight/helpers/requirements_blocks.rb +1 -1
  19. data/lib/archsight/helpers/resource_resolver.rb +1 -1
  20. data/lib/archsight/helpers/wiki_links.rb +11 -0
  21. data/lib/archsight/linter.rb +110 -0
  22. data/lib/archsight/mcp/analyze_resource_tool.rb +2 -2
  23. data/lib/archsight/mcp/resource_doc_tool.rb +2 -2
  24. data/lib/archsight/query/ast.rb +2 -1
  25. data/lib/archsight/query/evaluator.rb +2 -2
  26. data/lib/archsight/references.rb +129 -0
  27. data/lib/archsight/requirements.rb +4 -4
  28. data/lib/archsight/resources/application_component.rb +11 -1
  29. data/lib/archsight/resources/application_event.rb +79 -0
  30. data/lib/archsight/resources/application_interface.rb +1 -1
  31. data/lib/archsight/resources/application_service.rb +10 -5
  32. data/lib/archsight/resources/base.rb +40 -5
  33. data/lib/archsight/resources/business_actor.rb +9 -1
  34. data/lib/archsight/resources/business_control.rb +88 -0
  35. data/lib/archsight/resources/business_event.rb +79 -0
  36. data/lib/archsight/resources/business_process.rb +11 -3
  37. data/lib/archsight/resources/business_product.rb +2 -2
  38. data/lib/archsight/resources/business_role.rb +69 -0
  39. data/lib/archsight/resources/compliance_evidence.rb +44 -3
  40. data/lib/archsight/resources/data_object.rb +7 -2
  41. data/lib/archsight/resources/implementation_deliverable.rb +62 -0
  42. data/lib/archsight/resources/implementation_event.rb +52 -0
  43. data/lib/archsight/resources/implementation_gap.rb +49 -0
  44. data/lib/archsight/resources/implementation_plateau.rb +61 -0
  45. data/lib/archsight/resources/implementation_work_package.rb +83 -0
  46. data/lib/archsight/resources/motivation_assessment.rb +121 -0
  47. data/lib/archsight/resources/{business_constraint.rb → motivation_constraint.rb} +11 -5
  48. data/lib/archsight/resources/motivation_driver.rb +50 -0
  49. data/lib/archsight/resources/motivation_goal.rb +14 -2
  50. data/lib/archsight/resources/motivation_principle.rb +75 -0
  51. data/lib/archsight/resources/{business_requirement.rb → motivation_requirement.rb} +27 -7
  52. data/lib/archsight/resources/motivation_stakeholder.rb +9 -2
  53. data/lib/archsight/resources/page.rb +5 -0
  54. data/lib/archsight/resources/strategy_capability.rb +2 -2
  55. data/lib/archsight/resources/technology_event.rb +80 -0
  56. data/lib/archsight/resources/technology_node.rb +8 -2
  57. data/lib/archsight/resources/technology_service.rb +3 -3
  58. data/lib/archsight/resources/technology_system_software.rb +3 -3
  59. data/lib/archsight/resources.rb +34 -3
  60. data/lib/archsight/template.rb +2 -2
  61. data/lib/archsight/version.rb +1 -1
  62. data/lib/archsight/web/api/docs.rb +1 -1
  63. data/lib/archsight/web/api/json_helpers.rb +14 -10
  64. data/lib/archsight/web/api/openapi/spec.yaml +2 -2
  65. data/lib/archsight/web/api/page_helpers.rb +8 -7
  66. data/lib/archsight/web/api/routes.rb +1 -1
  67. data/lib/archsight/web/application.rb +6 -1
  68. data/lib/archsight/web/public/vue/{ApiDocsPage-D-cPRZCT.js → ApiDocsPage-BgqnQgwa.js} +1 -1
  69. data/lib/archsight/web/public/vue/{DocPage-DK6vNDbF.js → DocPage-CNO71nBH.js} +1 -1
  70. data/lib/archsight/web/public/vue/{EditorPage-BoJpQaVw.js → EditorPage-DR0FCNTz.js} +1 -1
  71. data/lib/archsight/web/public/vue/{ErrorPage-PGyjdtEf.js → ErrorPage-BfYArv6s.js} +1 -1
  72. data/lib/archsight/web/public/vue/{GraphView-BLiKR4zP.js → GraphView-BVTW30Ak.js} +1 -1
  73. data/lib/archsight/web/public/vue/HomePage-Wk9P4Pma.js +2 -0
  74. data/lib/archsight/web/public/vue/InstanceRouter-BV8ycydz.js +1 -0
  75. data/lib/archsight/web/public/vue/{InstanceRouter-60Tt3ZNM.css → InstanceRouter-jeavM6PW.css} +1 -1
  76. data/lib/archsight/web/public/vue/KindList-C8yMsN5J.js +1 -0
  77. data/lib/archsight/web/public/vue/{PageView-9MgHtrgl.js → PageView-BaN6TyJB.js} +1 -1
  78. data/lib/archsight/web/public/vue/{QueryError-D1FL1xgA.js → QueryError-D790wH-a.js} +1 -1
  79. data/lib/archsight/web/public/vue/ResourceList-D-66nas2.js +2 -0
  80. data/lib/archsight/web/public/vue/{SearchResults-DiW5XVYW.css → SearchResults-BewvsfOc.css} +1 -1
  81. data/lib/archsight/web/public/vue/SearchResults-CHyqIerQ.js +1 -0
  82. data/lib/archsight/web/public/vue/{WikiPage-CeCQBTDS.js → WikiPage-D2svpk6B.js} +3 -3
  83. data/lib/archsight/web/public/vue/WikiPage-DoFJ0dbW.css +1 -0
  84. data/lib/archsight/web/public/vue/{index-D7m61Ahx.js → index-BXXkUK1V.js} +2 -2
  85. data/lib/archsight/web/public/vue/index-Cov1SnzY.css +1 -0
  86. data/lib/archsight/web/public/vue/{useGraphviz-DweKV7Kg.js → useGraphviz-DlSnFeCL.js} +12 -0
  87. data/lib/archsight/web/public/vue.html +2 -2
  88. metadata +38 -22
  89. data/lib/archsight/web/public/vue/HomePage-C0lR8i2C.js +0 -2
  90. data/lib/archsight/web/public/vue/InstanceRouter-D3W2jJHV.js +0 -1
  91. data/lib/archsight/web/public/vue/KindList-BlsaRBNO.js +0 -1
  92. data/lib/archsight/web/public/vue/ResourceList-vkgFyeOY.js +0 -2
  93. data/lib/archsight/web/public/vue/SearchResults-Cl3O_OEr.js +0 -1
  94. data/lib/archsight/web/public/vue/WikiPage-C-8SG67a.css +0 -1
  95. data/lib/archsight/web/public/vue/index-Dbx3MXWG.css +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 336946fbac9548285ad368125db862c2f1926d99f2f40c1d40ba4155ebe8ca45
4
- data.tar.gz: 63ff3e1a973432f98b5ffb66ac9c518a204c0f87d90ee495615cf60bba293cd3
3
+ metadata.gz: b601281c3dc26c95647876457b96e590146aee23b762d14034ed2ae5f0953710
4
+ data.tar.gz: 7c271d26e8def3f7e85d82210ebda0d45628e280c1bb58832b81f2900c3e1097
5
5
  SHA512:
6
- metadata.gz: e76456b0f0ed4db22057a4df669953dfcdf7747ed8293ca3092be866e4eea6a4e4c63df6ffeaf6f163da552bf163f409dcb1184a1a493d12e565b0304e527202
7
- data.tar.gz: 60a37bef6e039f2bcb20d23fc1010baacdebc65cdded4e8d2f91992583bf60f8245c74175ef26945f3b67e67d6a3421de962c3d8513536376383b55e98bf8afb
6
+ metadata.gz: 416c904c7b8ecc1c44527b226fe7e6c7697c03d905d855db532bb80f1bd5ff0ff1277c770947eed411a6ca7cae7dafd8e32085690d72a4235c73bd4c1f35950b
7
+ data.tar.gz: 9c22b78187060cdc3606b4f423a38b79f84edcee6cb1d6f1446348a9da46dc088bedb4f537c809aad28c2db33f875d490637c4dcc13b57b4ee0ccc76822a0193
data/CONTRIBUTING.md CHANGED
@@ -84,7 +84,7 @@ class Archsight::Resources::MyResource < Archsight::Resources::Base
84
84
  description: 'Custom field description',
85
85
  enum: ['value1', 'value2']
86
86
 
87
- relation :realizes, :businessRequirements, :BusinessRequirement
87
+ relation :realizes, :motivationRequirements, :MotivationRequirement
88
88
  end
89
89
  ```
90
90
 
data/README.md CHANGED
@@ -91,6 +91,11 @@ archsight web
91
91
  claude mcp add --transport sse ionos-architecture http://localhost:4567/mcp/sse
92
92
  ```
93
93
 
94
+ For a deployed server use its address, for example `claude mcp add --transport sse archsight https://archsight.example.com/mcp/sse`.
95
+ The MCP endpoint accepts any hostname, like the web UI and the API, and has no authentication of its own: if the
96
+ ingress requires a token, pass it with `--header "Authorization: Bearer <token>"`. The ingress must not buffer or
97
+ time out the long-lived SSE connection.
98
+
94
99
  **Available tools:**
95
100
 
96
101
  - `query` - Search and filter resources using the query language
@@ -101,7 +106,7 @@ claude mcp add --transport sse ionos-architecture http://localhost:4567/mcp/sse
101
106
 
102
107
  **Macros** such as `{status:yellow WIP}` and `{emoticon:2705}` work inline in pages ([Wiki pages](docs/pages.md#macros)).
103
108
 
104
- **Views and analyses** can be embedded in pages with `![[View/Name]]` / `![[Analysis/Name]]` ([Wiki pages](docs/pages.md#embedding-views-and-analyses)); a view can also be written in place with a ```` ```view ```` block ([inline views](docs/pages.md#inline-views)), and the business requirements of a selection of resources shown with a ```` ```requirements ```` block ([requirements](docs/pages.md#business-requirements-of-a-selection-of-resources)).
109
+ **Views and analyses** can be embedded in pages with `![[View/Name]]` / `![[Analysis/Name]]` ([Wiki pages](docs/pages.md#embedding-views-and-analyses)); a view can also be written in place with a ```` ```view ```` block ([inline views](docs/pages.md#inline-views)), and the requirements of a selection of resources shown with a ```` ```requirements ```` block ([requirements](docs/pages.md#requirements-of-a-selection-of-resources)).
105
110
 
106
111
  **Images and draw.io diagrams** are plain files in the resources directory and are embedded in markdown with relative
107
112
  paths (`![](../img/a.png)`, `![](../../fop/flow.drawio)`); only files of image, draw.io and `.asd` diagram types inside the resources
data/docs/icons.md CHANGED
@@ -11,24 +11,51 @@ Current icon assignments for each resource type:
11
11
  | ApplicationInterface | `usb` | <i class="iconoir-usb"></i> |
12
12
  | ApplicationService | `cube` | <i class="iconoir-cube"></i> |
13
13
  | BusinessActor | `community` | <i class="iconoir-community"></i> |
14
- | BusinessConstraint | `prohibition` | <i class="iconoir-prohibition"></i> |
14
+ | ApplicationEvent | `bell-notification` | <i class="iconoir-bell-notification"></i> |
15
+ | BusinessControl | `shield-search` | <i class="iconoir-shield-search"></i> |
16
+ | BusinessEvent | `flash` | <i class="iconoir-flash"></i> |
17
+ | BusinessRole | `user-badge-check` | <i class="iconoir-user-badge-check"></i> |
15
18
  | BusinessProcess | `kanban-board` | <i class="iconoir-kanban-board"></i> |
16
19
  | BusinessProduct | `box-iso` | <i class="iconoir-box-iso"></i> |
17
- | BusinessRequirement | `task-list` | <i class="iconoir-task-list"></i> |
18
20
  | ComplianceEvidence | `shield-check` | <i class="iconoir-shield-check"></i> |
19
21
  | DataObject | `database` | <i class="iconoir-database"></i> |
20
22
  | ApplicationComponent | `component` | <i class="iconoir-component"></i> |
21
23
  | TechnologySystemSoftware | `terminal-tag` | <i class="iconoir-terminal-tag"></i> |
24
+ | MotivationAssessment | `stats-up-square` | <i class="iconoir-stats-up-square"></i> |
25
+ | MotivationDriver | `fire-flame` | <i class="iconoir-fire-flame"></i> |
26
+ | ImplementationDeliverable | `package` | <i class="iconoir-package"></i> |
27
+ | ImplementationEvent | `calendar-check` | <i class="iconoir-calendar-check"></i> |
28
+ | ImplementationGap | `git-compare` | <i class="iconoir-git-compare"></i> |
29
+ | ImplementationPlateau | `packages` | <i class="iconoir-packages"></i> |
30
+ | ImplementationWorkPackage | `hammer` | <i class="iconoir-hammer"></i> |
22
31
  | MotivationGoal | `archery` | <i class="iconoir-archery"></i> |
23
32
  | MotivationOutcome | `badge-check` | <i class="iconoir-badge-check"></i> |
33
+ | MotivationPrinciple | `book` | <i class="iconoir-book"></i> |
34
+ | MotivationRequirement | `task-list` | <i class="iconoir-task-list"></i> |
35
+ | MotivationConstraint | `prohibition` | <i class="iconoir-prohibition"></i> |
24
36
  | MotivationStakeholder | `user-crown` | <i class="iconoir-user-crown"></i> |
25
37
  | TechnologyNode | `server-connection` | <i class="iconoir-server-connection"></i> |
26
38
  | StrategyCapability | `strategy` | <i class="iconoir-strategy"></i> |
27
39
  | TechnologyArtifact | `puzzle` | <i class="iconoir-puzzle"></i> |
40
+ | TechnologyEvent | `warning-triangle` | <i class="iconoir-warning-triangle"></i> |
28
41
  | TechnologyInterface | `data-transfer-both` | <i class="iconoir-data-transfer-both"></i> |
29
42
  | TechnologyService | `cloud` | <i class="iconoir-cloud"></i> |
30
43
  | View | `view-grid` | <i class="iconoir-view-grid"></i> |
31
44
 
45
+ ## Layer Colours
46
+
47
+ Icons and graph nodes take the colour of their layer.
48
+
49
+ | Layer | Colour | Graph (light) | Icon |
50
+ |-------|--------|---------------|------|
51
+ | Strategy | orange | `#F4A261` | `#D4824A` |
52
+ | Motivation | purple | `#CE93D8` | `#AB47BC` |
53
+ | Business | yellow | `#F9DC5C` | `#D4B83C` |
54
+ | Application | blue | `#6CBEED` | `#4A9ECD` |
55
+ | Technology | green | `#8AC926` | `#7AB316` |
56
+ | Implementation & Migration | rose | `#F48FB1` | `#E0527F` |
57
+ | Other | gray | `#CCCCCC` | `#999999` |
58
+
32
59
  ## Icon Categories
33
60
 
34
61
  ### Technology & Development
data/docs/index.md.erb CHANGED
@@ -24,21 +24,27 @@ The following diagram shows all resource types organized by layer and their rela
24
24
 
25
25
  ### Motivation Layer
26
26
 
27
- Resources representing stakeholders, goals, and outcomes that drive architectural decisions.
27
+ Resources representing stakeholders, goals, outcomes, requirements, and constraints that drive architectural decisions.
28
28
 
29
29
  - [MotivationStakeholder](/doc/resources/motivation_stakeholder) - Roles with interests in the architecture
30
30
  - [MotivationGoal](/doc/resources/motivation_goal) - High-level statements of intent
31
31
  - [MotivationOutcome](/doc/resources/motivation_outcome) - End results or consequences
32
+ - [MotivationRequirement](/doc/resources/motivation_requirement) - Compliance, legal and functional requirements
33
+ - [MotivationConstraint](/doc/resources/motivation_constraint) - Limitations and restrictions
34
+ - [MotivationDriver](/doc/resources/motivation_driver) - Threats, opportunities and other drivers
35
+ - [MotivationAssessment](/doc/resources/motivation_assessment) - Risks, vulnerabilities and findings
36
+ - [MotivationPrinciple](/doc/resources/motivation_principle) - Policies and principles
32
37
 
33
38
  ### Business Layer
34
39
 
35
- Resources representing business processes, actors, and products.
40
+ Resources representing business processes, actors, products, and the controls that guide processes.
36
41
 
37
42
  - [BusinessActor](/doc/resources/business_actor) - Teams and organizations
43
+ - [BusinessRole](/doc/resources/business_role) - Responsibilities that actors take on
38
44
  - [BusinessProcess](/doc/resources/business_process) - Structured business workflows
39
45
  - [BusinessProduct](/doc/resources/business_product) - Products offered to customers
40
- - [BusinessRequirement](/doc/resources/business_requirement) - Business and compliance requirements
41
- - [BusinessConstraint](/doc/resources/business_constraint) - Limitations and restrictions
46
+ - [BusinessControl](/doc/resources/business_control) - Controls that guide business processes
47
+ - [BusinessEvent](/doc/resources/business_event) - Threat events, loss events and triggers
42
48
 
43
49
  ### Strategy Layer
44
50
 
@@ -53,6 +59,7 @@ Resources representing application services, components, and interfaces.
53
59
  - [ApplicationService](/doc/resources/application_service) - High-level application services
54
60
  - [ApplicationComponent](/doc/resources/application_component) - Logical parts of services
55
61
  - [ApplicationInterface](/doc/resources/application_interface) - APIs and interfaces between components
62
+ - [ApplicationEvent](/doc/resources/application_event) - Threat events, loss events and triggers of applications
56
63
  - [DataObject](/doc/resources/data_object) - Data structures and schemas
57
64
 
58
65
  ### Technology Layer
@@ -62,9 +69,20 @@ Resources representing technology infrastructure and artifacts.
62
69
  - [TechnologyService](/doc/resources/technology_service) - Infrastructure services
63
70
  - [TechnologyArtifact](/doc/resources/technology_artifact) - Source code repositories
64
71
  - [TechnologyInterface](/doc/resources/technology_interface) - Technical interfaces
72
+ - [TechnologyEvent](/doc/resources/technology_event) - Infrastructure events, scan findings and outages
65
73
  - [TechnologySystemSoftware](/doc/resources/technology_system_software) - Logical infrastructure components
66
74
  - [TechnologyNode](/doc/resources/technology_node) - Physical infrastructure
67
75
 
76
+ ### Implementation & Migration Layer
77
+
78
+ Resources representing change: work, results, milestones and the states of the architecture between them.
79
+
80
+ - [ImplementationWorkPackage](/doc/resources/implementation_work_package) - Projects, measures and remediation
81
+ - [ImplementationDeliverable](/doc/resources/implementation_deliverable) - Results of work packages
82
+ - [ImplementationEvent](/doc/resources/implementation_event) - Milestones, go-lives and deadlines
83
+ - [ImplementationPlateau](/doc/resources/implementation_plateau) - Baseline, transition and target states
84
+ - [ImplementationGap](/doc/resources/implementation_gap) - Differences between plateaus
85
+
68
86
  ### Other
69
87
 
70
88
  - [ComplianceEvidence](/doc/resources/compliance_evidence) - Evidence for compliance requirements
data/docs/modeling.md CHANGED
@@ -18,6 +18,34 @@ Application Layer What software supports the business
18
18
  Technology Layer How software is built and deployed
19
19
  ```
20
20
 
21
+ ## Direction of Relations
22
+
23
+ Model and read the architecture **top-down**: Motivation, Strategy, Business, Application, Technology; the
24
+ Implementation & Migration layer describes change across all of them. A relation is written on an element and points
25
+ to what that element depends on, is served by, or is answered by. Following relations from a high-level element
26
+ therefore walks down to people, code and infrastructure, and the relations form a DAG: nothing may lead back to where
27
+ it started. `archsight lint` reports every cycle (only `dependsOn` is exempt, because components may depend on each
28
+ other at runtime).
29
+
30
+ There are two families of verbs:
31
+
32
+ | Family | Verbs | Written on | Points to |
33
+ |--------|-------|------------|-----------|
34
+ | Responsibility and provider (down) | `performedBy`, `ownedBy`, `executedBy`, `servedBy`, `guidedBy`, `maintainedBy`, `contributedBy`, `hasConcern`, `realizedThrough`, `exposes`, `mitigatedBy`, `influences`, `triggers`, `affects`, `assesses`, `contains`, `closedBy`, `compares` | the element that needs, uses or is concerned with something | what provides it or is responsible for it |
35
+ | Realization (up) | `realizes`, `partiallyRealizes`, `plans`, `satisfies`, `evidencedBy` (on the evidenced element), `provides` | the concrete element | the abstract element it answers to (requirement, goal, capability, plateau) |
36
+
37
+ Rules:
38
+
39
+ - A pair of kinds never has the same relation in both directions: a goal `realizes` a requirement, a requirement does not
40
+ `realize` a goal. Reverse relations are shown for free as incoming relations.
41
+ - Responsibility ends at the actor: process, control, risk, policy, work package point to a `BusinessRole`, the role
42
+ points to the `BusinessActor` that holds it, and the actor points to nothing further.
43
+ - The docs draw realization chains top-down ("Requirement, down to Service") while the data is stored on the concrete
44
+ element, so the file of a service says what it realizes.
45
+ - `mentions` and `depicts` are not part of this structure. They are derived from the text and diagrams of a resource
46
+ (never written in a file) and show how things are linked sideways, in prose and pictures. They neither follow nor
47
+ contradict the direction above and are left out of the cycle check.
48
+
21
49
  ## Starting Points
22
50
 
23
51
  ### Top-Down Modeling
@@ -52,6 +80,11 @@ Model **why** the architecture exists.
52
80
  | MotivationStakeholder | For roles that have interest in architecture outcomes (CTO, Security Team, Customers) |
53
81
  | MotivationGoal | For high-level objectives ("Achieve SOC 2 compliance", "Reduce latency") |
54
82
  | MotivationOutcome | For measurable results ("99.9% availability", "Sub-100ms response") |
83
+ | MotivationRequirement | For must-have capabilities (compliance, functional needs) |
84
+ | MotivationConstraint | For limitations (budget, regulations, technical debt) |
85
+ | MotivationDriver | For threats, opportunities, regulation and market forces that motivate action (`driver/type`) |
86
+ | MotivationAssessment | For risks, vulnerabilities, findings and supplier or protection-need analyses (`assessment/type`) |
87
+ | MotivationPrinciple | For policies, guidelines and architecture principles (`principle/type`) |
55
88
 
56
89
  **Example chain:** Stakeholder "Security Team" → hasConcern → Goal "Achieve Compliance" → realizes → Requirement "Encrypt data at rest"
57
90
 
@@ -62,12 +95,33 @@ Model **who** does **what** in business terms.
62
95
  | Resource | When to Use |
63
96
  |----------|-------------|
64
97
  | BusinessActor | For teams, departments, or organizations |
98
+ | BusinessRole | For responsibilities held by actors: control owner, risk owner, information security officer (`role/type`) |
65
99
  | BusinessProcess | For workflows that produce business value |
66
100
  | BusinessProduct | For offerings to customers (cloud services, APIs) |
67
- | BusinessRequirement | For must-have capabilities (compliance, functional needs) |
68
- | BusinessConstraint | For limitations (budget, regulations, technical debt) |
101
+ | BusinessControl | For controls that guide a process (access review, change approval), with an owner and executors |
102
+ | BusinessEvent | For things that happen in the business: threat events, loss events, incidents, triggers (`event/type`) |
103
+
104
+ **Example chain:** Process "Incident Response" → performedBy → Actor "Platform Team"; Process "Incident Response" → servedBy → Service "Monitoring"
105
+
106
+ **Roles:** Process "Incident Response" → performedBy → Role "Incident Manager" → performedBy → Actor "Platform Team". Controls, risks, policies and work packages use `ownedBy` (and controls `executedBy`) the same way. Use a role where the responsibility has a name of its own and should survive a change of team; pointing straight at an actor stays valid.
107
+
108
+ **Controls:** Process "Incident Response" → guidedBy → Control "Escalation Review" → ownedBy / executedBy → Role or Actor. How controls, requirements and evidence fit together is described under Relation Patterns below.
69
109
 
70
- **Example chain:** Actor "Platform Team" → performedBy → Process "Incident Response" → servedBy → Service "Monitoring"
110
+ ### Implementation & Migration Layer
111
+
112
+ Model **change**: what is done, what it delivers and how the architecture looks before and after.
113
+
114
+ | Resource | When to Use |
115
+ |----------|-------------|
116
+ | ImplementationWorkPackage | For projects, measures, remediation of risks and findings, audit programmes (`workpackage/type`, status, due date) |
117
+ | ImplementationDeliverable | For the results of work packages: documents, systems, process changes, evidence (`deliverable/type`) |
118
+ | ImplementationEvent | For milestones, go-lives and deadlines (`event/type`) |
119
+ | ImplementationPlateau | For a state of the architecture: baseline, transition, target (`plateau/type`) |
120
+ | ImplementationGap | For the difference between two plateaus (`gap/status`, `gap/impact`) |
121
+
122
+ **Migration path:** Plateau "Baseline" → triggers → Plateau "Target"; Gap → compares → both plateaus; Work Package → realizes → Deliverable → realizes → Plateau "Target"; Gap → closedBy → Work Package.
123
+
124
+ **Remediation:** Assessment "Risk" → mitigatedBy → Work Package → realizes → Deliverable (type `evidence`) → realizes → ComplianceEvidence. Group by `risk/domain` to see the plan of one domain, filter by `workpackage/status` and `workpackage/due` for what is open or late.
71
125
 
72
126
  ### Strategy Layer
73
127
 
@@ -114,7 +168,7 @@ Model **infrastructure** and **code**.
114
168
  Shows how abstract concepts become concrete:
115
169
 
116
170
  ```
117
- BusinessRequirement
171
+ MotivationRequirement
118
172
  ↓ realizes
119
173
  ApplicationService
120
174
  ↓ realizedThrough
@@ -135,12 +189,157 @@ TechnologyService
135
189
  TechnologySystemSoftware
136
190
  ```
137
191
 
192
+ ### Requirements, Controls and Evidence
193
+
194
+ A requirement is the point where the process side and the application side of compliance meet:
195
+
196
+ ```
197
+ Process side Application side
198
+
199
+ BusinessProcess ApplicationService / ApplicationComponent
200
+ ↓ guidedBy ↓ realizes / plans
201
+ BusinessControl ↓ evidencedBy
202
+ ↓ satisfies ComplianceEvidence
203
+ ↓ ↓ satisfies
204
+ └────────────→ MotivationRequirement ←────────┘
205
+ ```
206
+
207
+ | Kind | Answers | Key relations |
208
+ |------|---------|---------------|
209
+ | MotivationRequirement | What must hold? | satisfied by controls and evidence; realized or planned by applications |
210
+ | BusinessControl | What do we do about it, who does it, how often? | a process is `guidedBy` it; `ownedBy` and `executedBy` actors; `satisfies` requirements; `evidencedBy` evidence |
211
+ | ComplianceEvidence | How is it met, how can it be shown? | `satisfies` requirements; `evidencedBy` from an application, a technology element or a control |
212
+
213
+ How to model it:
214
+
215
+ - **Process side.** Model a control once, let every process it governs point to it with `guidedBy`, and link it with `satisfies` to each requirement it addresses. Give it an owner (the accountable actor) and executors (the actors carrying it out). The `control/status` and `control/frequency` filters find, for example, the controls that are only partially implemented.
216
+ - **Application side.** Whether an application implements a requirement is stated on the application (`realizes`, `plans`, `evidencedBy`), never on the control. Evidence is per resource and requirement: it says how *this* service or component meets *that* requirement.
217
+ - **Evidence of a control.** A control can be `evidencedBy` evidence too. Use it for the records the control itself produces (reviews, diagrams, change history, audit logs) and set `evidence/type` to `process`, `documentation` or `audit-log`. Evidence that an application meets a requirement is linked from the application, not from a control.
218
+ - **Reading it back.** A requirement's page lists its controls and evidence as incoming `satisfies` relations. The "Requirements" table of an application page and the `requirements` blocks list what applications implement (`realizes`, `partiallyRealizes`, `plans`); controls are not part of that table.
219
+
220
+ ```yaml
221
+ # process side
222
+ kind: BusinessProcess
223
+ metadata: { name: Process:ChangeManagement }
224
+ spec:
225
+ guidedBy:
226
+ businessControls: [Control:ChangeApproval]
227
+ ---
228
+ kind: BusinessControl
229
+ metadata: { name: Control:ChangeApproval }
230
+ spec:
231
+ ownedBy: { businessActors: [Team:Management] }
232
+ executedBy: { businessActors: [Team:Operations] }
233
+ satisfies: { motivationRequirements: [Requirement:ChangeTraceability] }
234
+ ---
235
+ # application side
236
+ kind: ApplicationService
237
+ metadata: { name: Deployment }
238
+ spec:
239
+ realizes: { motivationRequirements: [Requirement:ChangeTraceability] }
240
+ evidencedBy: { complianceEvidences: [Evidence:DeploymentAuditLog] }
241
+ ```
242
+
243
+ ### Security and Risk
244
+
245
+ Security and risk are modelled with the elements above, following the risk and security overlay of the Open Group
246
+ white paper [Modeling Enterprise Risk Management and Security with the ArchiMate Language](#reference). There is no
247
+ separate security layer: a concept is an ordinary element that carries a **type** (a specialization, the paper's
248
+ "stereotype") plus profile annotations. The type is a filterable annotation, so views, queries and lists can group by it.
249
+
250
+ | Security concept | Kind | Type annotation | Notes |
251
+ |------------------|------|-----------------|-------|
252
+ | Threat (circumstance) | `MotivationDriver` | `driver/type: threat` | also opportunity, regulation, market |
253
+ | Threat agent | `BusinessActor`, `ApplicationComponent`, `TechnologyNode` | none | the `causedBy` of an event |
254
+ | Threat event | `BusinessEvent`, `ApplicationEvent`, `TechnologyEvent` | `event/type: threat-event` or `attack` | `attack` = intentional |
255
+ | Loss event, incident | the three event kinds | `event/type: loss-event` or `incident` | the layer says where it happens |
256
+ | Risk | `MotivationAssessment` | `assessment/type: risk` | initial and residual profile, `risk/treatment` |
257
+ | Vulnerability | `MotivationAssessment` | `assessment/type: vulnerability` | `assesses` the assets it is found on |
258
+ | Control objective | `MotivationGoal` | `goal/type: control-objective` | the risk is `mitigatedBy` it |
259
+ | Control measure | `MotivationRequirement` | `requirement/type: control-measure` | a goal `realizes` it; the risk can be `mitigatedBy` it |
260
+ | Control implementation | `BusinessControl`, applications, nodes, processes | none | `satisfies` / `realizes` the measure |
261
+ | Proof of the control | `ComplianceEvidence` | `evidence/type` | `evidence/status: not-applicable` where the requirement does not apply |
262
+ | Asset at risk | any application, technology, data or process kind | `asset/value`, `asset/confidentiality`, `asset/integrity`, `asset/availability` | the protection need (BSI Schutzbedarf) |
263
+ | Policy (design level) | `MotivationPrinciple` | `principle/type: security-policy` or `risk-policy` | status, validity, framework mapping |
264
+ | Operational policy, regulation | `MotivationConstraint` | none | the paper has no element for operational policy |
265
+ | Risk domain | none; annotation `risk/domain` | `risk/domain`, `risk/category` | group by it with a query or a `View` |
266
+
267
+ The chain, as in the paper's Coldhard Steel example:
268
+
269
+ ```
270
+ MotivationDriver (threat) ──influences──→ MotivationAssessment (risk) ──mitigatedBy──→ MotivationGoal (control objective)
271
+ │ triggers │ assesses │ realizes
272
+ ↓ ↓ ↓
273
+ BusinessEvent (loss event) ←──influences── MotivationAssessment (vulnerability) MotivationRequirement (control measure)
274
+ ↑ triggers ↑ satisfies / realizes
275
+ TechnologyEvent / ApplicationEvent (threat event, attack) BusinessControl / asset ──evidencedBy──→ ComplianceEvidence
276
+ ```
277
+
278
+ ```yaml
279
+ kind: MotivationDriver
280
+ metadata: { name: Threat:Intrusion, annotations: { driver/type: threat } }
281
+ spec:
282
+ influences: { motivationAssessments: [Risk:Intrusion] }
283
+ triggers: { businessEvents: [Loss:DataLeak] }
284
+ ---
285
+ kind: MotivationAssessment
286
+ metadata:
287
+ name: Risk:Intrusion
288
+ annotations:
289
+ assessment/type: risk
290
+ risk/initial-likelihood: high
291
+ risk/residual-likelihood: low
292
+ risk/treatment: mitigate
293
+ risk/domain: customer-data
294
+ spec:
295
+ ownedBy: { businessRoles: [Role:RiskOwner] }
296
+ assesses: { technologyNodes: [Node:Web1] }
297
+ mitigatedBy: { goals: [Objective:ReduceExposure], businessControls: [Control:FirewallReview] }
298
+ ---
299
+ kind: MotivationGoal
300
+ metadata: { name: Objective:ReduceExposure, annotations: { goal/type: control-objective } }
301
+ spec:
302
+ realizes: { motivationRequirements: [Measure:Firewall] }
303
+ ---
304
+ kind: MotivationRequirement
305
+ metadata: { name: Measure:Firewall, annotations: { requirement/type: control-measure } }
306
+ spec: {}
307
+ ---
308
+ kind: BusinessControl
309
+ metadata: { name: Control:FirewallReview }
310
+ spec:
311
+ ownedBy: { businessRoles: [Role:ControlOwner] }
312
+ satisfies: { motivationRequirements: [Measure:Firewall] }
313
+ ```
314
+
315
+ How to model it:
316
+
317
+ - **Events and their types.** A threat event `triggers` a loss event; the three event kinds (business, application,
318
+ technology) say on which level it happens and a technology event may trigger an application or business event. Use
319
+ `event/type` to tell threat events, attacks, loss events, incidents, opportunity events, audits, scans and changes apart.
320
+ - **Vulnerability scan.** One `MotivationAssessment` of type `vulnerability` per finding, `assesses` every node it was
321
+ found on, `influences` the loss events and risks it makes possible. Business impact follows from the model: the node
322
+ serves services, services serve processes.
323
+ - **Grouping (risk domains).** ArchiMate has no domain element; set `risk/domain` (and `risk/category`: hazard,
324
+ financial, operational, strategic, compliance, security) on events, assessments, drivers, requirements, controls and
325
+ assets, and query or build a `View` per domain to see its threats, risks, measures and assets together.
326
+ - **Policies.** The text of a policy is a `Page`; the structured statement (owner, validity, status, framework) is a
327
+ `MotivationPrinciple` that links to the page with `[[Page]]`.
328
+ - **Initial and residual risk.** Record both on the assessment (`risk/initial-*`, `risk/residual-*`) and the decision
329
+ in `risk/treatment`.
330
+
331
+ <a id="reference"></a>
332
+ **Reference:** Band, Engelsman, Feltus, González Paredes, Hietala, Jonkers, Massart,
333
+ [Modeling Enterprise Risk Management and Security with the ArchiMate Language](https://pure.unamur.be/ws/files/12366722/Modeling_Enterprise_Risk_Management_and_Secutity_with_the_ArchiMate_Language.pdf),
334
+ The Open Group white paper (ArchiMate 2.1). For the NIST OSCAL vocabulary used for names of assessment and evidence
335
+ fields see [OSCAL](https://pages.nist.gov/OSCAL/learn/concepts/layer/).
336
+
138
337
  ### Compliance Chain
139
338
 
140
339
  Shows how requirements are satisfied:
141
340
 
142
341
  ```
143
- BusinessRequirement
342
+ MotivationRequirement
144
343
  ↑ satisfies
145
344
  ComplianceEvidence
146
345
  ↑ evidencedBy
@@ -151,6 +350,44 @@ Technology elements such as a Kubernetes cluster runtime can plan, realize and b
151
350
  for requirements directly, so the requirement does not have to be attached to a placeholder
152
351
  ApplicationService. Applications deployed on them point to the TechnologyService with `servedBy`.
153
352
 
353
+ ApplicationComponents can be evidenced as well (`realizes` / `plans motivationRequirements`, `evidencedBy
354
+ complianceEvidences`), so requirements can be answered per component and not only per service.
355
+
356
+ A ComplianceEvidence answers "how is the requirement met" in structured markdown fields next to
357
+ `architecture/description` (kept as a short summary): `evidence/mechanism`, `evidence/coverage`,
358
+ `evidence/operatorView` (does it hold against operators or only against other tenants),
359
+ `evidence/verification`, `evidence/gaps` and `evidence/sources`. Because they are separate annotations they can be
360
+ queried, for example `ComplianceEvidence: evidence/gaps =~ "needs review"`.
361
+
362
+ ### Derived References
363
+
364
+ Text and diagrams already say which resources they are about, so archsight turns that into relations instead of asking you
365
+ to repeat it in YAML. There are two, and they are never written in a file:
366
+
367
+ | Relation | Comes from | Where |
368
+ |----------|------------|-------|
369
+ | `mentions` | `[[Target]]`, `[[Kind/Name]]` links and `![[View/Name]]` embeds | the content of a page, the description of any resource, any markdown annotation |
370
+ | `depicts` | the `resource "..."` of the nodes of a diagram | ```` ```asd ```` blocks and `![](file.asd)` files in those texts, and the `architecture/diagram` of any resource |
371
+
372
+ ```
373
+ Page "Architecture overview" --mentions--> ApplicationComponent "Core:Database" ([[Core:Database]])
374
+ Page "Architecture overview" --depicts---> ApplicationComponent "Web:API" (resource "Web:API" in a diagram)
375
+ ```
376
+
377
+ They are rebuilt on every load, so they cannot drift from the text. They show on both sides: a resource lists the pages
378
+ that mention and depict it under Relations ("Page / mentions"), and a page lists what it refers to. Only an exact name counts: a
379
+ page by its name or title, `Kind/Name`, or a resource name that exists once. Part of a name, a name that exists in several
380
+ kinds, and an unknown name do not make a relation (`archsight lint` reports unknown links in pages). Links in code are shown as
381
+ written and do not count, and neither does a resource referring to itself. Views and requirements blocks pick resources with a
382
+ query when they run, so they name nothing.
383
+
384
+ Derived relations are followed like written ones: queries (`ApplicationComponent: <- Page`, `Page: -> ApplicationComponent`),
385
+ transitive queries and impact analysis. A page that mentions a component therefore shows up when you ask what a change to the
386
+ component affects, which tells you which pages to update, and a resource that only a page mentions is not an orphan
387
+ (`<- none`). To leave them out of a query, exclude the verbs: `ApplicationComponent: ~{!mentions,depicts}> TechnologyArtifact`.
388
+ Computed annotations (costs, teams, repositories) follow written relations only, so a link in a text never changes a number.
389
+ They are not part of the editor's relation form, and `mentions:` or `depicts:` in a file is an unknown verb.
390
+
154
391
  ## Annotation Best Practices
155
392
 
156
393
  Use annotations to capture metadata:
@@ -194,7 +431,7 @@ relations:
194
431
  ### Compliance Mapping
195
432
 
196
433
  ```yaml
197
- kind: BusinessRequirement
434
+ kind: MotivationRequirement
198
435
  name: DataEncryption
199
436
  annotations:
200
437
  requirement/reference: c5-2020, gdpr-2018
@@ -204,3 +441,28 @@ relations:
204
441
  outcomes:
205
442
  - DataProtection
206
443
  ```
444
+
445
+ ## Renamed Kinds
446
+
447
+ Requirements and constraints are Motivation elements in ArchiMate, so their kinds are named that way:
448
+
449
+ | Old | New |
450
+ |-----|-----|
451
+ | `BusinessRequirement` | `MotivationRequirement` |
452
+ | `BusinessConstraint` | `MotivationConstraint` |
453
+ | relation key `businessRequirements` | `motivationRequirements` |
454
+ | relation key `businessConstraints` | `motivationConstraints` |
455
+
456
+ Both kinds moved from the Business to the Motivation layer. Their annotations (`requirement/*`) are unchanged.
457
+
458
+ For now the old names keep working: files with `kind: BusinessRequirement` or `businessRequirements:` keys load as they are, queries such as `BusinessRequirement: requirement/priority == "must"` and `~> BusinessRequirement` still match, and old links to `/kinds/BusinessRequirement/...` still open. Everything shown (the UI, the API, files written by the inline editor) uses the new names.
459
+
460
+ `archsight lint` lists every use of an old name as a deprecation, with the file and line, without failing. Replace them, for example with a find and replace over your resources directory (YAML files and the queries in markdown pages):
461
+
462
+ ```bash
463
+ find resources \( -name '*.yaml' -o -name '*.md' \) -exec sed -i.bak \
464
+ -e 's/BusinessRequirement/MotivationRequirement/g' -e 's/BusinessConstraint/MotivationConstraint/g' \
465
+ -e 's/businessRequirements/motivationRequirements/g' -e 's/businessConstraints/motivationConstraints/g' {} +
466
+ ```
467
+
468
+ The old names will be removed in a future release.
data/docs/pages.md CHANGED
@@ -171,14 +171,14 @@ It loads and runs in the browser like any embed; the server only writes `<div cl
171
171
  data-fields data-sort data-type>` around the source. A block that is not a valid View (broken YAML, missing or
172
172
  unparsable query, unknown `view/*` key or type) shows an error box with the source, and `archsight lint` reports it.
173
173
 
174
- ### Business requirements of a selection of resources
174
+ ### Requirements of a selection of resources
175
175
 
176
- The "Business Requirements" table of an instance page (the requirements it `realizes`, `partiallyRealizes` or `plans`,
176
+ The "Requirements" table of an instance page (the requirements it `realizes`, `partiallyRealizes` or `plans`,
177
177
  with status, priority and story) can be put on a page for any selection of resources with a ```` ```requirements ```` block:
178
178
 
179
179
  ````markdown
180
180
  ```requirements
181
- title: Requirements of the backup services # optional, default "Business Requirements"
181
+ title: Requirements of the backup services # optional, default "Requirements"
182
182
  of: 'ApplicationService: name =~ "Backup"' # required: query selecting the resources
183
183
  priority: must # optional: must, should, may (one value or a list)
184
184
  status: [implemented, partial] # optional: implemented, partial, planned
@@ -193,6 +193,15 @@ data-status>` around the source): the frontend loads the rows from `GET /api/v1/
193
193
  never runs the query. A block with a missing or unparsable `of`, an unknown key, priority or status shows an error box with the
194
194
  source, and `archsight lint` reports it.
195
195
 
196
+ ## What a page refers to
197
+
198
+ What a page says about the architecture becomes relations without anything to write: `[[Core:Database]]` or `[[Kind/Name]]` in the
199
+ text makes the page `mention` that resource, and a resource in a diagram of the page (an ```` ```asd ```` block or an embedded
200
+ `.asd` file) makes the page `depict` it. The resource then lists the page under Relations, and the page lists the resource, so you
201
+ can see which pages talk about a component, and which pages to review when it changes (impact analysis includes them). Only exact
202
+ names count and links in code are ignored. The same applies to the description and the diagram of every other resource. See
203
+ [Derived references](modeling.md#derived-references).
204
+
196
205
  ## Macros
197
206
 
198
207
  Inline macros are written `{name:arguments}` and named like the macros of Confluence. They work inside a sentence, a
data/docs/search.md CHANGED
@@ -121,7 +121,7 @@ Examples:
121
121
  -> ApplicationInterface # exposes an interface
122
122
  -> "Kubernetes:RestAPI" # exposes specific interface
123
123
  <- ApplicationComponent # referenced by a component
124
- ~> BusinessRequirement # transitively reaches requirement
124
+ ~> MotivationRequirement # transitively reaches requirement
125
125
  -> none & <- none # orphan (no relations)
126
126
  TechnologyArtifact: <- none # unreferenced artifacts
127
127
 
@@ -175,6 +175,13 @@ Examples:
175
175
  # Find artifacts with NO maintainedBy relations
176
176
  TechnologyArtifact: -{maintainedBy}> none
177
177
 
178
+ # Pages that mention a component, and the components they depict
179
+ ApplicationComponent: <{mentions}- Page
180
+ Page: -{depicts}> ApplicationComponent
181
+
182
+ # Leave the derived relations (links in text, nodes of diagrams) out of a traversal
183
+ ApplicationComponent: ~{!mentions,depicts}> TechnologyArtifact
184
+
178
185
  ## Sub-Query Targets
179
186
 
180
187
  Use `$(expression)` to dynamically find relation targets based on a query:
@@ -249,7 +256,7 @@ Large Go codebases:
249
256
 
250
257
  Resources with compliance chain:
251
258
 
252
- ~> BusinessRequirement
259
+ ~> MotivationRequirement
253
260
 
254
261
  Complex query with grouping:
255
262
 
data/docs/togaf.md CHANGED
@@ -122,7 +122,14 @@ The metamodel defines architectural entities and their relationships across all
122
122
 
123
123
  **Cross-Cutting:**
124
124
 
125
- - **Principle**, **Constraint**, **Requirement**, **Gap**, **Work Package**, **Location**
125
+ - **Principle**, **Constraint**, **Requirement**, **Location**
126
+ - **Gap**, **Work Package**, **Deliverable**, **Plateau**, **Implementation Event**: the Implementation & Migration layer (`ImplementationGap`, `ImplementationWorkPackage`, `ImplementationDeliverable`, `ImplementationPlateau`, `ImplementationEvent`)
127
+
128
+ **Governance:**
129
+
130
+ - **Control**: a decision-making step with accountability and authority, applied to a process or function. ArchiMate has no element for it; Archsight models it as `BusinessControl`, which a `BusinessProcess` is `guidedBy`
131
+
132
+ **Risk and security:** the Open Group overlay (*Modeling Enterprise Risk Management and Security with the ArchiMate Language*) maps threats to **Driver** (`MotivationDriver`), threat and loss events to **Business/Application/Technology Event**, risks and vulnerabilities to **Assessment** (`MotivationAssessment`), control objectives to **Goal**, control measures to **Requirement** and policies to **Principle** (`MotivationPrinciple`), each with a type annotation. See [Modeling Guide](modeling.md#security-and-risk). How relations are directed (top-down, DAG) is described under [Direction of Relations](modeling.md#direction-of-relations).
126
133
 
127
134
  ### Critical Relationships
128
135
 
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Asset module adds the asset profile of an asset at risk: its value and its protection need (BSI "Schutzbedarf")
4
+ module Archsight::Annotations::Asset
5
+ NEED = %w[normal high very-high].freeze
6
+
7
+ def self.included(base)
8
+ base.class_eval do
9
+ annotation "asset/value",
10
+ description: "Value of the asset to the organization",
11
+ title: "Asset value",
12
+ enum: %w[low medium high critical],
13
+ filter: :word
14
+
15
+ annotation "asset/confidentiality",
16
+ description: "Protection need for confidentiality",
17
+ title: "Confidentiality need",
18
+ enum: Archsight::Annotations::Asset::NEED,
19
+ filter: :word
20
+
21
+ annotation "asset/integrity",
22
+ description: "Protection need for integrity",
23
+ title: "Integrity need",
24
+ enum: Archsight::Annotations::Asset::NEED,
25
+ filter: :word
26
+
27
+ annotation "asset/availability",
28
+ description: "Protection need for availability",
29
+ title: "Availability need",
30
+ enum: Archsight::Annotations::Asset::NEED,
31
+ filter: :word
32
+ end
33
+ end
34
+ end