Cross-model alignment is a fundamental capability of MMEL that enables traceability between different standards, regulations, and organizational implementation models. A single organization typically needs to demonstrate compliance with multiple standards simultaneously, and MMEL provides the mechanisms to express how processes in one model correspond to processes in another.
This document specifies the two mechanisms MMEL provides for cross-model alignment:
In the MMEL ecosystem, models fall into two broad categories:
The mapping relationship is directional: implementation model processes are mapped to reference model processes, indicating that fulfilling the implementation process implies fulfilling the reference requirement.
+---------------------+ +---------------------+
| Implementation | | Reference |
| Model (.mmel) | | Model (.mmel) |
|---------------------| |---------------------|
| role Org { } | | role Manufacturer |
| process Procurement | <===== | process SCM { } |
| map_profile { } | .map | provision P1 { } |
| links { } | file | reference R1 { } |
+---------------------+ +---------------------+
| |
| workspace (.sws) | SDC (.sdc)
v v
+-------------+ +-------------+
| Runtime | | Normative |
| Evidence | | Source |
+-------------+ +-------------+
The MMEL cross-model mapping toolchain supports the following workflow:
MMEL-compliant tools SHALL be able to parse both
map_profile
blocks and
.map
files. Tools SHOULD be able to perform coverage analysis and auto-mapping
discovery. Tools MAY support report template generation.
The
link
construct defines a cross-model reference, allowing a process to
point to a related external model, repository, or web resource. Links are
declared as top-level elements in a
.mmel
file and referenced by processes
via the
links { }
property.
Links provide a lightweight mechanism for declaring that a process has a
relationship to an external model or resource, without specifying the detailed
element-to-element correspondence that
map_profile
or
.map
files provide.
link <LinkID> {
title "Link title"
description "Link description"
link "target-identifier"
type REPO | URL
}
MMEL defines the following link types:
| Type | Description |
|---|---|
REPO
|
References another MMEL model by its namespace identifier. The `link` field contains the target model's namespace string. |
URL
|
References an external web resource. The `link` field contains a URL pointing to the resource. |
TABLE_REFERENCE
|
References an internal table within the current model or a linked model. The `link` field contains the table identifier. |
The
REPO
link type is used to reference another MMEL model. The
link
field
contains the namespace identifier of the target model as declared in its
metadata.namespace
field.
This is the primary link type for cross-model navigation, enabling tools to resolve and load the referenced model.
link Link1 {
title "ISO 13485 Clause 7"
description "Medical devices -- Quality management systems -- Requirements for regulatory purposes"
link "BS13485"
type REPO
}
link Link2 {
title "ISO 13485 clause 8.2"
description "Medical devices -- Quality management systems -- Requirements for regulatory purposes"
link "BS13485"
type REPO
}
In this example, both links reference the
BS13485
namespace, indicating that
the processes using these links relate to the ISO 13485 model. The
title
and
description
fields provide context about which specific clauses are relevant.
The
URL
link type references an external web resource. The
link
field
contains the full URL.
link Link1 {
title "Data Protection Notice Generator"
description "Data Protection Notice Generator"
link "https://apps.pdpc.gov.sg/dp-notice-generator/introduction"
type URL
}
The
TABLE_REFERENCE
link type references an internal table within the current
model. The
link
field contains the identifier of the referenced table
construct.
link TableLink1 {
title "Reference to permitted voltages table"
description "Cross-reference to voltage ratings table"
link "PermittedVoltages"
type TABLE_REFERENCE
}
Processes reference links via the
links { }
property block. A process may
reference multiple links:
process IncorporateProductRealization {
name "Incorporate product realization process"
validate_provision {
Provision6
}
links {
Link1
}
}
process ProductionAndPost-productionInformation {
name "Production and post-production information"
actor Manufacturer
validate_provision {
Provision5
Provision84
}
links {
Link2
}
subprocess Page15
}
The
links
property does not imply a mapping; it merely declares an
associative relationship. For detailed element-to-element alignment, use
map_profile
or
.map
files.
The
map_profile
construct defines element-to-element mappings from the
current model to another model, embedding cross-model alignment directly within
the
.mmel
file. This provides an inline alternative to external
.map
files
for cases where the mapping is simple or where it is convenient to co-locate
the mapping with the model definition.
map_profile <TargetNamespace> {
mapping {
from <SourceElementID>
to <TargetElementID>
}
mapping {
from <SourceElementID>
to <TargetElementID>
}
// ... additional mapping blocks
}
The
map_profile
identifier is the namespace of the target model. Each
mapping
block within the profile defines a single element-to-element
correspondence. The
from
field specifies the source element, and the
to
field specifies the corresponding element in the target model.
Multiple
map_profile
blocks may appear in a single
.mmel
file, each
targeting a different namespace.
The
from
field supports the
Namespace#ElementID
notation for referencing
elements that originate from another model. This is particularly useful in
implementation models that import elements from a reference model and then map
them to local processes.
When the
from
field uses
Namespace#ElementID
notation:
When the
from
field uses a plain identifier (without
#
):
The following example is taken from an implementation model
(
BS20400impl(mapped).mmel
) that maps its local processes to the BS 20400
reference model:
map_profile BS20400 {
mapping {
from totalCostOfOwnership
to TotalCostOfOwnership
}
mapping {
from BS20400#MonetizedExternalities
to MonetizedExternalities
}
mapping {
from GiveRating
to PrequalifySuppliers
}
mapping {
from SupplierExperience
to PrequalifySuppliers
}
mapping {
from SupplierFeedback
to PrequalifySuppliers
}
mapping {
from FormPanel
to PrequalifySuppliers
}
mapping {
from AwardContract
to AwardContract
}
mapping {
from GovernmentRequirement
to ConsultStakeholders
}
mapping {
from ReviewDemand
to AdaptRecommendations
}
mapping {
from ReviewDemand
to EngageStakeholdersSupport
}
mapping {
from Process1
to AggregateDemand
}
}
In this example:
map_profile
provides inline mappings within the model file itself, while
.map
files provide external mappings in JSON format. The two mechanisms are
complementary:
The
.map
file format is a JSON-based format for defining comprehensive
process-to-process mappings between models. Unlike the inline
map_profile
construct,
.map
files support rich metadata including descriptions,
justifications, and report template definitions.
.map
files are the primary mechanism for expressing standards alignment and
implementation traceability in MMEL. They are used when mappings need to be
maintained separately from the model definition, or when additional metadata
(descriptions, justifications, report templates) is required.
MMEL mapping files use the
.map
extension by convention. Files with the
.json
extension containing
MMEL_MAP
format data are also accepted. The
content structure is identical regardless of extension.
A
.map
file contains the following top-level fields:
| Field | Description |
|---|---|
@context
|
The JSON-LD context URI. Always `"https://bsi-ribose-smart.org"`. |
@type
|
The document type. Always ” MMEL_MAP “ . |
id
|
The namespace identifier of the source model. May be an empty string if unspecified. |
mapSet
|
The set of namespace entries, each containing process-to-process mappings. |
docs
|
Report template entries for document generation. |
version
|
Semantic version string matching the source model version. |
The
mapSet
object contains one entry per target model namespace. Each entry
has the following structure:
{
"mapSet": {
"defaultns": {
"id": "defaultns",
"mappings": {}
},
"<TargetNamespace>": {
"id": "<TargetNamespace>",
"mappings": {
"<SourceProcessID>": {
"<TargetProcessID>": {
"description": "...",
"justification": "..."
}
}
}
}
}
}
Each mapping entry maps a source process to a target process with supporting metadata:
| Field | Description |
|---|---|
description
|
Explanation of how the source process addresses or fulfils the target process requirement. May be empty. |
justification
|
Evidence, references, or links supporting the validity of the mapping. May be empty. |
A source process may map to multiple target processes, and multiple source processes may map to the same target process.
The
docs
field contains report template definitions used for document
generation. Each template entry defines a Liquid template that generates a
compliance document (e.g. Statement of Applicability) from the mapping data.
The structure of the
docs
field is:
{
"docs": {
"<template-id>": {
"id": "<template-id>",
"name": "",
"datatype": "role",
"title": "Document Title",
"content": "<Liquid template content>"
}
}
}
See report-templates for detailed specification of the report template system.
The following is a complete
.map
file example from an ISO 27001
implementation:
{
"@context": "https://bsi-ribose-smart.org",
"@type": "MMEL_MAP",
"id": "",
"mapSet": {
"defaultns": {
"id": "defaultns",
"mappings": {}
},
"ISOIEC27001": {
"id": "ISOIEC27001",
"mappings": {
"CrimsonRequirements": {
"UnderstandContext": {
"justification": "Roles are defined in 4.1.6.",
"description": "Yes. To establish, implement, operate, monitor, review, maintain and improve a documented ISMS that covers all relevant external and internal issues."
},
"RiskAndOpportunitiesActions": {
"justification": "Defined in 6.1.",
"description": "Yes. To determine the risks and opportunities that need to be addressed in the ISMS."
}
},
"CrimsonContext": {
"Understandneeds": {
"justification": "Defined in 11.",
"description": "Yes. To establish, implement, operate, monitor, review, maintain and improve a documented ISMS that covers all relevant needs and expectations of interested parties."
},
"ISMS": {
"justification": "Defined in 7.2.",
"description": "Yes. To establish, implement, operate, monitor, review, maintain and improve a documented ISMS in accordance with the requirements of ISO/IEC 27001:2013 Clauses 4 to 10."
}
},
"SoA": {
"DetermineScope": {
"justification": "Defined in the Statement of applicability (SoA)",
"description": "Yes. To determine the boundaries, applicability and scope of the ISMS."
}
}
}
}
},
"docs": {
"applicability-main": {
"id": "applicability-main",
"name": "",
"datatype": "role",
"title": "ISO/IEC 27001:2013 Statement of Applicability",
"content": "=== Statement of applicability\n\n..."
}
},
"version": "v1.0.0-dev1"
}
Files with the
.json
extension may also contain
MMEL_MAP
format data,
identical in structure to
.map
files. The
.json
extension is an acceptable
alternative to
.map
for mapping files. The
version
field is required in all
MMEL_MAP
files regardless of file extension.
MMEL-compliant tools SHALL treat
.map
and
.json
files containing the
@type: "MMEL_MAP"
field identically.
This clause defines the formal semantics of MMEL mappings. Understanding these semantics is essential for correctly interpreting mapping data, performing coverage analysis, and generating compliance reports.
A mapping
A => B
means that fulfilling process A implies fulfilling ALL
requirements of process B. The direction is from the
implementation
(source)
to the
reference
(target):
Implementation Process A ====> Reference Process B
"fulfils" "requires"
This means:
Mappings are NOT transitive at the model level. If model X maps process A to process B in model Y, and model Y maps process B to process C in model Z, it does NOT automatically follow that model X maps process A to process C.
Rationale: Each mapping is an independent claim with its own justification. Transitivity would combine justifications from different contexts without explicit validation.
Model X (Implementation) Model Y (Standard) Model Z (Regulation)
process A process B process C
| | ^
+-- X.map: A => B --+ | |
Y.map: B => C -----------------+
(does NOT imply X: A => C)
To create a valid mapping from A to C, an explicit mapping entry with its own justification MUST be created.
While model-level mappings are non-transitive, transitivity DOES apply within a single model's process hierarchy at the process level:
If process A is mapped to process B, and process B is mapped to process C, and all three processes exist within the same model's process tree, then A => C holds at the process level.
Process A (mapped to B)
|
+-- subprocess containing B (mapped to C)
|
+-- implies A => C (within same model hierarchy)
This enables the auto-mapping discovery system (see auto-mapping ) to infer additional mappings from explicitly declared ones.
MMEL supports many-to-many mapping relationships:
Source Process X ==> Target Process M
Source Process X ==> Target Process N
Source Process Y ==> Target Process M
In this example:
Mappings apply at the process element level. A mapping from process A to process B implies:
Mappings do NOT imply structural equivalence -- the subprocess diagrams, events, and gateways of process A and process B may differ significantly. The mapping asserts only that the outcomes of process A satisfy the requirements of process B.
Mapping coverage analysis determines the extent to which a reference model's processes are addressed by an implementation model's mappings. Coverage is a key indicator of compliance completeness.
MMEL defines four levels of mapping coverage for a reference model process:
| Coverage type | Description |
|---|---|
| Full cover | The reference process is fully addressed by one or more mapped implementation processes. All provisions, data requirements, and actor obligations are satisfied. |
| Minimal cover | At least one implementation process maps to the reference process, but coverage may not be complete. Some provisions or data requirements may not be fully addressed. |
| Partial cover | Some aspects of the reference process are addressed by mapped implementation processes, but significant gaps remain. |
| No cover | No implementation process maps to the reference process. The reference requirement is unaddressed. |
Coverage is determined by analysing the mapping data:
When a parent process is mapped, its subprocesses are considered fully covered by inheritance. This reflects the hierarchical nature of MMEL processes: if a top-level process is mapped, all of its subprocess activities are implicitly covered.
Process A (mapped to Process B) Process B (reference)
| |
+-- Subprocess A1 +-- Subprocess B1
| |
+-- Subprocess A2 +-- Subprocess B2
|
+-- Subprocess A3
Since A => B is mapped:
A1, A2, A3 are considered fully covered (inherited from A)
Inherited coverage applies when:
If a subprocess has its own explicit mapping, that mapping takes precedence over inherited coverage.
Coverage is reported as a set of indicators for each reference model process:
| Indicator | Meaning |
|---|---|
COVERED_FULL
|
The process is fully covered by explicit or inherited mappings. |
COVERED_MINIMAL
|
The process has at least one mapping but may have gaps. |
COVERED_PARTIAL
|
The process is partially addressed with significant gaps. |
NOT_COVERED
|
No mapping exists for this process. |
COVERED_INHERITED
|
The process is covered by inheritance from a parent mapping. |
A coverage summary for a model mapping is expressed as:
Total reference processes: N
Full cover: X (X%)
Minimal cover: Y (Y%)
Partial cover: Z (Z%)
No cover: W (W%)
A mapping is considered complete when all reference processes have at least minimal cover. A mapping is considered comprehensive when all reference processes have full cover.
Auto-mapping discovery is a tooling feature that uses transitive and inherited mapping logic to infer additional mappings beyond those explicitly declared. This reduces the manual effort required to create comprehensive mappings and helps identify gaps in coverage.
Auto-mapping discovery operates on a set of loaded models and their associated mapping data. The following prerequisites apply:
The auto-mapping discovery process follows these steps:
Load all reference models and implementation models into the tool's workspace.
Identify the bridge model -- the model whose processes serve as the intermediate link between two other models. The bridge model has mappings both from a source model and to a destination model.
Select the destination models for which auto-mappings should be discovered. These are models that are not directly mapped from the implementation model but can be reached through the bridge model.
Apply the following rules to discover implicit mappings:
Transitive discovery follows process-level transitivity (see mapping-semantics ):
Implementation Model Bridge Model Destination Model
process A process B process C
| | ^
+-- A => B (explicit) | |
+-- B => C (explicit) ----+
|
A => C (discovered, transitive) ---+
The discovered mapping
A => C
is marked as transitive and includes a
reference to the intermediate mapping through B.
Inherited discovery propagates mappings from parent processes to their subprocesses:
Implementation Model Reference Model
process Parent (mapped to RefParent)
| |
+-- subprocess ChildA +-- subprocess RefChildA
| |
+-- subprocess ChildB +-- subprocess RefChildB
Since Parent => RefParent:
ChildA => RefChildA (discovered, inherited)
ChildB => RefChildB (discovered, inherited)
Auto-discovered mappings are annotated with provenance metadata:
| Metadata field | Description |
|---|---|
discoveryMethod
|
`"transitive"` or `"inherited"`, indicating how the mapping was discovered. |
intermediateMapping
|
For transitive mappings, the ID of the intermediate mapping used. |
parentMapping
|
For inherited mappings, the ID of the parent mapping. |
Discovered mappings are considered lower confidence than explicit mappings. Tools SHOULD present them differently (e.g. with a distinct visual indicator) and SHOULD allow users to validate or reject individual discovered mappings.
Auto-mapping discovery has the following limitations:
The MMEL mapping system includes a report template mechanism that enables
generation of compliance documents from mapping data. Report templates use the
Liquid template language and are stored within the
docs
section of
.map
files.
Report templates use the Liquid template language ( https://shopify.github.io/liquid/ ). Liquid provides a safe, designer-friendly templating syntax with three core constructs:
The report template engine provides the following environment objects to templates:
The
map
object is an array of
MappingRecord
objects, one for each mapping
entry in the loaded mapping data. Each
MappingRecord
has the following
properties:
| Property | Description |
|---|---|
clause
|
The clause identifier of the target process's associated reference. |
title
|
The title/name of the target process. |
description
|
The mapping description text. |
justification
|
An array of justification strings for this mapping. |
The
map
array is ordered by clause number.
The
raw
object provides direct access to the
MapSet
objects from the
.map
file. This gives templates access to the full mapping data structure,
including namespace information and nested mapping entries.
Each
MapSet
entry contains:
| Property | Description |
|---|---|
id
|
The namespace identifier. |
mappings
|
The nested mapping structure (source process to target process with description and justification). |
The
imodel
object provides access to the implementation model data, and the
rmodel
object provides access to the reference model data. These allow
templates to query model metadata, process definitions, and provisions.
The following example shows a Liquid template that generates a Statement of
Applicability (SoA) in AsciiDoc format. This template is stored in the
docs
section of a
.map
file:
=== Statement of applicability
.SoA for main document
[cols="1,1,1,1"]
|===
|Clause
|Title
|Description
|Justification
{% for r in map %}
{% assign first = r.clause | slice: 0 %}
{% unless first == "A" %}
{% if r.justification.length == 0 %}
4+|Clause {{r.clause}} {{r.title}}
{% else %}
{% for just in r.justification %}
|{{r.clause}}
|{{r.title}}
|
|{{just}}
{% endfor %}
{% endif %}
{% endunless %}
{% endfor %}
|===
.SoA for Annex A
[cols="1,1,1,1"]
|===
|Clause
|Title
|Description
|Justification
{% for r in map %}
{% assign first = r.clause | slice: 0 %}
{% if first == "A" %}
{% if r.justification.length == 0 %}
4+|Clause {{r.clause}} {{r.title}}
{% else %}
{% for just in r.justification %}
|{{r.clause}}
|{{r.title}}
|{{r.description}}
|{{just}}
{% endfor %}
{% endif %}
{% endif %}
{% endfor %}
|===
This template:
The template engine provides the following input objects:
| Object | Type | Description |
|---|---|---|
map
|
MappingRecord[]
|
Flat array of all mapping records, sorted by clause. |
raw
|
MapSet[]
|
Raw mapping data organized by namespace. |
imodel
|
Model
|
The implementation model definition. |
rmodel
|
Model
|
The reference model definition. |
| Property | Type | Description |
|---|---|---|
clause
|
string
|
Clause identifier (e.g. "4.1", "A.9.1.1"). |
title
|
string
|
Process or requirement title. |
description
|
string
|
Mapping description text. |
justification
|
string[]
|
Array of justification strings. |
Templates are stored in the
docs
field of
.map
files:
{
"docs": {
"applicability-main": {
"id": "applicability-main",
"name": "",
"datatype": "role",
"title": "ISO/IEC 27001:2013 Statement of Applicability",
"content": "<Liquid template content as a string>"
}
}
}
The
content
field contains the Liquid template source as a single string
(with
\n
for newlines). The
title
field provides a human-readable title
for the generated document.
A MMEL-compliant tool that supports report templates: