Skip to content

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.

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: class hydra:Operation, at least 1, at most 1
  • verify: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: class proc:UserTask, at least 1, at most 1
  • verify:actor: class odrl: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, datatype xsd:string
  • verify: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).

Released under the Apache-2.0 License.