@agenticprimitives/ontology 1.0.0-alpha.4 → 1.0.0-alpha.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/README.md +59 -21
  2. package/cbox/agent-facet-shapes.shacl.ttl +130 -0
  3. package/cbox/capability-catalog-shapes.shacl.ttl +284 -0
  4. package/cbox/card-projection-shapes.shacl.ttl +216 -0
  5. package/cbox/consultation-shapes.shacl.ttl +85 -0
  6. package/cbox/content-vocabulary.ttl +52 -0
  7. package/cbox/controlled-vocabularies.ttl +224 -4
  8. package/cbox/discovery-graph-shapes.shacl.ttl +284 -0
  9. package/cbox/familyoffice-shapes.shacl.ttl +92 -0
  10. package/cbox/familyoffice-vocabulary.ttl +48 -0
  11. package/cbox/geo-vocabulary.ttl +36 -0
  12. package/cbox/guidance-vocabulary.ttl +22 -0
  13. package/cbox/interaction-shapes.shacl.ttl +218 -0
  14. package/cbox/interaction-vocabulary.ttl +159 -0
  15. package/cbox/judgment-shapes.shacl.ttl +83 -0
  16. package/cbox/naming-registry-shapes.shacl.ttl +272 -0
  17. package/cbox/org-team-shapes.shacl.ttl +184 -0
  18. package/cbox/privacy-credential-shapes.shacl.ttl +187 -0
  19. package/cbox/profile-facet-vocabulary.ttl +50 -0
  20. package/cbox/registry-vocabulary.ttl +86 -0
  21. package/cbox/run-measures-shapes.shacl.ttl +59 -0
  22. package/cbox/run-provenance-shapes.shacl.ttl +264 -0
  23. package/cbox/scope-vocabulary.ttl +112 -0
  24. package/cbox/skill-grounding-vocabulary.ttl +18 -0
  25. package/cbox/skill-vocabulary.ttl +50 -0
  26. package/context.jsonld +37 -1
  27. package/dist/arg-types.d.ts +60 -0
  28. package/dist/arg-types.d.ts.map +1 -0
  29. package/dist/arg-types.js +143 -0
  30. package/dist/arg-types.js.map +1 -0
  31. package/dist/artifacts.d.ts +9 -2
  32. package/dist/artifacts.d.ts.map +1 -1
  33. package/dist/artifacts.js +153 -2
  34. package/dist/artifacts.js.map +1 -1
  35. package/dist/contact-fields.d.ts +28 -0
  36. package/dist/contact-fields.d.ts.map +1 -0
  37. package/dist/contact-fields.js +38 -0
  38. package/dist/contact-fields.js.map +1 -0
  39. package/dist/decisions.d.ts +69 -0
  40. package/dist/decisions.d.ts.map +1 -0
  41. package/dist/decisions.js +98 -0
  42. package/dist/decisions.js.map +1 -0
  43. package/dist/evaluation-context.d.ts +134 -0
  44. package/dist/evaluation-context.d.ts.map +1 -0
  45. package/dist/evaluation-context.js +136 -0
  46. package/dist/evaluation-context.js.map +1 -0
  47. package/dist/governance.d.ts +84 -0
  48. package/dist/governance.d.ts.map +1 -0
  49. package/dist/governance.js +88 -0
  50. package/dist/governance.js.map +1 -0
  51. package/dist/grounded-vocabulary.d.ts +29 -0
  52. package/dist/grounded-vocabulary.d.ts.map +1 -0
  53. package/dist/grounded-vocabulary.js +110 -0
  54. package/dist/grounded-vocabulary.js.map +1 -0
  55. package/dist/household.d.ts +19 -0
  56. package/dist/household.d.ts.map +1 -0
  57. package/dist/household.js +41 -0
  58. package/dist/household.js.map +1 -0
  59. package/dist/index.d.ts +1091 -3
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +1323 -5
  62. package/dist/index.js.map +1 -1
  63. package/dist/outcomes.d.ts +47 -0
  64. package/dist/outcomes.d.ts.map +1 -0
  65. package/dist/outcomes.js +40 -0
  66. package/dist/outcomes.js.map +1 -0
  67. package/dist/participant-vocabulary.d.ts +57 -0
  68. package/dist/participant-vocabulary.d.ts.map +1 -0
  69. package/dist/participant-vocabulary.js +66 -0
  70. package/dist/participant-vocabulary.js.map +1 -0
  71. package/dist/party-roles.d.ts +115 -0
  72. package/dist/party-roles.d.ts.map +1 -0
  73. package/dist/party-roles.js +343 -0
  74. package/dist/party-roles.js.map +1 -0
  75. package/dist/payload-classes.d.ts +22 -0
  76. package/dist/payload-classes.d.ts.map +1 -0
  77. package/dist/payload-classes.js +30 -0
  78. package/dist/payload-classes.js.map +1 -0
  79. package/dist/plan-shapes.d.ts +18 -0
  80. package/dist/plan-shapes.d.ts.map +1 -0
  81. package/dist/plan-shapes.js +38 -0
  82. package/dist/plan-shapes.js.map +1 -0
  83. package/dist/principles.generated.d.ts +11 -0
  84. package/dist/principles.generated.d.ts.map +1 -0
  85. package/dist/principles.generated.js +293 -0
  86. package/dist/principles.generated.js.map +1 -0
  87. package/dist/published-works.d.ts +13 -0
  88. package/dist/published-works.d.ts.map +1 -0
  89. package/dist/published-works.js +18 -0
  90. package/dist/published-works.js.map +1 -0
  91. package/dist/relations.d.ts +44 -0
  92. package/dist/relations.d.ts.map +1 -0
  93. package/dist/relations.js +104 -0
  94. package/dist/relations.js.map +1 -0
  95. package/dist/run-measures-context.d.ts +74 -0
  96. package/dist/run-measures-context.d.ts.map +1 -0
  97. package/dist/run-measures-context.js +77 -0
  98. package/dist/run-measures-context.js.map +1 -0
  99. package/dist/run-provenance-context.d.ts +315 -0
  100. package/dist/run-provenance-context.d.ts.map +1 -0
  101. package/dist/run-provenance-context.js +323 -0
  102. package/dist/run-provenance-context.js.map +1 -0
  103. package/dist/transitions.d.ts +42 -0
  104. package/dist/transitions.d.ts.map +1 -0
  105. package/dist/transitions.js +100 -0
  106. package/dist/transitions.js.map +1 -0
  107. package/dist/vault-records.d.ts +74 -0
  108. package/dist/vault-records.d.ts.map +1 -0
  109. package/dist/vault-records.js +777 -0
  110. package/dist/vault-records.js.map +1 -0
  111. package/dist/versions.generated.d.ts +262 -0
  112. package/dist/versions.generated.d.ts.map +1 -0
  113. package/dist/versions.generated.js +318 -0
  114. package/dist/versions.generated.js.map +1 -0
  115. package/evaluation.jsonld +133 -0
  116. package/mappings/actor-context-standards.ttl +89 -0
  117. package/mappings/agent-discovery-standards.ttl +127 -0
  118. package/mappings/collaboration-crosswalk-actors.ttl +30 -0
  119. package/mappings/collaboration-crosswalk-authority.ttl +31 -0
  120. package/mappings/collaboration-crosswalk-guidance.ttl +29 -0
  121. package/mappings/collaboration-crosswalk-intent.ttl +29 -0
  122. package/mappings/collaboration-crosswalk-messaging.ttl +37 -0
  123. package/mappings/collaboration-crosswalk-organization.ttl +66 -0
  124. package/mappings/collaboration-crosswalk-protocols.ttl +49 -0
  125. package/mappings/collaboration-crosswalk-skills.ttl +50 -0
  126. package/mappings/collaboration-profile.ttl +82 -0
  127. package/mappings/commerce-engagement-crosswalk.ttl +83 -0
  128. package/mappings/spine-standards.ttl +83 -0
  129. package/package.json +31 -9
  130. package/run-measures.jsonld +34 -0
  131. package/run-provenance.jsonld +314 -0
  132. package/tbox/actor-context.ttl +145 -0
  133. package/tbox/agent-resolution.ttl +308 -0
  134. package/tbox/agreement.ttl +77 -0
  135. package/tbox/attestation.ttl +156 -0
  136. package/tbox/card-projection.ttl +350 -0
  137. package/tbox/constraints.ttl +150 -0
  138. package/tbox/contact.ttl +61 -0
  139. package/tbox/content.ttl +76 -0
  140. package/tbox/context.ttl +508 -0
  141. package/tbox/coordination.ttl +263 -0
  142. package/tbox/core.ttl +325 -7
  143. package/tbox/dcat-imports.ttl +19 -0
  144. package/tbox/discovery.ttl +273 -0
  145. package/tbox/dqv-imports.ttl +29 -0
  146. package/tbox/earl-imports.ttl +32 -0
  147. package/tbox/engagement.ttl +349 -0
  148. package/tbox/entitlement.ttl +41 -0
  149. package/tbox/estate.ttl +78 -0
  150. package/tbox/evaluation.ttl +330 -0
  151. package/tbox/execution.ttl +720 -0
  152. package/tbox/familyoffice.ttl +87 -0
  153. package/tbox/fulfillment.ttl +140 -0
  154. package/tbox/geo.ttl +28 -0
  155. package/tbox/governance.ttl +67 -0
  156. package/tbox/guidance.ttl +40 -0
  157. package/tbox/household.ttl +142 -0
  158. package/tbox/identity.ttl +133 -6
  159. package/tbox/inference.ttl +177 -0
  160. package/tbox/intents.ttl +241 -0
  161. package/tbox/interaction.ttl +297 -0
  162. package/tbox/messaging.ttl +244 -0
  163. package/tbox/naming.ttl +114 -0
  164. package/tbox/org.ttl +410 -0
  165. package/tbox/payload.ttl +94 -0
  166. package/tbox/payment.ttl +124 -0
  167. package/tbox/plan.ttl +169 -0
  168. package/tbox/principles.ttl +212 -0
  169. package/tbox/privacy-credential.ttl +436 -0
  170. package/tbox/profile.ttl +107 -0
  171. package/tbox/prov-imports.ttl +73 -0
  172. package/tbox/registry.ttl +382 -0
  173. package/tbox/resolution.ttl +108 -0
  174. package/tbox/scope.ttl +59 -0
  175. package/tbox/security-exposure.ttl +102 -0
  176. package/tbox/situation.ttl +56 -0
  177. package/tbox/skills.ttl +316 -0
  178. package/tbox/skos-imports.ttl +54 -0
  179. package/tbox/transition.ttl +63 -0
  180. package/tbox/trust.ttl +210 -0
  181. package/tbox/values.ttl +81 -0
  182. package/tbox/verification-receipt.ttl +134 -0
  183. package/versions.adoption.json +173 -0
