@memoarchitect/ontology 0.15.1 → 0.15.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.
package/README.md CHANGED
@@ -25,7 +25,7 @@ pin an exact release; the package has no repository or runtime dependency on Mem
25
25
  Tools or Memo Architect.
26
26
 
27
27
  ```bash
28
- pnpm add @memoarchitect/ontology@0.15.1
28
+ pnpm add @memoarchitect/ontology@0.15.3
29
29
  ```
30
30
 
31
31
  > **Pre-1.0 notice:** ontology names, relationships, and package layout may
@@ -7,7 +7,7 @@
7
7
  # (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
8
8
  # removed at the native semantic flip and are now rejected if present.
9
9
  name: '@memoarchitect/extension-aadl'
10
- version: 0.15.1
10
+ version: 0.15.3
11
11
  description: AADL (SAE AS5506) correspondence profile and runtime component families
12
12
  license: MIT
13
13
  tags:
@@ -7,7 +7,7 @@
7
7
  # (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
8
8
  # removed at the native semantic flip and are now rejected if present.
9
9
  name: '@memoarchitect/example-extension-clinical'
10
- version: 0.15.1
10
+ version: 0.15.3
11
11
  description: Example methodology extension for clinical-procedure vocabulary
12
12
  license: MIT
13
13
  tags:
@@ -7,7 +7,7 @@
7
7
  # (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
8
8
  # removed at the native semantic flip and are now rejected if present.
9
9
  name: '@memoarchitect/extension-cloud'
10
- version: 0.15.1
10
+ version: 0.15.3
11
11
  description: Networked services and managed data stores
12
12
  license: MIT
13
13
  tags:
@@ -7,7 +7,7 @@
7
7
  # (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
8
8
  # removed at the native semantic flip and are now rejected if present.
9
9
  name: '@memoarchitect/extension-container'
10
- version: 0.15.1
10
+ version: 0.15.3
11
11
  description: OCI container images and container runtimes as deployment content
12
12
  license: MIT
13
13
  tags:
@@ -7,7 +7,7 @@
7
7
  # (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
8
8
  # removed at the native semantic flip and are now rejected if present.
9
9
  name: '@memoarchitect/extension-messaging'
10
- version: 0.15.1
10
+ version: 0.15.3
11
11
  description: Publish/subscribe messaging — topics, brokers, and delivery semantics
12
12
  license: MIT
13
13
  tags:
@@ -7,7 +7,7 @@
7
7
  # (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
8
8
  # removed at the native semantic flip and are now rejected if present.
9
9
  name: '@memoarchitect/extension-ros'
10
- version: 0.15.1
10
+ version: 0.15.3
11
11
  description: ROS 2 nodes, messages, topic/service/action interfaces, QoS, and containerized deployment
12
12
  license: MIT
13
13
  tags:
@@ -7,7 +7,7 @@
7
7
  # (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
8
8
  # removed at the native semantic flip and are now rejected if present.
9
9
  name: '@memoarchitect/methodology-default'
10
- version: 0.15.1
10
+ version: 0.15.3
11
11
  description: "MEMO default medical-device methodology \u2014 selects viewpoints/views/DHF documents from @memoarchitect/ontology and adds rules, gates, patterns, profiles, and workflow."
12
12
  license: MIT
13
13
  tags:
@@ -7,7 +7,7 @@
7
7
  # (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
8
8
  # removed at the native semantic flip and are now rejected if present.
9
9
  name: '@memoarchitect/methodology-gpca'
10
- version: 0.15.1
10
+ version: 0.15.3
11
11
  description: "GPCA infusion pump methodology \u2014 subtraction-based tailoring of @memoarchitect/methodology-default for the non-networked prototype variant. Excludes cybersecurity and SOUP."
12
12
  license: MIT
13
13
  tags:
@@ -7,7 +7,7 @@
7
7
  # (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
8
8
  # removed at the native semantic flip and are now rejected if present.
9
9
  name: '@memoarchitect/ontology'
10
- version: 0.15.1
10
+ version: 0.15.3
11
11
  description: "MEMO \u2014 the single canonical medical-device ontology: core semantics, the Arcadia-inspired architecture layers (context, requirements, behavior, structure, interfaces, risk, cybersecurity,\
12
12
  \ assurance, \u2026), compliance, viewpoints, views, and invariant rules. One namespace (memo::), one src/ tree."
13
13
  license: MIT
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memoarchitect/ontology",
3
- "version": "0.15.1",
3
+ "version": "0.15.3",
4
4
  "packageManager": "pnpm@9.15.0",
