Layer vocabularies
Generated page
This page is generated from the layer vocabularies in ontology/ on every docs build.
Inside each layer, SemanticSeams uses a small vocabulary of its own or an existing one; the seam predicates only name the joins between layers. BPMN and DMN have no vocabulary here at all: their native XML is the source, and only the elements that take part in a seam get an IRI.
SemanticSeams Architecture Vocabulary
Source: ontology/arch.ttl · prefix arch:
A deliberately small C4-inspired vocabulary. Unlike C4 proper, the containment hierarchy is user-definable (LikeC4-style): arch:contains nests any Element in any Element, and views are projections, not fixed levels. Deployment topology is included because 'where things run' is distinct from 'what they are'.
Classes
| Term | Kind | Description |
|---|---|---|
arch:Element | Class | Abstract superclass of everything in the architecture layer. |
arch:Person | Class | A human actor / role interacting with the system. Subclass of arch:Element. |
arch:System | Class | Highest-level unit delivering value; often owned by one team. Subclass of arch:Element. |
arch:Container | Class | A running application or data store (C4 sense, not Docker sense — though often both). Subclass of arch:Element. |
arch:Component | Class | A structural building block inside a container. Profiles subtype this (e.g. idesign:Manager). Subclass of arch:Element. |
arch:DeploymentNode | Class | Infrastructure a container runs on: host, VM, cluster, region. Nestable via arch:contains. Subclass of arch:Element. |
arch:Environment | Class | A deployment environment (prod, demo/dv, staging) grouping deployment nodes. Subclass of arch:Element. |
arch:Domain | Class | A business area that groups systems and bounded contexts; classified core, supporting or generic. Subclass of arch:Element. |
arch:BoundedContext | Class | The boundary inside which a term has one meaning: owns one seam:Ontology and the model graphs that use its language. Subclass of arch:Element. |
arch:DomainClassification | Class | |
arch:Core | arch:DomainClassification | core. |
arch:Supporting | arch:DomainClassification | supporting. |
arch:Generic | arch:DomainClassification | generic. |
arch:ContextRelationship | Class | A context-map relationship (ADR-0032): one arch:upstream context, one arch:downstream context and one arch:relationshipType. At most one per pair of contexts. |
arch:RelationshipType | Class | How the downstream context of an arch:ContextRelationship uses the upstream context's language. |
arch:CustomerSupplier | arch:RelationshipType | customer-supplier. |
arch:Conformist | arch:RelationshipType | conformist. |
arch:AntiCorruptionLayer | arch:RelationshipType | anti-corruption layer. |
arch:PublishedLanguage | arch:RelationshipType | published language. |
arch:SharedKernel | arch:RelationshipType | shared kernel. |
Properties
| Term | Kind | Description |
|---|---|---|
arch:contains | Property | Generic nesting: system contains containers, container contains components, node contains nodes. Domain arch:Element. Range arch:Element. |
arch:dependsOn | Property | Coarse dependency for sketching; refine with seam:consumes/seam:exposes when contracts are modeled. Domain arch:Element. Range arch:Element. |
arch:technology | Property | Free-text technology label (e.g. 'FastAPI', 'MySQL 8 async replica'). Domain arch:Element. |
arch:description | Property | Domain arch:Element. |
arch:classification | Property | Domain arch:Domain. Range arch:DomainClassification. |
arch:upstream | Property | The context whose language the downstream context depends on: a change to it can break the downstream. Domain arch:ContextRelationship. Range arch:BoundedContext. |
arch:downstream | Property | The context that reads, writes or subscribes to what the upstream context owns. Domain arch:ContextRelationship. Range arch:BoundedContext. |
arch:relationshipType | Property | Domain arch:ContextRelationship. Range arch:RelationshipType. |
SemanticSeams IFML-inspired Interaction Vocabulary
Source: ontology/ifml.ttl · prefix ifml:
HONEST SCOPE STATEMENT. This is our vocabulary, inspired by and correspondent with OMG IFML 1.0 (formal/2015-02-05) — it is not a proper subset and cannot be: OMG publishes IFML as a MOF metamodel with XMI interchange, and no official RDF/OWL rendering exists, so any RDF lift is somebody's interpretation. Ours makes three kinds of departure:
- CORRESPONDENCE: each class below names the IFML metaclass it corresponds to (see the 'Corresponds to' notes). For that overlap, mechanical XMI round-tripping is feasible. List/Details/Form come from the IFML Extensions package, not Core. 2. DEVIATION: data binding uses seam:reads/seam:writes to SHACL shapes instead of IFML DataBinding -> UML classifier machinery; action invocation uses seam:triggers instead of the opaque Action/DynamicBehavior reference. 3. OMISSION: ActivationExpressions, ViewComponentParts, Modules, Context/Viewpoint, and the full event taxonomy are deliberately out of scope for v1.
Consequence: WebRatio/IFMLEdit models do not import losslessly, and ours do not export losslessly. This is a living-system-model vocabulary, not an interchange tool.
Rendering conventions (for the viewer): ViewContainers are boxes-in-boxes; ViewComponents are typed inner boxes; Events are circles on borders; InteractionFlows are arrows. XOR containers render with the [XOR] tag; landmark containers are reachable from anywhere (navigation menu).
View structure
| Term | Kind | Description |
|---|---|---|
ifml:InteractionModel | Class | Root of one interaction model. Corresponds to: IFMLModel/InteractionFlowModel. |
ifml:ViewElement | Class | Corresponds to: ViewElement (abstract). |
ifml:ViewContainer | Class | Window, page, area, or pane. Nestable. Corresponds to: ViewContainer. Subclass of ifml:ViewElement. |
ifml:ViewComponent | Class | Content unit inside a container. Corresponds to: ViewComponent. Subclass of ifml:ViewElement. |
ifml:List | Class | Publishes a set of instances. Corresponds to: List (IFML Extensions). Subclass of ifml:ViewComponent. |
ifml:Details | Class | Publishes one instance. Corresponds to: Details (IFML Extensions). Subclass of ifml:ViewComponent. |
ifml:Form | Class | Collects input; fields generatable from the shape it seam:writes (SHACL 1.2 UI / DASH). Corresponds to: Form (IFML Extensions). Subclass of ifml:ViewComponent. |
ifml:contains | Property | Container nesting and container->component placement. Corresponds to: ViewContainer.viewElements. Domain ifml:ViewElement. Range ifml:ViewElement. |
ifml:order | Property | order. Render order of components within their containing ViewContainer, ascending; at most one per component and unique within a container (seamsh:OrderShape). Generators emit a container's components in this order, never in graph iteration order. Our extension; IFML's viewElements is an unordered association. Domain ifml:ViewComponent. Range xsd:integer. |
ifml:isLandmark | Property | Reachable from any container (global navigation). Corresponds to: ViewContainer.isLandmark. Range xsd:boolean. |
ifml:isDefault | Property | Shown by default among XOR siblings. Corresponds to: ViewContainer.isDefault. Range xsd:boolean. |
ifml:isXOR | Property | Children are mutually exclusive (tabs, wizard steps). Corresponds to: ViewContainer.isXOR. Range xsd:boolean. |
ifml:path | Property | path. URL path of a landmark ViewContainer: the GET route that serves the full page ("/" for the app entry point). Our extension; IFML has no URL notion. Domain ifml:ViewContainer. Range xsd:string. |
ifml:title | Property | title. User-facing, language-tagged document title of a ViewContainer (the HTML <title>), distinct from the modeller's rdfs:label. Our extension. Domain ifml:ViewContainer. Range rdf:langString. |
Events and flows
| Term | Kind | Description |
|---|---|---|
ifml:Event | Class | User interaction, system event, or action-completion. Corresponds to: Event (collapsing the ViewElementEvent/ActionEvent/SystemEvent taxonomy — see OMISSION note). |
ifml:hasEvent | Property | Corresponds to: InteractionFlowElement.events. Domain ifml:ViewElement. Range ifml:Event. |
ifml:InteractionFlow | Class | Corresponds to: InteractionFlow (abstract). |
ifml:NavigationFlow | Class | Event -> target; moves the user. Maps to hx-get/hx-post + hx-target swap. Corresponds to: NavigationFlow. Subclass of ifml:InteractionFlow. |
ifml:DataFlow | Class | Pure parameter passing; no navigation. Corresponds to: DataFlow. Subclass of ifml:InteractionFlow. |
ifml:source | Property | Event (navigation) or view component (data flow). Corresponds to: InteractionFlow.srcInteractionFlowElement. Domain ifml:InteractionFlow. |
ifml:target | Property | View element, or — via the seam — a process/decision the event seam:triggers. Corresponds to: InteractionFlow.trgtInteractionFlowElement. Domain ifml:InteractionFlow. |
ifml:trigger | Property | trigger. Literal DOM event name that fires the ifml:Event ("click", "submit"); renders as hx-trigger. Our extension; IFML leaves the concrete UI event to the platform. Domain ifml:Event. Range xsd:string. |
ifml:swap | Property | swap. How the response of a NavigationFlow lands in its ifml:target component; renders as hx-swap. Generator rules: an ifml:Replace flow targets the component element #<component> and its response partial is <component>.html; an ifml:Append or ifml:Prepend flow targets the component's item list #<component>_items and its partial is <component>_item.html (the operation that renders the partial is the one whose seam:rendersComponent names the target). Channel rule (no flow needed): a comm:Channel subscription a container seam:consumes always appends events into its element (hx-swap beforeend), since an event stream only adds. Our extension. Domain ifml:NavigationFlow. Range ifml:SwapStrategy. |
ifml:SwapStrategy | Class | Swap strategy. Enumeration of ifml:swap values. |
ifml:Replace | ifml:SwapStrategy | replace (outerHTML). |
ifml:Append | ifml:SwapStrategy | append (beforeend). |
ifml:Prepend | ifml:SwapStrategy | prepend (afterbegin). |
Parameters
| Term | Kind | Description |
|---|---|---|
ifml:Parameter | Class | Named typed value exposed or expected by a view element / action. Corresponds to: Parameter. |
ifml:hasParameter | Property | Corresponds to: InteractionFlowElement.parameters. Range ifml:Parameter. |
ifml:boundTo | Property | bound to. The sh:path property a Form parameter fills (an ifml:Parameter -> the property IRI of a property shape of the shape the Form seam:writes). Form rule: a Form renders an input only for properties that some ifml:hasParameter of the Form is ifml:boundTo; every other property of the written shape is system-set and never rendered as input. Presentation comes from the bound property shape: sh:order (field order), sh:minCount 1 (required), sh:maxLength (maxlength), dash:editor (widget, e.g. dash:TextAreaEditor -> <textarea>, default single-line <input>). Our extension; IFML leaves Parameter -> domain attribute binding to its DataBinding machinery. Domain ifml:Parameter. Range rdf:Property. |
ifml:ParameterBinding | Class | sourceParameter -> targetParameter along a flow. Maps to htmx params/vals. Corresponds to: ParameterBinding. |
ifml:binds | Property | Corresponds to: InteractionFlow.parameterBindingGroup. Domain ifml:InteractionFlow. Range ifml:ParameterBinding. |
ifml:sourceParameter | Property | Domain ifml:ParameterBinding. Range ifml:Parameter. |
ifml:targetParameter | Property | Domain ifml:ParameterBinding. Range ifml:Parameter. |
SemanticSeams Process/Decision Index Vocabulary
Source: ontology/proc.ttl · prefix proc:
NOT a BPMN ontology, on purpose. BPMN 2.0 XML remains the language and the render payload (seam:renderPayload); bpmn-js renders it natively, and full metamodel lifts (BBO, Rospocher/Ghidini) are a swamp that buys nothing for navigation.
This file only provides rdf:type terms for the index: the handful of elements that participate in seam edges. Types exist so that (a) SHACL shapes over the seams have class targets ('seam:decidedBy connects only BusinessRuleTasks to Decisions'), (b) cross-layer queries read as class matches rather than label heuristics, and (c) the shell knows what an IRI is before fetching a payload.
Each term mirrors exactly one BPMN/DMN metaclass; nothing about control flow, gateways, sequence flows, or lanes is modeled here — that all stays in the XML. Minimalist escape hatch: shapes can instead use sh:targetSubjectsOf on seam predicates, making these types optional; decide when the first validation shapes are written.
BPMN index types
| Term | Kind | Description |
|---|---|---|
proc:Process | Class | Mirrors bpmn:process. The node an ifml:Event seam:triggers and that seam:detailedBy a BPMN seam:Model. |
proc:Task | Class | Mirrors bpmn:task (and serves as the superclass for typed tasks below). |
proc:ServiceTask | Class | Mirrors bpmn:serviceTask. The type that seam:invokes a comm operation. Implementation rule (gaps.md GAP-27): the implementation of the invoked operation is the arch:Container that seam:exposes it, reached at the operation's comm:path; there is no proc:implementation term. A container that also seam:executes the task's process serves the operation in-process. What serves the operation is its seam:implementedBy (ADR-0012). Subclass of proc:Task. |
proc:UserTask | Class | Mirrors bpmn:userTask. Human work item: the process waits until a person completes it on the ifml:Form it seam:completedOn (ADR-0009). Its seam:governedBy policies, with the task as odrl:target, decide who may complete it. Subclass of proc:Task. |
proc:BusinessRuleTask | Class | Mirrors bpmn:businessRuleTask. The only legal subject of seam:decidedBy. Subclass of proc:Task. |
proc:MessageThrowEvent | Class | Mirrors bpmn:intermediateThrowEvent / endEvent with messageEventDefinition. Subject of seam:publishesTo (as is a proc:ServiceTask that streams its invoked operation's deltas, D046). Message-name rule (gaps.md GAP-26): the event's message name is the rdfs:label of the comm:Channel it seam:publishesTo; no messageRef is added to the BPMN payload. |
proc:MessageCatchEvent | Class | Mirrors bpmn:intermediateCatchEvent / startEvent with messageEventDefinition. Subject of seam:subscribesTo. Channel start rule (ADR-0010): when the event is the bpmn:startEvent of its process, the process is channel-started. The runtime starts it whenever a message throw event publishes on the comm:Channel it seam:subscribesTo, with the publisher's correlation key and a copy of its entities and statuses. |
proc:ErrorBoundaryEvent | Class | Mirrors bpmn:boundaryEvent with an errorEventDefinition, attached to a proc:ServiceTask that seam:invokes an operation. Subject of seam:catches (ADR-0013). Lifting rule: such a boundary is lifted only when it catches one of the invoked operation's errors; the attachment (attachedToRef) and the code (the errorCode of the bpmn:error its errorRef names) stay in the XML, and the runtime checks at load that they agree with the graph. A boundary with no errorRef is not lifted. |
proc:TimerStartEvent | Class | Mirrors bpmn:startEvent of a bpmn:process with one timerEventDefinition: a timer-started process (ADR-0037). The process has no route; the arch:Container that seam:schedules the process starts an instance at each due time the expression defines. Lifting rule: the expression (bpmn:timeDate or bpmn:timeCycle) stays in the XML as a quoted ISO 8601 literal, and the runtime checks at load that the graph and the XML agree. The start event of an event subprocess is not lifted. |
proc:TimerCatchEvent | Class | Mirrors bpmn:intermediateCatchEvent with one timerEventDefinition, or a bpmn:boundaryEvent with one, interrupting or not, attached to a proc:UserTask (ADR-0037): the instance waits, or the task's timer fires while it is still open (an overdue reminder). Lifting rule: the expression (bpmn:timeDate, bpmn:timeDuration or bpmn:timeCycle) and the attachment (attachedToRef) stay in the XML, and the runtime checks at load that they agree with the graph. A timer boundary on any other task is not lifted: a service-call timeout is an error (ADR-0013). |
DMN index types
| Term | Kind | Description |
|---|---|---|
dec:DecisionModel | Class | Mirrors dmn:definitions. The seam:Model-typed node whose seam:renderPayload is DMN XML. |
dec:Decision | Class | Mirrors dmn:decision. Object of seam:decidedBy; subject of seam:reads on its input data shapes. |
Runtime binding terms (M004/S02, gaps.md GAP-22..GAP-27)
| Term | Kind | Description |
|---|---|---|
proc:correlationKey | Property | The ifml:Parameter whose value identifies a running instance of the process, so later events, channel subscriptions and lifecycle transitions find the same instance. The handler that starts the process passes it as correlation_key; its name matches the hydra:variable of the comm:path mapping of the operation the triggering event seam:submitsTo (gaps.md GAP-22). Domain proc:Process. Range ns1:Parameter. |
dec:payloadElement | Property | The id of the native dmn:decision element in the decision model's seam:renderPayload (a literal, e.g. "routing_decision"). The worker joins the graph decision to the DMN on this id and checks the DMN declares it (GAP-23); it never derives the id from the IRI local name. Domain dec:Decision. |
dec:InputBinding | Class | Binds one DMN input variable to a property path of the shape the process carries (GAP-24). |
dec:OutputBinding | Class | Binds the decision's DMN output to the process variable it feeds (GAP-25). |
dec:input | Property | One DMN input the worker must supply when evaluating the decision. Domain dec:Decision. Range dec:InputBinding. |
dec:output | Property | The DMN output whose value the worker stores in the process. Domain dec:Decision. Range dec:OutputBinding. |
dec:variable | Property | The DMN-side name: for an InputBinding, the inputExpression text of the decision table input; for an OutputBinding, the output's name (or its label when the payload's output has no name attribute). |
dec:fromPath | Property | The sh:path of the carried shape whose value fills the input. Domain dec:InputBinding. |
dec:measure | Property | Optional function applied to the path value before binding. Absent means the value itself. Domain dec:InputBinding. Range dec:Measure. |
dec:Measure | Class | Enumeration of functions dec:measure can apply. |
dec:Length | dec:Measure | The character length of a string value. |
dec:processVariable | Property | The process variable the decision output is stored under. Domain dec:OutputBinding. |
SemanticSeams Statechart Vocabulary
Source: ontology/state.ttl · prefix state:
Entity lifecycles as state machines. Hierarchical/parallel states deferred until a dogfood model needs them.
Statecharts (entity lifecycles) — SCXML-shaped, deliberately flat for v1
| Term | Kind | Description |
|---|---|---|
state:StateMachine | Class | |
state:State | Class | |
state:Transition | Class | |
state:hasState | Property | Domain state:StateMachine. Range state:State. |
state:initial | Property | Domain state:StateMachine. Range state:State. |
state:final | Property | Domain state:StateMachine. Range state:State. |
state:hasTransition | Property | Domain state:StateMachine. Range state:Transition. |
state:from | Property | Domain state:Transition. Range state:State. |
state:to | Property | Domain state:Transition. Range state:State. |
state:trigger | Property | Human-readable trigger label. Which process tasks may fire it lives on the seam (seam:fires). Domain state:Transition. |
SemanticSeams Communication Vocabulary
Source: ontology/comm.ttl · prefix comm:
Request/response communication is described with Hydra (hydra:Operation, hydra:method, etc.). This module only adds what Hydra lacks: asynchronous channels, and QUERY as a first-class read method. Payload contracts are SHACL shapes via seam:acceptsShape / seam:returnsShape; the fragment-vs-data distinction is seam:mediaKind.
Addressing reuses Hydra: comm:path points at a hydra:IriTemplate whose hydra:template is the URL and whose hydra:mapping entries name, per variable, the shape path (hydra:property) that supplies the value. comm:transport and comm:eventName say how a channel reaches a client; comm:requestMediaType says how an operation's request body is encoded.
Handler-name rule (no term): the code identifier of an operation or channel is its IRI local name with a trailing "_op" removed (:send_message_op -> send_message, :stream_events -> stream_events).
Token stream (declared, D046): a service task that seam:invokes an operation streams that operation's reply onto a channel only when the task itself seam:publishesTo the channel (invoke_llm seam:publishesTo :stream_events). Each delta is an event named by the channel's comm:eventName; a throw event that seam:publishesTo the same channel ends the stream (ADR-0007 spike finding 2). The runtime publishes no delta the graph does not state.
Communication — Hydra supplies operations/links; comm adds channels + endpoints
| Term | Kind | Description |
|---|---|---|
comm:Channel | Class | An async topic/queue/webhook target. Events published here are named-graph payloads whose shape is the channel's seam:acceptsShape. |
comm:Endpoint | Class | A network-addressable base a container seam:exposes; groups hydra:Operations and comm:Channels. |
comm:hasOperation | Property | Domain comm:Endpoint. Range hydra:Operation. |
comm:hasChannel | Property | Domain comm:Endpoint. Range comm:Channel. |
Addressing, transport and encoding (M004 golden gaps GAP-08/15/18)
| Term | Kind | Description |
|---|---|---|
comm:path | Property | path. The URL of a hydra:Operation or comm:Channel, relative to the exposing container: a hydra:IriTemplate with hydra:template "/conversations/{conversation}/messages" and one hydra:mapping [ hydra:variable ; hydra:property ] per variable. hydra:property names the shape path whose value fills the variable. Range hydra:IriTemplate. |
comm:Transport | Class | How a comm:Channel's events reach a subscriber. |
comm:SSE | comm:Transport | Server-Sent Events. |
comm:WebSocket | comm:Transport | WebSocket. |
comm:SemPKMWebhook | comm:Transport | SemPKM webhook. Inbound (ADR-0027): SemPKM POSTs its webhook deliveries to the channel's comm:path on the one container that seam:exposes it, and each change to an object of the channel's seam:acceptsShape starts the processes whose start event seam:subscribesTo the channel. The channel's comm:eventName is the SemPKM event type ("object.changed"); the SemPKM store is the one the accepted shape is seam:storedIn. No process seam:publishesTo such a channel. |
comm:transport | Property | transport. Domain comm:Channel. Range comm:Transport. |
comm:eventName | Property | event name. The event type a subscriber listens for (SSE event: field, htmx sse-swap). Domain comm:Channel. |
comm:requestMediaType | Property | request media type. Literal media type of the request body, e.g. "application/x-www-form-urlencoded" for an htmx form post or "application/json" for a seam:Data operation. seam:acceptsShape says what the body holds; this says how it is encoded. Domain hydra:Operation. |
Operation implementation (ADR-0012)
| Term | Kind | Description |
|---|---|---|
comm:LLMCompletion | Class | LLM completion. Implementation kind: chat messages built from the accepted entity, a streamed completion from the serving container (the executing container's deploy:serviceOf binding) at the operation's comm:path, deltas published on the task's seam:publishesTo channel, and the joined reply validated against seam:returnsShape. |
comm:PythonHandler | Class | Python handler. Implementation kind: a hand-written function in the application's handlers package, called in the runtime's process with the accepted entity; its result is validated against seam:returnsShape. Names the function with comm:handler. The operation must be served in-process. |
comm:HTTPEndpoint | Class | HTTP endpoint. Implementation kind: the accepted entity POSTed as JSON to the serving container (base URL from the deploy:serviceOf binding, path from the operation's comm:path), the JSON response validated against seam:returnsShape. |
comm:handler | Property | handler. Dotted path of a comm:PythonHandler's function relative to the handlers package, e.g. "notify.notify_manager" (function notify_manager in handlers/notify.py). Every segment is a Python identifier, so the path cannot name code outside the package. Domain comm:PythonHandler. Range xsd:string. |
Operation errors (ADR-0013)
| Term | Kind | Description |
|---|---|---|
comm:errorCode | Property | error code. The code of an error an operation can raise, on the hydra:Status the operation hydra:possibleStatus (e.g. "notify-failed"). An implementation raises it, and a BPMN error boundary event that seam:catches the status names a bpmn:error with the same errorCode. Unique among one operation's statuses (ADR-0013). Domain hydra:Status. Range xsd:string. |
comm:type | Property | type. sh:path of the RFC 9457 problem member "type" in an error shape: a URI reference identifying the problem type ("about:blank" when absent). |
comm:title | Property | title. sh:path of the RFC 9457 problem member "title" in an error shape: a short summary of the problem type. Required in every error shape; the runtime fills it from the status's rdfs:label. |
comm:status | Property | status. sh:path of the RFC 9457 problem member "status" in an error shape: the HTTP status code, an xsd:integer. Required in every error shape. Its value is never stated in the shape; the runtime fills it from the status's hydra:statusCode, so the code is stated once. |
comm:detail | Property | detail. sh:path of the RFC 9457 problem member "detail" in an error shape: an explanation of this occurrence of the problem, supplied by the raised error. |
comm:instance | Property | instance. sh:path of the RFC 9457 problem member "instance" in an error shape: a URI reference identifying this occurrence of the problem. |
SemanticSeams Deployment Vocabulary (stub)
Source: ontology/deploy.ttl · prefix deploy:
The VERB side of infrastructure. arch: describes what runs where (nouns); deploy: describes how a container comes into existence: artifact, config, resources, ordering, and placement policy. This graph does not launch anything — deployment artifacts (docker-compose, Ansible inventory/plays, k8s manifests) are GENERATED projections of it, exactly as a Gantt chart is a projection of plan:.
Prior art: TOSCA (heavyweight standard for topology + orchestration templates, read but not adopted); BESSER's deployment modeling extension (same gap, same fix).
GitOps loop: the as-designed named graph is desired state; a generator/reconciler emits and applies artifacts; an observer writes actual state into an as-deployed named graph (Zabbix/monitoring as data source). Drift detection = SPARQL diff between the two graphs — with semantics ('order_api violates its placement policy'), not textual YAML diffs.
Design rule inherited from seam.ttl: few and generic. Values that are secrets are referenced by IRI (e.g. into a secret manager), never inlined as literals.
Artifact and configuration
| Term | Kind | Description |
|---|---|---|
deploy:Artifact | Class | A launchable unit: OCI image, package, VM template. Identified by reference + version. |
deploy:artifact | Property | On an arch:Container (shared) or a deploy:Override (one environment). No rdfs:domain: two would mean both, so shapes/seam-shapes.ttl states the allowed subjects (ADR-0015). Range deploy:Artifact. |
deploy:reference | Property | Image/package reference, e.g. 'ghcr.io/org/order-api'. Domain deploy:Artifact. |
deploy:version | Property | Domain deploy:Artifact. |
deploy:Build | Class | Build. How to build an artifact from source instead of pulling it: a deploy:context and a deploy:dockerfile (ADR-0015). |
deploy:build | Property | build. Build the artifact from source. Generator rule: an artifact with a build renders as compose 'build' with 'pull_policy: build', one without as a pulled 'image'. Domain deploy:Artifact. Range deploy:Build. |
deploy:context | Property | context. The build context directory, relative to the model file's directory (like seam:renderPayload paths). Domain deploy:Build. Range xsd:string. |
deploy:dockerfile | Property | dockerfile. The Dockerfile, relative to the build deploy:context, as in Docker. Domain deploy:Build. Range xsd:string. |
deploy:Configuration | Class | A set of environment bindings for a container in an environment. |
deploy:configuration | Property | On an arch:Container (shared) or a deploy:Override (one environment, merged with the shared bindings by deploy:key). No rdfs:domain, as for deploy:artifact (ADR-0015). Range deploy:Configuration. |
deploy:binding | Property | A key/value pair (blank node with deploy:key and one of deploy:value, deploy:secretRef, deploy:secretFile or deploy:serviceOf). Domain deploy:Configuration. |
deploy:key | Property | |
deploy:value | Property | |
deploy:secretRef | Property | IRI into a secret manager (e.g. an Infisical path). NEVER inline secret literals. |
deploy:secretName | Property | secret name. Name of the secret in the target platform's secret store (e.g. a compose/swarm external secret), on a binding that carries a deploy:secretRef. The secret value never enters the graph; generators render the name as an external secret source. |
deploy:secretFile | Property | secret file. On a binding, instead of deploy:secretRef: the secret is read from this file, not from a platform secret store. The path is relative to the model file's directory; the file's contents never enter the graph. Generators render it as a file secret the host can repoint with <KEY>_FILE (ADR-0015). Range xsd:string. |
deploy:serviceOf | Property | service of. Derived binding: the binding's value is the in-network URL of the referenced container, rendered as http://<service name>:<deploy:containerPort>. Use instead of a literal deploy:value so the URL follows the target's name and port. Range arch:Container. |
Environments (ADR-0015)
| Term | Kind | Description |
|---|---|---|
deploy:Override | Class | Override. An environment-scoped set of facts about one container: a qualified relation naming its deploy:environment and carrying replacement deploy:artifact, deploy:configuration or deploy:replicas facts. An override's artifact and replicas replace the shared ones whole; its bindings replace the shared binding with the same deploy:key or add one. Absent means shared, never unset (ADR-0015). |
deploy:override | Property | override. A container's environment-scoped facts. At most one per environment (constraint in shapes/seam-shapes.ttl). Domain arch:Container. Range deploy:Override. |
deploy:environment | Property | environment. The arch:Environment an override's facts hold in. Domain deploy:Override. Range arch:Environment. |
deploy:proxies | Property | proxies. A code-free reverse proxy and its target: the container forwards every request to the referenced container's single deploy:port (ADR-0015). Domain arch:Container. Range arch:Container. |
Network, storage, readiness
| Term | Kind | Description |
|---|---|---|
deploy:Port | Class | Port. A port a container listens on. Without deploy:publishedPort it is internal to the deployment network (compose 'expose'); with one it is published to the host (compose 'ports'). |
deploy:port | Property | port. Domain arch:Container. Range deploy:Port. |
deploy:containerPort | Property | container port. Port number the container listens on. Domain deploy:Port. Range xsd:integer. |
deploy:publishedPort | Property | published port. Host port the container port is published on. Absent means internal only. Domain deploy:Port. Range xsd:integer. |
deploy:Volume | Class | Volume. Named persistent storage that outlives a container, mounted into it at deploy:mountPath. |
deploy:volume | Property | volume. Domain arch:Container. Range deploy:Volume. |
deploy:volumeName | Property | volume name. Name of the volume resource (compose top-level 'volumes' key). Domain deploy:Volume. |
deploy:mountPath | Property | mount path. Absolute path inside the container where the volume is mounted. Domain deploy:Volume. |
deploy:Healthcheck | Class | Healthcheck. How the platform decides a container is ready: a probe command run on an interval. |
deploy:healthcheck | Property | healthcheck. Domain arch:Container. Range deploy:Healthcheck. |
deploy:probe | Property | probe. Shell command whose exit status 0 means ready (compose renders it as CMD-SHELL). Domain deploy:Healthcheck. |
deploy:interval | Property | interval. Time between probes, as a duration string (e.g. '5s'). Domain deploy:Healthcheck. |
deploy:StoreKind | Class | Store kind. Controlled vocabulary of the stores the runtime can use (ADR-0011). The runtime checks a store's deploy:storeKind against it; arch:technology stays free text for people and is never read. |
deploy:PostgreSQL | deploy:StoreKind | PostgreSQL. A PostgreSQL server, reached through a deploy:connectsTo binding on the executing container. |
deploy:SQLite | deploy:StoreKind | SQLite. An embedded SQLite file. No connection is needed; the path comes from the SEAMS_DB environment variable. |
deploy:SemPKM | deploy:StoreKind | SemPKM. A SemPKM instance, reached over HTTP: it holds the entities of the shapes seam:storedIn it as RDF, while process state stays in the runtime's relational store. The executing container has a deploy:connectsTo binding for its base URL and a deploy:authenticatesTo binding for its service token (ADR-0025). |
deploy:storeKind | Property | store kind. Store arch:Container -> the deploy:StoreKind it is. Exactly one per store (constraint in shapes/seam-shapes.ttl). Domain arch:Container. Range deploy:StoreKind. |
deploy:connectsTo | Property | connects to. On a deploy:binding blank node: the store arch:Container whose connection string the binding carries. It sits beside deploy:serviceOf; the value still comes from deploy:secretRef / deploy:secretName (or deploy:value for a non-secret dev URL), and the runtime reads the environment variable named by the binding's deploy:key, never a fixed key name (ADR-0011). Range arch:Container. |
deploy:authenticatesTo | Property | authenticates to. On a deploy:binding blank node: the deploy:SemPKM store arch:Container whose service token the binding carries. Its value comes from a secret (deploy:secretRef / deploy:secretName), and the runtime reads the environment variable named by the binding's deploy:key; the predicate, not the key name, tells it apart from the deploy:connectsTo binding (ADR-0025). Range arch:Container. |
Resources, replication, ordering
| Term | Kind | Description |
|---|---|---|
deploy:cpu | Property | Requested CPU (free-form for v1, e.g. '2'). Domain arch:Container. |
deploy:memory | Property | Requested memory (e.g. '4Gi'). Domain arch:Container. |
deploy:replicas | Property | Requested number of running INSTANCES of the container, not a node count. On an arch:Container (shared) or a deploy:Override (one environment); no rdfs:domain, as for deploy:artifact. Until backlog A10 the generator runs the serving container with one replica whatever this says (ADR-0015). Range xsd:integer. |
deploy:dependsOn | Property | Startup ordering, distinct from arch:dependsOn (design-time dependency). Domain arch:Container. Range arch:Container. |
Placement: policy in, resolved fact out
| Term | Kind | Description |
|---|---|---|
deploy:PlacementPolicy | Class | WHY a container lands where it does: affinity to an Environment or node class, hardware requirements, anti-affinity. seam:deployedTo becomes the RESOLVED OUTPUT of applying this policy, not a hand-asserted fact. |
deploy:placement | Property | Placement policy of the container. Generator rule: the RESOLVED placement, the container's seam:deployedTo node, renders as the swarm constraint 'node.labels.seams.node == <node rdfs:label>' whether or not a policy is asserted; the policy explains the choice, the deployedTo fact drives the output. Domain arch:Container. Range deploy:PlacementPolicy. |
deploy:targetEnvironment | Property | Domain deploy:PlacementPolicy. Range arch:Environment. |
deploy:requires | Property | Free-form capability requirement for v1 (e.g. 'fast-disks', 'gpu'). Matched against deploy:capability advertised by nodes. Domain deploy:PlacementPolicy. |
deploy:capability | Property | Free-form capability a deployment node advertises (e.g. 'fast-disks', 'gpu'); matched by deploy:requires. Split from deploy:requires so neither property violates its own domain. Domain arch:DeploymentNode. |
deploy:antiAffinity | Property | Must not co-locate with the referenced container. Domain deploy:PlacementPolicy. Range arch:Container. |
SemanticSeams Scenario and Example Vocabulary
Source: ontology/verify.ttl · prefix verify:
What a model says it should do, stated so a generator can turn it into tests (ADR-0014). A scenario runs a process through its user tasks and names the state it ends in; a decision example gives a decision's inputs and its expected output; a shape example points a SHACL shape at a node it must accept or reject. Policy tests need no terms here: they derive from the ODRL policies already in the model.
Every triple that uses these terms lives in the seams graph, next to the ODRL policies: each one joins layers (a process, data paths, parties, lifecycle states). DASH's test cases were checked first; ADR-0014 records why each was not reused. The constraints on these terms are the shapes in ontology/shapes/seam-shapes.ttl.
Scenarios
| Term | Kind | Description |
|---|---|---|
verify:Scenario | Class | Scenario. One run of a process: the verify:actor starts verify:process with the verify:given field values, the parties in verify:step complete its user tasks in order, and the run ends in verify:expectState, at verify:expectEndEvent, or both. The process is one a UI event seam:triggers, so the run starts the way a person starts it. The run also takes in every process it starts through a channel (ADR-0010), so an expectation may name a state or end event of one of those. Each verify:failure makes an operation fail whenever the run invokes it. |
verify:process | Property | process. The proc:Process the scenario runs. Domain verify:Scenario. Range proc:Process. |
verify:actor | Property | actor. The odrl:Party who acts: on a scenario, who starts the process; on a step, who completes the step's user task. A test acts as a person holding that role. Range odrl:Party. |
verify:given | Property | given. One input field value, as a blank node with one verify:field and one verify:value. On a scenario it is a field of the form that starts the process; on a step, a field of the form the task is completed on; on a decision example, a value of one of the decision's dec:input bindings. |
verify:field | Property | field. The sh:path of the shape property the given value fills, e.g. :amount. |
verify:value | Property | value. The literal for a given field or an expected output. Its lexical form is what a form submits; its datatype is what a decision evaluator receives. |
verify:step | Property | step. An RDF list of the user tasks the scenario completes, in order. Each member is a blank node with one verify:task, one verify:actor and the verify:given fields the task's form is submitted with. Domain verify:Scenario. |
verify:task | Property | task. The proc:UserTask a step completes. It is in the same BPMN model as the scenario's process. Range proc:UserTask. |
verify:expectState | Property | expect state. The state:State the process's entity is in when the steps are done. The entity is the one whose shape seam:lifecycle holds that state. It may be an entity a process the run starts through a channel moves. Domain verify:Scenario. Range state:State. |
verify:expectEndEvent | Property | expect end event. The BPMN end event the run finishes on: its IRI is the process model's IRI with the end event's id as fragment (ADR-0002), and it is lifted into the process's model graph like any element a seam names. It may instead be an end event of a process the run starts through a channel: one whose message start event seam:subscribesTo a channel an element of the scenario's process seam:publishesTo. Domain verify:Scenario. |
verify:failure | Property | failure. An operation that fails in this run, as a blank node with one verify:operation and one verify:status. Whenever the run invokes the operation, the runtime raises the status's comm:errorCode instead of calling the implementation, so the run takes the error boundary that seam:catches the status (ADR-0013). Failing the operation is the scenario's input, like a given value: the handler's own reasons for failing are not part of the model. Domain verify:Scenario. |
verify:operation | Property | operation. The hydra:Operation a verify:failure makes fail. Range hydra:Operation. |
verify:status | Property | status. The hydra:Status the operation fails with: one of its hydra:possibleStatus that carries a comm:errorCode. Range hydra:Status. |
Decision examples
| Term | Kind | Description |
|---|---|---|
verify:DecisionExample | Class | Decision example. One row of a decision's expected behaviour: the verify:given values for every dec:input of verify:decision, and the verify:expectOutput the DMN must return. |
verify:decision | Property | decision. The dec:Decision the example evaluates. Domain verify:DecisionExample. Range dec:Decision. |
verify:expectOutput | Property | expect output. One expected output, as a blank node with the dec:variable of one of the decision's dec:output bindings and the verify:value the DMN returns for it. Domain verify:DecisionExample. |
Shape examples
| Term | Kind | Description |
|---|---|---|
verify:validExample | Property | valid example. A node the shape must accept: validating it with the shape as its only shape conforms. The example node carries no rdf:type a shape targets, so it never makes the model itself fail its shapes. Domain sh:NodeShape. |
verify:invalidExample | Property | invalid example. A node the shape must reject: validating it with the shape as its only shape does not conform. Domain sh:NodeShape. |