7.2 KiB
OA communication means — independent design critique
Read-only production review, 2026-09-06. Recommendation: add a first-class
CommunicationMean relation over OA Entity/Actor endpoints and reuse the existing
ExchangeAllocation relation. Do not widen the meaning of existing boundary-port
records silently. Root retains the contract decision; no production edits made.
Primary evidence
Capella's OperationalAnalysis.ecore defines CommunicationMean as a specialization of ComponentExchange and exposes sourceEntity/targetEntity as direct aliases of its endpoints (lines 1597–1632). Entity includes actors in its documented operational meaning. The inherited FunctionalAnalysis.ecore defines optional orientation, default false, and allocation of functional exchanges (lines 2522–2545). ComponentExchange also participates in the event/ operation abstraction. These establish a useful shared exchange family, not a requirement to force operational entities through SA typed ports.
Why the smaller-looking BoundaryExchange change is risky
Current RelationKind::permits requires Port→Port. ports::validate_relation
checks participant ownership through each endpoint's parent, Legacy/Standard/Flow
contracts and carried interfaces. validate_relation_context rejects endpoints
with equal parents: applied directly to nested OA sibling entities it would reject
valid communication. ports::validate_exchange_allocation again treats endpoint
parents as performers and classifies Interaction allocation as legacy. Its legacy
branch warns OA users to introduce typed ports they cannot create, and checks only
the forward pairing even for an unoriented boundary.
Projection identifies BoundaryExchange endpoints as ports; endpoint picking,
reconnection, connection creation, interface checks and scenario participant
resolution all contain related assumptions. Changing only permits yields an
inconsistent product. A proper tagged endpoint sum could represent both semantics,
but it requires migrating every BoundaryExchange and all these consumers. A new
relation variant exposes each required exhaustive integration explicitly while
leaving old records, identities and authored source intact.
Small explicit contract to freeze
CommunicationMean { source, target, oriented, items }; distinct same-layer OA Entity or Actor endpoints, optional carried OA ExchangeItems, no child ports. Initialoriented=falsefollows the primary model; users can choose direction. Multiple named means between the same pair remain valid engineering alternatives.ExchangeAllocation { source: mean, target: interaction }is relation-to-relation allocation. Do not duplicate allocated-interaction IDs inside the mean. Preserve old BoundaryExchange→Interaction and BoundaryExchange→FunctionalExchange records.- Match actual direct Activity Allocation owners. Missing/ambiguous allocation is an actionable incomplete-allocation warning; a known contradictory owner is an error. Role realization alone does not silently establish an actual allocation. For unoriented means consider both complete pairings; when one owner is unknown, the other known owner must still belong to at least one admissible pairing.
- The mean carries every allocated Interaction item, using existing item-type satisfaction rules. Editing either item list revalidates its allocations atomically. Means may be created before their Interactions; incomplete work must remain possible without inventing responsibilities or allocating parents.
- ParticipantInteraction scenarios may reference means; OperationalActivity
scenarios/process exchange contributions continue to reference Interactions.
An unoriented ordinary message resolves direction from explicit sender/receiver
lifelines. A correlated same-mean Reply reverses the actual Call binding, including
a reverse Call on an unoriented mean. Keep the existing operation-response
convention rather than invent simplex hardware constraints from
oriented. This direction convention is a Studio decision to specify, not established by the primary schema's orientation sentence alone.
Compatibility and transition traps
transitions::mapped_relation currently clones BoundaryExchange into the other
layer. Direct OA participant endpoints mapped to SA participants are not component
ports. Two OA entities may also map to one System: their operational communication
need not become an external boundary exchange. Never auto-generate SA ports or
self-boundaries from that fact. A bounded first implementation should explicitly
report an unsupported/omitted counterpart until a user chooses the corresponding
SA boundary and its ports; preserve the OA mean and any existing manual trace.
Schema 5 is current. migration_v4::Project4 embeds live Relation/Diagram types;
adding a live variant can accidentally make a schema-4 envelope accept a new
construct. Freeze a deliberate version policy and add negative old-version
source/JSON admission tests. Do not rewrite frozen migration fixtures or reinterpret
legacy ports as entities. An explicit future conversion must account for port-level
artifacts, interface roles, diagrams and endpoint references before removal.
Generic reference traversal must visit items; endpoint visitors alone are insufficient. Deleting a mean removes its allocations, routes, trace links and dependent occurrences, while preserving their Interaction definitions and cross-layer counterparts. Deleting/reparenting an actual work allocation must revalidate the new OA allocation contract without accidentally invoking the SA port-allocation cascade.
Required user journey and falsification tests
Start empty: place two OA entities/actors; create allocated activities and an Interaction; draw/name a Communication means edge between participant cards; select carried items and allocate existing Interactions using a filtered picker. The inspector exposes both communication and activity layers with direct navigation. Render the mean on participant boundaries, keep work allocation nested, and show allocated Interactions as selectable rows rather than extra allocation arrows. Endpoint reconnect preserves UUID/alias/prose/items/routes/artifact owners and retains rejected edits. No OA Port form should appear in this journey.
Acceptance must falsify: mixed-layer/Role/Port/Activity endpoints; same endpoint; wrong/unknown/role-only performer; forward/reverse/unoriented and partial-owner allocation; missing carried items and later item changes; multiple means per pair; reverse unoriented Call and correctly correlated Reply; forbidden process/viewpoint use; folded containers and missing placements; sibling nested entities; exact reconnect/undo/redo; remap/delete/reparent; no automatic SA boundary after participant collapse. Source+JSON+REST must agree, reject atomically, and retain identity and comments through reidentify, include movement and server restart. A standalone OA mean plus later allocation must be usable without SA or LA/PA work.