@prefix cpcp: . @prefix a2a: . @prefix webmcpld: . @prefix jrl: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @prefix xsd: . # The ontology IRI is stable and unversioned; the versionIRI names one cut of # it. They were one string through 1.0.0, which meant a term's isDefinedBy # churned on every release and a consumer dereferencing an old cut landed on a # graph that no longer existed. Terms are defined by the ontology. Releases are # named by the versionIRI, and only there. a owl:Ontology ; owl:versionIRI ; owl:versionInfo "0.1.2" ; owl:priorVersion ; owl:imports ; rdfs:label "CPCP base ontology"@en ; rdfs:comment "coordination-protocol-contract-package (PubSubStandard_1) foundation: CID, PULL/PUSH operations, the grant and its result, ledgers, canonical records, and pods, plus two bindings -- a2a between agents and webmcpld in a browser tab. Imports JSON-RPC-LD core; PS1-PX profiles import this."@en ; rdfs:seeAlso . # ---- Classes ----------------------------------------------------------------- cpcp:Envelope a owl:Class ; rdfs:subClassOf jrl:Envelope ; rdfs:label "CPCP envelope"@en ; rdfs:comment "A JSON-RPC-LD envelope carrying a CPCP record payload."@en ; rdfs:isDefinedBy . cpcp:Operation a owl:Class ; rdfs:subClassOf jrl:Operation ; rdfs:label "CPCP operation"@en ; rdfs:comment "A CID-declared operation with an allowed direction (PULL or PUSH)."@en ; rdfs:isDefinedBy . cpcp:CID a owl:Class ; rdfs:label "Cyborg Interface Descriptor"@en ; rdfs:comment "The release-controlled grounding contract (JSON-LD context + operation manifest + closed shapes) from which the OKF bundle, ontology, shapes, and language bindings are all generated."@en ; rdfs:isDefinedBy . cpcp:Profile a owl:Class ; rdfs:label "CPCP profile"@en ; rdfs:comment "A concrete contract package (e.g. PS1-P1) that has exactly one CID."@en ; rdfs:isDefinedBy . cpcp:Pod a owl:Class ; rdfs:label "pod"@en ; rdfs:comment "A deployable FRONT/BACK unit that serves a CPCP profile's operations."@en ; rdfs:isDefinedBy . cpcp:Direction a owl:Class ; rdfs:label "operation direction"@en ; rdfs:comment "The permitted data-flow direction of an operation: PULL (FRONT<-BACK) or PUSH (BACK<-FRONT)."@en ; rdfs:isDefinedBy . cpcp:Ledger a owl:Class ; rdfs:label "ledger"@en ; rdfs:comment "An append-only store a record is placed in."@en ; rdfs:isDefinedBy . cpcp:CanonicalLedger a owl:Class ; rdfs:subClassOf cpcp:Ledger ; rdfs:label "canonical ledger"@en ; rdfs:comment "The portable, shared source of truth."@en ; rdfs:isDefinedBy . cpcp:SyncIntentLedger a owl:Class ; rdfs:subClassOf cpcp:Ledger ; rdfs:label "sync-intent ledger"@en ; rdfs:comment "Pending intended mutations awaiting reconciliation."@en ; rdfs:isDefinedBy . cpcp:PrivateLocalLedger a owl:Class ; rdfs:subClassOf cpcp:Ledger ; rdfs:label "private-local ledger"@en ; rdfs:comment "Non-portable, device-local records that MUST NOT cross a portable PULL/PUSH boundary."@en ; rdfs:isDefinedBy . cpcp:Record a owl:Class ; rdfs:label "record"@en ; rdfs:comment "A typed payload carried by an envelope and placed in a ledger."@en ; rdfs:isDefinedBy . cpcp:CanonicalRecord a owl:Class ; rdfs:subClassOf cpcp:Record ; rdfs:label "canonical record"@en ; rdfs:comment "A portable record destined for the canonical ledger."@en ; rdfs:isDefinedBy . cpcp:Note a owl:Class ; rdfs:subClassOf cpcp:CanonicalRecord ; rdfs:label "note"@en ; rdfs:comment "A portable canonical record containing a note."@en ; rdfs:isDefinedBy . cpcp:Insight a owl:Class ; rdfs:subClassOf cpcp:CanonicalRecord ; rdfs:label "insight"@en ; rdfs:comment "A portable canonical record containing an insight."@en ; rdfs:isDefinedBy . cpcp:Receipt a owl:Class ; rdfs:subClassOf cpcp:CanonicalRecord ; rdfs:label "receipt"@en ; rdfs:comment "Evidence of a protocol action or attested result."@en ; rdfs:isDefinedBy . cpcp:SyncIntent a owl:Class ; rdfs:subClassOf cpcp:Record ; rdfs:label "sync intent"@en ; rdfs:comment "A pending intended mutation destined for the sync-intent ledger."@en ; rdfs:isDefinedBy . cpcp:PrivateLocalArtifact a owl:Class ; rdfs:subClassOf cpcp:Record ; rdfs:label "private-local artifact"@en ; rdfs:comment "A non-portable device-local record; never crosses a portable boundary."@en ; rdfs:isDefinedBy . # ---- The grant, and what comes back ------------------------------------------ # One grant, two faces. Every binding in this tree has been typing nodes # cpcp:Context, cpcp:Effect and cpcp:Result on the wire against a vocabulary # that did not define them. cpcp:Grant a owl:Class ; rdfs:label "grant"@en ; rdfs:comment "The affordance a deterministic entity grants a non-deterministic one, as a node: a Context (read) or an Effect (write). Not an access decision -- authentication and authorization have already run, out of band."@en ; rdfs:isDefinedBy . cpcp:Context a owl:Class ; rdfs:subClassOf cpcp:Grant ; rdfs:label "context"@en ; rdfs:comment "The read face: grounded state a party pulls across the seam, following CID @id references. Costs nothing and promises nothing. Carries no operationId."@en ; rdfs:isDefinedBy . cpcp:Effect a owl:Class ; rdfs:subClassOf cpcp:Grant ; rdfs:label "effect"@en ; rdfs:comment "The write face: a typed, closed-shape node a party pushes across the seam, carrying an operationId -- the actor's word for what it is doing. The id is jrl:operationId; this vocabulary depends on it and does not restate it."@en ; rdfs:isDefinedBy . cpcp:Context owl:disjointWith cpcp:Effect . cpcp:Result a owl:Class ; rdfs:label "result"@en ; rdfs:comment "What comes back, always. Never raise across the boundary: a refusal is a Result with ok false and a reason, not an exception, a dropped connection, or a bare status."@en ; rdfs:isDefinedBy . cpcp:ok a owl:DatatypeProperty ; rdfs:domain cpcp:Result ; rdfs:range xsd:boolean ; rdfs:label "ok"@en ; rdfs:isDefinedBy . cpcp:reason a owl:DatatypeProperty ; rdfs:domain cpcp:Result ; rdfs:range xsd:string ; rdfs:label "reason"@en ; rdfs:comment "A member of the closed refusal taxonomy (spec/refusals.md). Stable strings: renaming one is a breaking contract change. It reaches a reader under error.reason or flat; both shapes are live and a client handles both."@en ; rdfs:isDefinedBy . cpcp:because a owl:DatatypeProperty ; rdfs:domain cpcp:Result ; rdfs:range rdfs:Literal ; rdfs:label "because"@en ; rdfs:comment "Why this reason, for a reader. Free text or a structured object depending on the seam; never a second reason."@en ; rdfs:isDefinedBy . # ---- Direction individuals --------------------------------------------------- cpcp:PULL a owl:NamedIndividual, cpcp:Direction ; rdfs:label "PULL"@en ; rdfs:comment "FRONT reads canonical state from BACK."@en ; rdfs:isDefinedBy . cpcp:PUSH a owl:NamedIndividual, cpcp:Direction ; rdfs:label "PUSH"@en ; rdfs:comment "FRONT publishes a permitted record to BACK."@en ; rdfs:isDefinedBy . # ---- Object properties ------------------------------------------------------- cpcp:declaresOperation a owl:ObjectProperty ; rdfs:domain cpcp:CID ; rdfs:range cpcp:Operation ; rdfs:label "declares operation"@en ; rdfs:isDefinedBy . cpcp:hasCID a owl:ObjectProperty ; rdfs:domain cpcp:Profile ; rdfs:range cpcp:CID ; rdfs:label "has CID"@en ; rdfs:isDefinedBy . cpcp:invokesOperation a owl:ObjectProperty ; rdfs:subPropertyOf jrl:invokesOperation ; rdfs:domain cpcp:Envelope ; rdfs:range cpcp:Operation ; rdfs:label "invokes operation"@en ; rdfs:isDefinedBy . cpcp:hasPayload a owl:ObjectProperty ; rdfs:domain cpcp:Envelope ; rdfs:range cpcp:Record ; rdfs:label "has payload"@en ; rdfs:isDefinedBy . cpcp:storedIn a owl:ObjectProperty ; rdfs:domain cpcp:Record ; rdfs:range cpcp:Ledger ; rdfs:label "stored in"@en ; rdfs:isDefinedBy . cpcp:hasDirection a owl:ObjectProperty ; rdfs:domain cpcp:Operation ; rdfs:range cpcp:Direction ; rdfs:label "has direction"@en ; rdfs:isDefinedBy . cpcp:references a owl:ObjectProperty ; rdfs:domain cpcp:Record ; rdfs:range rdfs:Resource ; rdfs:label "references"@en ; rdfs:comment "A record's portable @id reference to another resource."@en ; rdfs:isDefinedBy . # ---- Datatype properties ----------------------------------------------------- cpcp:contentDigest a owl:DatatypeProperty ; rdfs:domain cpcp:CID ; rdfs:range xsd:string ; rdfs:label "content digest"@en ; rdfs:comment "The immutable digest of the CID release artifact."@en ; rdfs:isDefinedBy . cpcp:protocolVersion a owl:DatatypeProperty ; rdfs:range xsd:string ; rdfs:label "protocol version"@en ; rdfs:isDefinedBy . # ---- Direction as a type ----------------------------------------------------- # cpcp:PULL and cpcp:PUSH above name the direction OF AN OPERATION. The wire # types a NODE instead -- a2a writes type: ["Effect", "cpcp:Push"], webmcpld # writes @type: ["webmcpld:Tool", "cpcp:Pull"] -- and that spelling had no term. # Same distinction, two positions. Kept as classes rather than a restriction on # cpcp:hasDirection: an a2a Context typed cpcp:Pull is not thereby an Operation, # and a domain inference saying it is would be a fact nobody asserted. cpcp:Pull a owl:Class ; rdfs:label "PULL-typed node"@en ; rdfs:comment "A node whose direction is read access: the caller reads from the seam, the page, or the peer. Costs nothing and promises nothing."@en ; rdfs:seeAlso cpcp:PULL ; rdfs:isDefinedBy . cpcp:Push a owl:Class ; rdfs:label "PUSH-typed node"@en ; rdfs:comment "A node whose direction is write access: the caller publishes a typed, closed-shape Effect, carrying an operationId -- its word for what it is doing."@en ; rdfs:seeAlso cpcp:PUSH ; rdfs:isDefinedBy . cpcp:Pull owl:disjointWith cpcp:Push . # ---- webmcpld: the grant in a browser tab ------------------------------------ # Terms for the WebMCP superset binding (webmcpld/README.md). Namespace is # https://w3id.org/cpcp/osi8/webmcpld# -- not the domain that serves the # reference instance. Domains change hands; identity must not. webmcpld:Tool a owl:Class ; rdfs:subClassOf cpcp:Operation ; rdfs:label "webmcpld tool"@en ; rdfs:comment "A WebMCP tool carrying a durable capability IRI, a direction (cpcp:Pull or cpcp:Push), and a closed shape. A CPCP operation whose seam is a page."@en ; rdfs:isDefinedBy . webmcpld:CID a owl:Class ; rdfs:subClassOf cpcp:CID ; rdfs:label "webmcpld CID"@en ; rdfs:comment "The contract of one origin's tools, linked from the document and resolvable at a well-known path. A tool grounding itself against a CID that does not declare it is grounding itself against nothing."@en ; rdfs:isDefinedBy . # ---- webmcpld object properties ---------------------------------------------- webmcpld:declaresTool a owl:ObjectProperty ; rdfs:subPropertyOf cpcp:declaresOperation ; rdfs:domain webmcpld:CID ; rdfs:range webmcpld:Tool ; rdfs:label "declares tool"@en ; rdfs:isDefinedBy . webmcpld:cid a owl:ObjectProperty ; rdfs:domain webmcpld:Tool ; rdfs:range webmcpld:CID ; rdfs:label "cid"@en ; rdfs:comment "The CID this tool names, as an absolute URL. The inverse direction of declaresTool, asserted by the page rather than by the document."@en ; rdfs:isDefinedBy . webmcpld:instance a owl:ObjectProperty ; rdfs:domain webmcpld:CID ; rdfs:range rdfs:Resource ; rdfs:label "instance"@en ; rdfs:comment "The origin whose tools this CID declares."@en ; rdfs:isDefinedBy . webmcpld:inputShape a owl:ObjectProperty ; rdfs:domain webmcpld:Tool ; rdfs:range rdfs:Resource ; rdfs:label "input shape"@en ; rdfs:comment "The SHACL node shape the arguments must satisfy. A resource reference, not a shape: shapes live in the profile, never duplicated here."@en ; rdfs:isDefinedBy . webmcpld:outputShape a owl:ObjectProperty ; rdfs:domain webmcpld:Tool ; rdfs:range rdfs:Resource ; rdfs:label "output shape"@en ; rdfs:comment "The SHACL node shape the result must satisfy."@en ; rdfs:isDefinedBy . # ---- webmcpld datatype properties -------------------------------------------- webmcpld:toolName a owl:DatatypeProperty ; rdfs:domain webmcpld:Tool ; rdfs:range xsd:string ; rdfs:label "tool name"@en ; rdfs:comment "The page-local WebMCP name. Not an identifier: two origins may both call it \"search\", and neither name means anything a tab over. The @id is what identifies."@en ; rdfs:isDefinedBy . webmcpld:exposedTo a owl:DatatypeProperty ; rdfs:domain webmcpld:Tool ; rdfs:range xsd:string ; rdfs:label "exposed to"@en ; rdfs:comment "A secure origin this tool is reachable from. Absent means same-origin documents and the user agent's own agent -- pod_internal_services in scope terms; present widens the reach to services. Exposure is measured from what is served, never from what the source intended."@en ; rdfs:isDefinedBy . webmcpld:autosubmit a owl:DatatypeProperty ; rdfs:domain webmcpld:Tool ; rdfs:range xsd:boolean ; rdfs:label "autosubmit"@en ; rdfs:comment "True asserts that this tool needs no human confirmation. On a cpcp:Push tool that is a claim a write may happen unwatched, and it is void without a because."@en ; rdfs:isDefinedBy . webmcpld:because a owl:DatatypeProperty ; rdfs:domain webmcpld:Tool ; rdfs:range xsd:string ; rdfs:label "because"@en ; rdfs:comment "Why a tool departs from the safe default. Required beside autosubmit true -- anything other than the default needs a reason somebody can read."@en ; rdfs:isDefinedBy . webmcpld:declaresReason a owl:DatatypeProperty ; rdfs:domain webmcpld:CID ; rdfs:range xsd:string ; rdfs:label "declares reason"@en ; rdfs:comment "A refusal reason this origin's tools can answer with, from the closed taxonomy (spec/refusals.md, including the Bindings section this binding's three live in)."@en ; rdfs:isDefinedBy . # ---- a2a: one agent addressing another --------------------------------------- # Terms for the payloads the A2A bindings put on the wire (a2a/README.md). # Namespace is https://w3id.org/cpcp/osi8/a2a#. The JSON-RPC 2.0 frame is NOT # modelled here and never will be: compacting jsonrpc into an IRI would break # every JSON-RPC parser, and the frame is json-rpc-ld's, not this vocabulary's. # What follows is the JSON-LD *inside* params and result. a2a:Message a owl:Class ; rdfs:label "message"@en ; rdfs:comment "The node sent under params.message. Carries Parts, one of which is the grant."@en ; rdfs:isDefinedBy . a2a:Part a owl:Class ; rdfs:label "part"@en ; rdfs:comment "One member of a Message or Artifact."@en ; rdfs:isDefinedBy . a2a:DataPart a owl:Class ; rdfs:subClassOf a2a:Part ; rdfs:label "data part"@en ; rdfs:comment "The Part that carries a grant: mediaType application/ld+json, and data that IS a cpcp:Context or cpcp:Effect node. Not a JSON object wrapping one."@en ; rdfs:isDefinedBy . a2a:TextPart a owl:Class ; rdfs:subClassOf a2a:Part ; rdfs:label "text part"@en ; rdfs:comment "A Part carrying no grant. A message of these alone is refused a2a_unsupported_part; the dispatcher never runs."@en ; rdfs:isDefinedBy . a2a:Task a owl:Class ; rdfs:label "task"@en ; rdfs:comment "What message/send returns and tasks/get reads back. Task identity is neither the JSON-RPC id nor the operationId, and the Task map is not the admission journal."@en ; rdfs:isDefinedBy . a2a:TaskStatus a owl:Class ; rdfs:label "task status"@en ; rdfs:isDefinedBy . a2a:TaskState a owl:Class ; rdfs:label "task state"@en ; rdfs:comment "Whether A2A delivered the grant, and whether the grant succeeded. Two questions, one field."@en ; rdfs:isDefinedBy . a2a:Artifact a owl:Class ; rdfs:label "artifact"@en ; rdfs:comment "What a Task carries back. The CPCP Result rides in an artifact Part, same media type, same vocabulary as the request."@en ; rdfs:isDefinedBy . a2a:AgentCard a owl:Class ; rdfs:label "agent card"@en ; rdfs:comment "Discovery. On the internet road, GET /.well-known/agent-card.json; in a pod, agent/card on the agent's subject. Advertises the authentication scheme and carries no secrets."@en ; rdfs:isDefinedBy . a2a:Interface a owl:Class ; rdfs:label "interface"@en ; rdfs:comment "One way to reach the agent: a transport, and the address on it."@en ; rdfs:isDefinedBy . a2a:Skill a owl:Class ; rdfs:label "skill"@en ; rdfs:isDefinedBy . a2a:Capabilities a owl:Class ; rdfs:label "capabilities"@en ; rdfs:isDefinedBy . a2a:Transport a owl:Class ; rdfs:label "transport"@en ; rdfs:comment "A road. Level 8 semantics MUST be identical across roads: a grant valid on one is valid on the other, and only discovery, addressing and the HTTP dual-signal differ."@en ; rdfs:isDefinedBy . # ---- a2a individuals --------------------------------------------------------- a2a:HTTP a owl:NamedIndividual, a2a:Transport ; rdfs:label "HTTP"@en ; rdfs:comment "The internet road. TLS required beyond the pod."@en ; rdfs:isDefinedBy . a2a:NATS a owl:NamedIndividual, a2a:Transport ; rdfs:label "NATS"@en ; rdfs:comment "The intrapod road: request-reply on a2a..rpc. Exclusive where configured -- there is no HTTP fallback, and a timeout is nats_unreachable."@en ; rdfs:isDefinedBy . a2a:completed a owl:NamedIndividual, a2a:TaskState ; rdfs:label "completed"@en ; rdfs:comment "Delivered, and the CPCP envelope said ok."@en ; rdfs:isDefinedBy . a2a:failed a owl:NamedIndividual, a2a:TaskState ; rdfs:label "failed"@en ; rdfs:comment "Delivered, and the grant was refused. A refused grant is still a completed A2A delivery."@en ; rdfs:isDefinedBy . a2a:rejected a owl:NamedIndividual, a2a:TaskState ; rdfs:label "rejected"@en ; rdfs:comment "Not delivered: no JSON-LD grant Part, so A2A never called the dispatcher. The one state where an a2a_ reason appears instead of a CPCP one."@en ; rdfs:isDefinedBy . # ---- a2a object properties --------------------------------------------------- a2a:parts a owl:ObjectProperty ; rdfs:range a2a:Part ; rdfs:label "parts"@en ; rdfs:comment "Domain is a Message or an Artifact, so none is asserted. In v1 the first JSON-LD grant Part wins and the rest are ignored."@en ; rdfs:isDefinedBy . a2a:data a owl:ObjectProperty ; rdfs:domain a2a:DataPart ; rdfs:range cpcp:Grant ; rdfs:label "data"@en ; rdfs:comment "The grant itself. A nested JSON-RPC document here, or a JSON object with no @context, is refused a2a_json_not_jsonld -- the retired nest."@en ; rdfs:isDefinedBy . a2a:status a owl:ObjectProperty ; rdfs:domain a2a:Task ; rdfs:range a2a:TaskStatus ; rdfs:label "status"@en ; rdfs:isDefinedBy . a2a:state a owl:ObjectProperty ; rdfs:domain a2a:TaskStatus ; rdfs:range a2a:TaskState ; rdfs:label "state"@en ; rdfs:isDefinedBy . a2a:artifacts a owl:ObjectProperty ; rdfs:domain a2a:Task ; rdfs:range a2a:Artifact ; rdfs:label "artifacts"@en ; rdfs:isDefinedBy . a2a:contextId a owl:ObjectProperty ; rdfs:domain a2a:Task ; rdfs:range rdfs:Resource ; rdfs:label "context id"@en ; rdfs:comment "The Message this Task answers. Correlation, not identity."@en ; rdfs:isDefinedBy . a2a:preferredTransport a owl:ObjectProperty ; rdfs:domain a2a:AgentCard ; rdfs:range a2a:Transport ; rdfs:label "preferred transport"@en ; rdfs:isDefinedBy . a2a:additionalInterfaces a owl:ObjectProperty ; rdfs:domain a2a:AgentCard ; rdfs:range a2a:Interface ; rdfs:label "additional interfaces"@en ; rdfs:isDefinedBy . a2a:transport a owl:ObjectProperty ; rdfs:domain a2a:Interface ; rdfs:range a2a:Transport ; rdfs:label "transport"@en ; rdfs:isDefinedBy . a2a:url a owl:ObjectProperty ; rdfs:domain a2a:Interface ; rdfs:range rdfs:Resource ; rdfs:label "url"@en ; rdfs:comment "In a pod this is the broker, never http://:. An interface naming an in-pod HTTP path is advertising the surface the bind exists to close."@en ; rdfs:isDefinedBy . a2a:skills a owl:ObjectProperty ; rdfs:domain a2a:AgentCard ; rdfs:range a2a:Skill ; rdfs:label "skills"@en ; rdfs:isDefinedBy . a2a:capabilities a owl:ObjectProperty ; rdfs:domain a2a:AgentCard ; rdfs:range a2a:Capabilities ; rdfs:label "capabilities"@en ; rdfs:isDefinedBy . # ---- a2a datatype properties ------------------------------------------------- a2a:role a owl:DatatypeProperty ; rdfs:domain a2a:Message ; rdfs:range xsd:string ; rdfs:label "role"@en ; rdfs:comment "The A2A conversational role of a Message. Not a CPCP role (FRONT, BACK, BackJob, GRAPH) -- one word, two vocabularies."@en ; rdfs:isDefinedBy . a2a:messageId a owl:DatatypeProperty ; rdfs:domain a2a:Message ; rdfs:range xsd:string ; rdfs:label "message id"@en ; rdfs:isDefinedBy . a2a:mediaType a owl:DatatypeProperty ; rdfs:domain a2a:Part ; rdfs:range xsd:string ; rdfs:label "media type"@en ; rdfs:comment "application/ld+json on a grant Part. A Card advertising application/json for the grant is describing the retired nest."@en ; rdfs:isDefinedBy . a2a:subject a owl:DatatypeProperty ; rdfs:domain a2a:Interface ; rdfs:range xsd:string ; rdfs:label "subject"@en ; rdfs:comment "The NATS subject: a2a..rpc for agent conversations, cpcp..rpc for grants that are not one."@en ; rdfs:isDefinedBy . a2a:protocol a owl:DatatypeProperty ; rdfs:domain a2a:Interface ; rdfs:range xsd:string ; rdfs:label "protocol"@en ; rdfs:isDefinedBy . a2a:defaultInputModes a owl:DatatypeProperty ; rdfs:domain a2a:AgentCard ; rdfs:range xsd:string ; rdfs:label "default input modes"@en ; rdfs:isDefinedBy . a2a:defaultOutputModes a owl:DatatypeProperty ; rdfs:domain a2a:AgentCard ; rdfs:range xsd:string ; rdfs:label "default output modes"@en ; rdfs:isDefinedBy . a2a:name a owl:DatatypeProperty ; rdfs:range xsd:string ; rdfs:label "name"@en ; rdfs:comment "Of an AgentCard or a Skill; no domain asserted."@en ; rdfs:isDefinedBy . a2a:description a owl:DatatypeProperty ; rdfs:domain a2a:Skill ; rdfs:range xsd:string ; rdfs:label "description"@en ; rdfs:isDefinedBy . a2a:streaming a owl:DatatypeProperty ; rdfs:domain a2a:Capabilities ; rdfs:range xsd:boolean ; rdfs:label "streaming"@en ; rdfs:isDefinedBy . a2a:pushNotifications a owl:DatatypeProperty ; rdfs:domain a2a:Capabilities ; rdfs:range xsd:boolean ; rdfs:label "push notifications"@en ; rdfs:comment "An A2A transport capability. Unrelated to cpcp:PUSH, which is a direction of a grant."@en ; rdfs:isDefinedBy .