@@ -0,0 +1,297 @@
1
+ # T-box — Agentic Interaction: the canonical bounded context (spec 340; ADR-0058, extending ADR-0048).
2
+ #
3
+ # WHY THIS NAMESPACE IS `apix:` AND NOT `apfab:`. `apfab:` was named after the PACKAGE that implements
4
+ # these concepts. That binds the vocabulary to a deployment decision and forces every reader to know
5
+ # which runtime owns which meaning before they can read a triple. Concepts get named after concepts.
6
+ # `packages/fabric` remains the Ring-0 operational realization (ADR-0047) — it is not the semantic owner.
7
+ #
8
+ # THE SPINE, in one line each. Getting these apart is the entire point of the file:
9
+ #
10
+ # Interaction the durable GOVERNED SITUATION — participants, profile, state, commitments
11
+ # Exchange one IMMUTABLE SIGNED UNIT crossing the interaction boundary
12
+ # Act what the actor is COMMUNICATIVELY DOING (ask, offer, counter, command…)
13
+ # Content the THING the act is about (a Question, an Offer, a Command) — optional
14
+ # Commitment a NORMATIVE OBLIGATION some acts create, modify or discharge
15
+ # Receipt ATTESTED EVIDENCE that something occurred — never that it was authorized
16
+ #
17
+ # An Exchange without an Interaction is a message. An Interaction without Exchanges is an empty room.
18
+ #
19
+ # THE INVARIANT EVERYTHING ELSE RESTS ON: no communicative act is execution authority. A signed Command
20
+ # is a recorded request. It creates no execution without an independent authority decision, which lives
21
+ # in `delegation` + `entitlements` + `tool-policy` and is re-evaluated at the moment of acting
22
+ # (ADR-0043, ADR-0041). This ontology is safe to make expressive precisely because it confers nothing.
23
+
24
+ @prefix apix: <https://agenticprimitives.dev/ns/interaction#> .
25
+ @prefix apmsg: <https://agenticprimitives.dev/ns/messaging#> .
26
+ @prefix apint: <https://agenticprimitives.dev/ns/intent#> .
27
+ @prefix apsit: <https://agenticprimitives.dev/ns/situation#> .
28
+ @prefix ap: <https://agenticprimitives.dev/ns/core#> .
29
+ @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
30
+ @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
31
+ @prefix owl: <http://www.w3.org/2002/07/owl#> .
32
+ @prefix skos: <http://www.w3.org/2004/02/skos/core#> .
33
+ @prefix prov: <http://www.w3.org/ns/prov#> .
34
+ @prefix p-plan: <http://purl.org/net/p-plan#> .
35
+ @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
36
+
37
+ apix: a owl:Ontology ;
38
+ rdfs:label "Agentic Primitives — Agentic Interaction" ;
39
+ owl:versionInfo "1.0.0" ;
40
+ rdfs:comment "Canonical semantics for governed exchange between agents. Realized operationally by packages/fabric; confers no authority (ADR-0058)." .
41
+
42
+ # ─── The situation ──────────────────────────────────────────────────────────
43
+
44
+ apix:Interaction a owl:Class ;
45
+ rdfs:subClassOf apsit:Situation, prov:Entity ;
46
+ rdfs:label "Interaction" ;
47
+ rdfs:comment "A durable governed situation among Person/Organization/Service agents, realized through immutable signed Exchanges. It is NOT a message, a thread, or a task. It persists across exchanges, participants joining and leaving, and profile versions." .
48
+
49
+ apix:InteractionProfile a owl:Class ;
50
+ rdfs:subClassOf apsit:SituationDescription, prov:Plan, p-plan:Plan ;
51
+ rdfs:label "InteractionProfile" ;
52
+ rdfs:comment "A VERSIONED description of one interaction kind: permitted roles, permitted acts, required contexts, state machine, authority requirements, shapes. This replaces frozen `kind`/`state` enums — a new interaction type is a new profile, not a schema change. Pinned by version into every Exchange so a Negotiation cannot be downgraded to a Conversation." .
53
+
54
+ apix:Participation a owl:Class ;
55
+ rdfs:subClassOf apsit:SituationParticipation, prov:Entity ;
56
+ rdfs:label "Participation" ;
57
+ rdfs:comment "An agent's standing in an Interaction under a profile-defined role, over a time window. Participating is never authority: a role explains WHY delegations were issued, never substitutes for them (ADR-0048 §4)." .
58
+
59
+ # ─── The unit that crosses the boundary ─────────────────────────────────────
60
+
61
+ apix:Exchange a owl:Class ;
62
+ rdfs:subClassOf prov:Entity ;
63
+ rdfs:label "Exchange" ;
64
+ rdfs:comment "One immutable, signed unit crossing an interaction boundary. Records the acts performed, the content conveyed, the causal relations, the exact context snapshot, and the proof. Immutable: a correction is a NEW Exchange that supersedes, never an edit." .
65
+
66
+ apix:ExchangeActivity a owl:Class ;
67
+ rdfs:subClassOf prov:Activity ;
68
+ rdfs:label "ExchangeActivity" ;
69
+ rdfs:comment "The occurrence of exchanging — the PROV activity whose record is an apix:Exchange. Separated so provenance can attribute the doing (activity) distinctly from the artifact (entity)." .
70
+
71
+ # ─── Act and content are different things ───────────────────────────────────
72
+
73
+ apix:CommunicativeAct a owl:Class ;
74
+ rdfs:subClassOf prov:Activity ;
75
+ rdfs:label "CommunicativeAct" ;
76
+ rdfs:comment "What the actor is communicatively DOING. Named CommunicativeAct because ADR-0048 §5/§6 already established that term and the TS type is CommunicativeActV1 — a synonym would have been a second name for a named concept, which is the problem this ADR exists to remove. MOVED here from apmsg: an act is interaction semantics, not a messaging detail. One Exchange may realize SEVERAL acts: \"yes to the date, but $8,000 not $10,000\" is an Answer, an Accept and a CounterOffer at once. Collapsing act into content makes that unrepresentable (ADR-0058 §13)." .
77
+
78
+ apix:performative a owl:ObjectProperty ;
79
+ rdfs:domain apix:CommunicativeAct ;
80
+ rdfs:range skos:Concept ;
81
+ rdfs:label "performative" ;
82
+ rdfs:comment "WHAT the act does, from the apix:performativeScheme codelist (cbox/interaction-vocabulary.ttl). Named `performative` because that is what the in-use TS field is called (CommunicativeActV1.performative, 13 values) — my first pass called it `actKind` over a parallel 10-concept `apix:ActKinds` scheme, which was a second name for a named concept and exactly what ADR-0058 exists to remove. A SKOS concept rather than an OWL class so the vocabulary extends without the T-box becoming a class catalog; acts with distinctive CONSEQUENCES are promoted to classes below." .
83
+
84
+ # Promoted acts — these earn OWL classes because they have consequences the generic act does not.
85
+ apix:OfferAct a owl:Class ;
86
+ rdfs:subClassOf apix:CommunicativeAct ;
87
+ rdfs:label "OfferAct" ;
88
+ rdfs:comment "Proposes terms whose ACCEPTANCE may create a Commitment. Promoted from a bare act kind because that consequence needs its own shapes and authority checks." .
89
+
90
+ apix:CounterOfferAct a owl:Class ;
91
+ rdfs:subClassOf apix:OfferAct ;
92
+ rdfs:label "CounterOfferAct" ;
93
+ rdfs:comment "A NEW immutable Offer that supersedes a prior one. It never mutates the offer it counters — the superseded offer remains in evidence exactly as sent." .
94
+
95
+ apix:AcceptAct a owl:Class ;
96
+ rdfs:subClassOf apix:CommunicativeAct ;
97
+ rdfs:label "AcceptAct" ;
98
+ rdfs:comment "Accepts an identified Offer. Creates a Commitment ONLY when the profile, terms, time window, signer and authority are all valid — acceptance by an unauthorized party creates nothing." .
99
+
100
+ apix:CommandAct a owl:Class ;
101
+ rdfs:subClassOf apix:CommunicativeAct ;
102
+ rdfs:label "CommandAct" ;
103
+ rdfs:comment "Directs action. A signed Command is a RECORDED REQUEST: it creates no execution without an independent authority decision. A denied Command is still a valid, recorded Exchange." .
104
+
105
+ apix:ReactAct a owl:Class ;
106
+ rdfs:subClassOf apix:CommunicativeAct ;
107
+ rdfs:label "ReactAct" ;
108
+ rdfs:comment "A lightweight target-relative annotation. NEVER acceptance, approval, or acknowledgement by default — a thumbs-up does not accept an offer (ADR-0058 §16)." .
109
+
110
+ apix:Content a owl:Class ;
111
+ rdfs:subClassOf prov:Entity ;
112
+ rdfs:label "Content" ;
113
+ rdfs:comment "The information object an act is ABOUT — a Question, an Offer, a Command. Distinct from the act that conveys it and from the Message that renders it." .
114
+
115
+ apix:Question a owl:Class ; rdfs:subClassOf apix:Content ; rdfs:label "Question" .
116
+ apix:Answer a owl:Class ; rdfs:subClassOf apix:Content ; rdfs:label "Answer" ;
117
+ rdfs:comment "MUST identify the Question it addresses (apix:answers). An answer with no question is an Inform." .
118
+ apix:Offer a owl:Class ; rdfs:subClassOf apix:Content ; rdfs:label "Offer" ;
119
+ rdfs:comment "Proposed terms. An Offer is NOT a Commitment; it becomes one only through a valid, authorized Accept." .
120
+ apix:Command a owl:Class ; rdfs:subClassOf apix:Content ; rdfs:label "Command" .
121
+ apix:Notification a owl:Class ; rdfs:subClassOf apix:Content ; rdfs:label "Notification" ;
122
+ rdfs:comment "Reports that something happened. Reporting a revocation does not PERFORM the revocation." .
123
+
124
+ apix:Message a owl:Class ;
125
+ rdfs:subClassOf prov:Entity ;
126
+ rdfs:label "Message" ;
127
+ rdfs:comment "Human- or machine-readable content carried by an Exchange. OPTIONAL — a machine-to-machine Exchange may carry only a structured act, an event, a decision or an attachment reference, and no natural language at all. This is why the canonical ingress is exchange.submit, not message.send." .
128
+
129
+ apix:AttachmentBinding a owl:Class ;
130
+ rdfs:subClassOf prov:Entity ;
131
+ rdfs:label "AttachmentBinding" ;
132
+ rdfs:comment "An EXACT reference to an artifact: canonical id, version, digest, and the role it plays in the exchange. Never an inline body, never a floating pointer." .
133
+
134
+ # ─── Reproducible context ───────────────────────────────────────────────────
135
+
136
+ apix:ContextSnapshot a owl:Class ;
137
+ rdfs:subClassOf prov:Bundle ;
138
+ rdfs:label "ContextSnapshot" ;
139
+ rdfs:comment "An IMMUTABLE, digest-addressed bundle of exactly what was known and evaluated when an Exchange was made. Every reference inside carries canonical id, exact version, digest and observed time. `current` and `latest` are FORBIDDEN — the failure this prevents is quiet and forensic: a year later, nobody can say what the evaluator actually saw." .
140
+
141
+ # ─── Normative obligation ───────────────────────────────────────────────────
142
+
143
+ apix:Commitment a owl:Class ;
144
+ rdfs:subClassOf prov:Entity ;
145
+ rdfs:label "Commitment" ;
146
+ rdfs:comment "A normative obligation with a debtor, a creditor, content, conditions, and its OWN lifecycle. Distinct from the Offer that proposed it and from the execution that may discharge it: workflow completion discharges nothing unless the profile's discharge conditions are met (ADR-0058 §15). NOT apint:Commitment — that is the narrower dual-signed envelope produced from an IntentMatch (spec 241, the Layer 7→8 commerce bridge). One is the general obligation; the other is one commerce-specific way of creating one. Same English word, two namespaces: see docs/architecture/vocabulary-map.md." .
147
+
148
+ # ─── Typed evidence ─────────────────────────────────────────────────────────
149
+
150
+ apix:Receipt a owl:Class ;
151
+ rdfs:subClassOf prov:Entity ;
152
+ rdfs:label "Receipt" ;
153
+ rdfs:comment "Attested evidence that something OCCURRED. Never evidence that it was authorized, understood, or agreed to. Always typed — a generic receipt is an ambiguity waiting to be misread." .
154
+
155
+ apix:DeliveryReceipt a owl:Class ; rdfs:subClassOf apix:Receipt ; rdfs:label "DeliveryReceipt" ;
156
+ rdfs:comment "Delivery completed under a stated profile. NOT understanding, NOT agreement." .
157
+ apix:AdmissionReceipt a owl:Class ; rdfs:subClassOf apix:Receipt ; rdfs:label "AdmissionReceipt" ;
158
+ rdfs:comment "A boundary admitted or rejected the Exchange. Admission is not authorization (ADR-0043)." .
159
+ apix:ReadReceipt a owl:Class ; rdfs:subClassOf apix:Receipt ; rdfs:label "ReadReceipt" ;
160
+ rdfs:comment "A participant's client marked content read. NOT human comprehension, NOT acknowledgement, NOT consent." .
161
+ apix:AcknowledgementReceipt a owl:Class ; rdfs:subClassOf apix:Receipt ; rdfs:label "AcknowledgementReceipt" ;
162
+ rdfs:comment "An agent acknowledged a target Exchange. NOT acceptance." .
163
+ apix:DecisionReceipt a owl:Class ; rdfs:subClassOf apix:Receipt ; rdfs:label "DecisionReceipt" ;
164
+ rdfs:comment "A signed decision was made. NOT that it was executed." .
165
+ apix:ExecutionReceipt a owl:Class ; rdfs:subClassOf apix:Receipt ; rdfs:label "ExecutionReceipt" ;
166
+ rdfs:comment "Work started, progressed or completed. NOT that the outcome was valid or the commitment discharged." .
167
+ apix:PaymentReceipt a owl:Class ; rdfs:subClassOf apix:ExecutionReceipt ; rdfs:label "PaymentReceipt" ;
168
+ rdfs:comment "A transfer of value OCCURRED: this payer, this payee, this asset, this amount, this transaction (spec 360). NOT that it was owed, NOT that it was accepted, NOT that any obligation is now discharged — a receipt says the money moved and nothing about why. Held by BOTH parties: the payer's copy and the payee's are the same fact, delivered twice, which is what lets either of them account for it without asking the other." .
169
+
170
+ apix:receiptPayer a owl:ObjectProperty ; rdfs:domain apix:PaymentReceipt ; rdfs:range prov:Agent ;
171
+ rdfs:label "receiptPayer" ; rdfs:comment "The agent whose funds moved — the mandate's delegator, never the person who typed the sentence." .
172
+ apix:receiptPayee a owl:ObjectProperty ; rdfs:domain apix:PaymentReceipt ; rdfs:range prov:Agent ;
173
+ rdfs:label "receiptPayee" ; rdfs:comment "The agent the funds reached. Pinned to the party named in the authorizing step, never a recipient chosen after the fact (spec 360 §1)." .
174
+ apix:receiptAsset a owl:DatatypeProperty ; rdfs:domain apix:PaymentReceipt ; rdfs:label "receiptAsset" ;
175
+ rdfs:comment "The asset contract the transfer moved." .
176
+ apix:receiptAmount a owl:DatatypeProperty ; rdfs:domain apix:PaymentReceipt ; rdfs:label "receiptAmount" ;
177
+ rdfs:comment "The amount in the asset's own base units — never a rendered decimal, which loses the unit." .
178
+ apix:receiptTx a owl:DatatypeProperty ; rdfs:domain apix:PaymentReceipt ; rdfs:label "receiptTx" ;
179
+ rdfs:comment "The transaction that settled it — what makes this receipt checkable against the chain rather than believed." .
180
+
181
+ # ─── Relations ──────────────────────────────────────────────────────────────
182
+
183
+ apix:hasProfile a owl:ObjectProperty ; rdfs:domain apix:Interaction ; rdfs:range apix:InteractionProfile .
184
+ apix:hasParticipation a owl:ObjectProperty ; rdfs:domain apix:Interaction ; rdfs:range apix:Participation .
185
+ apix:occursIn a owl:ObjectProperty ; rdfs:domain apix:Exchange ; rdfs:range apix:Interaction .
186
+ apix:realizesAct a owl:ObjectProperty ; rdfs:domain apix:Exchange ; rdfs:range apix:CommunicativeAct .
187
+ apix:conveys a owl:ObjectProperty ; rdfs:domain apix:CommunicativeAct ; rdfs:range apix:Content .
188
+ apix:rendersAs a owl:ObjectProperty ; rdfs:domain apix:Exchange ; rdfs:range apix:Message .
189
+ apix:hasAttachment a owl:ObjectProperty ; rdfs:domain apix:Exchange ; rdfs:range apix:AttachmentBinding .
190
+ apix:pinsContext a owl:ObjectProperty ; rdfs:domain apix:Exchange ; rdfs:range apix:ContextSnapshot ;
191
+ rdfs:comment "By DIGEST. An Exchange references the snapshot it was evaluated against, not a mutable pointer." .
192
+
193
+ # Causal relations — the graph a Thread is DERIVED from. A thread is a projection, never a container,
194
+ # until it acquires an independent property and is promoted to its own Interaction (ADR-0058 §14).
195
+ apix:inReplyTo a owl:ObjectProperty ; rdfs:domain apix:Exchange ; rdfs:range apix:Exchange .
196
+ apix:respondsTo a owl:ObjectProperty ; rdfs:domain apix:Exchange ; rdfs:range apix:Exchange .
197
+ apix:causedBy a owl:ObjectProperty ; rdfs:domain apix:Exchange ; rdfs:range apix:Exchange .
198
+ apix:supersedes a owl:ObjectProperty ; rdfs:domain apix:Exchange ; rdfs:range apix:Exchange ;
199
+ rdfs:comment "Exchange-level replacement: this signed unit replaces that one. The superseded Exchange stays in evidence exactly as sent — supersession records, it never edits." .
200
+
201
+ # Semantic targets — act/content level, NOT exchange level. Both exist because one Exchange may carry
202
+ # two Offers, so `respondsTo <the offer exchange>` cannot answer WHICH offer was accepted or countered.
203
+ apix:accepts a owl:ObjectProperty ; rdfs:domain apix:AcceptAct ; rdfs:range apix:Offer ;
204
+ rdfs:comment "REQUIRED on every AcceptAct — the identified Offer. Identifying it is not authorizing it: acceptance by an unauthorized party creates no Commitment (ADR-0058 §15)." .
205
+ apix:counters a owl:ObjectProperty ; rdfs:domain apix:CounterOfferAct ; rdfs:range apix:Offer ;
206
+ rdfs:comment "REQUIRED on every CounterOfferAct — the Offer being countered. Act-level, not exchange-level: `supersedes` already covers 'this unit replaces that unit', and having `counters` mean both would be one name for two relations." .
207
+ apix:answers a owl:ObjectProperty ; rdfs:domain apix:Answer ; rdfs:range apix:Question ;
208
+ rdfs:comment "REQUIRED on every Answer. An answer that identifies no question is an Inform." .
209
+
210
+ # Commitment lifecycle — proposal, creation and discharge are different acts on different objects.
211
+ apix:proposesCommitment a owl:ObjectProperty ; rdfs:domain apix:CommunicativeAct ; rdfs:range apix:Commitment .
212
+ apix:createsCommitment a owl:ObjectProperty ; rdfs:domain apix:AcceptAct ; rdfs:range apix:Commitment .
213
+ apix:dischargesCommitment a owl:ObjectProperty ; rdfs:domain prov:Activity ; rdfs:range apix:Commitment .
214
+
215
+ apix:expressesIntent a owl:ObjectProperty ; rdfs:domain apix:CommunicativeAct ; rdfs:range apint:Intent ;
216
+ rdfs:comment "An act may express zero, one or many Intents (ADR-0048 §5). Intent ≠ Act." .
217
+ apix:attestedBy a owl:ObjectProperty ; rdfs:domain apix:Exchange ; rdfs:range apix:Receipt .
218
+ apix:attests a owl:ObjectProperty ; owl:inverseOf apix:attestedBy ;
219
+ rdfs:domain apix:Receipt ; rdfs:range prov:Entity ;
220
+ rdfs:comment "What this receipt is evidence ABOUT. Required: a receipt that names no subject asserts that SOMETHING happened without saying what, which is how a delivery receipt gets read as an approval (ADR-0058 §16)." .
221
+
222
+ # ─── Digest + version pins ──────────────────────────────────────────────────
223
+ # The two anti-downgrade, anti-drift controls, as first-class predicates so they can be REQUIRED by a
224
+ # shape rather than living only in prose.
225
+
226
+ apix:contextDigest a owl:DatatypeProperty ;
227
+ rdfs:domain apix:ContextSnapshot ; rdfs:range xsd:string ;
228
+ rdfs:label "contextDigest" ;
229
+ rdfs:comment "The snapshot's content address. A ContextSnapshot is identified BY its digest, not by a name that could later point somewhere else." .
230
+
231
+ apix:profileVersion a owl:DatatypeProperty ;
232
+ rdfs:domain apix:InteractionProfile ; rdfs:range xsd:string ;
233
+ rdfs:label "profileVersion" .
234
+
235
+ apix:pinsProfileVersion a owl:DatatypeProperty ;
236
+ rdfs:domain apix:Exchange ; rdfs:range xsd:string ;
237
+ rdfs:label "pinsProfileVersion" ;
238
+ rdfs:comment "The EXACT profile version this Exchange was made under, recorded on the Exchange itself. Reading the version off the live Interaction instead would let a Negotiation be reinterpreted as a Conversation after the fact, taking its acceptance semantics with it (ADR-0058)." .
239
+ apix:hasProtocolBinding a owl:ObjectProperty ; rdfs:domain apix:Exchange ; rdfs:range prov:Entity ;
240
+ rdfs:comment "A2A contextId, DIDComm thid, Matrix event id, CloudEvents source+id. Foreign keys into someone else's namespace — NEVER the canonical Interaction or Exchange id." .
241
+
242
+ # ─── Extensible act vocabulary — NOT DEFINED HERE ───────────────────────────
243
+ # The performative codelist is `apix:performativeScheme` in cbox/interaction-vocabulary.ttl. Two
244
+ # reasons it is not in this file: SKOS codelists live in the C-box by convention (package CLAUDE.md),
245
+ # and the scheme ALREADY EXISTED with thirteen concepts that `fabric`'s `Performative` TS union emits.
246
+ # My first pass wrote a parallel ten-concept `apix:ActKinds` here without noticing, which would have
247
+ # shipped two vocabularies for one concept — the precise failure ADR-0058 was written to end. Deleted.
248
+ # It moved namespace (apmsg: → apix:) but not meaning: a performative is interaction semantics, and
249
+ # apmsg: is the delivery/inbox PROJECTION — folders, labels, unread, retention. A folder is not an act.
250
+
251
+ # ─── Migrated from apfab: (ADR-0058) ────────────────────────────────────────
252
+ # `tbox/fabric.ttl` is DELETED, not deprecated-in-place: with no A-box instance data there is nothing
253
+ # to keep an alias for, and an equivalentClass shim would preserve exactly the two-names-one-concept
254
+ # ambiguity this ADR exists to remove.
255
+
256
+ apix:Envelope a owl:Class ;
257
+ rdfs:subClassOf prov:Entity ;
258
+ rdfs:label "Envelope" ;
259
+ rdfs:comment "The SIGNED TRANSPORT ARTIFACT that carries an act (`ap.message.v1`; was apfab:ExchangeEnvelope). Envelope ≠ Act (ADR-0048 §6) and Envelope ≠ Exchange (§7): the envelope is how a thing travelled, the act is what was done, the exchange is the aggregate. Not every envelope carries an Intent." .
260
+
261
+ apix:ExchangeEvent a owl:Class ;
262
+ rdfs:subClassOf prov:Activity ;
263
+ rdfs:label "ExchangeEvent" ;
264
+ rdfs:comment "A lifecycle occurrence on an Exchange (was apfab:ExchangeEvent). The append-only events state is reduced from — materialized state is always rebuildable from these." .
265
+
266
+ apix:containsEnvelope a owl:ObjectProperty ; rdfs:domain apix:Exchange ; rdfs:range apix:Envelope .
267
+ apix:actor a owl:ObjectProperty ; rdfs:domain apix:Exchange ; rdfs:range prov:Agent ;
268
+ rdfs:comment "WHO performed the move (was apfab:exchangeActor). Distinct from principal: a service agent acting under delegation is the actor, never the principal. The acting agent is never erased from provenance." .
269
+ apix:principal a owl:ObjectProperty ; rdfs:domain apix:Exchange ; rdfs:range prov:Agent ;
270
+ rdfs:comment "ON WHOSE BEHALF (was apfab:exchangePrincipal). Equals actor unless delegated; the authorizing delegation travels by reference, never inline." .
271
+
272
+ # ─── Authority tiers ────────────────────────────────────────────────────────
273
+ # These three were REFERENCED by packages/provenance doc comments and DEFINED NOWHERE — the S1
274
+ # firewall documented a vocabulary that did not exist. Defining them is the fix; deleting the comments
275
+ # would have hidden the gap instead of closing it.
276
+
277
+ apix:CommunicationDelivery a owl:Class ;
278
+ rdfs:subClassOf apix:ExchangeActivity ;
279
+ rdfs:label "CommunicationDelivery" ;
280
+ rdfs:comment "T0 — a communication exchange. Carries no execution tier and creates no task. The overwhelming majority of exchanges." .
281
+
282
+ apix:IntentInvocation a owl:Class ;
283
+ rdfs:subClassOf apix:ExchangeActivity ;
284
+ rdfs:label "IntentInvocation" ;
285
+ rdfs:comment "T1 — an exchange expressing an Intent for the receiver to act on. Expressing an intent is not authority to fulfil it." .
286
+
287
+ apix:OrchestratedTask a owl:Class ;
288
+ rdfs:subClassOf apix:ExchangeActivity ;
289
+ rdfs:label "OrchestratedTask" ;
290
+ rdfs:comment "T2 — an exchange bound to actual execution. Equivalent to apful:Task; the WorkflowInstance is LINKED from the Interaction, never a subclass of it." .
291
+
292
+ # ─── Provenance edges: NOT redefined here ───────────────────────────────────
293
+ # `usedDelegation`, `usedStatusEvidence` and `onBehalfOf` already exist as `apvr:` in
294
+ # tbox/verification-receipt.ttl. My first pass called them "dangling" and was wrong: the TERMS were
295
+ # fine, the doc comments in packages/provenance cited the wrong prefix (`apfab:`). Defining apix:
296
+ # copies would have created exactly the two-names-one-concept problem this ADR removes. The comments
297
+ # are fixed instead.
@@ -0,0 +1,244 @@
1
+ # T-box — messaging / interaction-substrate vocabulary (spec 322 §3).
2
+ # RDFS/OWL terminology only. The durable interaction ARTIFACTS (envelopes, events, conversations,
3
+ # boards, directory listings) get classes; PROJECTIONS (inbox items, cursors, summaries) get NONE —
4
+ # a derived view must never be mistaken for a fact. These records are PRIVATE vault residents
5
+ # (ADR-0025): the ontology names their shapes; it never implies KB projection (ADR-0040 — the only
6
+ # public artifact is the OPT-IN listing anchor attestation, which reuses apatt: terms).
7
+ #
8
+ # Wire binding (one type system): `ap.message.v1` ↔ apmsg:MessageEnvelope,
9
+ # `ap.message.event.v1` ↔ apmsg:MessageEvent, `ap.conversation.v1` ↔ apmsg:Conversation,
10
+ # `ap.home.directory-listing.v1` ↔ aporg:DirectoryListing. The tag is the wire discriminator; the
11
+ # IRI is the semantic name; the TS interface (packages/fabric) is the enforced mirror.
12
+ # NOTE: apmsg:MessageEnvelope ≠ apful:Message (a fulfillment task message) — same word, different
13
+ # layer; see docs/architecture/vocabulary-map.md.
14
+
15
+ @prefix apix: <https://agenticprimitives.dev/ns/interaction#> .
16
+ @prefix apmsg: <https://agenticprimitives.dev/ns/messaging#> .
17
+ @prefix aporg: <https://agenticprimitives.dev/ns/org#> .
18
+ @prefix apsit: <https://agenticprimitives.dev/ns/situation#> .
19
+ @prefix ap: <https://agenticprimitives.dev/ns/core#> .
20
+ @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
21
+ @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
22
+ @prefix owl: <http://www.w3.org/2002/07/owl#> .
23
+ @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
24
+ @prefix prov: <http://www.w3.org/ns/prov#> .
25
+ @prefix skos: <http://www.w3.org/2004/02/skos/core#> .
26
+
27
+ apmsg: a owl:Ontology ;
28
+ rdfs:label "Agentic Primitives — messaging / interaction substrate" ;
29
+ owl:versionInfo "0.1.0" .
30
+
31
+ # ─── Classes (apmsg) ─────────────────────────────────────────────────
32
+
33
+ apmsg:MessageEnvelope a owl:Class ;
34
+ rdfs:subClassOf prov:Entity ;
35
+ rdfs:label "MessageEnvelope" ;
36
+ rdfs:comment "A versioned message envelope (`ap.message.v1`): sender/recipients/subject/bodyHash — the body itself is a separate hash-bound vault record. Validated by apmsg:MessageEnvelopeShape (enforced by fabric's TS mirror)." .
37
+
38
+ apmsg:MessageEvent a owl:Class ;
39
+ rdfs:subClassOf prov:Activity ;
40
+ rdfs:label "MessageEvent" ;
41
+ rdfs:comment "A lifecycle activity on an envelope (`ap.message.event.v1`): delivered / sent / read / archived. Append-only; the inbox view is replayed from these." .
42
+
43
+ apmsg:Conversation a owl:Class ;
44
+ rdfs:subClassOf prov:Entity ;
45
+ rdfs:label "Conversation" ;
46
+ rdfs:comment "A conversation descriptor (`ap.conversation.v1`): participants, participantPolicy, contextRefs. A CHANNEL is a Conversation with participantPolicy 'open-to-context' — not a separate class." .
47
+
48
+ apmsg:ChannelBoard a owl:Class ;
49
+ rdfs:subClassOf prov:Entity ;
50
+ rdfs:label "ChannelBoard" ;
51
+ rdfs:comment "DEPRECATED name — org conversation/topic index (`conversation.index` post-W6). Legacy `board.*` vault records." .
52
+
53
+ # ─── Communicative acts + discussions (spec 324 §9–§10) ───────────────
54
+
55
+ # apmsg:CommunicativeAct MOVED to apix:CommunicativeAct (ADR-0058). An act is interaction
56
+ # semantics — what an agent is DOING — not a property of the delivery channel. `apmsg:` keeps
57
+ # what is genuinely messaging: envelopes, inbox, folders, labels, unread, rules, retention.
58
+
59
+ apmsg:Performative a owl:Class ;
60
+ rdfs:subClassOf skos:Concept ;
61
+ rdfs:label "Performative" ;
62
+ rdfs:comment "Closed vocabulary: INFORM, QUERY, REQUEST, PROPOSE, COUNTER, ACCEPT, REJECT, NOTIFY, ACKNOWLEDGE, ISSUE, RETRACT, SUBSCRIBE, UNSUBSCRIBE." .
63
+
64
+ apmsg:performedBy a owl:ObjectProperty ;
65
+ rdfs:domain apix:CommunicativeAct ; rdfs:range ap:Agent ;
66
+ rdfs:label "performedBy" .
67
+
68
+ apmsg:actAddressedTo a owl:ObjectProperty ;
69
+ rdfs:domain apix:CommunicativeAct ; rdfs:range ap:Agent ;
70
+ rdfs:label "actAddressedTo" .
71
+
72
+ apmsg:inRespondsTo a owl:ObjectProperty ;
73
+ rdfs:domain apix:CommunicativeAct ; rdfs:range apmsg:MessageEnvelope ;
74
+ rdfs:label "inRespondsTo" .
75
+
76
+ apmsg:Discussion a owl:Class ;
77
+ rdfs:subClassOf prov:Entity ;
78
+ rdfs:label "Discussion" ;
79
+ rdfs:comment "Abstract parent of DiscussionTopic and MessageThread." .
80
+
81
+ apmsg:DiscussionTopic a owl:Class ;
82
+ rdfs:subClassOf apmsg:Discussion ;
83
+ rdfs:label "DiscussionTopic" ;
84
+ rdfs:comment "Durable named partition inside a Conversation (UI label: Topic). What legacy UI called a 'channel' row. Carries exactly one apmsg:participationPolicy." .
85
+
86
+ apmsg:MessageThread a owl:Class ;
87
+ rdfs:subClassOf apmsg:Discussion ;
88
+ rdfs:label "MessageThread" ;
89
+ rdfs:comment "Reply chain rooted at a message/exchange." .
90
+
91
+ # ─── Topic participation (open vs restricted) ─────────────────────────
92
+ # LANGUAGE RULE: a person with an aporg:OrganizationMembership is a MEMBER of the org;
93
+ # a person who may dialog in a specific DiscussionTopic is a PARTICIPANT of that topic.
94
+ # OPEN topics: every org member is automatically a participant — participation is DERIVED
95
+ # from OrganizationMembership at read time and MUST NOT be asserted or stored per topic
96
+ # (same doctrine as aporg:memberOf). RESTRICTED topics: participation is ASSERTED —
97
+ # DiscussionInvitation (proposal) → acceptance → DiscussionParticipation (situation)
98
+ # carrying a discussion-scoped aporg:RoleAssignment.
99
+
100
+ apmsg:participationPolicy a owl:ObjectProperty ;
101
+ rdfs:domain apmsg:DiscussionTopic ; rdfs:range skos:Concept ;
102
+ rdfs:label "participationPolicy" ;
103
+ rdfs:comment "apmsg:openParticipation (all org members participate, derived) | apmsg:restrictedParticipation (invite-only, asserted DiscussionParticipation). Orthogonal to discussionStatus (open/closed/archived lifecycle)." .
104
+
105
+ apmsg:DiscussionParticipation a owl:Class ;
106
+ rdfs:subClassOf apsit:Situation ;
107
+ rdfs:label "DiscussionParticipation" ;
108
+ rdfs:comment "A person's ASSERTED participation in a RESTRICTED DiscussionTopic: exactly one participantAgent + one inDiscussionTopic, created by accepting a DiscussionInvitation. Never asserted for OPEN topics (there it is derived from aporg:OrganizationMembership). Carries a discussion-scoped aporg:RoleAssignment (facilitator | contributor)." .
109
+
110
+ apmsg:participantAgent a owl:ObjectProperty ;
111
+ rdfs:domain apmsg:DiscussionParticipation ; rdfs:range ap:Agent ;
112
+ rdfs:label "participantAgent" .
113
+
114
+ apmsg:inDiscussionTopic a owl:ObjectProperty ;
115
+ rdfs:domain apmsg:DiscussionParticipation ; rdfs:range apmsg:DiscussionTopic ;
116
+ rdfs:label "inDiscussionTopic" .
117
+
118
+ apmsg:participationRoleAssignment a owl:ObjectProperty ;
119
+ rdfs:domain apmsg:DiscussionParticipation ; rdfs:range aporg:RoleAssignment ;
120
+ rdfs:label "participationRoleAssignment" ;
121
+ rdfs:comment "The discussion-scoped RoleAssignment (scope 'discussion', scopeRef = the topic). Like every RoleAssignment: declarative — materialized by Delegations, supported by Entitlements; never itself authority." .
122
+
123
+ apmsg:DiscussionInvitation a owl:Class ;
124
+ rdfs:subClassOf prov:Entity ;
125
+ rdfs:label "DiscussionInvitation" ;
126
+ rdfs:comment "Directed proposal facilitator→agent to participate in a RESTRICTED DiscussionTopic (mirror of aporg:MembershipInvitation at topic scope). Not a participation — acceptance creates the DiscussionParticipation." .
127
+
128
+ apmsg:invitedAgent a owl:ObjectProperty ;
129
+ rdfs:domain apmsg:DiscussionInvitation ; rdfs:range ap:Agent ;
130
+ rdfs:label "invitedAgent" .
131
+
132
+ apmsg:invitationTopic a owl:ObjectProperty ;
133
+ rdfs:domain apmsg:DiscussionInvitation ; rdfs:range apmsg:DiscussionTopic ;
134
+ rdfs:label "invitationTopic" .
135
+
136
+ apmsg:invitedBy a owl:ObjectProperty ;
137
+ rdfs:domain apmsg:DiscussionInvitation ; rdfs:range ap:Agent ;
138
+ rdfs:label "invitedBy" ;
139
+ rdfs:comment "The facilitator (or org custodian) who issued the invitation." .
140
+
141
+ apmsg:invitationStatus a owl:DatatypeProperty ;
142
+ rdfs:domain apmsg:DiscussionInvitation ; rdfs:range xsd:string ;
143
+ rdfs:label "invitationStatus" ;
144
+ rdfs:comment "Concept from apmsg:discussionInvitationStatusScheme: invited | accepted | declined | revoked." .
145
+
146
+ # ─── Org-assistant participation + acting-agent provenance (spec 327; 318 §8.1) ──
147
+ # The org's OWN agent posting in its topics is the Organization SA being agentic — the principal
148
+ # itself (318 §8.1/§8.8), never a Service participant and never a "bot account". Participant bots
149
+ # (distinct Service SAs, admission delegations — 318 §8.2–8.8 / C4) get their OWN classes at the
150
+ # fabric cutover; these two terms are deliberately narrower and compose with them.
151
+
152
+ apmsg:actingAgent a owl:ObjectProperty ;
153
+ rdfs:domain apmsg:MessageEnvelope ; rdfs:range ap:Agent ;
154
+ rdfs:label "actingAgent" ;
155
+ rdfs:comment "spec 324 §9 acting-agent provenance on a board entry: WHO performed the authoring move when it was not a human session — for org-assistant posts, the org SA itself. Absent ⇒ human-session authored. Never erased (prov: alignment: the acting move is attributable, not anonymous). Mirrors fabric ExchangeRecordV1.actor, which absorbs it at the 316 cutover." .
156
+
157
+ apmsg:topicAssistantPolicy a owl:ObjectProperty ;
158
+ rdfs:domain apmsg:DiscussionTopic ; rdfs:range skos:Concept ;
159
+ rdfs:label "topicAssistantPolicy" ;
160
+ rdfs:comment "Presence ⇔ the org's own agent participates in this DiscussionTopic (steward-enabled, spec 327). apmsg:assistantOnMention (reply only to @-mentions of the org) | apmsg:assistantOnAllPosts (reply to every member post). Orthogonal to participationPolicy — enablement is a steward act on the topic, never a participation assertion." .
161
+
162
+ apmsg:inConversation a owl:ObjectProperty ;
163
+ rdfs:domain apmsg:Discussion ; rdfs:range apmsg:Conversation ;
164
+ rdfs:label "inConversation" .
165
+
166
+ apmsg:hostedBy a owl:ObjectProperty ;
167
+ rdfs:domain apmsg:Conversation ; rdfs:range ap:Agent ;
168
+ rdfs:label "hostedBy" ;
169
+ rdfs:comment "Owner/host Agent. OrganizationAgent hosts Conversations — is not one." .
170
+
171
+ apmsg:ConversationProfile a owl:Class ;
172
+ rdfs:subClassOf skos:Concept ;
173
+ rdfs:label "ConversationProfile" ;
174
+ rdfs:comment "direct | group | discussion | broadcast | forum | announcement | support." .
175
+
176
+ # ─── Routed consultation (spec 329 — org assistant member routing) ────
177
+ # ARTIFACTS only, per this file's rule: the ConsultAnswer (a member agent's durable, structured
178
+ # answer) gets a class; pending-routing rings and candidate rankings are PROJECTIONS and get NONE.
179
+ # The routing decision itself is described by apint:ConsultationIntent (tbox/intents.ttl); the
180
+ # synthesized reply's provenance reuses PROV-O directly (prov:wasDerivedFrom each contributing
181
+ # ConsultAnswer, prov:wasAttributedTo) — no parallel terms are minted (house rule).
182
+ # Wire binding: `ap.consult-answer.v1` ↔ apmsg:ConsultAnswer (TS mirror: fabric ConsultAnswerV1).
183
+
184
+ apmsg:ConsultAnswer a owl:Class ;
185
+ rdfs:subClassOf prov:Entity ;
186
+ rdfs:label "ConsultAnswer" ;
187
+ rdfs:comment "A member agent's structured answer Artifact to a ConsultationIntent (spec 329 §3.2). Durable artifact in the org's vault; agent-authored (apmsg:actor = member SA). Carries exactly one of an answer or an explicit decline (SHACL: answered xor declined)." .
188
+
189
+ apmsg:consultedAgent a owl:ObjectProperty ;
190
+ rdfs:domain apmsg:MessageEnvelope ; rdfs:range ap:Agent ;
191
+ rdfs:label "consultedAgent" ;
192
+ rdfs:comment "Synthesized-reply attribution: an agent consulted for this reply (PROV-aligned; pairs with prov:wasDerivedFrom pointing at the contributing apmsg:ConsultAnswer records). Attribution only — never authority." .
193
+
194
+ apmsg:answerText a owl:DatatypeProperty ;
195
+ rdfs:domain apmsg:ConsultAnswer ; rdfs:range xsd:string ;
196
+ rdfs:label "answerText" ;
197
+ rdfs:comment "The member agent's answer text. Present iff the consult was ANSWERED (xor apmsg:declined — ConsultAnswerShape). The artifact body's integrity hash reuses apful:bodyHash (the answer rides the a2a task Artifact)." .
198
+
199
+ apmsg:declined a owl:DatatypeProperty ;
200
+ rdfs:domain apmsg:ConsultAnswer ; rdfs:range xsd:boolean ;
201
+ rdfs:label "declined" ;
202
+ rdfs:comment "True iff the member's agent explicitly declined to answer (spec 329 §3.2 — the playbook's decline path). Present (true) xor apmsg:answerText; an optional free-text reason rides apmsg:declineReason." .
203
+
204
+ apmsg:declineReason a owl:DatatypeProperty ;
205
+ rdfs:domain apmsg:ConsultAnswer ; rdfs:range xsd:string ;
206
+ rdfs:label "declineReason" ;
207
+ rdfs:comment "Optional member-agent-supplied reason accompanying a decline." .
208
+
209
+ # ─── Classes + predicates (aporg extension: the membership listing) ──
210
+
211
+ aporg:DirectoryListing a owl:Class ;
212
+ rdfs:subClassOf prov:Entity ;
213
+ rdfs:label "DirectoryListing" ;
214
+ rdfs:comment "A member's SELF-SIGNED presence listing in an org context (`ap.home.directory-listing.v1`) — the consent artifact channel membership derives from (spec 318/322). ERC-1271-verified against the subject SA at publish AND at gate time. Membership itself stays DERIVED (current listing + valid spec-321 delegation ⟹ aporg:memberOf) — never stored as a fact." .
215
+
216
+ aporg:listingSubject a owl:ObjectProperty ;
217
+ rdfs:domain aporg:DirectoryListing ; rdfs:range ap:CanonicalAgentId ;
218
+ rdfs:label "listingSubject" ; rdfs:comment "The person SA publishing themselves (self-published only)." .
219
+
220
+ aporg:listingContext a owl:ObjectProperty ;
221
+ rdfs:domain aporg:DirectoryListing ; rdfs:range ap:CanonicalAgentId ;
222
+ rdfs:label "listingContext" ; rdfs:comment "The org/community context the listing is scoped to." .
223
+
224
+ aporg:visibility a owl:DatatypeProperty ;
225
+ rdfs:domain aporg:DirectoryListing ; rdfs:range xsd:string ;
226
+ rdfs:label "visibility" ; rdfs:comment "'community' | 'public'. Display intent only — NEVER a residency or KB-projection signal (ADR-0040)." .
227
+
228
+ aporg:publishedAt a owl:DatatypeProperty ;
229
+ rdfs:domain aporg:DirectoryListing ; rdfs:range xsd:dateTime ;
230
+ rdfs:label "publishedAt" ; rdfs:comment "Monotonic per subject (replay guard, spec 322 §4)." .
231
+
232
+ aporg:expiresAt a owl:DatatypeProperty ;
233
+ rdfs:domain aporg:DirectoryListing ; rdfs:range xsd:dateTime ;
234
+ rdfs:label "expiresAt" .
235
+
236
+ aporg:listingHash a owl:DatatypeProperty ;
237
+ rdfs:domain aporg:DirectoryListing ; rdfs:range xsd:string ;
238
+ rdfs:label "listingHash" ;
239
+ rdfs:comment "sha256 of the canonical listing — the commitment an OPT-IN on-chain anchor attests to (apatt:credentialHash ≡ this; anchor requires the ADR-0025 amendment, spec 322 §6)." .
240
+
241
+ aporg:consultable a owl:DatatypeProperty ;
242
+ rdfs:domain aporg:DirectoryListing ; rdfs:range xsd:boolean ;
243
+ rdfs:label "consultable" ;
244
+ rdfs:comment "Member-asserted, org-scoped routing HINT (spec 329 §2.2). The authority is the consultability delegation; this property only surfaces eligibility. Absent ⇒ false. Flag without delegation ⇒ not consultable (fail-closed); delegation without flag ⇒ not surfaced to routing." .