SHACL shapes
Generated page
This page is generated from ontology/shapes/seam-shapes.ttl on every docs build, so it always matches the file CI validates.
Seam Validation Shapes. The project's own methodology applied to itself: constraints on the seam predicates live HERE, as SHACL shapes over the model graph — not as rdfs:domain/range in seam.ttl, because RDFS ranges infer types onto violators instead of rejecting them. Every shape below encodes a claim the prose ontology comments were already making; validating a model against this file is what turns 'we follow the seam design rules' into a machine-verifiable statement.
Validate with the ontology files merged into the data graph: sh:class checks subclass closure (e.g. proc:ServiceTask -> proc:Task) from triples in the data.
Every example model is validated against these shapes in CI, and the viewer shows the result on every page as its model-health badge. CI also proves that the shapes reject deliberately broken seams.
Navigation backbone
seamsh:ModelShape
Applies to instances of seam:Model.
seam:notation: Every seam:Model has exactly one seam:notation, and it is a seam:Notation.- BPMN and DMN models must carry a seam:renderPayload (the native XML is the render source).
seamsh:DetailedByShape
Applies to objects of seam:detailedBy.
- seam:detailedBy points at a seam:Model.
seamsh:InModelShape
Applies to objects of seam:inModel.
- seam:inModel points at a seam:Model.
Reveal modes
seamsh:RevealShape
Applies to the node seam:detailedBy, and the node seam:presents, and the node seam:exposes, and the node seam:consumes, and the node seam:deployedTo, and the node seam:executes, and the node seam:schedules, and the node seam:owns, and the node seam:storedIn, and the node seam:triggers, and the node seam:completedOn, and the node seam:visibleWhen, and the node seam:submitsTo, and the node seam:rendersComponent, and the node seam:decidedBy, and the node seam:invokes, and the node seam:publishesTo, and the node seam:subscribesTo, and the node seam:reads, and the node seam:writes, and the node seam:lifecycle, and the node seam:aggregateMember, and the node seam:fires, and the node seam:acceptsShape, and the node seam:returnsShape, and the node seam:mediaKind, and the node seam:implementedBy, and the node seam:catches, and the node seam:governedBy, and the node seam:conformsTo, and the node seam:offersClass, and the node seam:usesGenerator, and the node seam:profileShapes, and the node seam:realizes.
seam:reveal: Every seam predicate declares exactly one seam:reveal, one of seam:Open, seam:Nest or seam:Layer.
Architecture ↔ everything
seamsh:PresentsShape
Applies to subjects of seam:presents.
- Only an arch:Container seam:presents a UI surface.
seam:presents: seam:presents points at a seam:Model (an IFML surface).
seamsh:ExposesShape
Applies to subjects of seam:exposes.
seam:exposes: seam:exposes points at an operation or a channel.
seamsh:ConsumesShape
Applies to subjects of seam:consumes.
seam:consumes: seam:consumes points at an operation or a channel.
seamsh:DeployedToShape
Applies to subjects of seam:deployedTo.
seam:deployedTo: seam:deployedTo points at an arch:DeploymentNode.
seamsh:ExecutesShape
Applies to subjects of seam:executes.
seam:executes: seam:executes points at a proc:Process.
Domains and bounded contexts (ADR-0030)
seamsh:DomainShape
Applies to instances of arch:Domain.
rdfs:label: An arch:Domain has exactly one rdfs:label.arch:classification: An arch:Domain has exactly one arch:classification: arch:Core, arch:Supporting or arch:Generic.
seamsh:BoundedContextShape
Applies to instances of arch:BoundedContext.
rdfs:label: An arch:BoundedContext has exactly one rdfs:label.nde3ac20dbe494c7f981f636ec710ca35b41: An arch:BoundedContext is arch:contains'ed by exactly one arch:Domain.seam:owns: An arch:BoundedContext seam:owns exactly one model whose seam:notation is seam:Ontology.
seamsh:ModelOwnerShape
Applies to instances of seam:Model.
nde3ac20dbe494c7f981f636ec710ca35b46: A seam:Model is seam:owns'ed by at most one arch:BoundedContext.- Once the dataset declares an arch:BoundedContext, every seam:Model whose notation is not seam:C4 is seam:owns'ed by exactly one.
seamsh:OwnsTargetShape
Applies to objects of seam:owns.
- seam:owns points at a seam:Model.
Context-map relationships (ADR-0032)
seamsh:ContextRelationshipShape
Applies to instances of arch:ContextRelationship.
arch:upstream: An arch:ContextRelationship has exactly one arch:upstream, an arch:BoundedContext.arch:downstream: An arch:ContextRelationship has exactly one arch:downstream, an arch:BoundedContext.arch:relationshipType: An arch:ContextRelationship has exactly one arch:relationshipType: arch:CustomerSupplier, arch:Conformist, arch:AntiCorruptionLayer, arch:PublishedLanguage or arch:SharedKernel.- An arch:ContextRelationship's arch:upstream and arch:downstream are two different contexts.
- Two contexts have at most one arch:ContextRelationship between them, in either direction.
seamsh:ContextRelationshipTermsShape
Applies to subjects of arch:upstream, and subjects of arch:downstream, and subjects of arch:relationshipType.
- Only an arch:ContextRelationship has an arch:upstream, arch:downstream or arch:relationshipType.
UI ↔ process
seamsh:TriggersShape
Applies to subjects of seam:triggers.
- Only an ifml:Event seam:triggers behavior.
seam:triggers: seam:triggers points at a process or a decision.
seamsh:CompletedOnShape
Applies to subjects of seam:completedOn.
- Only a proc:UserTask seam:completedOn a form.
seam:completedOn: seam:completedOn points at one ifml:Form.
seamsh:VisibleWhenShape
Applies to subjects of seam:visibleWhen.
seam:visibleWhen: seam:visibleWhen points at a state:State.
UI ↔ communication
seamsh:SubmitsToShape
Applies to subjects of seam:submitsTo.
- Only an ifml:Event seam:submitsTo an operation.
seam:submitsTo: seam:submitsTo points at a hydra:Operation.
seamsh:RendersComponentShape
Applies to subjects of seam:rendersComponent.
- Only a hydra:Operation seam:rendersComponent.
seam:rendersComponent: seam:rendersComponent points at an ifml:ViewComponent.
seamsh:SwapShape
Applies to subjects of ifml:swap.
- Only an ifml:NavigationFlow carries ifml:swap.
ifml:swap: ifml:swap is at most one of ifml:Replace, ifml:Append or ifml:Prepend.
seamsh:BoundToShape
Applies to subjects of ifml:boundTo.
- Only an ifml:Parameter is ifml:boundTo a property.
ifml:boundTo: ifml:boundTo names at most one property IRI.
seamsh:OrderShape
Applies to subjects of ifml:order.
- Only an ifml:ViewComponent carries ifml:order.
ifml:order: ifml:order is at most one xsd:integer per component.
seamsh:OrderUniqueShape
Applies to subjects of ifml:order.
- ifml:order is unique among the components of one ViewContainer.
seamsh:PageComponentOrderShape
Applies to objects of ifml:contains.
- A component of a page (an ifml:ViewContainer with an ifml:path, or the landmark) has exactly one ifml:order.
IFML structure the generators rely on (backlog K1)
seamsh:ComponentKindShape
Applies to instances of ifml:ViewComponent.
- An ifml:ViewComponent is exactly one of ifml:List, ifml:Details or ifml:Form.
seamsh:ComponentReadsShape
Applies to instances of ifml:List, and instances of ifml:Details.
seam:reads: An ifml:List or ifml:Details seam:reads exactly one shape, the data it shows.
seamsh:ListEventShape
Applies to instances of ifml:List.
ifml:hasEvent: An ifml:List has exactly one ifml:hasEvent, the event its rows raise.
seamsh:FormWritesShape
Applies to instances of ifml:Form.
seam:writes: An ifml:Form seam:writes exactly one shape, the data it submits.- An ifml:Form has exactly one ifml:hasEvent event that seam:submitsTo an operation.
seamsh:VisibleWhenGuardShape
Applies to subjects of seam:visibleWhen.
seam:reads: A component with seam:visibleWhen seam:reads the shape whose lifecycle state guards it.- Each seam:visibleWhen state is a state:hasState of the seam:lifecycle of the shape the component seam:reads, its own or that of its sh:targetClass.
seamsh:InteractionModelShape
Applies to instances of ifml:InteractionModel.
nde3ac20dbe494c7f981f636ec710ca35b88: An ifml:InteractionModel is seam:presents-ed by exactly one container.- A model with an IFML layer has exactly one ifml:ViewContainer with ifml:isLandmark true (the app's entry page).
seamsh:ServedPageShape
Applies to subjects of ifml:path, and subjects of ifml:isLandmark.
nde3ac20dbe494c7f981f636ec710ca35b91: A page (an ifml:ViewContainer with an ifml:path, or the landmark) is ifml:contains-ed by exactly one ifml:InteractionModel.
seamsh:EventOwnerShape
Applies to instances of ifml:Event.
nde3ac20dbe494c7f981f636ec710ca35b94: An ifml:Event is the ifml:hasEvent of exactly one ifml:ViewContainer or ifml:ViewComponent.
seamsh:EventNavigationShape
Applies to instances of ifml:Event.
- An event of an ifml:List, or one that seam:submitsTo an operation, is the ifml:source of exactly one ifml:NavigationFlow.
seamsh:InteractionFlowShape
Applies to instances of ifml:InteractionFlow.
ifml:source: ifml:source points at an ifml:Event, ifml:ViewContainer or ifml:ViewComponent.ifml:target: ifml:target points at an ifml:Event, ifml:ViewContainer or ifml:ViewComponent.
seamsh:ItemSwapShape
Applies to subjects of ifml:swap.
- A flow that ifml:swap ifml:Append or ifml:Prepend has an ifml:Details as its ifml:target (only a Details has an item list).
seamsh:ListLinkShape
Applies to objects of ifml:target.
- The ifml:target of the NavigationFlow from an ifml:List's event is seam:rendersComponent-ed by exactly one GET operation.
seamsh:SubmitConsumedShape
Applies to subjects of seam:submitsTo.
- The container that seam:presents a form's interaction model seam:consumes the operation the form's event seam:submitsTo.
seamsh:CompletedOnFormShape
Applies to objects of seam:completedOn.
nde3ac20dbe494c7f981f636ec710ca35b118: A form is seam:completedOn by at most one user task (ADR-0009).
seamsh:BoundToWrittenShape
Applies to subjects of ifml:boundTo.
- A parameter of an ifml:Form is ifml:boundTo the sh:path of a datatype, category or flattened sh:node property of the shape the form seam:writes.
Process ↔ decisions, communication, data
seamsh:DecidedByShape
Applies to subjects of seam:decidedBy.
- seam:decidedBy connects only business-rule tasks to decisions.
seam:decidedBy: seam:decidedBy points at a dec:Decision.
seamsh:InvokesShape
Applies to subjects of seam:invokes.
- Only a proc:ServiceTask seam:invokes an operation.
seam:invokes: seam:invokes points at a hydra:Operation.
seamsh:PublishesToShape
Applies to subjects of seam:publishesTo.
- Only a proc:MessageThrowEvent, a proc:ServiceTask or a state:Transition seam:publishesTo a channel (D046, ADR-0031).
seam:publishesTo: seam:publishesTo points at a comm:Channel.
seamsh:SubscribesToShape
Applies to subjects of seam:subscribesTo.
seam:subscribesTo: seam:subscribesTo points at a comm:Channel.
seamsh:ReadsShape
Applies to objects of seam:reads.
- seam:reads points at a sh:NodeShape.
seamsh:WritesShape
Applies to objects of seam:writes.
- seam:writes points at a sh:NodeShape.
Data ↔ lifecycle
seamsh:LifecycleShape
Applies to subjects of seam:lifecycle.
- Only an owl:Class or a sh:NodeShape carries a seam:lifecycle (ADR-0031).
seam:lifecycle: seam:lifecycle points at a state:StateMachine.
seamsh:EffectiveLifecycleShape
Applies to instances of sh:NodeShape.
- A sh:NodeShape has at most one effective seam:lifecycle, its own or that of its sh:targetClass; it reaches {?other} and {?value}.
seamsh:AggregateMemberShape
Applies to subjects of seam:aggregateMember.
seam:lifecycle: Only an aggregate, an owl:Class or sh:NodeShape with a seam:lifecycle, has a seam:aggregateMember (ADR-0035).seam:aggregateMember: seam:aggregateMember points at a sh:NodeShape.
seamsh:OneAggregateShape
Applies to objects of seam:aggregateMember.
- A sh:NodeShape is the seam:aggregateMember of at most one aggregate; it is a member of {?other} and {?value}.
seamsh:FiresShape
Applies to subjects of seam:fires.
- Only a proc:Task seam:fires a transition.
seam:fires: seam:fires points at a state:Transition.
Ontology models (ADR-0022)
seamsh:OntologyModelShape
Applies to instances of seam:Model.
- A seam:Ontology model is also an owl:Ontology with exactly one owl:versionIRI.
seamsh:OntologyClassShape
Applies to instances of owl:Class.
rdfs:label: Every owl:Class a model declares has an rdfs:label.seam:inModel: Every owl:Class a model declares is seam:inModel its ontology model.
Communication contracts
seamsh:AcceptsShapeShape
Applies to subjects of seam:acceptsShape.
- Only operations and channels declare seam:acceptsShape.
seam:acceptsShape: seam:acceptsShape points at a sh:NodeShape.
seamsh:ReturnsShapeShape
Applies to subjects of seam:returnsShape.
- Only operations and their hydra:Status responses (ADR-0013) declare seam:returnsShape.
seam:returnsShape: seam:returnsShape points at a sh:NodeShape.
seamsh:MediaKindShape
Applies to objects of seam:mediaKind.
- seam:mediaKind takes a seam:MediaKind (seam:UIFragment or seam:Data).
Operation implementation (ADR-0012)
seamsh:ImplementedByShape
Applies to subjects of seam:implementedBy.
- Only a hydra:Operation is seam:implementedBy an implementation.
seam:implementedBy: An operation is seam:implementedBy at most one implementation, named by an IRI.
seamsh:ImplementationKindShape
Applies to objects of seam:implementedBy.
rdf:type: An implementation has exactly one rdf:type, its kind: comm:LLMCompletion, comm:PythonHandler or comm:HTTPEndpoint.
seamsh:PythonHandlerShape
Applies to instances of comm:PythonHandler.
comm:handler: A comm:PythonHandler has exactly one comm:handler, a dotted path of Python identifiers inside the handlers package.
seamsh:HandlerShapeShape
Applies to objects of seam:acceptsShape, and objects of seam:returnsShape.
- A field of a shape a comm:PythonHandler operation accepts or returns has an sh:datatype the handler stub generator maps to a Python type: xsd:string, xsd:integer, xsd:decimal, xsd:double, xsd:boolean, xsd:date or xsd:dateTime.
- A shape a comm:PythonHandler operation accepts or returns has a local name, and sh:path local names, that are Python identifiers and not keywords: the handler stub's TypedDict and its keys.
- The sh:path local names of a shape a comm:PythonHandler operation accepts or returns are distinct: each is a key of the handler stub's TypedDict.
- Two shapes the comm:PythonHandler operations of one handler module accept or return have different local names: each is a TypedDict of the module.
- A shape a comm:PythonHandler operation accepts or returns has a local name that is not a function of the same handler module (the last segment of a comm:handler there): the stub module would bind the name twice.
seamsh:RemoteImplementationShape
Applies to objects of seam:invokes.
- An operation invoked across containers (its exposing container does not seam:executes the invoking process) declares a seam:implementedBy (ADR-0012).
Operation errors and error boundaries (ADR-0013)
seamsh:ErrorStatusShape
Applies to subjects of comm:errorCode.
- Only a hydra:Status carries a comm:errorCode.
comm:errorCode: An error status has exactly one comm:errorCode: a string of letters, digits, '.', '_' or '-', starting with a letter.hydra:statusCode: An error status has exactly one integer hydra:statusCode in 400..599.seam:returnsShape: An error status seam:returnsShape exactly one error shape over problem+json (comm:title and an integer comm:status).nde3ac20dbe494c7f981f636ec710ca35b169: An error status is the hydra:possibleStatus of a hydra:Operation.
seamsh:ProblemShapeShape
sh:property: An error shape declares the problem member comm:status with sh:datatype xsd:integer.sh:property: An error shape declares the problem member comm:title.
seamsh:ErrorCodeUniqueShape
Applies to subjects of hydra:possibleStatus.
- An operation's error statuses have distinct comm:errorCodes (ADR-0013).
seamsh:CatchesShape
Applies to subjects of seam:catches.
- Only a proc:ErrorBoundaryEvent seam:catches an error.
seam:catches: An error boundary event seam:catches at most one hydra:Status.nde3ac20dbe494c7f981f636ec710ca35b180: seam:catches points at an error status: a hydra:Status with a comm:errorCode.
seamsh:ErrorBoundaryEventShape
Applies to instances of proc:ErrorBoundaryEvent.
seam:catches: A lifted error boundary event seam:catches the operation error it routes (ADR-0013).
Timers and scheduling (ADR-0037)
seamsh:SchedulesShape
Applies to subjects of seam:schedules.
seam:schedules: seam:schedules points at a proc:Process.- A container that seam:schedules a process also seam:executes it: it starts each timer-started instance in process (ADR-0037).
- A container seam:schedules only a process whose BPMN model holds a proc:TimerStartEvent (ADR-0037).
seamsh:TimerStartedProcessShape
Applies to instances of proc:Process.
- A process whose BPMN model holds a proc:TimerStartEvent is seam:schedules-d by exactly one container; it has none (ADR-0037).
- A process whose BPMN model holds a proc:TimerStartEvent is seam:schedules-d by exactly one container; it has more than one (ADR-0037).
Deployment facts the generators read
seamsh:ArtifactShape
Applies to objects of deploy:artifact.
deploy:reference: A deploy:artifact has exactly one string deploy:reference.deploy:version: A deploy:artifact has at most one string deploy:version.deploy:build: A deploy:artifact has at most one deploy:build.
seamsh:BuildShape
Applies to objects of deploy:build.
deploy:context: A deploy:build has exactly one string deploy:context.deploy:dockerfile: A deploy:build has at most one string deploy:dockerfile.
seamsh:OverridableSubjectShape
Applies to subjects of deploy:artifact, and subjects of deploy:configuration, and subjects of deploy:replicas.
- Only an arch:Container or a deploy:Override carries deploy:artifact, deploy:configuration or deploy:replicas.
deploy:artifact: A container or override has at most one deploy:artifact.deploy:replicas: deploy:replicas is at most one non-negative integer.
seamsh:PortShape
Applies to objects of deploy:port.
deploy:containerPort: A deploy:port has exactly one integer deploy:containerPort in 1..65535.deploy:publishedPort: deploy:publishedPort is at most one integer in 1..65535.
seamsh:VolumeShape
Applies to objects of deploy:volume.
deploy:volumeName: A deploy:volume has exactly one string deploy:volumeName.deploy:mountPath: A deploy:volume has exactly one absolute deploy:mountPath.
seamsh:HealthcheckShape
Applies to objects of deploy:healthcheck.
deploy:probe: A deploy:healthcheck has exactly one string deploy:probe.
seamsh:BindingShape
Applies to objects of deploy:binding.
- A deploy:binding takes exactly one of deploy:value, deploy:secretRef, deploy:secretFile or deploy:serviceOf.
deploy:key: A deploy:binding has exactly one deploy:key.deploy:secretFile: deploy:secretFile is at most one string path.deploy:serviceOf: deploy:serviceOf points at an arch:Container.deploy:connectsTo: deploy:connectsTo points at one arch:Container (a store).deploy:authenticatesTo: deploy:authenticatesTo points at one arch:Container (a SemPKM store).
seamsh:SecretNameShape
Applies to subjects of deploy:secretName.
deploy:secretRef: deploy:secretName names the platform secret for a deploy:secretRef binding; a binding with a secretName must carry a secretRef.
seamsh:ProxiesShape
Applies to subjects of deploy:proxies.
- Only an arch:Container deploy:proxies another.
deploy:proxies: deploy:proxies points at one arch:Container.
seamsh:SystemShape
Applies to instances of arch:System.
arch:contains: An arch:System arch:contains at least one arch:Container.
seamsh:BindingKeyShape
Applies to objects of deploy:binding.
deploy:key: deploy:key is an environment variable name: a letter or _, then letters, digits or _.
seamsh:BindingKeyOnceShape
Applies to subjects of deploy:configuration.
- A container or override binds each deploy:key at most once in its deploy:configuration.
seamsh:SameSystemShape
Applies to instances of arch:Container.
- deploy:dependsOn, deploy:proxies and a binding's deploy:serviceOf point at a container of the arch:System that contains the container stating them.
seamsh:SinglePortShape
Applies to subjects of deploy:proxies, and objects of deploy:proxies, and objects of deploy:serviceOf.
deploy:port: A container that deploy:proxies another, its target and a deploy:serviceOf container each have exactly one deploy:port.
seamsh:ServingProbePortShape
Applies to instances of arch:Container.
- In a model with an arch:Environment, a serving container without a deploy:healthcheck has exactly one deploy:port, which the runtime's /healthz probe uses.
seamsh:DeploymentNodeLabelShape
Applies to objects of seam:deployedTo.
rdfs:label: A seam:deployedTo node has exactly one rdfs:label, which names it in the placement constraint.
Environments (ADR-0015)
seamsh:OverrideShape
Applies to instances of deploy:Override, and objects of deploy:override.
- A deploy:Override is the object of deploy:override and carries only deploy:environment, deploy:artifact, deploy:configuration and deploy:replicas (ADR-0015).
deploy:environment: A deploy:Override names exactly one deploy:environment, an arch:Environment.
seamsh:OverridePerEnvironmentShape
Applies to subjects of deploy:override.
- A container has at most one deploy:override per deploy:environment (ADR-0015).
seamsh:OverrideStoreShape
Applies to subjects of deploy:override.
- An override binding deploy:connectsTo the same store as the shared binding with its deploy:key; the store cannot change per environment (ADR-0015).
Storage (ADR-0011)
seamsh:StoredInShape
Applies to subjects of seam:storedIn.
- Only a sh:NodeShape is seam:storedIn a store.
seam:storedIn: seam:storedIn points at one arch:Container (a store).
seamsh:StoreShape
Applies to objects of seam:storedIn, and objects of deploy:connectsTo, and objects of deploy:authenticatesTo.
deploy:storeKind: A store (the object of seam:storedIn, deploy:connectsTo or deploy:authenticatesTo) declares a deploy:storeKind.
seamsh:StoreKindShape
Applies to subjects of deploy:storeKind.
- Only an arch:Container carries a deploy:storeKind.
deploy:storeKind: deploy:storeKind is at most one of deploy:PostgreSQL, deploy:SQLite or deploy:SemPKM.
seamsh:ReplicatedStoreShape
Applies to instances of arch:Container.
- A serving container with more than one deploy:replicas in an arch:Environment keeps process state in a deploy:PostgreSQL store, which its replicas share; an embedded or deploy:SQLite store lives in one process (ADR-0038).
seamsh:AuthenticatesToShape
Applies to subjects of deploy:authenticatesTo.
deploy:value: A binding that deploy:authenticatesTo a store carries a token, so its value comes from a secret (deploy:secretRef with its deploy:secretName, or deploy:secretFile), never a deploy:value.deploy:serviceOf: A binding that deploy:authenticatesTo a store carries a token, so its value comes from a secret, never a deploy:serviceOf URL.
seamsh:AuthenticatedStoreShape
Applies to objects of deploy:authenticatesTo.
deploy:storeKind: deploy:authenticatesTo points at a deploy:SemPKM store.
seamsh:SemPKMWebhookChannelShape
Applies to subjects of comm:transport.
- A SemPKM webhook channel has exactly one comm:transport (ADR-0027 section 10).
- A SemPKM webhook channel has exactly one comm:eventName, "object.changed", the SemPKM event type it listens for (ADR-0027 section 2).
- A SemPKM webhook channel seam:acceptsShape exactly one shape, the shape of the objects whose changes start processes (ADR-0027 section 2).
- The shape a SemPKM webhook channel seam:acceptsShape is seam:storedIn exactly one store, a deploy:SemPKM store (ADR-0027 section 2).
- The shape a SemPKM webhook channel seam:acceptsShape has exactly one sh:targetClass, the class of the changed objects that matter (ADR-0027 section 2).
- A SemPKM webhook channel has exactly one comm:path, a hydra:IriTemplate with no hydra:mapping: a delivery names no variable (ADR-0027 section 2).
- Exactly one container seam:exposes a SemPKM webhook channel: the container that receives its deliveries (ADR-0027 section 2).
- Two SemPKM webhook channels of one container have different comm:path templates (ADR-0027 section 10).
- A proc:MessageCatchEvent start event seam:subscribesTo a SemPKM webhook channel: a channel with no subscriber is a fault, not a silent sink (ADR-0027 section 2).
- The container that seam:exposes a SemPKM webhook channel seam:executes every process subscribed to it (ADR-0027 section 2).
- No process seam:publishesTo a SemPKM webhook channel: SemPKM is its only publisher (ADR-0027 section 1).
- The container that seam:exposes a SemPKM webhook channel has a binding that deploy:connectsTo the SemPKM store its accepted shape is seam:storedIn (ADR-0027 section 2, ADR-0025).
- The container that seam:exposes a SemPKM webhook channel has exactly one binding that deploy:authenticatesTo the SemPKM store its accepted shape is seam:storedIn: the service token (ADR-0027 section 2, ADR-0025).
- No element of a process the receiving container seam:executes seam:writes the shape a SemPKM webhook channel seam:acceptsShape: the runtime's own writes must not start processes (ADR-0027 section 7).
Routes (principle 5)
seamsh:ServingContainerShape
Applies to subjects of seam:executes, and subjects of seam:exposes.
nde3ac20dbe494c7f981f636ec710ca35b260: A container that seam:executes a process or seam:exposes an endpoint is arch:contains-ed by exactly one arch:System.
seamsh:ExecutedProcessShape
Applies to objects of seam:executes.
seam:detailedBy: A process a container seam:executes is seam:detailedBy exactly one BPMN seam:Model.- A process a container seam:executes starts one way: the events that seam:triggers it seam:submitsTo exactly one operation, a proc:MessageCatchEvent of its BPMN model seam:subscribesTo a comm:Channel (ADR-0010), or its BPMN model holds a proc:TimerStartEvent (ADR-0037).
seamsh:MethodShape
Applies to subjects of hydra:method.
hydra:method: hydra:method is an HTTP method a route serves: GET, POST, PUT, PATCH or DELETE.
seamsh:RouteOperationShape
Applies to instances of hydra:Operation.
- A routed operation (one an event seam:submitsTo, or one no task seam:invokes) that seam:acceptsShape a shape has a comm:requestMediaType: the request body the shape is validated from.
- An operation a user task's form submits to (ADR-0009) has a comm:requestMediaType: the completion is a request body.
- An operation that the event triggering a process seam:submitsTo has a seam:acceptsShape: the process starts from a validated payload.
- The events that seam:submitsTo an operation seam:triggers at most one process: a route starts one.
- An operation completes a user task or starts a process, not both: no form a task seam:completedOn and no event that seam:triggers a process both seam:submitsTo it.
- The forms that seam:submitsTo an operation are seam:completedOn by at most one user task: a route completes one task.
- An operation whose submitting event's NavigationFlow ifml:swap ifml:Append or ifml:Prepend onto the component it renders returns the entity it accepts: its seam:returnsShape is its seam:acceptsShape.
- An operation that renders a whole component (no ifml:Append or ifml:Prepend flow onto it) renders a query of its seam:returnsShape, so it has one and is a GET or a user-task completion.
Authorization
seamsh:PolicyShape
Applies to instances of odrl:Policy.
odrl:permission: Each odrl:permission of a policy names exactly one odrl:target.nde3ac20dbe494c7f981f636ec710ca35b275: A permission's odrl:target is a hydra:Operation or a proc:UserTask: the request the policy governs.
seamsh:PermissionShape
odrl:target: at least 1, at most 1
Domain profiles (ADR-0018)
seamsh:ProfileShape
Applies to instances of seam:Profile.
seam:offersClass: A seam:Profile's seam:offersClass values are class IRIs.seam:usesGenerator: A seam:Profile's seam:usesGenerator values are generator names, as strings.seam:profileShapes: A seam:Profile's seam:profileShapes values are paths relative to the profile directory, as strings.
seamsh:OfferedClassShape
Applies to objects of seam:offersClass.
skos:prefLabel: A class a profile offers has at most one skos:prefLabel.rdfs:label: A class a profile offers has at most one rdfs:label.
Scenarios and examples (ADR-0014)
seamsh:ScenarioShape
Applies to instances of verify:Scenario, and subjects of verify:process, and subjects of verify:step, and subjects of verify:expectState, and subjects of verify:expectEndEvent, and subjects of verify:failure.
- Only a verify:Scenario carries verify:process, verify:step, verify:failure or an expected state or end event, and a scenario is an IRI (its local name names its generated test).
verify:process: A scenario runs exactly one verify:process, a proc:Process.verify:actor: A scenario is started by exactly one verify:actor, an odrl:Party.verify:step: A scenario has at most one verify:step list.nde3ac20dbe494c7f981f636ec710ca35b292: Each verify:step names one verify:task (a proc:UserTask) and one verify:actor (an odrl:Party).verify:expectState: A scenario expects at most one verify:expectState, a state:State.verify:expectEndEvent: A scenario expects at most one verify:expectEndEvent, an IRI.verify:failure: Each verify:failure names one verify:operation (a hydra:Operation) and one verify:status, an error of that operation (a hydra:possibleStatus with a comm:errorCode).- A scenario states what it expects: a verify:expectState, a verify:expectEndEvent, or both.
- A scenario's process is started by a UI event: some ifml:Event seam:triggers it.
- verify:step is an RDF list (rdf:nil or a node with rdf:first).
- A step's verify:task is in the same BPMN model (seam:inModel) as the scenario's process.
- verify:expectEndEvent is lifted into the model (seam:inModel) of the scenario's process, or of a process the run starts: one whose start event seam:subscribesTo a channel an element of the scenario's process seam:publishesTo.
- verify:expectState is a state of a lifecycle some shape seam:lifecycle names, directly or through its sh:targetClass, so the test knows whose state to read.
- A verify:failure's operation is one the run invokes: an element of the scenario's process model, or of a process the run starts through a channel, seam:invokes it.
- A scenario makes each operation fail at most once (one verify:failure per verify:operation).
seamsh:FailureShape
verify:operation: classhydra:Operation, at least 1, at most 1verify:status: at least 1, at most 1- verify:status is an error of verify:operation: one of its hydra:possibleStatus, with a comm:errorCode.
seamsh:StepShape
verify:task: classproc:UserTask, at least 1, at most 1verify:actor: classodrl:Party, at least 1, at most 1
seamsh:GivenShape
Applies to objects of verify:given.
verify:field: A verify:given value names exactly one verify:field, an IRI.verify:value: A verify:given value has exactly one verify:value, a literal.- verify:field is the sh:path of a property of some shape in the model.
seamsh:GivenUniqueShape
Applies to subjects of verify:given.
- A scenario, step or decision example gives each verify:field at most once.
seamsh:DecisionExampleShape
Applies to instances of verify:DecisionExample, and subjects of verify:decision, and subjects of verify:expectOutput.
- Only a verify:DecisionExample carries verify:decision or verify:expectOutput, and a decision example is an IRI (its local name names its generated test).
verify:decision: A decision example evaluates exactly one verify:decision, a dec:Decision.verify:expectOutput: A decision example expects at least one output: a dec:variable string and a literal verify:value.- Each verify:given field of a decision example is the dec:fromPath of one of the decision's dec:input bindings.
- A decision example gives a value for every dec:input of its decision.
- Each expected output's dec:variable names one of the decision's dec:output bindings.
seamsh:ExpectOutputShape
dec:variable: at least 1, at most 1, datatypexsd:stringverify:value: at least 1, at most 1
seamsh:ShapeExampleShape
Applies to subjects of verify:validExample, and subjects of verify:invalidExample.
- Only a sh:NodeShape carries verify:validExample or verify:invalidExample.
verify:validExample: A verify:validExample is an IRI: its local name names its generated test.verify:invalidExample: A verify:invalidExample is an IRI: its local name names its generated test.- A node is not both a valid and an invalid example of the same shape.
Shapes target classes; categories; flattened sh:node (ADR-0023)
seamsh:TargetClassShape
Applies to instances of sh:NodeShape.
- {$this} names more than one sh:targetClass ({?value} among them); a shape describes at most one class (ADR-0023).
- {$this}: sh:targetClass {?value} is not an owl:Class of a seam:Ontology model; subclass an imported class in the model's ontology and target that (ADR-0023).
seamsh:FieldNameShape
Applies to instances of sh:NodeShape.
- {$this}: field {?value} carries more than one sh:name; a field has one wire name (ADR-0023).
- {$this}: sh:name {?value} is not a name matching ^[A-Za-z_][A-Za-z0-9_]*$; put a label with spaces in rdfs:label (ADR-0023).
- {$this}: two fields have the sh:name {?value}; a wire name is unique within a shape (ADR-0023).
seamsh:CategoryFieldShape
Applies to instances of sh:NodeShape.
- {$this}: field {?field} sh:class {?value} is a category with no members; type its member IRIs with it (ADR-0023).
- {$this}: member {?value} of field {?field}'s category needs exactly one rdfs:label (its wire value; ADR-0023).
- {$this}: two members of field {?field}'s category are labelled {?value}; the label is the wire value (ADR-0023).
- {$this}: field {?value} has an sh:in that mixes IRIs and literals (ADR-0023).
seamsh:FlattenedFieldShape
Applies to instances of sh:NodeShape.
- {$this}: field {?field} sh:node {?value} has no free property (one without sh:hasValue); a flattened field needs exactly one (ADR-0023).
- {$this}: field {?field} sh:node {?value} has more than one free property (one without sh:hasValue); a flattened field needs exactly one (ADR-0023).
- {$this}: field {?field} has both sh:node {?value} and sh:datatype; a flattened field takes its datatype from the nested shape (ADR-0023).