Skip to content

Seam predicates ​

Generated page

This page is generated from ontology/seam.ttl on every docs build, so it always matches the file CI validates.

SemanticSeams Bridging Ontology. The cross-layer predicates that weld architecture, UI, process, decision, state, data, communication, authorization, and planning models into one navigable graph. Design rules: (1) few and generic beats many and precise; (2) every predicate must earn a cross-layer query; (3) reuse existing vocabularies inside layers, mint here only where layers meet; (4) the navigation backbone stays notation-agnostic.

Each predicate is described in the order and grouping of the ontology file. Constraints on how the predicates may be used live in the SHACL shapes, not in rdfs:domain or rdfs:range, so most predicates below state their intended source and target in their description.

seam:Model ​

Class · Model.

A diagram/model in some notation; typically stored as its own named graph.

seam:detailedBy ​

Predicate · detailed by.

Focus element -> model that elaborates it. Traversing this edge is 'zooming in'.

Range: seam:Model · Reveal: open

seam:notation ​

Predicate · notation.

Which renderer the shell mounts for this model.

Domain: seam:Model · Range: seam:Notation

seam:inModel ​

Predicate · in model.

Element -> the seam:Model it belongs to. Membership as DATA: the fragment-IRI convention (:order_bpmn#persist_task) is a rendering-dispatch naming scheme that SPARQL cannot traverse; this edge is what cross-layer property paths walk (e.g. process -> seam:detailedBy -> model -> ^seam:inModel -> task). Asserted for every lifted element. For elements whose triples are native RDF (IFML, states, shapes), it is asserted alongside layer containment until named-graph partitioning (ADR-0001) lands. Earns every query that crosses a model boundary.

Range: seam:Model

seam:Notation ​

Class · Notation.

seam:renderPayload ​

Predicate · render payload.

Link to (or literal containing) the native serialization used for rendering, e.g. BPMN 2.0 XML or DMN XML. Native payloads are kept as-is; only seam-participating elements are lifted to IRIs. Convention: native element IDs become IRI fragments on the model IRI, e.g. :order_bpmn#persist_task.

Domain: seam:Model

ValueKindMeaning
seam:C4seam:NotationC4-style architecture view
seam:IFMLseam:NotationIFML interaction model
seam:BPMNseam:NotationBPMN 2.0 process diagram
seam:DMNseam:NotationDMN decision model
seam:Statechartseam:NotationHarel statechart
seam:ShapeGraphseam:NotationRDF/SHACL data-model view
seam:Ontologyseam:NotationOWL ontology (classes and properties)

Reveal modes ​

seam:RevealMode ​

Class · Reveal mode.

How the viewer reveals a seam edge's target when the source is clicked (docs/research/2026-10-15-reveal-modes.md section 2, ADR-0005 as amended). Replaces the boolean navigational set: open and nest predicates navigate, layer predicates stay inspector-only until layer mode lands.

seam:reveal ​

Predicate · reveal.

seam predicate -> its default seam:RevealMode. Every seam predicate except the administrative ones (inModel, notation, renderPayload) declares exactly one (constraint in shapes/seam-shapes.ttl). An annotation, not a seam edge: it describes predicates, never model elements.

Range: seam:RevealMode

ValueKindMeaning
seam:Openseam:RevealModeopen
seam:Nestseam:RevealModenest
seam:Layerseam:RevealModelayer

Architecture ↔ everything ​

seam:presents ​

Predicate · presents.

arch:Container -> IFML seam:Model. The container's user-facing surface. (Resolved Container per review triage; a Component variant can wait.)

Reveal: nest

seam:exposes ​

Predicate · exposes.

arch:Container -> comm:Operation | comm:Channel.

Reveal: layer

seam:consumes ​

Predicate · consumes.

arch:Container -> comm:Operation | comm:Channel. The dependency edge.

Reveal: layer

seam:deployedTo ​

Predicate · deployed to.

arch:Container -> arch:DeploymentNode. Enables 'what breaks if db02 goes away'.

Reveal: layer

seam:executes ​

Predicate · executes.

arch:Container -> proc:Process it runs. Completes impact analysis: 'what breaks if node X dies' must reach the process layer, and the generic graph-literate worker needs to know where a task's process lives.

Reveal: nest

seam:schedules ​

Predicate · schedules.

arch:Container -> proc:Process whose timer start events it runs (ADR-0037). The container also seam:executes the process, since it starts each instance in process. Exactly one per process whose BPMN model holds a proc:TimerStartEvent; listed, never derived from seam:executes, because a process may be executed by more than one container and the one that keeps time is a decision. Earns the query "which schedules stop if node X dies" (seam:schedules/seam:deployedTo). (Constraints in shapes/seam-shapes.ttl.)

Reveal: nest

seam:owns ​

Predicate · owns.

A bounded context owns a model: the model is written in the context's language and changed by its team.

Domain: arch:BoundedContext · Range: seam:Model · Reveal: layer

Data ↔ architecture ​

seam:storedIn ​

Predicate · stored in.

sh:NodeShape -> arch:Container (a store) that persists its instances. Lets impact-of-node.rq answer which data is lost if a node goes away (ADR-0011). (Constraint in shapes/seam-shapes.ttl.)

Reveal: layer

UI ↔ process ​

seam:triggers ​

Predicate · triggers.

ifml:Event -> proc:Process | dec:Decision. IFML's action-reference extension point, made concrete.

Reveal: open

seam:completedOn ​

Predicate · completed on.

proc:UserTask -> ifml:Form on which a person completes the task, at most one per task (ADR-0009, decision D027). The mirror of seam:triggers: an event starts a process, a user task waits for a form. The screen is the ifml:ViewContainer that ifml:contains the form; the form's one event seam:submitsTo the completion operation, and the form seam:writes the task's output shape. Authorization: the task's seam:governedBy policies are evaluated with the task IRI as the odrl:target; an ungoverned task is open to any authenticated identity. Earns the query 'which screens must a person visit to finish this process' (docs/queries/screens-to-finish-process.rq). (Constraint in shapes/seam-shapes.ttl.)

Reveal: open

seam:visibleWhen ​

Predicate · visible when.

ifml:ViewComponent -> state:State. Conditional rendering as a graph edge. Multi-valued: the component is visible when the state is any one of its values. Evaluation rule: the guard is evaluated server-side, at render time, against the lifecycle of the shape the component seam:reads (the shape's effective lifecycle: its own seam:lifecycle, else that of its sh:targetClass, ADR-0031; the machine must state:hasState every guard state). The template variable is the shape's local name, lowercased, minus a trailing 'shape', plus '_state' (:MessageShape -> message_state), compared with the guard state's rdfs:label (one state: ==, several: in a tuple of the labels, sorted). The value is the state of the current instance in the component's render context (for the message thread, the conversation's latest message). A state change re-renders the component through the channel events the client consumes (comm:eventName on a seam:consumes channel); no client-side guard.

Reveal: layer

UI ↔ communication ​

seam:submitsTo ​

Predicate · submits to.

ifml:Event -> hydra:Operation the event calls (the form's hx-post, the FastAPI route). seam:triggers names the process the event starts; the operation's handler starts it. Earns the query 'which route does this UI event call, and which policies must that route enforce' (event -> seam:submitsTo -> operation -> seam:governedBy). (Constraint in shapes/seam-shapes.ttl.)

Reveal: layer

seam:rendersComponent ​

Predicate · renders component.

hydra:Operation -> ifml:ViewComponent whose partial is the operation's seam:UIFragment response. The template name derives from the component (ADR-0007 component -> partial): <component>.html when the flow that lands the response swaps ifml:Replace, <component>_item.html when it swaps ifml:Append or ifml:Prepend. The inverse earns 'which endpoint loads or updates this component' (the hx-get of a list or details). (Constraint in shapes/seam-shapes.ttl.)

Reveal: layer

Process ↔ decisions, communication, data ​

seam:decidedBy ​

Predicate · decided by.

proc business-rule task -> dec:Decision.

Reveal: open

seam:invokes ​

Predicate · invokes.

proc service task -> comm:Operation.

Reveal: layer

seam:publishesTo ​

Predicate · publishes to.

proc message throw event (completion event, named by the channel's rdfs:label) | proc service task that seam:invokes an operation (each streamed delta of that operation's reply, named by comm:eventName) | state:Transition (the domain event the transition is, named by its IRI or state:trigger, never a copied label; ADR-0031) -> comm:Channel.

Reveal: layer

seam:subscribesTo ​

Predicate · subscribes to.

proc message catch event -> comm:Channel. On a process's start event it makes the process channel-started: each publish on the channel starts an instance (ADR-0010).

Reveal: layer

seam:reads ​

Predicate · reads.

task | view component | decision -> sh:NodeShape it reads. Workhorse of impact analysis. (Constraint lives in shapes/seam-shapes.ttl, not rdfs:range: RDFS ranges infer, they don't reject.)

Reveal: layer

seam:writes ​

Predicate · writes.

task | ui event -> sh:NodeShape it writes. Workhorse of impact analysis. (Constraint in shapes/seam-shapes.ttl.)

Reveal: layer

Data ↔ lifecycle ​

seam:lifecycle ​

Predicate · lifecycle.

owl:Class | sh:NodeShape -> state:StateMachine governing instances of the class or the shape. The class is preferred; a shape's effective lifecycle is its own, else that of its sh:targetClass, and more than one is a violation (ADR-0031). (Constraint in shapes/seam-shapes.ttl.)

Reveal: open

seam:aggregateMember ​

Predicate · aggregate member.

aggregate (an owl:Class or sh:NodeShape with a seam:lifecycle) -> sh:NodeShape whose entities the aggregate commits together, in one store transaction. Listed, never derived from sh:targetClass; a shape is a member of at most one aggregate (ADR-0035). (Constraint in shapes/seam-shapes.ttl.)

Reveal: layer

seam:fires ​

Predicate · fires.

proc task -> state:Transition. Inverse view: which tasks may move an Order out of 'submitted'?

Reveal: layer

Communication contracts ​

seam:acceptsShape ​

Predicate · accepts shape.

operation | channel -> request / event payload sh:NodeShape. (Constraint in shapes/seam-shapes.ttl.)

Reveal: layer

seam:returnsShape ​

Predicate · returns shape.

operation -> response payload sh:NodeShape. For operations whose seam:mediaKind is seam:UIFragment, this describes the shape of the DATA the fragment renders, not the HTTP body (which is HTML). On a hydra:Status that an operation hydra:possibleStatus (an error with a comm:errorCode), it is the error shape: the problem+json body of that response (ADR-0013). (Constraint in shapes/seam-shapes.ttl.)

Reveal: layer

seam:implementedBy ​

Predicate · implemented by.

operation -> the implementation that serves it (ADR-0012). The node's rdf:type is its kind: comm:LLMCompletion, comm:PythonHandler or comm:HTTPEndpoint. At most one per operation; every task that invokes the operation gets the same implementation. An operation invoked across containers must declare one; an in-process operation with none is served by the runtime itself. Layer reveal: the implementation is code, not a model the viewer opens. (Constraints in shapes/seam-shapes.ttl.)

Domain: hydra:Operation · Reveal: layer

seam:catches ​

Predicate · catches.

proc:ErrorBoundaryEvent -> the hydra:Status it catches: one error (comm:errorCode) of the operation its task seam:invokes (ADR-0013). When the operation's implementation raises that error, the runtime routes the process down the boundary's outgoing flow instead of failing the instance. Exactly one per boundary. Layer reveal: the status is part of the operation's contract, not a model of its own. (Constraints in shapes/seam-shapes.ttl.)

Reveal: layer

seam:mediaKind ​

Predicate · media kind.

operation -> seam:UIFragment | seam:Data. The htmx two-kinds-of-API distinction.

Range: seam:MediaKind · Reveal: layer

seam:MediaKind ​

Class · Media kind.

ValueKindMeaning
seam:UIFragmentseam:MediaKindhypermedia / UI fragment response
seam:Dataseam:MediaKindpure data (JSON-LD) response

Authorization (cross-cutting by design) ​

seam:governedBy ​

Predicate · governed by.

ANY element -> policy (odrl:Policy, or an ACP/WebACL resource — hence no rdfs:range, which would wrongly INFER odrl:Policy on a WebACL resource). Deliberately broad domain: attaches to events, tasks, operations, shapes, transitions alike. Propagation rule (documented, not enforced in v1): an action is allowed iff every edge on the UI-event -> ... -> shape path carries either no policy or a satisfied one.

Reveal: layer

Profiles and planning (reserved seams) ​

seam:Profile ​

Class.

A methodology profile: a component taxonomy plus a SHACL shapes library validating the model graph itself (e.g. IDesign).

seam:conformsTo ​

Predicate · conforms to.

Range: seam:Profile · Reveal: layer

seam:offersClass ​

Predicate · offers class.

Profile -> a class the editor offers when adding an element, one triple per class (ADR-0018). Stated in the profile's profile.ttl, never in the model. Labels for the offered class come from skos:prefLabel, else rdfs:label, in the same file.

Domain: seam:Profile · Reveal: layer

seam:usesGenerator ​

Predicate · uses generator.

Profile -> the name (a string) of a generator the editor previews: a seams.generators entry-point name as written in seams.toml (ADR-0016, ADR-0018).

Domain: seam:Profile · Reveal: layer

seam:profileShapes ​

Predicate · profile shapes.

Profile -> a shapes file (a string path relative to the profile directory) merged into the viewer's health check (ADR-0018).

Domain: seam:Profile · Reveal: layer

seam:realizes ​

Predicate · realizes.

plan:Activity -> ANY element. The single edge the Gantt projection needs.

Reveal: layer

Released under the Apache-2.0 License.