5
5
  "description": "MEMO — Medical Engineering Modelling Ontology. Pure SysML v2 medical-device ontology with native constraints, portable to any conformant SysML v2 tool (SysIDE, SysON, sysand).",
6
6
  "scripts": {
@@ -7,7 +7,7 @@
7
7
  # (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
8
8
  # removed at the native semantic flip and are now rejected if present.
9
9
  name: '@memoarchitect/medical-modeling-profile'
10
- version: 0.15.1
10
+ version: 0.15.3
11
11
  description: Closure rules and viewpoints for medical device modeling
12
12
  license: MIT
13
13
  tags:
@@ -73,6 +73,18 @@ package memo_architecture_logical_structure {
73
73
  enum hardware;
74
74
  }
75
75
 
76
+ // Who builds a system or system of systems: this organisation, or others.
77
+ // Distinct from `componentRole`, which says what a logical component DOES
78
+ // (an `externalSystem` is a role in a context). This says whose it is to
79
+ // build, which decides what the project is responsible for delivering and
80
+ // verifying versus what it only interfaces with.
81
+ enum def SystemOriginKind {
82
+ /** Built by this organisation: the project delivers and verifies it. */
83
+ enum internal;
84
+ /** Built by others: the project interfaces with it and relies on what its maker states. */
85
+ enum external;
86
+ }
87
+
76
88
  // ─── System hierarchy ────────────────────────────────────────
77
89
  // Three types rather than three role values, because they differ in what
78
90
  // they may CONTAIN — and containment legality cannot live on an attribute.
@@ -91,6 +103,7 @@ package memo_architecture_logical_structure {
91
103
  // battery are not — which is why ownership is recorded here and is the
92
104
  // attribute that distinguishes an SoS from a merely large system.
93
105
  attribute systemBoundaryDescription : String;
106
+ attribute origin : SystemOriginKind[0..1];
94
107
  attribute constituentOwnership : String;
95
108
  // A constituent may itself coordinate systems-of-systems, or it may be
96
109
  // an independently operated system. Subsystems and components remain
@@ -101,6 +114,7 @@ package memo_architecture_logical_structure {
101
114
 
102
115
  part def System specializes LogicalComponent {
103
116
  attribute systemBoundaryDescription : String;
117
+ attribute origin : SystemOriginKind[0..1];
104
118
  part system : System[0..*];
105
119
  part subsystem : Subsystem[0..*];
106
120
  part component : LogicalComponent[0..*];
@@ -29,6 +29,12 @@ package memo_assurance_safety_risk {
29
29
  attribute estimationBasis : String;
30
30
  attribute analysisContext : String;
31
31
  attribute foreseeableMisuseIncluded : Boolean;
32
+ doc /* The risk that remains after the controls (ISO 14971 clause 7) is the same risk
33
+ * re-estimated, so a register that holds one row per risk states it here. A
34
+ * ResidualRisk part is for a model that evaluates it as an element of its own. */
35
+ attribute residualProbabilityEstimate : ProbabilityKind[0..1];
36
+ attribute residualSeverityEstimate : SeverityKind[0..1];
37
+ attribute residualBenefitRiskRequired : Boolean[0..1];
32
38
  }
33
39
  part def ResidualRisk specializes Risk {
34
40
  attribute benefitRiskRequired : Boolean;
@@ -40,10 +46,12 @@ package memo_assurance_safety_risk {
40
46
  attribute acceptabilityThresholds : String;
41
47
  }
42
48
  // `DesignControlRiskRow` was a denormalized spreadsheet transcription.
43
- // Risk rows now decompose into the ISO 14971 chain below: Risk owns its
44
- // Hazard, SequenceOfEvents, HazardousSituation, and Harm items, linked by
45
- // TracesRisk / LeadsToHarm, with ResidualRisk after mitigation. The risk
46
- // itself is reached by EstimatedFor / ReducedBy / EvaluatedIn below.
49
+ // Risk rows now decompose into the ISO 14971 chain below: a Hazard,
50
+ // SequenceOfEvents, HazardousSituation and Harm are independent elements, not
51
+ // owned by a risk, because the same hazard is the hazard of many risks. A Risk
52
+ // is linked to each by EstimatedFor, and the chain runs through TracesRisk /
53
+ // LeadsToHarm, with ResidualRisk after mitigation. The risk itself is reached
54
+ // by EstimatedFor / ReducedBy / EvaluatedIn below.
47
55
  // A device characteristic whose implementation, failure, or misuse can
48
56
  // affect safety. This is the modelable output of ISO 14971 §5.3.
49
57
  part def SafetyRelatedCharacteristic specializes MemoPart {
@@ -126,6 +126,26 @@ package memo_core_relationships {
126
126
  // inherited `rationale` — an untyped link with no stated reason is an
127
127
  // audit gap, not a model fact.
128
128
 
129
+ // An item belongs to the scope of one system or system of systems: a need,
130
+ // requirement, risk or verification case that describes, constrains or
131
+ // assesses that system and is its to deliver or verify. Imported records
132
+ // arrive with no design element to anchor them (a requirement is not
133
+ // allocated to anything yet), so this is how an import says whose they are;
134
+ // without it they are Unassigned in every workspace. The target is the
135
+ // system, typed as a part (a System and a SystemOfSystems both are). The
136
+ // source stays untyped: the items span metaclasses (a need is a requirement
137
+ // def, a risk an item, a verification case an action), as for DerivesFrom.
138
+ connection def ScopedTo :> MemoRelationship {
139
+ end scopedItem :>> source;
140
+ end scopeSystem : MemoPart :>> target;
141
+ }
142
+ abstract connection scopedToLinks : ScopedTo[*];
143
+ metadata def <scopedTo> ScopedToMetadata :> SemanticMetadata {
144
+ :> annotatedElement : SysML::ConnectionDefinition;
145
+ :> annotatedElement : SysML::ConnectionUsage;
146
+ :>> baseType = scopedToLinks meta SysML::Usage;
147
+ }
148
+
129
149
  connection def DerivesFrom :> MemoRelationship {
130
150
  // Drivers span metaclasses — a need is a requirement def, a hazard an
131
151
  // item, a threat an item — so the source end stays untyped. The target
@@ -163,6 +163,9 @@ package memo_core_relationships_workspace_membership {
163
163
  // system through the relation that ties it to one (a failure mode, a control measure's allocation).
164
164
  // Decided 2026-10-14: a risk chain with no such tie is Unassigned, which is the finding, not a gap here.
165
165
  part membershipTracesRisk : WorkspaceMembershipEntry { attribute :>> relation = "tracesRisk"; attribute :>> direction = WorkspaceMembershipKind::neither; }
166
+ // An item scoped to a system follows that system: the whole purpose of the relation. The items an
167
+ // item owns (a risk's hazard chain) join with it by ownership, so one link anchors a chain.
168
+ part membershipScopedTo : WorkspaceMembershipEntry { attribute :>> relation = "scopedTo"; attribute :>> direction = WorkspaceMembershipKind::sourceFollowsTarget; }
166
169
  // A harm follows the hazardous situation that leads to it.
167
170
  part membershipLeadsToHarm : WorkspaceMembershipEntry { attribute :>> relation = "leadsToHarm"; attribute :>> direction = WorkspaceMembershipKind::targetFollowsSource; }
168
171
  // Neither: a scenario illustrates a hazard without being part of it.
@@ -40,6 +40,7 @@ package memo {
40
40
  public import memo_architecture_variability::*;
41
41
 
42
42
  public import memo_viewpoints_definitions::*;
43
+ public import memo_viewpoints_matrix::*;
43
44
  public import memo_viewpoints_stakeholders_concerns::*;
44
45
  public import memo_viewpoints_catalog::*;
45
46
  public import memo_viewpoints_context_context_viewpoint::*;
@@ -16,7 +16,7 @@ package memo_methodology_profiles {
16
16
  private import memo_core_common::MemoIdentity;
17
17
  part mdCoreLibrary : MethodologyLibrary {
18
18
  @MemoIdentity { :>> providedId = "METHLIB-001"; :>> label = "MedicalDeviceMethodologyLibrary"; }
19
- attribute :>> version = "0.15.1";
19
+ attribute :>> version = "0.15.3";
20
20
  attribute :>> domain = "medical device modeling";
21
21
  doc /* Methodology layer for selecting, restricting, sequencing, tailoring, and lightly extending use of the medical-device ontology. */
22
22
  }
@@ -37,7 +37,7 @@ package memo_methodology_profiles {
37
37
  // second scope authority.
38
38
  part mdDefaultDefinition : MethodologyDefinition {
39
39
  @MemoIdentity { :>> providedId = "METH-MD-DEFAULT"; :>> label = "MedicalDeviceDefault"; }
40
- attribute :>> version = "0.15.1";
40
+ attribute :>> version = "0.15.3";
41
41
  attribute :>> domain = "medical device modeling";
42
42
  doc /* MEMO default medical-device methodology. Selects every layer, discipline, standard, artifact kind, and viewpoint the resolved ontology and extension packages provide. */
43
43
  attribute :>> scopeMode = ScopeModeKind::allAvailable;
@@ -0,0 +1,93 @@
1
+ // Traceability matrices and design structure matrices, declared as views.
2
+ //
3
+ // A matrix is a native SysML `view` usage (ViewUsage, SysML-textual-bnf.kebnf:1610)
4
+ // typed by a `view def` (ViewDefinition, :1584), like every other MEMO view, so
5
+ // it is written, derived, listed and moved by the same machinery. It declares no
6
+ // `expose`: ViewBodyItem makes Expose optional (:1618-1622), and a matrix shows
7
+ // what its axes select, not a package's contents.
8
+ //
9
+ // An axis is a part usage (PartUsage, :627) typed by MemoMatrixAxis. It is
10
+ // hand-picked elements, a memo-query, or both. A query is stored as its text and
11
+ // evaluated against the model when the matrix opens, so the matrix answers the
12
+ // same question after the model has grown; the ids it matched are never stored.
13
+ package memo_viewpoints_matrix {
14
+ private import ScalarValues::*;
15
+
16
+ private import memo_core_common::*;
17
+ private import memo_core_enumerations::*;
18
+ private import memo_viewpoints_definitions::*;
19
+
20
+ enum def MatrixOrderingKind {
21
+ enum natural;
22
+ enum kind;
23
+ enum partition;
24
+ enum cluster;
25
+ }
26
+
27
+ enum def MatrixGroupKind {
28
+ enum owningPackage;
29
+ enum memoQuery;
30
+ enum clusterResult;
31
+ }
32
+
33
+ /**
34
+ * One axis of a matrix: the elements it lists.
35
+ *
36
+ * `includeElementKinds` and `includeElementIds` are inherited from the
37
+ * selection query a view already carries; the ids are hand-picked elements,
38
+ * by qualified name. `query` adds the text of a `memo-query` block, the same
39
+ * query language the DHF templates use. The axis is the union of the two.
40
+ */
41
+ part def MemoMatrixAxis :> ViewSelectionQuery {
42
+ attribute query : String[0..1];
43
+ }
44
+
45
+ /** A named group of rows in a design structure matrix. */
46
+ part def MemoMatrixGroup :> MemoPart {
47
+ attribute groupName : String;
48
+ attribute groupedBy : MatrixGroupKind;
49
+ /** A package qualified name, or the text of a `memo-query`; empty for a cluster result. */
50
+ attribute expression : String[0..1];
51
+ }
52
+
53
+ /**
54
+ * Which elements the relationship types connect, and how the matrix reads
55
+ * them. The relationship types are the model's own, never a list kept here.
56
+ */
57
+ view def MemoTraceabilityMatrixView :> MemoDiagramView {
58
+ attribute :>> viewKind = DiagramViewKind::grid;
59
+ @MemoIdentity { :>> shortDescription = "Rows traced to columns by relationships, each axis chosen by hand or by query."; }
60
+ /**
61
+ * The system or system of systems the matrix is about: the qualified name
62
+ * of its definition (a workspace root). Its queries run in that workspace.
63
+ * A string, because a `ref` cannot name a definition.
64
+ */
65
+ attribute system : String[0..1];
66
+ part rowAxis : MemoMatrixAxis[0..1];
67
+ part columnAxis : MemoMatrixAxis[0..1];
68
+ /** Relationship types that count as a link; empty means any. */
69
+ attribute linkTypes : String[*];
70
+ }
71
+
72
+ /**
73
+ * A design structure matrix has one axis because rows equal columns. The
74
+ * options after `axis` apply to a dependency reading and are not on the
75
+ * traceability definition.
76
+ */
77
+ view def MemoDependencyMatrixView :> MemoDiagramView {
78
+ attribute :>> viewKind = DiagramViewKind::grid;
79
+ @MemoIdentity { :>> shortDescription = "Dependencies among one set of elements, chosen by hand or by query."; }
80
+ /** The system or system of systems the matrix is about, as on the traceability matrix. */
81
+ attribute system : String[0..1];
82
+ part axis : MemoMatrixAxis[0..1];
83
+ /** Relationship types that put a mark in a cell; empty means any. */
84
+ attribute dependencyTypes : String[*];
85
+ /** Relationship types that build the nesting, so the hierarchy is the one the model declares. */
86
+ attribute containmentTypes : String[*];
87
+ attribute symmetric : Boolean[0..1];
88
+ attribute ordering : MatrixOrderingKind[0..1];
89
+ part groups : MemoMatrixGroup[*];
90
+ /** Elements to highlight on the axis and in the cell inspector. */
91
+ part criticalElements : MemoMatrixAxis[0..1];
92
+ }
93
+ }