@memoarchitect/ontology 0.6.5 → 0.8.22

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 (394) hide show
  1. package/README.md +4 -2
  2. package/examples/connected-patient-monitor/model/catalog/connected_patient_monitor.sysml +1 -1
  3. package/examples/connected-patient-monitor/model/catalog/project.sysml +24 -0
  4. package/examples/connected-patient-monitor/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  5. package/examples/connected-patient-monitor/model/{viewpoints → catalog/viewpoints/unassigned/views}/connected_patient_monitor_overview.sysml +1 -1
  6. package/examples/embedded-infusion-pump/model/catalog/embedded_infusion_pump.sysml +7 -5
  7. package/examples/embedded-infusion-pump/model/catalog/project.sysml +24 -0
  8. package/examples/embedded-infusion-pump/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  9. package/examples/embedded-infusion-pump/model/{viewpoints → catalog/viewpoints/unassigned/views}/embedded_infusion_pump_overview.sysml +1 -1
  10. package/examples/functional-logical-physical/model/catalog/functional_logical_physical.sysml +5 -5
  11. package/examples/functional-logical-physical/model/catalog/project.sysml +24 -0
  12. package/examples/functional-logical-physical/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  13. package/examples/functional-logical-physical/model/{viewpoints → catalog/viewpoints/unassigned/views}/functional_logical_physical_overview.sysml +1 -1
  14. package/examples/gpca-pump/methodology/gpca_methodology.sysml +7 -8
  15. package/examples/gpca-pump/methodology/gpca_profiles.sysml +89 -11
  16. package/examples/gpca-pump/model/catalog/gpca_analysis.sysml +19 -9
  17. package/examples/gpca-pump/model/catalog/gpca_architecture.sysml +342 -100
  18. package/examples/gpca-pump/model/catalog/gpca_behavior_actions.sysml +27 -13
  19. package/examples/gpca-pump/model/catalog/gpca_behavior_modes.sysml +329 -272
  20. package/examples/gpca-pump/model/catalog/gpca_behavior_subsystems.sysml +57 -16
  21. package/examples/gpca-pump/model/catalog/gpca_context.sysml +12 -8
  22. package/examples/gpca-pump/model/catalog/gpca_cybersecurity.sysml +14 -10
  23. package/examples/gpca-pump/model/catalog/gpca_formal_behavior.sysml +1 -15
  24. package/examples/gpca-pump/model/catalog/gpca_interfaces.sysml +181 -264
  25. package/examples/gpca-pump/model/catalog/gpca_operational.sysml +95 -60
  26. package/examples/gpca-pump/model/catalog/gpca_physical.sysml +6 -11
  27. package/examples/gpca-pump/model/catalog/gpca_requirements.sysml +102 -101
  28. package/examples/gpca-pump/model/catalog/gpca_risk.sysml +1 -1
  29. package/examples/gpca-pump/model/catalog/gpca_standards.sysml +161 -0
  30. package/examples/gpca-pump/model/catalog/gpca_system.sysml +47 -30
  31. package/examples/gpca-pump/model/catalog/gpca_trace.sysml +301 -354
  32. package/examples/gpca-pump/model/catalog/gpca_verification.sysml +116 -36
  33. package/examples/gpca-pump/model/catalog/project.sysml +26 -0
  34. package/examples/gpca-pump/model/catalog/viewpoints/context/viewpoint.sysml +8 -0
  35. package/examples/gpca-pump/model/{views → catalog/viewpoints/context/views}/context_system_context_view.sysml +4 -4
  36. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/viewpoint.sysml +8 -0
  37. package/examples/gpca-pump/model/{views → catalog/viewpoints/cybersecurity/views}/cybersecurity_cybersecurity_view.sysml +4 -4
  38. package/examples/gpca-pump/model/{views → catalog/viewpoints/cybersecurity/views}/document_cyber_assessment_view.sysml +4 -4
  39. package/examples/gpca-pump/model/{views → catalog/viewpoints/cybersecurity/views}/document_threat_model_view.sysml +5 -5
  40. package/examples/gpca-pump/model/catalog/viewpoints/functional/viewpoint.sysml +8 -0
  41. package/examples/gpca-pump/model/{views → catalog/viewpoints/functional/views}/functional_function_allocation_view.sysml +2 -2
  42. package/examples/gpca-pump/model/{views → catalog/viewpoints/functional/views}/functional_function_browser_view.sysml +3 -3
  43. package/examples/gpca-pump/model/catalog/viewpoints/logical/viewpoint.sysml +8 -0
  44. package/examples/gpca-pump/model/{views → catalog/viewpoints/logical/views}/behavior_action_flow_view.sysml +3 -3
  45. package/examples/gpca-pump/model/{views → catalog/viewpoints/logical/views}/document_architecture_description_view.sysml +8 -8
  46. package/examples/gpca-pump/model/{views → catalog/viewpoints/logical/views}/logical_device_interconnect_view.sysml +5 -5
  47. package/examples/gpca-pump/model/{views → catalog/viewpoints/logical/views}/logical_logical_architecture_view.sysml +3 -3
  48. package/examples/gpca-pump/model/{views → catalog/viewpoints/logical/views}/logical_mode_state_view.sysml +4 -4
  49. package/examples/gpca-pump/model/{views → catalog/viewpoints/logical/views}/logical_system_decomposition_view.sysml +3 -3
  50. package/examples/gpca-pump/model/catalog/viewpoints/operational/viewpoint.sysml +8 -0
  51. package/examples/gpca-pump/model/{views → catalog/viewpoints/operational/views}/operational_scenario_sequence_view.sysml +3 -3
  52. package/examples/gpca-pump/model/{views → catalog/viewpoints/operational/views}/operational_use_case_view.sysml +4 -4
  53. package/examples/gpca-pump/model/catalog/viewpoints/physical/viewpoint.sysml +8 -0
  54. package/examples/gpca-pump/model/{views → catalog/viewpoints/physical/views}/physical_physical_bom_view.sysml +2 -2
  55. package/examples/gpca-pump/model/catalog/viewpoints/requirements/viewpoint.sysml +8 -0
  56. package/examples/gpca-pump/model/{views → catalog/viewpoints/requirements/views}/document_dhf_index_view.sysml +8 -8
  57. package/examples/gpca-pump/model/{views → catalog/viewpoints/requirements/views}/requirements_requirements_trace_view.sysml +2 -2
  58. package/examples/gpca-pump/model/catalog/viewpoints/risk/viewpoint.sysml +8 -0
  59. package/examples/gpca-pump/model/{views → catalog/viewpoints/risk/views}/document_hazard_analysis_view.sysml +8 -5
  60. package/examples/gpca-pump/model/{views → catalog/viewpoints/risk/views}/document_rmf_view.sysml +7 -5
  61. package/examples/gpca-pump/model/{views → catalog/viewpoints/risk/views}/risk_fmea_view.sysml +3 -3
  62. package/examples/gpca-pump/model/{views → catalog/viewpoints/risk/views}/risk_risk_chain_view.sysml +3 -3
  63. package/examples/gpca-pump/model/catalog/viewpoints/software/viewpoint.sysml +8 -0
  64. package/examples/gpca-pump/model/{views → catalog/viewpoints/software/views}/document_sdd_view.sysml +4 -4
  65. package/examples/gpca-pump/model/{views → catalog/viewpoints/software/views}/software_software_architecture_view.sysml +5 -5
  66. package/examples/gpca-pump/model/catalog/viewpoints/usability/viewpoint.sysml +8 -0
  67. package/examples/gpca-pump/model/{views → catalog/viewpoints/usability/views}/document_usability_view.sysml +8 -6
  68. package/examples/gpca-pump/model/catalog/viewpoints/verification/viewpoint.sysml +8 -0
  69. package/examples/gpca-pump/model/{views → catalog/viewpoints/verification/views}/document_vv_view.sysml +7 -5
  70. package/examples/gpca-pump/model/{views → catalog/viewpoints/verification/views}/verification_verification_coverage_view.sysml +3 -3
  71. package/examples/ivd-laboratory-system/model/catalog/project.sysml +24 -0
  72. package/examples/ivd-laboratory-system/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  73. package/examples/ivd-laboratory-system/model/{viewpoints → catalog/viewpoints/unassigned/views}/ivd_laboratory_system_overview.sysml +1 -1
  74. package/examples/manual-surgical-instrument/model/catalog/manual_surgical_instrument.sysml +4 -2
  75. package/examples/manual-surgical-instrument/model/catalog/project.sysml +24 -0
  76. package/examples/manual-surgical-instrument/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  77. package/examples/manual-surgical-instrument/model/{viewpoints → catalog/viewpoints/unassigned/views}/manual_surgical_instrument_overview.sysml +1 -1
  78. package/examples/multidimensional-layers/model/catalog/multidimensional_layers.sysml +6 -2
  79. package/examples/multidimensional-layers/model/catalog/project.sysml +24 -0
  80. package/examples/multidimensional-layers/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  81. package/examples/multidimensional-layers/model/{viewpoints → catalog/viewpoints/unassigned/views}/multidimensional_layers_overview.sysml +1 -1
  82. package/examples/nested-architecture-dsm/README.md +49 -0
  83. package/examples/nested-architecture-dsm/model/catalog/architecture/functional/functions.sysml +179 -0
  84. package/examples/nested-architecture-dsm/model/catalog/architecture/logical/structure.sysml +165 -0
  85. package/examples/nested-architecture-dsm/model/catalog/assurance/requirements/needs.sysml +53 -0
  86. package/examples/nested-architecture-dsm/model/catalog/assurance/requirements/requirements.sysml +89 -0
  87. package/examples/nested-architecture-dsm/model/catalog/assurance/verification_validation/verification_validation.sysml +113 -0
  88. package/examples/nested-architecture-dsm/model/catalog/project.sysml +28 -0
  89. package/examples/nested-architecture-dsm/model/catalog/traces.sysml +48 -0
  90. package/examples/reusable-instrument/model/catalog/project.sysml +24 -0
  91. package/examples/reusable-instrument/model/catalog/reusable_instrument.sysml +11 -8
  92. package/examples/reusable-instrument/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  93. package/examples/reusable-instrument/model/{viewpoints → catalog/viewpoints/unassigned/views}/reusable_instrument_overview.sysml +1 -1
  94. package/examples/ros-mobile-robot/README.md +40 -0
  95. package/examples/ros-mobile-robot/model/catalog/project.sysml +33 -0
  96. package/examples/ros-mobile-robot/model/catalog/ros_mobile_robot.sysml +296 -0
  97. package/examples/ros-mobile-robot/model/catalog/viewpoints/unassigned/viewpoint.sysml +7 -0
  98. package/examples/ros-mobile-robot/model/catalog/viewpoints/unassigned/views/ros_mobile_robot_overview.sysml +13 -0
  99. package/examples/software-only-medical-device/model/catalog/project.sysml +28 -0
  100. package/examples/software-only-medical-device/model/catalog/software_only_medical_device.sysml +11 -5
  101. package/examples/software-only-medical-device/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  102. package/examples/software-only-medical-device/model/{viewpoints → catalog/viewpoints/unassigned/views}/software_only_medical_device_overview.sysml +1 -1
  103. package/examples/surgical-closure-workflow/model/catalog/project.sysml +24 -0
  104. package/examples/surgical-closure-workflow/model/catalog/surgical_closure_workflow.sysml +57 -57
  105. package/examples/surgical-closure-workflow/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  106. package/examples/surgical-closure-workflow/model/{viewpoints → catalog/viewpoints/unassigned/views}/surgical_closure_workflow_overview.sysml +1 -1
  107. package/examples/surgical-robot/model/catalog/project.sysml +24 -0
  108. package/examples/surgical-robot/model/catalog/surgical_robot.sysml +6 -4
  109. package/examples/surgical-robot/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  110. package/examples/surgical-robot/model/{viewpoints → catalog/viewpoints/unassigned/views}/surgical_robot_overview.sysml +1 -1
  111. package/examples/sysml-diagram-samples/README.md +7 -0
  112. package/examples/sysml-diagram-samples/dhf/documents/DOC-HAR-001.md +11 -0
  113. package/examples/sysml-diagram-samples/memo.package.yaml +11 -5
  114. package/examples/sysml-diagram-samples/model/catalog/project.sysml +33 -0
  115. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  116. package/examples/sysml-diagram-samples/model/{samples → catalog/viewpoints/unassigned/views}/action_flow_view.sysml +23 -20
  117. package/examples/sysml-diagram-samples/model/{samples → catalog/viewpoints/unassigned/views}/context_view.sysml +11 -11
  118. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.viewlayout +47 -0
  119. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/functional_flow_view.sysml +143 -0
  120. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.sysml +87 -0
  121. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.viewlayout +94 -0
  122. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.sysml +109 -0
  123. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.viewlayout +13 -0
  124. package/examples/sysml-diagram-samples/model/{samples → catalog/viewpoints/unassigned/views}/requirements_view.sysml +6 -7
  125. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/standard_activity_view.sysml +33 -0
  126. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/state_transition_view.sysml +80 -0
  127. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/tree_view.sysml +48 -0
  128. package/examples/sysml-diagram-samples/model/{samples → catalog/viewpoints/unassigned/views}/use_case_view.sysml +15 -9
  129. package/examples/sysml-diagram-samples/model/sysml_v2_activity_example.sysml +93 -0
  130. package/examples/temperature-alarm/model/catalog/project.sysml +24 -0
  131. package/examples/temperature-alarm/model/catalog/temperature_alarm.sysml +29 -21
  132. package/examples/temperature-alarm/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  133. package/examples/temperature-alarm/model/{viewpoints → catalog/viewpoints/unassigned/views}/temperature_alarm_overview.sysml +1 -1
  134. package/examples/ui-screen-regions/README.md +117 -0
  135. package/examples/ui-screen-regions/model/catalog/architecture/functional/functions.sysml +84 -0
  136. package/examples/ui-screen-regions/model/catalog/architecture/implementation/ui.sysml +212 -0
  137. package/examples/ui-screen-regions/model/catalog/artifacts/assets/catalog.sysml +61 -0
  138. package/examples/ui-screen-regions/model/catalog/artifacts/assets/screen-captures/drugSelectorRegion/drug-selector-expanded-2.4.1.png +0 -0
  139. package/examples/ui-screen-regions/model/catalog/artifacts/assets/screen-captures/mainScreenLayout/main-screen-2.4.1.png +0 -0
  140. package/examples/ui-screen-regions/model/catalog/artifacts/assets/screen-captures/settingsScreenLayout/settings-screen-2.4.1.png +0 -0
  141. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/comments.sysml +51 -0
  142. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/notes.sysml +27 -0
  143. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/rationales.sysml +27 -0
  144. package/examples/ui-screen-regions/model/catalog/assurance/human_factors/human_factors.sysml +59 -0
  145. package/examples/ui-screen-regions/model/catalog/assurance/requirements/needs.sysml +25 -0
  146. package/examples/ui-screen-regions/model/catalog/assurance/requirements/requirements.sysml +178 -0
  147. package/examples/ui-screen-regions/model/catalog/assurance/safety_risk/risk.sysml +93 -0
  148. package/examples/ui-screen-regions/model/catalog/assurance/verification_validation/verification_validation.sysml +75 -0
  149. package/examples/ui-screen-regions/model/catalog/project.sysml +45 -0
  150. package/examples/ui-screen-regions/model/catalog/relationships.sysml +8 -0
  151. package/examples/ui-screen-regions/model/catalog/traces.sysml +179 -0
  152. package/examples/ui-screen-regions/model/catalog/viewpoints/functional/viewpoint.sysml +8 -0
  153. package/examples/ui-screen-regions/model/catalog/viewpoints/functional/views/ui_functional_tree.sysml +62 -0
  154. package/examples/ui-screen-regions/model/catalog/viewpoints/requirements/viewpoint.sysml +8 -0
  155. package/examples/ui-screen-regions/model/catalog/viewpoints/requirements/views/ui_requirements_trace.sysml +62 -0
  156. package/examples/ui-screen-regions/model/catalog/viewpoints/risk/viewpoint.sysml +8 -0
  157. package/examples/ui-screen-regions/model/catalog/viewpoints/risk/views/ui_risk_chain.sysml +62 -0
  158. package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/viewpoint.sysml +8 -0
  159. package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/main_screen_layout.sysml +57 -0
  160. package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/settings_screen_layout.sysml +52 -0
  161. package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/ui_region_trace.sysml +54 -0
  162. package/extensions/LICENSES/MIT.txt +19 -0
  163. package/extensions/README.md +94 -0
  164. package/extensions/aadl/memo.package.yaml +18 -0
  165. package/extensions/aadl/src/aadl_extension.sysml +6 -0
  166. package/extensions/aadl/src/correspondence/memo_aadl_correspondence.sysml +147 -0
  167. package/extensions/aadl/src/methodology/aadl_methodology.sysml +17 -0
  168. package/extensions/aadl/src/runtime/memo_aadl_runtime.sysml +56 -0
  169. package/extensions/clinical/memo.package.yaml +18 -0
  170. package/extensions/clinical/src/methodology/clinical_methodology.sysml +22 -0
  171. package/extensions/cloud/memo.package.yaml +18 -0
  172. package/extensions/cloud/src/cloud_extension.sysml +44 -0
  173. package/extensions/cloud/src/methodology/cloud_methodology.sysml +17 -0
  174. package/extensions/container/memo.package.yaml +18 -0
  175. package/extensions/container/src/container_extension.sysml +37 -0
  176. package/extensions/container/src/methodology/container_methodology.sysml +17 -0
  177. package/extensions/messaging/memo.package.yaml +18 -0
  178. package/extensions/messaging/src/messaging_extension.sysml +64 -0
  179. package/extensions/messaging/src/methodology/messaging_methodology.sysml +17 -0
  180. package/extensions/ros/memo.package.yaml +18 -0
  181. package/extensions/ros/src/methodology/ros_methodology.sysml +25 -0
  182. package/extensions/ros/src/ros_extension.sysml +200 -0
  183. package/extensions/template/memo.package.yaml +17 -0
  184. package/extensions/template/src/extension.sysml +37 -0
  185. package/memo.manifest.yaml +15 -2
  186. package/methodologies/default/memo.package.yaml +19 -9
  187. package/methodologies/gpca/memo.package.yaml +18 -9
  188. package/ontology/memo.package.yaml +23 -8
  189. package/package.json +6 -6
  190. package/profile/memo.package.yaml +18 -9
  191. package/src/architecture/decisions/memo_decisions.sysml +28 -0
  192. package/src/architecture/functional/behavior/memo_behavior.sysml +50 -22
  193. package/src/architecture/functional/constraints/memo_constraints.sysml +3 -2
  194. package/src/architecture/functional/functions/memo_functions.sysml +93 -43
  195. package/src/architecture/implementation/software/runtime/memo_software_runtime.sysml +46 -24
  196. package/src/architecture/implementation/software/structure/memo_software_structure.sysml +52 -12
  197. package/src/architecture/implementation/ui/memo_ui.sysml +276 -53
  198. package/src/architecture/logical/interfaces/memo_interfaces.sysml +64 -13
  199. package/src/architecture/logical/structure/memo_logical_structure.sysml +92 -35
  200. package/src/architecture/operational/activities/memo_activities.sysml +10 -4
  201. package/src/architecture/operational/context/actors/memo_actors.sysml +5 -8
  202. package/src/architecture/operational/context/stakeholders/memo_stakeholders.sysml +13 -30
  203. package/src/architecture/operational/context/use_context/memo_use_context.sysml +42 -16
  204. package/src/architecture/operational/scenarios/memo_scenarios.sysml +57 -23
  205. package/src/architecture/operational/use_cases/memo_use_cases.sysml +35 -26
  206. package/src/architecture/operational/workflows/memo_workflows.sysml +28 -15
  207. package/src/architecture/realization/deployment/memo_deployment.sysml +111 -16
  208. package/src/architecture/realization/physical/memo_physical_architecture.sysml +27 -2
  209. package/src/artifacts/configuration_management/memo_configuration_management.sysml +35 -0
  210. package/src/artifacts/core/memo_controlled_artifacts.sysml +35 -0
  211. package/src/artifacts/documents/risk_management/memo_risk_management.sysml +12 -0
  212. package/src/artifacts/standards/cfr_21_820.sysml +116 -0
  213. package/src/artifacts/standards/fda_cybersecurity_2023.sysml +80 -0
  214. package/src/artifacts/standards/iec_60601_1.sysml +149 -0
  215. package/src/artifacts/standards/iec_60601_1_2.sysml +56 -0
  216. package/src/artifacts/standards/iec_60812.sysml +51 -0
  217. package/src/artifacts/standards/iec_62304.sysml +210 -0
  218. package/src/artifacts/standards/iec_62366_1.sysml +113 -0
  219. package/src/artifacts/standards/iec_81001_5_1.sysml +84 -0
  220. package/src/artifacts/standards/iso_13485.sysml +113 -0
  221. package/src/artifacts/standards/iso_14971.sysml +94 -0
  222. package/src/artifacts/standards/iso_iec_ieee_42010.sysml +42 -0
  223. package/src/artifacts/standards/memo_artifacts_standards_traceability.sysml +132 -0
  224. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/design-input.md +1 -1
  225. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/design-output.md +5 -5
  226. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/design-review.md +1 -1
  227. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/design-validation.md +2 -2
  228. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/design-verification.md +2 -2
  229. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/dhf-index.md +2 -2
  230. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/transfer-plan.md +1 -1
  231. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/user-needs.md +1 -1
  232. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/vv-plan.md +3 -3
  233. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/vv-report.md +4 -4
  234. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/fda-cybersecurity/incident-response.md +1 -1
  235. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/fda-cybersecurity/postmarket-surveillance.md +3 -2
  236. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/fda-cybersecurity/security-arch.md +2 -2
  237. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/fda-cybersecurity/threat-model.md +4 -4
  238. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/fda-cybersecurity/vuln-assessment.md +4 -3
  239. package/src/artifacts/templates/dhf/iec-60601/hrs.md +170 -0
  240. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62304/detailed-design.md +1 -1
  241. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62304/integration-test.md +3 -3
  242. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62304/sad.md +6 -5
  243. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62304/sbom.md +3 -2
  244. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62304/sdp.md +5 -4
  245. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62304/soup.md +4 -2
  246. package/src/artifacts/templates/dhf/iec-62304/srs.md +172 -0
  247. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62304/sw-traceability.md +3 -3
  248. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62304/system-test.md +1 -1
  249. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62366/summative-eval.md +1 -1
  250. package/src/artifacts/templates/dhf/iec-62366/task-analysis.md +93 -0
  251. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62366/ue-plan.md +1 -1
  252. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62366/urra.md +3 -3
  253. package/src/artifacts/templates/dhf/iso-14971/fmea.md +116 -0
  254. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iso-14971/har.md +3 -3
  255. package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iso-14971/rmp.md +2 -2
  256. package/src/artifacts/templates/dhf/system/sad.md +173 -0
  257. package/src/artifacts/templates/dhf/system/standards-checklist.md +87 -0
  258. package/src/artifacts/templates/dhf/system/standards-traceability.md +125 -0
  259. package/src/artifacts/templates/dhf/system/syrs.md +128 -0
  260. package/src/assurance/cybersecurity/memo_cybersecurity.sysml +39 -20
  261. package/src/assurance/human_factors/memo_human_factors.sysml +29 -22
  262. package/src/assurance/requirements/memo_requirements.sysml +5 -2
  263. package/src/assurance/requirements/needs/memo_needs.sysml +1 -1
  264. package/src/assurance/safety_risk/analysis/memo_fmea.sysml +118 -13
  265. package/src/assurance/safety_risk/memo_risk.sysml +78 -7
  266. package/src/assurance/safety_risk/postmarket_surveillance/memo_postmarket_surveillance.sysml +27 -0
  267. package/src/assurance/verification_validation/clinical_evaluation/memo_clinical_evaluation.sysml +11 -0
  268. package/src/assurance/verification_validation/memo_assurance.sysml +17 -21
  269. package/src/core/annotations/memo_annotations.sysml +96 -0
  270. package/src/core/common/memo_common.sysml +140 -18
  271. package/src/core/consistency_rules/consistency_rules.sysml +7 -0
  272. package/src/core/dimensions/dimensions.sysml +17 -1
  273. package/src/core/enumerations/memo_enumerations.sysml +101 -20
  274. package/src/core/methodology_scope/methodology_scope.sysml +7 -15
  275. package/src/core/relationships/memo_relationships.sysml +199 -194
  276. package/src/memo_namespaces.sysml +127 -67
  277. package/src/methodology/core/memo_core.sysml +69 -2
  278. package/src/methodology/profiles/memo_profiles.sysml +31 -41
  279. package/src/methodology/workflow/memo_workflow.sysml +7 -2
  280. package/src/rules/closure/closure_rules.sysml +104 -31
  281. package/src/rules/coverage/coverage_rules.sysml +4 -256
  282. package/src/rules/crosslayer/cross_layer_rules.sysml +6 -15
  283. package/src/rules/lifecycle/lifecycle_rules.sysml +4 -39
  284. package/src/rules/ontology/ontology_invariants.sysml +243 -74
  285. package/src/rules/quantitative/quantitative_rules.sysml +8 -8
  286. package/src/viewpoints/catalog/memo_viewpoint_catalog.sysml +10 -3
  287. package/src/viewpoints/clinical/clinical_viewpoint.sysml +4 -2
  288. package/src/viewpoints/clinical/{clinical_evidence_view → views/clinical_evidence_view}/clinical_evidence_view.sysml +2 -2
  289. package/src/viewpoints/context/context_viewpoint.sysml +4 -2
  290. package/src/viewpoints/context/{system_context_view → views/system_context_view}/system_context_view.sysml +2 -2
  291. package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +4 -2
  292. package/src/viewpoints/cybersecurity/{cybersecurity_assessment_view → views/cybersecurity_assessment_view}/cybersecurity_assessment_view.sysml +2 -2
  293. package/src/viewpoints/cybersecurity/{threat_model_view → views/threat_model_view}/threat_model_view.sysml +2 -2
  294. package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +5 -0
  295. package/src/viewpoints/functional/functional_viewpoint.sysml +4 -2
  296. package/src/viewpoints/functional/{function_allocation_view → views/function_allocation_view}/function_allocation_view.sysml +3 -3
  297. package/src/viewpoints/functional/{system_functional_tree_view → views/system_functional_tree_view}/system_functional_tree_view.sysml +3 -3
  298. package/src/viewpoints/logical/logical_viewpoint.sysml +3 -1
  299. package/src/viewpoints/logical/{logical_architecture_view → views/logical_architecture_view}/logical_architecture_view.sysml +2 -2
  300. package/src/viewpoints/operational/operational_viewpoint.sysml +4 -2
  301. package/src/viewpoints/operational/{use_case_view → views/use_case_view}/use_case_view.sysml +3 -3
  302. package/src/viewpoints/physical/physical_viewpoint.sysml +3 -1
  303. package/src/viewpoints/physical/{network_topology_view → views/network_topology_view}/network_topology_view.sysml +2 -2
  304. package/src/viewpoints/physical/{physical_bom_view → views/physical_bom_view}/physical_bom_view.sysml +2 -2
  305. package/src/viewpoints/rendering/memo_rendering.sysml +354 -0
  306. package/src/viewpoints/requirements/requirements_viewpoint.sysml +3 -1
  307. package/src/viewpoints/requirements/{requirements_traceability_view → views/requirements_traceability_view}/requirements_traceability_view.sysml +2 -2
  308. package/src/viewpoints/risk/risk_viewpoint.sysml +3 -1
  309. package/src/viewpoints/risk/{risk_chain_view → views/risk_chain_view}/risk_chain_view.sysml +2 -2
  310. package/src/viewpoints/software/software_viewpoint.sysml +3 -1
  311. package/src/viewpoints/software/{software_architecture_view → views/software_architecture_view}/software_architecture_view.sysml +2 -2
  312. package/src/viewpoints/ui_layout/ui_layout_viewpoint.sysml +28 -0
  313. package/src/viewpoints/ui_layout/views/screen_layout_view/screen_layout_view.sysml +23 -0
  314. package/src/viewpoints/usability/usability_viewpoint.sysml +3 -1
  315. package/src/viewpoints/usability/{usability_engineering_view → views/usability_engineering_view}/usability_engineering_view.sysml +2 -2
  316. package/src/viewpoints/verification/verification_viewpoint.sysml +4 -2
  317. package/src/viewpoints/verification/{verification_coverage_view → views/verification_coverage_view}/verification_coverage_view.sysml +3 -3
  318. package/templates/connected-device/memo.package.yaml +11 -5
  319. package/templates/connected-device/model/catalog/project.sysml +28 -0
  320. package/templates/connected-device/syside.toml +1 -1
  321. package/templates/default/memo.package.yaml +11 -5
  322. package/templates/default/model/catalog/project.sysml +28 -0
  323. package/templates/default/syside.toml +1 -1
  324. package/templates/infusion-pump/memo.package.yaml +11 -5
  325. package/templates/infusion-pump/model/catalog/project.sysml +28 -0
  326. package/templates/infusion-pump/syside.toml +1 -1
  327. package/templates/monitoring-device/memo.package.yaml +11 -5
  328. package/templates/monitoring-device/model/catalog/project.sysml +28 -0
  329. package/templates/monitoring-device/syside.toml +1 -1
  330. package/templates/samd/memo.package.yaml +11 -5
  331. package/templates/samd/model/catalog/project.sysml +28 -0
  332. package/templates/samd/syside.toml +1 -1
  333. package/examples/connected-patient-monitor/model/connected_patient_monitor.sysml +0 -3
  334. package/examples/embedded-infusion-pump/model/embedded_infusion_pump.sysml +0 -3
  335. package/examples/extensions/README.md +0 -16
  336. package/examples/extensions/clinical/memo.package.yaml +0 -9
  337. package/examples/extensions/clinical/src/methodology/clinical_methodology.sysml +0 -14
  338. package/examples/extensions/template/memo.package.yaml +0 -9
  339. package/examples/extensions/template/src/extension.sysml +0 -15
  340. package/examples/functional-logical-physical/model/functional_logical_physical.sysml +0 -3
  341. package/examples/gpca-pump/memo.config.yaml +0 -9
  342. package/examples/gpca-pump/methodology/gpca_scope.sysml +0 -25
  343. package/examples/ivd-laboratory-system/model/ivd_laboratory_system.sysml +0 -3
  344. package/examples/manual-surgical-instrument/model/manual_surgical_instrument.sysml +0 -3
  345. package/examples/multidimensional-layers/model/multidimensional_layers.sysml +0 -4
  346. package/examples/reusable-instrument/model/reusable_instrument.sysml +0 -4
  347. package/examples/software-only-medical-device/model/software_only_medical_device.sysml +0 -4
  348. package/examples/surgical-closure-workflow/model/surgical_closure_workflow.sysml +0 -4
  349. package/examples/surgical-robot/model/surgical_robot.sysml +0 -4
  350. package/examples/sysml-diagram-samples/model/samples/functional_flow_view.sysml +0 -164
  351. package/examples/sysml-diagram-samples/model/samples/interconnection_view.sysml +0 -94
  352. package/examples/sysml-diagram-samples/model/samples/operational_behaviour_view.sysml +0 -135
  353. package/examples/sysml-diagram-samples/model/samples/state_transition_view.sysml +0 -109
  354. package/examples/sysml-diagram-samples/model/samples/tree_view.sysml +0 -56
  355. package/examples/temperature-alarm/model/temperature_alarm.sysml +0 -4
  356. package/ontology/memo.rendering.yaml +0 -84
  357. package/src/compliance/artifacts/memo_artifacts.sysml +0 -12
  358. package/src/compliance/change/memo_change.sysml +0 -17
  359. package/src/compliance/dhf-templates/iec-62304/srs.md +0 -138
  360. package/src/compliance/dhf-templates/iec-62366/task-analysis.md +0 -57
  361. package/src/compliance/dhf-templates/iso-14971/fmea.md +0 -93
  362. package/src/compliance/document_views/memo_document_views.sysml +0 -7
  363. package/src/compliance/iso14971/risk_management_file.sysml +0 -16
  364. package/src/compliance/postmarket/memo_postmarket.sysml +0 -16
  365. /package/{examples/extensions → extensions}/clinical/src/clinical_extension.sysml +0 -0
  366. /package/{examples/extensions → extensions}/clinical/src/procedures/memo_clinical_procedures.sysml +0 -0
  367. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/change-record.md +0 -0
  368. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62304/change-control.md +0 -0
  369. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62366/formative-eval.md +0 -0
  370. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62366/ui-spec.md +0 -0
  371. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62366/use-spec.md +0 -0
  372. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iso-14971/fta.md +0 -0
  373. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iso-14971/risk-benefit.md +0 -0
  374. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iso-14971/risk-matrix.md +0 -0
  375. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iso-14971/rmr.md +0 -0
  376. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/shared/snippets/approval-block.md +0 -0
  377. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/shared/snippets/document-control-header.md +0 -0
  378. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/shared/snippets/references-section.md +0 -0
  379. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/shared/snippets/revision-history-table.md +0 -0
  380. /package/templates/connected-device/{src → model/catalog}/architecture/system.sysml +0 -0
  381. /package/templates/connected-device/{src/artifacts/artifacts.sysml → model/catalog/artifacts/catalog.sysml} +0 -0
  382. /package/templates/connected-device/{src → model/catalog}/assurance/requirements.sysml +0 -0
  383. /package/templates/default/{src → model/catalog}/architecture/system.sysml +0 -0
  384. /package/templates/default/{src/artifacts/artifacts.sysml → model/catalog/artifacts/catalog.sysml} +0 -0
  385. /package/templates/default/{src → model/catalog}/assurance/requirements.sysml +0 -0
  386. /package/templates/infusion-pump/{src → model/catalog}/architecture/system.sysml +0 -0
  387. /package/templates/infusion-pump/{src/artifacts/artifacts.sysml → model/catalog/artifacts/catalog.sysml} +0 -0
  388. /package/templates/infusion-pump/{src → model/catalog}/assurance/requirements.sysml +0 -0
  389. /package/templates/monitoring-device/{src → model/catalog}/architecture/system.sysml +0 -0
  390. /package/templates/monitoring-device/{src/artifacts/artifacts.sysml → model/catalog/artifacts/catalog.sysml} +0 -0
  391. /package/templates/monitoring-device/{src → model/catalog}/assurance/requirements.sysml +0 -0
  392. /package/templates/samd/{src → model/catalog}/architecture/system.sysml +0 -0
  393. /package/templates/samd/{src/artifacts/artifacts.sysml → model/catalog/artifacts/catalog.sysml} +0 -0
  394. /package/templates/samd/{src → model/catalog}/assurance/requirements.sysml +0 -0
@@ -11,17 +11,26 @@ package memo_rules_ontology {
11
11
 
12
12
  // ─── Structure ───────────────────────────────────────────────────────
13
13
 
14
- constraint def containmentAcyclicRule {
14
+ constraint def ContainmentAcyclicRule :> MemoConsistencyRule {
15
15
  attribute id = "CR-ONT-001";
16
- attribute appliesTo = "MemoPart";
16
+ attribute tailoring = RuleTailoringKind::invariant;
17
+ attribute appliesTo = "Model";
17
18
  attribute severity = RuleSeverityKind::error;
18
19
  attribute rationaleText = "Containment/composition relations (Composes) must form no cycles.";
19
20
  attribute predicateExpression = "acyclic(composes)";
20
21
  constraint { true }
21
22
  }
22
- constraint def nestedPartConnectedRule {
23
+ constraint def NestedPartConnectedRule :> MemoConsistencyRule {
23
24
  attribute id = "AR-IBD-001";
24
- attribute appliesTo = "MemoPart";
25
+ attribute tailoring = RuleTailoringKind::invariant;
26
+ // Internal-block connectivity is a structural-architecture concern, so
27
+ // the subject is the structural component — not every MemoPart. UI
28
+ // elements, captured evidence, and review comments nest in compositions
29
+ // without ever bearing a connector, and judging them produced warnings
30
+ // no modeller could act on. The engine reads this value; narrowing or
31
+ // widening the rule happens here, not in TypeScript.
32
+ attribute appliesTo = "LogicalComponent";
33
+ attribute evaluator = "architecture";
25
34
  attribute severity = RuleSeverityKind::warning;
26
35
  attribute rationaleText = "A structural part nested inside another part should expose at least one modeled interface connector. Passive or intentionally isolated parts may retain this warning with an explicit modelling rationale.";
27
36
  attribute predicateExpression = "hasConnectorInComposition";
@@ -32,115 +41,275 @@ package memo_rules_ontology {
32
41
  // represent that transitive containment query.
33
42
  constraint { true }
34
43
  }
35
- constraint def connectorEndpointsExistRule {
36
- attribute id = "CR-ONT-002";
37
- attribute appliesTo = "ComponentExchange";
38
- attribute severity = RuleSeverityKind::error;
39
- attribute rationaleText = "Connector endpoints must resolve to model elements via the typed refs sourceEndpoint/targetEndpoint; port-path strings are descriptive labels only.";
40
- attribute predicateExpression = "sourceEndpoint->size() = 1 and targetEndpoint->size() = 1";
41
- constraint { true }
42
- }
43
- constraint def portCompatibilityRule {
44
- attribute id = "CR-ONT-003";
45
- attribute appliesTo = "LogicalConnector";
46
- attribute severity = RuleSeverityKind::error;
47
- attribute rationaleText = "Connected ports must agree on content kind; a fluid port cannot connect to an information port.";
48
- attribute predicateExpression = "sourceComponent.ports.contentKind->intersect(targetComponent.ports.contentKind)->size() >= 1";
49
- constraint { true }
50
- }
51
- constraint def directionAgreesWithFlowRule {
52
- attribute id = "CR-ONT-004";
53
- attribute appliesTo = "LogicalExchange";
54
- attribute severity = RuleSeverityKind::error;
55
- attribute rationaleText = "Exchange direction must agree with the direction of its source and target ports.";
56
- attribute predicateExpression = "sourcePort.direction != DirectionKind::input and targetPort.direction != DirectionKind::output";
57
- constraint { true }
58
- }
59
- constraint def exchangedItemTypeRule {
60
- attribute id = "CR-ONT-005";
61
- attribute appliesTo = "LogicalExchange";
62
- attribute severity = RuleSeverityKind::warning;
63
- attribute rationaleText = "Exchanged items must be type-compatible with the exchange content kind.";
64
- attribute predicateExpression = "exchangedItem->isEmpty() or exchangedItem.contentKind = contentKind";
65
- constraint { true }
66
- }
67
-
68
44
  // ─── Deployment and realization ──────────────────────────────────────
69
45
 
70
- constraint def deployToCapableNodeRule {
71
- attribute id = "CR-ONT-010";
72
- attribute appliesTo = "DeploysTo";
73
- attribute severity = RuleSeverityKind::error;
74
- attribute rationaleText = "Software deploys only to capable execution nodes (e.g. containerized units require supportsContainerization).";
75
- attribute predicateExpression = "deploymentKind != DeploymentKind::containerized or node.supportsContainerization = true";
76
- constraint { true }
77
- }
78
- constraint def runtimeTracesToModuleRule {
46
+ constraint def RuntimeTracesToModuleRule :> MemoConsistencyRule {
79
47
  attribute id = "CR-ONT-011";
48
+ attribute tailoring = RuleTailoringKind::invariant;
80
49
  attribute appliesTo = "SoftwareComponent";
81
50
  attribute severity = RuleSeverityKind::warning;
82
51
  attribute rationaleText = "Every runtime component must trace to a module-view definition (Realizes).";
83
52
  attribute predicateExpression = "realizes->size() >= 1";
84
53
  constraint { true }
85
54
  }
86
- constraint def logicalRealizationTypedRule {
87
- attribute id = "CR-ONT-012";
88
- attribute appliesTo = "Realizes";
89
- attribute severity = RuleSeverityKind::error;
90
- attribute rationaleText = "Realization relations must resolve both ends to model elements, not name strings.";
91
- attribute predicateExpression = "realizing->size() = 1 and realized->size() = 1";
92
- constraint { true }
93
- }
94
-
95
- constraint def patientContactCharacterizedRule {
55
+ constraint def PatientContactCharacterizedRule :> MemoConsistencyRule {
96
56
  attribute id = "CR-ONT-032";
57
+ attribute tailoring = RuleTailoringKind::invariant;
97
58
  attribute appliesTo = "PhysicalComponent";
98
59
  attribute severity = RuleSeverityKind::error;
99
60
  attribute rationaleText = "Patient-contact components must identify contact nature and duration (ISO 10993-1).";
100
- attribute predicateExpression = "patientContact = false or (contactNature != '' and contactDuration != '')";
61
+ attribute predicateExpression = "patientContact == false or (contactNature != '' and contactDuration != '')";
101
62
  constraint { true }
102
63
  }
103
64
 
104
65
  // ─── Assurance coverage ──────────────────────────────────────────────
105
66
 
106
- constraint def safetyCriticalFunctionVerifiedRule {
67
+ constraint def SafetyCriticalFunctionVerifiedRule :> MemoConsistencyRule {
107
68
  attribute id = "CR-ONT-040";
108
- attribute appliesTo = "SystemFunction";
69
+ attribute tailoring = RuleTailoringKind::invariant;
70
+ attribute appliesTo = "MemoFunction";
109
71
  attribute severity = RuleSeverityKind::error;
110
72
  attribute rationaleText = "Safety-critical functions (criticality high or catastrophic) must trace to at least one verification case.";
111
- attribute predicateExpression = "criticality < CriticalityKind::high or verifiedBy->size() >= 1";
73
+ attribute predicateExpression = "not(criticality == 'high' or criticality == 'catastrophic') or verifiedBy->size() >= 1";
112
74
  constraint { true }
113
75
  }
114
- constraint def criticalTaskValidatedRule {
76
+ constraint def CriticalTaskValidatedRule :> MemoConsistencyRule {
115
77
  attribute id = "CR-ONT-041";
78
+ attribute tailoring = RuleTailoringKind::invariant;
116
79
  attribute appliesTo = "UserTask[criticality=high]";
117
80
  attribute severity = RuleSeverityKind::error;
118
81
  attribute rationaleText = "Critical tasks (criticality high or catastrophic) must trace to usability validation (FDA HF guidance; IEC 62366-1 summative evaluation).";
119
- attribute predicateExpression = "criticality < CriticalityKind::high or validates->size() >= 1";
82
+ attribute predicateExpression = "not(criticality == 'high' or criticality == 'catastrophic') or validates->size() >= 1";
120
83
  constraint { true }
121
84
  }
122
- constraint def useErrorTracesToHazardRule {
85
+ constraint def UseErrorTracesToHazardRule :> MemoConsistencyRule {
123
86
  attribute id = "CR-ONT-042";
87
+ attribute tailoring = RuleTailoringKind::invariant;
124
88
  attribute appliesTo = "UseError";
125
89
  attribute severity = RuleSeverityKind::warning;
126
90
  attribute rationaleText = "Safety-relevant use errors (severity serious or worse) must trace to a hazard.";
127
- attribute predicateExpression = "severity < SeverityKind::serious or causes->size() >= 1";
91
+ attribute predicateExpression = "not(severity == 'serious' or severity == 'critical' or severity == 'catastrophic') or causes->size() >= 1 or tracesRisk->size() >= 1";
128
92
  constraint { true }
129
93
  }
130
- constraint def alternateScenarioHasBaseRule {
131
- attribute id = "CR-ONT-043";
132
- attribute appliesTo = "MemoScenario";
94
+ // ─── Relation end conformance (Track A0) ─────────────────────────────
95
+ //
96
+ // These rules carry the constraints that `connection def` end TYPES used to
97
+ // carry in memo_core_relationships. The types had to go: KerML forbids a
98
+ // port or a behaviour from specializing a part-based type, so a
99
+ // `MemoPart`-typed end forced every endpoint to be a part — which is why
100
+ // ports are part defs, why a function is a part with its behaviour stapled
101
+ // on, and why `allocate <function> to <actor>` is rejected. See the Track A0
102
+ // note at the top of memo_core_relationships.
103
+ //
104
+ // Each rule states what its end stated, in the one vocabulary that survives
105
+ // the metaclass split:
106
+ //
107
+ // * `conformsTo(Base)` — SysML specialization against a MEMO base. This is
108
+ // the part the end type expressed, and it still works within a metaclass.
109
+ // * `construct == 'action' | 'port' | 'state' | …` — the SysML METACLASS.
110
+ // No MEMO base can say this, because the bases are per-metaclass by
111
+ // construction; a type-based end could only ever admit one of them.
112
+ //
113
+ // Several of these are WIDER than the end they replace, and deliberately so:
114
+ // the ends were being violated by content that already shipped. `composes`
115
+ // was typed MemoPart/MemoPart and links StateMachine (a state def) to
116
+ // WorkflowStep (an action def); `verifiedBy`'s source was typed MemoPart and
117
+ // most of its sources are requirement defs; `precedes` was typed
118
+ // ArchitectureElement and joins OperationalActivity to OperationalActivity.
119
+ // A rule that reproduced the old type exactly would have failed on the
120
+ // flagship example on the day it landed. What each rule asserts is the
121
+ // constraint the end MEANT, stated so it can be checked.
122
+ //
123
+ // Subject scope is `Model`, following CR-ONT-001: a statement about the ends
124
+ // of a relation quantifies over its LINKS, not over elements of one kind, so
125
+ // no per-element subject can reach it. The cost is that a violation names
126
+ // the rule and not the offending link; the rationale text names the relation
127
+ // and the admissible types so the report is still actionable.
128
+
129
+ constraint def SatisfiedBySourceKindRule :> MemoConsistencyRule {
130
+ attribute id = "CR-ONT-060";
131
+ attribute tailoring = RuleTailoringKind::invariant;
132
+ attribute appliesTo = "Model";
133
133
  attribute severity = RuleSeverityKind::error;
134
- attribute rationaleText = "Alternate, exception, and recovery scenarios must identify their base scenario or variation point — never duplicate the workflow.";
135
- attribute predicateExpression = "variantKind = ScenarioVariantKind::nominal or baseScenario->size() = 1 or variationPoint != ''";
134
+ attribute rationaleText = "Only a requirement or a need is satisfied by something. The source end of SatisfiedBy must conform to MemoRequirementElement.";
135
+ attribute predicateExpression = "sourcesOf(satisfiedBy)->forAll(conformsTo(MemoRequirementElement))";
136
+ constraint { true }
137
+ }
138
+ constraint def SatisfiedByTargetKindRule :> MemoConsistencyRule {
139
+ attribute id = "CR-ONT-061";
140
+ attribute tailoring = RuleTailoringKind::invariant;
141
+ attribute appliesTo = "Model";
142
+ attribute severity = RuleSeverityKind::error;
143
+ attribute rationaleText = "A requirement is satisfied by a designed thing: an architecture element, an actor, a behaviour, or a port. Never by another requirement or by a document.";
144
+ attribute predicateExpression = "targetsOf(satisfiedBy)->forAll(conformsTo(ArchitectureElement) or conformsTo(Actor) or construct == 'action' or construct == 'port')";
145
+ constraint { true }
146
+ }
147
+ constraint def VerifiedByTargetKindRule :> MemoConsistencyRule {
148
+ attribute id = "CR-ONT-062";
149
+ attribute tailoring = RuleTailoringKind::invariant;
150
+ attribute appliesTo = "Model";
151
+ attribute severity = RuleSeverityKind::error;
152
+ attribute rationaleText = "A verification case verifies a requirement, a risk control, an architecture element, a behaviour, or a port — something a test can be run against. Not a view, not an evidence record.";
153
+ attribute predicateExpression = "sourcesOf(verifiedBy)->forAll(conformsTo(MemoPart) or construct == 'requirement' or construct == 'action' or construct == 'port')";
154
+ constraint { true }
155
+ }
156
+ constraint def AllocatedToSourceKindRule :> MemoConsistencyRule {
157
+ attribute id = "CR-ONT-063";
158
+ attribute tailoring = RuleTailoringKind::invariant;
159
+ attribute appliesTo = "Model";
160
+ attribute severity = RuleSeverityKind::error;
161
+ attribute rationaleText = "Allocation runs from a function or a behaviour to where it runs. The source end of AllocatedTo is an architecture element or an action.";
162
+ attribute predicateExpression = "sourcesOf(allocatedTo)->forAll(conformsTo(ArchitectureElement) or construct == 'action')";
163
+ constraint { true }
164
+ }
165
+ constraint def AllocatedToTargetKindRule :> MemoConsistencyRule {
166
+ attribute id = "CR-ONT-064";
167
+ attribute tailoring = RuleTailoringKind::invariant;
168
+ attribute appliesTo = "Model";
169
+ attribute severity = RuleSeverityKind::error;
170
+ attribute rationaleText = "A function is allocated to an architecture element or to an actor — ARCADIA System Analysis allocates to the system OR to an actor, which the former ArchitectureElement-typed end made impossible.";
171
+ attribute predicateExpression = "targetsOf(allocatedTo)->forAll(conformsTo(ArchitectureElement) or conformsTo(Actor))";
172
+ constraint { true }
173
+ }
174
+ constraint def ComposesParentKindRule :> MemoConsistencyRule {
175
+ attribute id = "CR-ONT-065";
176
+ attribute tailoring = RuleTailoringKind::invariant;
177
+ attribute appliesTo = "Model";
178
+ attribute severity = RuleSeverityKind::error;
179
+ attribute rationaleText = "A whole in a decomposition is a part, a behaviour, or a state machine. A requirement does not compose anything.";
180
+ attribute predicateExpression = "sourcesOf(composes)->forAll(conformsTo(MemoPart) or construct == 'action' or construct == 'state')";
181
+ constraint { true }
182
+ }
183
+ constraint def ComposesChildKindRule :> MemoConsistencyRule {
184
+ attribute id = "CR-ONT-066";
185
+ attribute tailoring = RuleTailoringKind::invariant;
186
+ attribute appliesTo = "Model";
187
+ attribute severity = RuleSeverityKind::error;
188
+ attribute rationaleText = "A part in a decomposition is a part, a behaviour, a state, or a port — a component owns its ports, and a workflow owns its steps.";
189
+ attribute predicateExpression = "targetsOf(composes)->forAll(conformsTo(MemoPart) or construct == 'action' or construct == 'state' or construct == 'port')";
190
+ constraint { true }
191
+ }
192
+ constraint def PrecedesEndKindRule :> MemoConsistencyRule {
193
+ attribute id = "CR-ONT-067";
194
+ attribute tailoring = RuleTailoringKind::invariant;
195
+ attribute appliesTo = "Model";
196
+ attribute severity = RuleSeverityKind::error;
197
+ attribute rationaleText = "Precedence orders things that happen: architecture elements or behaviours, at both ends.";
198
+ attribute predicateExpression = "sourcesOf(precedes)->forAll(conformsTo(ArchitectureElement) or construct == 'action') and targetsOf(precedes)->forAll(conformsTo(ArchitectureElement) or construct == 'action')";
199
+ constraint { true }
200
+ }
201
+ constraint def PerformsPerformerKindRule :> MemoConsistencyRule {
202
+ attribute id = "CR-ONT-068";
203
+ attribute tailoring = RuleTailoringKind::invariant;
204
+ attribute appliesTo = "Model";
205
+ attribute severity = RuleSeverityKind::error;
206
+ attribute rationaleText = "A performer is an operational entity, an actor, or a system action — a part or a behaviour. The end's own documentation said 'or system action' while its MemoPart type forbade one.";
207
+ attribute predicateExpression = "sourcesOf(performs)->forAll(conformsTo(MemoPart) or construct == 'action')";
208
+ constraint { true }
209
+ }
210
+ constraint def EnablesEnablerKindRule :> MemoConsistencyRule {
211
+ attribute id = "CR-ONT-069";
212
+ attribute tailoring = RuleTailoringKind::invariant;
213
+ attribute appliesTo = "Model";
214
+ attribute severity = RuleSeverityKind::error;
215
+ attribute rationaleText = "An enabling system or function enables a workflow: the enabling end is a part or a behaviour.";
216
+ attribute predicateExpression = "sourcesOf(enables)->forAll(conformsTo(MemoPart) or construct == 'action')";
217
+ constraint { true }
218
+ }
219
+ constraint def BindsToInterfaceEndKindRule :> MemoConsistencyRule {
220
+ attribute id = "CR-ONT-070";
221
+ attribute tailoring = RuleTailoringKind::invariant;
222
+ attribute appliesTo = "Model";
223
+ attribute severity = RuleSeverityKind::error;
224
+ attribute rationaleText = "A port binds to an interface. The bound end is an interface definition, which the former InterfaceElement-typed end could not hold at all — Interface specializes MemoInterface, an interface def, not a part.";
225
+ attribute predicateExpression = "sourcesOf(bindsToInterface)->forAll(conformsTo(InterfaceElement) or construct == 'port') and targetsOf(bindsToInterface)->forAll(conformsTo(InterfaceElement) or construct == 'interface' or construct == 'port')";
226
+ constraint { true }
227
+ }
228
+ constraint def CrossesTrustBoundaryEndKindRule :> MemoConsistencyRule {
229
+ attribute id = "CR-ONT-071";
230
+ attribute tailoring = RuleTailoringKind::invariant;
231
+ attribute appliesTo = "Model";
232
+ attribute severity = RuleSeverityKind::error;
233
+ attribute rationaleText = "A boundary is a boundary element or a port; what crosses it is an asset or an exchange item.";
234
+ attribute predicateExpression = "sourcesOf(crossesTrustBoundary)->forAll(conformsTo(InterfaceElement) or construct == 'port') and targetsOf(crossesTrustBoundary)->forAll(conformsTo(ArchitectureElement) or construct == 'item')";
235
+ constraint { true }
236
+ }
237
+
238
+ // CR-ONT-002's replacement. ComponentExchange's endpoints are `ref`
239
+ // features, not links, and the builder projects them as element-ID STRINGS
240
+ // in the attribute map (a §13.3 string pseudo-reference) — so they cannot be
241
+ // reached with sourcesOf/targetsOf. They are resolved here by looking the id
242
+ // up in the kind extent, which is the same statement made the long way.
243
+ constraint def ComponentExchangeSourceEndpointKindRule :> MemoConsistencyRule {
244
+ attribute id = "CR-ONT-072";
245
+ attribute tailoring = RuleTailoringKind::invariant;
246
+ attribute appliesTo = "ComponentExchange";
247
+ attribute severity = RuleSeverityKind::error;
248
+ attribute rationaleText = "An exchange starts at a component or at a boundary port. Stating it as a rule is what let the endpoint refs stop being MemoPart-typed, which is what lets PhysicalPort and SoftwarePort become port defs.";
249
+ attribute predicateExpression = "attributes.sourceEndpoint == '' or allOfKind('ArchitectureElement')->exists(id == subject.attributes.sourceEndpoint) or allOfKind('InterfaceElement')->exists(id == subject.attributes.sourceEndpoint) or allOfKind('MemoPort')->exists(id == subject.attributes.sourceEndpoint)";
136
250
  constraint { true }
137
251
  }
138
- constraint def singleAxisOwnershipRule {
139
- attribute id = "CR-ONT-045";
140
- attribute appliesTo = "MemoPart";
252
+ constraint def ComponentExchangeTargetEndpointKindRule :> MemoConsistencyRule {
253
+ attribute id = "CR-ONT-073";
254
+ attribute tailoring = RuleTailoringKind::invariant;
255
+ attribute appliesTo = "ComponentExchange";
256
+ attribute severity = RuleSeverityKind::error;
257
+ attribute rationaleText = "An exchange ends at a component or at a boundary port, on the same grounds as CR-ONT-072.";
258
+ attribute predicateExpression = "attributes.targetEndpoint == '' or allOfKind('ArchitectureElement')->exists(id == subject.attributes.targetEndpoint) or allOfKind('InterfaceElement')->exists(id == subject.attributes.targetEndpoint) or allOfKind('MemoPort')->exists(id == subject.attributes.targetEndpoint)";
259
+ constraint { true }
260
+ }
261
+
262
+ // ─── The functional chain ────────────────────────────────────────────
263
+ //
264
+ // What makes ComponentFunction a definition of its own rather than an enum
265
+ // member on SystemFunction. An enum value cannot change a multiplicity, and
266
+ // "answerable to exactly one component" is the whole content of the concept.
267
+
268
+ constraint def ComponentFunctionAllocatedRule :> MemoConsistencyRule {
269
+ attribute id = "CR-ONT-074";
270
+ attribute tailoring = RuleTailoringKind::invariant;
271
+ attribute appliesTo = "ComponentFunction";
141
272
  attribute severity = RuleSeverityKind::error;
142
- attribute rationaleText = "Every element is owned by exactly one axis, encoded by its owning package: a horizontal architecture layer (memo_architecture_*) XOR a vertical assurance discipline (memo_assurance_*) — never both. Cross-axis participation is expressed by typed relationships, not by dual membership.";
143
- attribute predicateExpression = "owningPackage.startsWith('memo_architecture_') xor owningPackage.startsWith('memo_assurance_')";
273
+ attribute rationaleText = "A component function is the responsibility of exactly one component, and AllocatedTo is what names it. A component function allocated nowhere is a responsibility nobody has accepted; one allocated twice is a responsibility nobody owns. A system-level responsibility with no single owner is a SystemFunction, which allows that.";
274
+ attribute predicateExpression = "allocatedTo->size() == 1";
275
+ constraint { true }
276
+ }
277
+ constraint def FunctionDecomposesIntoFunctionsRule :> MemoConsistencyRule {
278
+ attribute id = "CR-ONT-075";
279
+ attribute tailoring = RuleTailoringKind::invariant;
280
+ attribute appliesTo = "MemoFunction";
281
+ attribute severity = RuleSeverityKind::error;
282
+ attribute rationaleText = "The functional chain decomposes functions into functions. A function composed of a component, or owned by one, is confusing allocation with decomposition — the component is named by AllocatedTo, never by Composes.";
283
+ attribute predicateExpression = "composes->forAll(conformsTo(MemoFunction))";
284
+ constraint { true }
285
+ }
286
+
287
+ // Track A3. The flow is the edge; the exchange part carries the budget and
288
+ // assurance attributes. The two halves are bound by a SHARED NAME — the flow
289
+ // usage is named with its exchange — and this is what makes that binding a
290
+ // checked fact rather than a convention someone can quietly break.
291
+ //
292
+ // It needs `linksOf`, because the question is about a link's IDENTITY, not
293
+ // about what sits at its ends: `sourcesOf`/`targetsOf` yield the elements at
294
+ // the ends and can never answer it. Naming the flow is what the grammar's
295
+ // restored FlowDeclaration name makes possible at all.
296
+ constraint def ExchangeHasFlowRule :> MemoConsistencyRule {
297
+ attribute id = "CR-ONT-076";
298
+ attribute tailoring = RuleTailoringKind::invariant;
299
+ attribute appliesTo = "ComponentExchange";
300
+ attribute severity = RuleSeverityKind::error;
301
+ attribute rationaleText = "An exchange states that something crosses a boundary, which is an EDGE, and the edge is a native flow. The part def exists for the budget and assurance attributes a reader has to find from the edge, so the two are named alike and this rule holds them together. An exchange with no flow is a budget attached to nothing.";
302
+ attribute predicateExpression = "linksOf(flow)->exists(id == subject.id)";
303
+ constraint { true }
304
+ }
305
+
306
+ constraint def AlternateScenarioHasBaseRule :> MemoConsistencyRule {
307
+ attribute id = "CR-ONT-043";
308
+ attribute tailoring = RuleTailoringKind::invariant;
309
+ attribute appliesTo = "MemoScenario";
310
+ attribute severity = RuleSeverityKind::error;
311
+ attribute rationaleText = "Alternate, exception, and recovery scenarios must identify their base scenario or variation point — never duplicate the workflow.";
312
+ attribute predicateExpression = "not(variantKind == 'alternate' or variantKind == 'exception' or variantKind == 'recovery') or baseScenario->size() == 1 or variationPoint != ''";
144
313
  constraint { true }
145
314
  }
146
315
  }
@@ -1,28 +1,28 @@
1
- // C5 quantitative rule pack — native KerML constraints (Epic EE-3).
2
- // Numeric cardinality bounds migrated from cardinalityCheck predicate parts to
3
- // native `constraint def` bodies. The aggregate ratio rule (QT-003) is a
4
- // model-level metric, not a single-subject predicate, and is omitted (see note).
1
+ // Quantitative per-subject cardinality constraints. Aggregate ratios belong to
2
+ // model-level coverage reporting rather than this evaluator.
5
3
  package memo_rules_quantitative {
6
4
  private import ScalarValues::*;
7
5
 
8
6
  private import memo_core_consistency_rules::*;
9
7
  private import memo_core_enumerations::*;
10
8
 
11
- constraint def hazardMaxControlsRule {
9
+ constraint def HazardMaxControlsRule :> MemoConsistencyRule {
12
10
  attribute id = "QT-001";
11
+ attribute tailoring = RuleTailoringKind::assurance;
13
12
  attribute appliesTo = "Hazard";
14
13
  attribute severity = RuleSeverityKind::info;
15
14
  attribute rationaleText = "Excessive controls per hazard suggests the hazard is too broad and should be decomposed.";
16
- attribute predicateExpression = "mitigates->size() >= 0 and mitigates->size() <= 10";
15
+ attribute predicateExpression = "mitigates->size() <= 10";
17
16
  constraint { true }
18
17
  }
19
18
 
20
- constraint def swComponentMaxInterfacesRule {
19
+ constraint def SwComponentMaxInterfacesRule :> MemoConsistencyRule {
21
20
  attribute id = "QT-002";
21
+ attribute tailoring = RuleTailoringKind::assurance;
22
22
  attribute appliesTo = "SoftwareModule";
23
23
  attribute severity = RuleSeverityKind::info;
24
24
  attribute rationaleText = "High interface count indicates excessive coupling; consider decomposition.";
25
- attribute predicateExpression = "threatenedBy->size() >= 0 and threatenedBy->size() <= 8";
25
+ attribute predicateExpression = "threatenedBy->size() <= 8";
26
26
  constraint { true }
27
27
  }
28
28
 
@@ -34,8 +34,8 @@ package memo_viewpoints_catalog {
34
34
  attribute :>> purpose = "Workflow steps, decisions, parallel work, handoffs, and roles.";
35
35
  attribute :>> defaultViewKind = DiagramViewKind::actionflow;
36
36
  }
37
- part vpOperativeScenario : Viewpoint {
38
- attribute :>> id = "VP-CAT-005"; attribute :>> name = "OperativeScenarioViewpoint";
37
+ part vpScenario : Viewpoint {
38
+ attribute :>> id = "VP-CAT-005"; attribute :>> name = "ScenarioViewpoint";
39
39
  attribute :>> purpose = "Selected paths through workflows: variants, conditions, variation points.";
40
40
  attribute :>> defaultViewKind = DiagramViewKind::actionflow;
41
41
  }
@@ -151,13 +151,20 @@ package memo_viewpoints_catalog {
151
151
  }
152
152
  // A software sequence diagram is a VIEW conforming to this viewpoint
153
153
  // (ISO/IEC/IEEE 42010): it frames the runtime message ordering between
154
- // SoftwareComponents realizing a FunctionalScenario. The viewpoint is the
154
+ // SoftwareComponents realizing a functional MemoScenario. The viewpoint is the
155
155
  // reusable spec; the diagram of a specific model is the view.
156
156
  part vpSoftwareSequence : Viewpoint {
157
157
  attribute :>> id = "VP-CAT-027"; attribute :>> name = "SoftwareSequenceViewpoint";
158
158
  attribute :>> purpose = "Runtime message ordering between software components along a functional scenario.";
159
159
  attribute :>> defaultViewKind = DiagramViewKind::sequence;
160
160
  }
161
+ // The first cataloged viewpoint to resolve to `geometry`: screen regions
162
+ // carry authored RegionBounds, so a geometry view draws modelled facts.
163
+ part vpUILayout : Viewpoint {
164
+ attribute :>> id = "VP-CAT-028"; attribute :>> name = "UILayoutViewpoint";
165
+ attribute :>> purpose = "Captured screens with their marked regions and the UI elements those regions present.";
166
+ attribute :>> defaultViewKind = DiagramViewKind::geometry;
167
+ }
161
168
 
162
169
  // ── Compatibility mappings (§22): legacy diagram intents resolve to
163
170
  // standard view kinds; C4 and AADL stay in examples/ mappings. ──
@@ -9,7 +9,7 @@ package memo_viewpoints_clinical_clinical_viewpoint {
9
9
  attribute :>> name = "ClinicalViewpoint";
10
10
  attribute :>> title = "Clinical Viewpoint";
11
11
  attribute :>> shortDescription = "Shows clinical context, users, use environment, and clinical evidence.";
12
- attribute :>> longDescription = "Default viewpoint derived from the context and assurance layers for clinical stakeholders — intended use, patient/clinician interaction, clinical evidence, and clinical safety claims.";
12
+ attribute :>> description = "Default viewpoint derived from the context and assurance layers for clinical stakeholders — intended use, patient/clinician interaction, clinical evidence, and clinical safety claims.";
13
13
  attribute :>> purpose = "Communicate clinical use context and clinical evidence for the device.";
14
14
  attribute :>> audience = (AudienceKind::clinicalEngineer, AudienceKind::regulatoryEngineer);
15
15
  attribute :>> stage = WorkflowStageKind::context;
@@ -18,7 +18,9 @@ package memo_viewpoints_clinical_clinical_viewpoint {
18
18
  attribute :>> presentationKind = (PresentationKind::narrativeSection);
19
19
  attribute :>> concernKinds = (ConcernKind::safety, ConcernKind::clinical);
20
20
  attribute :>> includedLayers = ("context", "assurance");
21
- attribute :>> allowedElementKinds = ("Actor", "UseContext", "Evidence");
21
+ attribute :>> explorerLane = "assurance";
22
+ attribute :>> explorerOrder = 4;
23
+ attribute :>> allowedElementKinds = ("Actor", "UseContext", "MemoEvidence");
22
24
  attribute :>> userExtensible = true;
23
25
  }
24
26
  }
@@ -1,11 +1,11 @@
1
- package memo_viewpoints_clinical_clinical_evidence_view {
1
+ package memo_viewpoints_clinical_views_clinical_evidence_view {
2
2
  private import ScalarValues::*;
3
3
 
4
4
  private import memo_viewpoints_definitions::*;
5
5
  private import memo_core_enumerations::*;
6
6
 
7
7
  view def MemoClinicalEvidenceView :> MemoDocumentView {
8
- attribute :>> viewKind = DocumentViewKind::Clinical;
8
+ attribute :>> viewKind = DocumentViewKind::clinical;
9
9
  attribute :>> generationRule = "Include use contexts, actors, and clinical evidence supporting the device's intended use, filtered to clinical concern.";
10
10
  attribute :>> outputKind = (ViewOutputKind::documentSection);
11
11
  attribute :>> presentationKind = (PresentationKind::narrativeSection);
@@ -9,7 +9,7 @@ package memo_viewpoints_context_context_viewpoint {
9
9
  attribute :>> name = "ContextViewpoint";
10
10
  attribute :>> title = "System Context Viewpoint";
11
11
  attribute :>> shortDescription = "Shows actors, use context, and system boundary.";
12
- attribute :>> longDescription = "Default viewpoint derived from the context layer to communicate who interacts with the device, under which use conditions, and where trust or safety boundaries exist.";
12
+ attribute :>> description = "Default viewpoint derived from the context layer to communicate who interacts with the device, under which use conditions, and where trust or safety boundaries exist.";
13
13
  attribute :>> purpose = "Communicate operational context and boundaries.";
14
14
  attribute :>> audience = (AudienceKind::systemArchitect);
15
15
  attribute :>> stage = WorkflowStageKind::context;
@@ -18,6 +18,8 @@ package memo_viewpoints_context_context_viewpoint {
18
18
  attribute :>> presentationKind = (PresentationKind::blockDiagram);
19
19
  attribute :>> concernKinds = (ConcernKind::safety, ConcernKind::interoperability);
20
20
  attribute :>> includedLayers = ("context");
21
+ attribute :>> explorerLane = "architecture";
22
+ attribute :>> explorerOrder = 0;
21
23
  // UseEnvironment (IEC 62366-1 3.20) is what the device sits inside —
22
24
  // facility, procedure area, ambient conditions. A context view that
23
25
  // cannot show it is missing half of "where is this used".
@@ -27,7 +29,7 @@ package memo_viewpoints_context_context_viewpoint {
27
29
  // boundary picture. Projects derive their own verbs from it and are
28
30
  // picked up through the specialization closure. The three older
29
31
  // relations remain for models authored before it existed.
30
- attribute :>> allowedRelationshipKinds = ("InteractsInContext", "InteractsWith", "ExchangesWith", "ConnectsPhysically");
32
+ attribute :>> allowedRelationshipKinds = ("InteractsInContext", "InteractsWith", "flow", "bind", "connect");
31
33
  attribute :>> userExtensible = true;
32
34
  }
33
35
  }
@@ -1,4 +1,4 @@
1
- package memo_viewpoints_context_system_context_view {
1
+ package memo_viewpoints_context_views_system_context_view {
2
2
  private import ScalarValues::*;
3
3
 
4
4
  private import memo_viewpoints_definitions::*;
@@ -6,7 +6,7 @@ package memo_viewpoints_context_system_context_view {
6
6
  private import memo_viewpoints_context_context_viewpoint::*;
7
7
 
8
8
  view systemContextView : MemoDiagramView {
9
- expose memo_viewpoints_context_system_context_view::*;
9
+ expose memo_viewpoints_context_views_system_context_view::*;
10
10
  attribute depth = 2;
11
11
  attribute :>> id = "VIEW-CTX-001";
12
12
  attribute :>> name = "SystemContextView";
@@ -9,7 +9,7 @@ package memo_viewpoints_cybersecurity_cybersecurity_viewpoint {
9
9
  attribute :>> name = "CybersecurityViewpoint";
10
10
  attribute :>> title = "Cybersecurity Viewpoint";
11
11
  attribute :>> shortDescription = "Shows assets, trust boundaries, threats, vulnerabilities, cyber hazards, cyber risks, and mitigations.";
12
- attribute :>> longDescription = "Default viewpoint derived from the cybersecurity layer, using STRIDE-style threat categories by default while allowing safety and privacy impacts to be traced into the broader model.";
12
+ attribute :>> description = "Default viewpoint derived from the cybersecurity layer, using STRIDE-style threat categories by default while allowing safety and privacy impacts to be traced into the broader model.";
13
13
  attribute :>> purpose = "Communicate cybersecurity design, threat analysis, and cyber risk posture.";
14
14
  attribute :>> audience = (AudienceKind::securityEngineer);
15
15
  attribute :>> stage = WorkflowStageKind::risk;
@@ -18,7 +18,9 @@ package memo_viewpoints_cybersecurity_cybersecurity_viewpoint {
18
18
  attribute :>> presentationKind = (PresentationKind::custom);
19
19
  attribute :>> concernKinds = (ConcernKind::cybersecurity, ConcernKind::privacy, ConcernKind::safety);
20
20
  attribute :>> includedLayers = ("cybersecurity", "software_structure", "hardware_structure", "interfaces", "risk", "assurance");
21
- attribute :>> allowedElementKinds = ("CybersecurityAsset", "Threat", "Vulnerability", "CyberHazard", "CyberRisk", "CyberMitigation", "SecurityRequirement", "TrustBoundary", "ThreatScenario");
21
+ attribute :>> explorerLane = "assurance";
22
+ attribute :>> explorerOrder = 3;
23
+ attribute :>> allowedElementKinds = ("CybersecurityAsset", "Threat", "Vulnerability", "CyberHazard", "CyberRisk", "CyberMitigation", "SecurityRequirement", "TrustBoundary", "MemoScenario[scenarioKind=threat]");
22
24
  attribute :>> allowedRelationshipKinds = ("ThreatenedBy", "Exploits", "RealizedByScenario", "Mitigates", "DerivesCyberRequirement", "ImpactsSafety", "CrossesTrustBoundary");
23
25
  attribute :>> documentUsage = ("Secure Product Development", "Threat Model", "Cybersecurity Risk Assessment", "QMSR");
24
26
  attribute :>> userExtensible = true;
@@ -1,11 +1,11 @@
1
- package memo_viewpoints_cybersecurity_cybersecurity_assessment_view {
1
+ package memo_viewpoints_cybersecurity_views_cybersecurity_assessment_view {
2
2
  private import ScalarValues::*;
3
3
 
4
4
  private import memo_viewpoints_definitions::*;
5
5
  private import memo_core_enumerations::*;
6
6
 
7
7
  view def MemoCybersecurityAssessmentView :> MemoDocumentView {
8
- attribute :>> viewKind = DocumentViewKind::CybersecurityAssessment;
8
+ attribute :>> viewKind = DocumentViewKind::cybersecurityAssessment;
9
9
  attribute :>> generationRule = "Include cyber risks, exploitability, mitigations, security requirements, verification, residual risk, and postmarket evidence references.";
10
10
  attribute :>> outputKind = (ViewOutputKind::documentSection);
11
11
  attribute :>> presentationKind = (PresentationKind::riskTable);
@@ -1,11 +1,11 @@
1
- package memo_viewpoints_cybersecurity_threat_model_view {
1
+ package memo_viewpoints_cybersecurity_views_threat_model_view {
2
2
  private import ScalarValues::*;
3
3
 
4
4
  private import memo_viewpoints_definitions::*;
5
5
  private import memo_core_enumerations::*;
6
6
 
7
7
  view def MemoCybersecurityThreatModelView :> MemoDocumentView {
8
- attribute :>> viewKind = DocumentViewKind::ThreatModel;
8
+ attribute :>> viewKind = DocumentViewKind::threatModel;
9
9
  attribute :>> generationRule = "Include assets, trust boundaries, threat scenarios, vulnerabilities, mitigations, and trace links to safety/privacy concerns.";
10
10
  attribute :>> outputKind = (ViewOutputKind::documentSection);
11
11
  attribute :>> presentationKind = (PresentationKind::narrativeSection);
@@ -1,4 +1,5 @@
1
1
  package memo_viewpoints_definitions {
2
+ private import Metaobjects::SemanticMetadata;
2
3
  private import ScalarValues::*;
3
4
 
4
5
  private import memo_core_common::*;
@@ -21,6 +22,10 @@ package memo_viewpoints_definitions {
21
22
  attribute userExtensible : Boolean;
22
23
  // Optional navigation grouping interpreted by Memo Architect.
23
24
  attribute group : String;
25
+ // Explorer placement follows the MEMO V-model: Architecture is read
26
+ // top-to-bottom; Assurance is read left-to-right.
27
+ attribute explorerLane : String;
28
+ attribute explorerOrder : Integer;
24
29
  // default diagram kind for a catalog viewpoint (optional)
25
30
  attribute defaultViewKind : DiagramViewKind[0..1];
26
31
  }
@@ -9,7 +9,7 @@ package memo_viewpoints_functional_functional_viewpoint {
9
9
  attribute :>> name = "FunctionalViewpoint";
10
10
  attribute :>> title = "Functional Viewpoint";
11
11
  attribute :>> shortDescription = "Shows system functions, their decomposition, and allocation.";
12
- attribute :>> longDescription = "Default viewpoint derived from the functions layer for what the system does, independent of how it is structured — function trees, function allocation, and behavior triggers.";
12
+ attribute :>> description = "Default viewpoint derived from the functions layer for what the system does, independent of how it is structured — function trees, function allocation, and behavior triggers.";
13
13
  attribute :>> purpose = "Describe the system's functional decomposition and behavior.";
14
14
  attribute :>> audience = (AudienceKind::systemArchitect);
15
15
  attribute :>> stage = WorkflowStageKind::architecture;
@@ -18,7 +18,9 @@ package memo_viewpoints_functional_functional_viewpoint {
18
18
  attribute :>> presentationKind = (PresentationKind::activityDiagram);
19
19
  attribute :>> concernKinds = (ConcernKind::safety, ConcernKind::performance);
20
20
  attribute :>> includedLayers = ("functions");
21
- attribute :>> allowedElementKinds = ("SystemFunction", "FunctionalFlow", "FunctionalFlowStep", "FunctionalScenario", "FunctionalExchange");
21
+ attribute :>> explorerLane = "architecture";
22
+ attribute :>> explorerOrder = 2;
23
+ attribute :>> allowedElementKinds = ("SystemFunction", "ComponentFunction", "FunctionalFlow", "FunctionalFlowStep", "MemoScenario[scenarioKind=functional]", "FunctionalExchange");
22
24
  attribute :>> userExtensible = true;
23
25
  }
24
26
  }