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

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,436 @@
1
+ # T-box — the ANONYMOUS CREDENTIAL plane: what a holder proves about a credential without showing it, and every record
2
+ # the substrate keeps around that proof. Spec 304 (issuer-key facets), spec 305 (privacy credentials, W2 = the
3
+ # zero-knowledge suite), spec 442 §7.2 (the `predicate` proof grade at a company's door), spec 443 W5 (the door),
4
+ # docs/architecture/zkid-and-verifiable-credentials-alignment.md (waves Z1–Z4). Namespace appc:.
5
+ #
6
+ # ── The doctrine, in one line ─────────────────────────────────────────────────────────────────────
7
+ # PROOF IS EVIDENCE, THE MANDATE IS AUTHORITY, THE RECEIPT BINDS THE TWO. A presentation that verifies says "a
8
+ # credential under this issuer facet satisfies this predicate program, answering this verifier's challenge" — and
9
+ # nothing else: no claim value, no credential, no person. Whether the holder may ACT is her mandate's to say, judged
10
+ # per step (ADR-0041); whether she may ENTER is the door's admission on the evidence (ADR-0056 / ADR-0057). No gate
11
+ # reads an appc: record as a permission.
12
+ #
13
+ # ── What is deliberately NOT here ─────────────────────────────────────────────────────────────────
14
+ # · No property from a pairwise account or a presentation to the PERSON. The verifier learns a handle and a proof; the
15
+ # link to the person exists in her own vault and nowhere in a shared graph (INV-305-1/-3, ADR-0025). A vocabulary
16
+ # that offered the join would be an invitation to make it.
17
+ # · No claim values. A predicate program names claims and operators; a presentation proves the program held; the
18
+ # values stay in the credential, which stays with the holder.
19
+ # · No product or implementation name. Suites and grades are codelists (cbox/controlled-vocabularies.ttl); the
20
+ # proving system behind a suite is informative and lives in the packages that bind it.
21
+ #
22
+ # ── Where the records live (ADR-0055) ─────────────────────────────────────────────────────────────
23
+ # A facet document and its attestation are public (the issuer's chain). A credential and its device key are the
24
+ # HOLDER's vault records. A presentation is computed per challenge and held by a door for minutes under a reference —
25
+ # a cache; the receipt keeps the digests. The issuer row's openings are the ISSUER's vault records (apest:). A
26
+ # predicate admission's evidence is the door's receipt, beside the decision.
27
+
28
+ @prefix appc: <https://agenticprimitives.dev/ns/privacy-credential#> .
29
+ @prefix apvc: <https://agenticprimitives.dev/ns/verifiable-credential#> .
30
+ @prefix apatt: <https://agenticprimitives.dev/ns/attestation#> .
31
+ @prefix apdel: <https://agenticprimitives.dev/ns/delegation#> .
32
+ @prefix apest: <https://agenticprimitives.dev/ns/estate#> .
33
+ @prefix apix: <https://agenticprimitives.dev/ns/interaction#> .
34
+ @prefix ap: <https://agenticprimitives.dev/ns/core#> .
35
+ @prefix prov: <http://www.w3.org/ns/prov#> .
36
+ @prefix skos: <http://www.w3.org/2004/02/skos/core#> .
37
+ @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
38
+ @prefix owl: <http://www.w3.org/2002/07/owl#> .
39
+ @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
40
+
41
+ appc: a owl:Ontology ;
42
+ rdfs:label "Agentic Primitives — anonymous credentials" ;
43
+ owl:versionInfo "0.1.0" ;
44
+ rdfs:comment "Issuer-key facets, holder-bound credentials, proof requests and predicate programs, zero-knowledge presentations with their nullifiers and status, the issuer's live-credential row, the presentation mandate, and the predicate as admission evidence. Specs 304 / 305 / 442 §7.2 / 443 W5." .
45
+
46
+ # ═══ The issuer side ══════════════════════════════════════════════════════════════════════════════
47
+
48
+ appc:IssuerKeyFacet a owl:Class ;
49
+ rdfs:subClassOf prov:Entity ;
50
+ rdfs:label "IssuerKeyFacet" ;
51
+ rdfs:comment "A KEY AN ISSUING AGENT SIGNS CREDENTIALS WITH, published as a facet of that agent (spec 304): one suite per facet, a public key, a validity window, and the agent's own signature over the facet's hash. A facet rotates; the issuing agent does not (ADR-0010/0011) — the facet is a credential of the agent, never its identity, and never a control credential (that is apcr:CredentialFacet). A verifier resolves it by key id and RE-VERIFIES it through the chain: the signature answers under the agent's account, and the facet is anchored as an attestation (appc:anchoredBy) — never a fetch to the issuer." .
52
+
53
+ appc:facetSubject a owl:ObjectProperty ;
54
+ rdfs:domain appc:IssuerKeyFacet ; rdfs:range ap:Agent ;
55
+ rdfs:label "facet subject" ;
56
+ rdfs:comment "The agent this key speaks for: an organization or a service. NEVER a person — a person's agent HOLDS credentials; it does not issue them (spec 443 §2). And never an estate's governance agent, whose row on neutral ground the issuer's own row would collide with (spec 443 W5)." .
57
+
58
+ appc:facetKeyId a owl:DatatypeProperty ;
59
+ rdfs:domain appc:IssuerKeyFacet ; rdfs:range xsd:string ;
60
+ rdfs:label "facet key id" ;
61
+ rdfs:comment "The id a credential names its issuer key by and a verifier resolves the facet by (`issuer-key:<suite>:<label>`). A name for lookup, never a trust signal." .
62
+
63
+ appc:facetSuite a owl:ObjectProperty ;
64
+ rdfs:domain appc:IssuerKeyFacet ; rdfs:range skos:Concept ;
65
+ rdfs:label "facet suite" ;
66
+ rdfs:comment "ONE suite per facet (INV-304-3), from appc:issuerKeySuiteScheme. A key reused across suites is two facets and two attestations." .
67
+
68
+ appc:facetPublicKeyThumbprint a owl:DatatypeProperty ;
69
+ rdfs:domain appc:IssuerKeyFacet ; rdfs:range xsd:string ;
70
+ rdfs:label "facet public key thumbprint" ;
71
+ rdfs:comment "The JWK thumbprint of the facet's public key: what a listing shows and what a proof's hidden issuer key is checked against after verification. The key itself is in the facet document; never a private component." .
72
+
73
+ appc:facetHash a owl:DatatypeProperty ;
74
+ rdfs:domain appc:IssuerKeyFacet ; rdfs:range xsd:string ;
75
+ rdfs:label "facet hash" ;
76
+ rdfs:comment "sha256 over the canonical facet document — what the issuing agent signed and what the attestation's credentialHash carries. A document that recomputes to another hash is not this facet." .
77
+
78
+ appc:facetValidFrom a owl:DatatypeProperty ;
79
+ rdfs:domain appc:IssuerKeyFacet ; rdfs:range xsd:dateTime ;
80
+ rdfs:label "facet valid from" .
81
+
82
+ appc:facetValidUntil a owl:DatatypeProperty ;
83
+ rdfs:domain appc:IssuerKeyFacet ; rdfs:range xsd:dateTime ;
84
+ rdfs:label "facet valid until" ;
85
+ rdfs:comment "Absent means open-ended; revocation is the attestation's revoke path, which a verifier reads at verification time (spec 304 §rotation)." .
86
+
87
+ appc:anchoredBy a owl:ObjectProperty ;
88
+ rdfs:domain appc:IssuerKeyFacet ; rdfs:range apatt:Attestation ;
89
+ rdfs:label "anchored by" ;
90
+ rdfs:comment "The attestation on the issuer's chain that binds the facet to the agent: credentialType `issuer-key-facet`, subject = issuer = the agent, credentialHash = appc:facetHash. Live (not revoked) is what a verifier checks; the uid is what the register lists. Anchoring is the only way a stranger learns a facet is the agent's — the facet document alone proves nothing." .
91
+
92
+ appc:IssuerRow a owl:Class ;
93
+ rdfs:subClassOf prov:Entity ;
94
+ rdfs:label "IssuerRow" ;
95
+ rdfs:comment "A CREDENTIAL ISSUER'S LIVE-CREDENTIAL ROOT ON NEUTRAL GROUND — the issuer's own row on the estate projection registry, keyed by the same id function as an estate's (chain + agent) and TAGGED as an issuer row so a verifier can tell it from an estate's (a credential leaf is never standing; a door refuses a row so tagged as if it were an estate). Its leaves are apest:ProjectionSubmission records in the `live-credential` set, kept by the issuer with their openings; the root is anchored under a monotonic sequence. REVOCATION IS THE ISSUER'S ACT: it retires a leaf and re-anchors, and every status presentation built at an older sequence is stale against the chain from then on. Zero-knowledge alignment §4, wave Z3." .
96
+
97
+ appc:issuerRowOf a owl:ObjectProperty ;
98
+ rdfs:domain appc:IssuerRow ; rdfs:range ap:Agent ;
99
+ rdfs:label "issuer row of" ;
100
+ rdfs:comment "The issuing agent whose live set this is; the row's signer on neutral ground is the agent itself, and the key that writes is a delegate under its anchoring wire (spec 439 §4)." .
101
+
102
+ appc:issuerRowId a owl:DatatypeProperty ;
103
+ rdfs:domain appc:IssuerRow ; rdfs:range xsd:string ;
104
+ rdfs:label "issuer row id" ;
105
+ rdfs:comment "keccak256(`eip155:<chainId>:<issuer agent>`) — the registry key. The only thing public ground learns about the issuer's set." .
106
+
107
+ appc:liveCredentialRoot a owl:DatatypeProperty ;
108
+ rdfs:domain appc:IssuerRow ; rdfs:range xsd:string ;
109
+ rdfs:label "live-credential root" ;
110
+ rdfs:comment "The anchored Merkle root over the commitments of the credentials the issuer still stands behind, as of appc:anchoredSequence." .
111
+
112
+ appc:anchoredSequence a owl:DatatypeProperty ;
113
+ rdfs:domain appc:IssuerRow ; rdfs:range xsd:integer ;
114
+ rdfs:label "anchored sequence" ;
115
+ rdfs:comment "Strictly increasing per anchor. A status presentation names the sequence it was built at; a verifier accepts only the sequence it READ, within its freshness window — behind is stale, ahead is unverifiable, neither is fetched." .
116
+
117
+ appc:anchoredAt a owl:DatatypeProperty ;
118
+ rdfs:domain appc:IssuerRow ; rdfs:range xsd:dateTime ;
119
+ rdfs:label "anchored at" .
120
+
121
+ appc:hasLiveCredentialLeaf a owl:ObjectProperty ;
122
+ rdfs:domain appc:IssuerRow ; rdfs:range apest:ProjectionSubmission ;
123
+ rdfs:label "has live-credential leaf" ;
124
+ rdfs:comment "A leaf of the row: an apest:ProjectionSubmission whose apest:projectionSet is `live-credential` and whose apest:vouchedDigest is the credential digest (appc:credentialDigest). The issuer's record, with the opening; absent from the chain." .
125
+
126
+ # ═══ The holder side ══════════════════════════════════════════════════════════════════════════════
127
+
128
+ appc:AnonymousCredential a owl:Class ;
129
+ rdfs:subClassOf apvc:VerifiableCredential ;
130
+ rdfs:label "AnonymousCredential" ;
131
+ rdfs:comment "A CREDENTIAL MADE TO BE PROVED ABOUT, NOT SHOWN: issued under an issuer-key facet, with its claims selectively disclosable and the HOLDER'S DEVICE KEY bound into it, so that a presentation can prove a predicate over the claims and possession of the key without revealing either. The holder's vault record (ADR-0055): the issuer keeps its digest in its live set, never the credential." .
132
+
133
+ appc:issuedUnder a owl:ObjectProperty ;
134
+ rdfs:domain appc:AnonymousCredential ; rdfs:range appc:IssuerKeyFacet ;
135
+ rdfs:label "issued under" ;
136
+ rdfs:comment "The facet whose key signed the credential. A presentation names the facet's key id; the proof hides the key and the verifier checks the proven key against the resolved facet (spec 304 step 4)." .
137
+
138
+ appc:boundToDeviceKey a owl:ObjectProperty ;
139
+ rdfs:domain appc:AnonymousCredential ; rdfs:range appc:DeviceKey ;
140
+ rdfs:label "bound to device key" ;
141
+ rdfs:comment "Holder binding: the public key in the credential's confirmation claim. A presentation is valid only with a signature by this key over the verifier's challenge — made inside the proof, so the key stays hidden." .
142
+
143
+ appc:credentialDigest a owl:DatatypeProperty ;
144
+ rdfs:domain appc:AnonymousCredential ; rdfs:range xsd:string ;
145
+ rdfs:label "credential digest" ;
146
+ rdfs:comment "keccak256 over the issuer-signed compact credential (never the disclosures, which the holder chooses per presentation). Issuer and holder compute the same; it is the leaf of the issuer row's live set and the key of a status presentation." .
147
+
148
+ appc:claimSchema a owl:DatatypeProperty ;
149
+ rdfs:range xsd:string ;
150
+ rdfs:label "claim schema" ;
151
+ rdfs:comment "The issuer-fixed disclosure order of a credential type — claim name per slot, as a JSON array string. A verifier knows the credential format and resolves claim names to slots directly; a request and a credential that disagree on it prove nothing. Declared on the credential and on the proof request." .
152
+
153
+ appc:DeviceKey a owl:Class ;
154
+ rdfs:subClassOf prov:Entity ;
155
+ rdfs:label "DeviceKey" ;
156
+ rdfs:comment "THE HOLDER-BINDING KEY — custodied (a managed signer, or a local signer standing in for one), never held by the agent that presents. It signs ONLY under a presentation mandate (appc:PresentationMandate), judged by the presentation release inside every signature; the proving system sees a callback, never the key. Named by its thumbprint. It is a credential of the holder's, never her identity, and no property here leads from it to her." .
157
+
158
+ appc:deviceKeyThumbprint a owl:DatatypeProperty ;
159
+ rdfs:domain appc:DeviceKey ; rdfs:range xsd:string ;
160
+ rdfs:label "device key thumbprint" .
161
+
162
+ appc:PairwiseAccount a owl:Class ;
163
+ rdfs:subClassOf prov:Entity ;
164
+ rdfs:label "PairwiseAccount" ;
165
+ rdfs:comment "THE ACCOUNT A VERIFIER SEES: derived from the holder's secret and the verifier's origin, one per verifier, unlinkable across verifiers (INV-305-1), underivable without the secret. It signs the request proof at a door — the admission invariants want a signed actor (ADR-0010/0041) and this is the actor — and it appears in the door's receipt. It is NOT a Smart Agent and not the person: the link from it to her exists only in her vault, and this vocabulary declares no property for it on purpose." .
166
+
167
+ appc:pairwiseFor a owl:DatatypeProperty ;
168
+ rdfs:domain appc:PairwiseAccount ; rdfs:range xsd:anyURI ;
169
+ rdfs:label "pairwise for" ;
170
+ rdfs:comment "The verifier's origin the account exists for. The same holder at another origin is another account." .
171
+
172
+ # ═══ The exchange: request → presentation ═════════════════════════════════════════════════════════
173
+
174
+ appc:ProofRequest a owl:Class ;
175
+ rdfs:subClassOf prov:Entity ;
176
+ rdfs:label "ProofRequest" ;
177
+ rdfs:comment "WHAT A VERIFIER ASKS — built by the verifier from ITS OWN policy and ITS OWN challenge, never from a presentation: one suite, the predicates to prove, the credential layout accepted, the proof-bundle versions bound to its verifying keys, an audience (the verifier's origin) and a single-use nonce. The holder reproduces it from the verifier's published policy so both sides digest the same predicate program." .
178
+
179
+ appc:requestSuite a owl:ObjectProperty ;
180
+ rdfs:domain appc:ProofRequest ; rdfs:range skos:Concept ;
181
+ rdfs:label "request suite" ;
182
+ rdfs:comment "ONE suite per request (ADR-0013 — no ladder), from appc:presentationSuiteScheme. A presentation in any other suite is refused, never downgraded." .
183
+
184
+ appc:verifierId a owl:DatatypeProperty ;
185
+ rdfs:domain appc:ProofRequest ; rdfs:range xsd:string ;
186
+ rdfs:label "verifier id" .
187
+
188
+ appc:audience a owl:DatatypeProperty ;
189
+ rdfs:range xsd:anyURI ;
190
+ rdfs:label "audience" ;
191
+ rdfs:comment "The verifier's origin the proof is bound to. On the request, the nullifier, the status presentation and the mandate alike: a thing made for one audience answers no other." .
192
+
193
+ appc:challengeNonce a owl:DatatypeProperty ;
194
+ rdfs:domain appc:ProofRequest ; rdfs:range xsd:string ;
195
+ rdfs:label "challenge nonce" ;
196
+ rdfs:comment "Single-use. The verifier consumes it before a proof is verified, so the same challenge is never answered twice (1/OPENAC §Challenge Freshness as deployment policy)." .
197
+
198
+ appc:asksPredicate a owl:ObjectProperty ;
199
+ rdfs:domain appc:ProofRequest ; rdfs:range appc:PredicateProgram ;
200
+ rdfs:label "asks predicate" .
201
+
202
+ appc:acceptedBundleVersion a owl:DatatypeProperty ;
203
+ rdfs:domain appc:ProofRequest ; rdfs:range xsd:string ;
204
+ rdfs:label "accepted bundle version" ;
205
+ rdfs:comment "A proof-bundle version this verifier has bound to its tuple of verifying keys, circuit parameters, profile and challenge pipeline. Anything unbound is refused (1/OPENAC §Versioning). Repeatable." .
206
+
207
+ appc:PredicateProgram a owl:Class ;
208
+ rdfs:subClassOf prov:Entity ;
209
+ rdfs:label "PredicateProgram" ;
210
+ rdfs:comment "THE STATEMENT PROVED: a conjunction of predicates over named claims, compiled to the suite's canonical form and digested. The digest is what a holder's mandate names and what a receipt cites — the same program at the same verifier is the same reason, which is what makes a mandate standing across challenges rather than a signature per nonce." .
211
+
212
+ appc:predicateDigest a owl:DatatypeProperty ;
213
+ rdfs:range xsd:string ;
214
+ rdfs:label "predicate digest" ;
215
+ rdfs:comment "The intent digest of the compiled, canonical program. Computed by the verifier from its own request and by the holder from the published policy; a disagreement derives no mandate." .
216
+
217
+ appc:hasPredicate a owl:ObjectProperty ;
218
+ rdfs:domain appc:PredicateProgram ; rdfs:range appc:Predicate ;
219
+ rdfs:label "has predicate" .
220
+
221
+ appc:Predicate a owl:Class ;
222
+ rdfs:subClassOf prov:Entity ;
223
+ rdfs:label "Predicate" ;
224
+ rdfs:comment "One claim, one operator, one operand: `age gte 18`. No claim VALUE of the holder's appears anywhere in this vocabulary — the operand is the verifier's threshold." .
225
+
226
+ appc:predicateClaim a owl:DatatypeProperty ;
227
+ rdfs:domain appc:Predicate ; rdfs:range xsd:string ;
228
+ rdfs:label "predicate claim" .
229
+
230
+ appc:predicateOp a owl:ObjectProperty ;
231
+ rdfs:domain appc:Predicate ; rdfs:range skos:Concept ;
232
+ rdfs:label "predicate operator" ;
233
+ rdfs:comment "From appc:predicateOpScheme: gte · lte · in-set · before · after." .
234
+
235
+ appc:predicateOperand a owl:DatatypeProperty ;
236
+ rdfs:domain appc:Predicate ; rdfs:range xsd:string ;
237
+ rdfs:label "predicate operand" ;
238
+ rdfs:comment "The threshold, set member list or date, as the suite's lexical form. A literal out of the suite's range is a refusal (`predicate_invalid`), not a wider circuit." .
239
+
240
+ appc:PrivatePresentation a owl:Class ;
241
+ rdfs:subClassOf prov:Entity ;
242
+ rdfs:label "PrivatePresentation" ;
243
+ rdfs:comment "WHAT A HOLDER ANSWERS WITH: a proof that a credential under the named facet satisfies the request's predicate program and that the device key signed the request's audience-bound challenge — the issuer key, the device key and every claim hidden; plus, when the verifier's policy asks, a nullifier for this audience and the issuer's status presentation. Computed per challenge, never stored by the holder; held by a door for minutes under a reference (a cache); only its digest survives in a receipt. It says nothing about who presented." .
244
+
245
+ appc:answersRequest a owl:ObjectProperty ;
246
+ rdfs:domain appc:PrivatePresentation ; rdfs:range appc:ProofRequest ;
247
+ rdfs:label "answers request" ;
248
+ rdfs:comment "The one request this proof answers; the audience and nonce inside the proof must be the request's (`nonce_or_audience_mismatch` otherwise)." .
249
+
250
+ appc:presentedUnder a owl:ObjectProperty ;
251
+ rdfs:domain appc:PrivatePresentation ; rdfs:range appc:IssuerKeyFacet ;
252
+ rdfs:label "presented under" ;
253
+ rdfs:comment "The facet the presentation claims, by key id. The verifier resolves it through the chain and checks the proven issuer key against it; a reference naming another facet than the verdict's is refused." .
254
+
255
+ appc:provesPredicate a owl:ObjectProperty ;
256
+ rdfs:domain appc:PrivatePresentation ; rdfs:range appc:PredicateProgram ;
257
+ rdfs:label "proves predicate" ;
258
+ rdfs:comment "The program that held — `expression_result = 1` inside the proof. Evidence that the predicate holds, never policy acceptance (that is the verifier's), never authority." .
259
+
260
+ appc:bundleVersion a owl:DatatypeProperty ;
261
+ rdfs:domain appc:PrivatePresentation ; rdfs:range xsd:string ;
262
+ rdfs:label "bundle version" .
263
+
264
+ appc:relationshipHandle a owl:DatatypeProperty ;
265
+ rdfs:domain appc:PrivatePresentation ; rdfs:range xsd:string ;
266
+ rdfs:label "relationship handle" ;
267
+ rdfs:comment "The pairwise pseudonym for THIS verifier when the holder chooses to carry one (INV-305-3) — never her agent." .
268
+
269
+ appc:carriesNullifier a owl:ObjectProperty ;
270
+ rdfs:domain appc:PrivatePresentation ; rdfs:range appc:Nullifier ;
271
+ rdfs:label "carries nullifier" .
272
+
273
+ appc:carriesStatus a owl:ObjectProperty ;
274
+ rdfs:domain appc:PrivatePresentation ; rdfs:range appc:CredentialStatusPresentation ;
275
+ rdfs:label "carries status" .
276
+
277
+ appc:signedByDeviceKey a owl:ObjectProperty ;
278
+ rdfs:domain appc:PrivatePresentation ; rdfs:range appc:DeviceKey ;
279
+ rdfs:label "signed by device key" ;
280
+ rdfs:comment "The holder's own record of which custodied key answered the challenge — inside the proof the key is hidden, so this relation lives in her vault, never in what a verifier holds." .
281
+
282
+ appc:madeUnderMandate a owl:ObjectProperty ;
283
+ rdfs:domain appc:PrivatePresentation ; rdfs:range appc:PresentationMandate ;
284
+ rdfs:label "made under mandate" ;
285
+ rdfs:comment "The child mandate the device key signed under — the holder's receipt joins the proof digest, the challenge digest and this mandate's digest (apvr:, spec 305 §Z2). The verifier never sees the mandate; it is the holder's evidence that her agent acted within what she allowed." .
286
+
287
+ appc:presents a owl:ObjectProperty ;
288
+ rdfs:subPropertyOf prov:wasDerivedFrom ;
289
+ rdfs:domain appc:PrivatePresentation ; rdfs:range appc:AnonymousCredential ;
290
+ rdfs:label "presents" ;
291
+ rdfs:comment "Which credential the proof was made from — the holder's record only. A verifier that could state this triple would have unlinked nothing." .
292
+
293
+ appc:Nullifier a owl:Class ;
294
+ rdfs:subClassOf prov:Entity ;
295
+ rdfs:label "Nullifier" ;
296
+ rdfs:comment "ONE VISIT PER AUDIENCE: a value deterministic per (device key, audience) — a hash of the device key's signature over an audience-bound message — that a verifier's store consumes atomically. The same holder at the same audience within the policy's window is `nullifier_reused`; at another audience the value differs and nothing links them. Its GRADE says how much it is worth: `asserted` is honest-holder-exact (the verifier checks nothing about its derivation), `in-circuit` is proved inside the presentation (2/ZK-POP; reserved until the profile emits it). The STORE is the verifier's (a door's ledger), never the verifying service's." .
297
+
298
+ appc:nullifierValue a owl:DatatypeProperty ;
299
+ rdfs:domain appc:Nullifier ; rdfs:range xsd:string ;
300
+ rdfs:label "nullifier value" .
301
+
302
+ appc:nullifierGrade a owl:ObjectProperty ;
303
+ rdfs:domain appc:Nullifier ; rdfs:range skos:Concept ;
304
+ rdfs:label "nullifier grade" ;
305
+ rdfs:comment "From appc:nullifierGradeScheme. A verifier's policy names the lowest grade it accepts; `in-circuit` refuses every asserted one." .
306
+
307
+ appc:CredentialStatusPresentation a owl:Class ;
308
+ rdfs:subClassOf prov:Entity ;
309
+ rdfs:label "CredentialStatusPresentation" ;
310
+ rdfs:comment "THE ISSUER STILL STANDS BEHIND THIS CREDENTIAL, as of a sequence: one leaf of the issuer row, its opening, a Merkle proof against the anchored root, bound to the verifier's challenge. Names no subject — a credential is not a person. The verifier reads the root from neutral ground, never from the holder: a presentation behind the anchored sequence is `stale` (what a revoked credential's old status becomes), ahead is unverifiable, and neither is fetched. Linkable under the Merkle suite (the opening names the credential) — said, and the reason a verifier asks for it only where it would otherwise phone a status list; the zero-knowledge form is reserved." .
311
+
312
+ appc:statusOf a owl:ObjectProperty ;
313
+ rdfs:domain appc:CredentialStatusPresentation ; rdfs:range appc:IssuerRow ;
314
+ rdfs:label "status of" .
315
+
316
+ appc:statusSequence a owl:DatatypeProperty ;
317
+ rdfs:domain appc:CredentialStatusPresentation ; rdfs:range xsd:integer ;
318
+ rdfs:label "status sequence" ;
319
+ rdfs:comment "The anchored sequence the proof was built against; a verifier accepts the sequence it read and refuses every other." .
320
+
321
+ # ═══ Authority around the proof (never the proof itself) ══════════════════════════════════════════
322
+
323
+ appc:PresentationMandate a owl:Class ;
324
+ rdfs:subClassOf apdel:Delegation ;
325
+ rdfs:label "PresentationMandate" ;
326
+ rdfs:comment "THE PERSON'S STANDING PERMISSION FOR HER DEVICE KEY TO SIGN (capability `credential.present`): a delegation from her agent to her runtime's key bounded to the verifiers, the predicate programs and the issuer facets she agreed to, for a window. Her runtime derives a CHILD for one statement (one audience, one program, one facet, a few minutes) and the presentation release judges that child before EVERY device-key signature — the key is behind the release, the proving system gets a callback. A wire for another venue signs nothing (the release refuses; nothing is presented). Delegated presentation, zero-knowledge alignment §3, wave Z2." .
327
+
328
+ appc:mandateAudience a owl:DatatypeProperty ;
329
+ rdfs:domain appc:PresentationMandate ; rdfs:range xsd:anyURI ;
330
+ rdfs:label "mandate audience" ;
331
+ rdfs:comment "A verifier origin the mandate covers. Repeatable on a standing wire; exactly one on a derived child." .
332
+
333
+ appc:mandatePredicateDigest a owl:DatatypeProperty ;
334
+ rdfs:domain appc:PresentationMandate ; rdfs:range xsd:string ;
335
+ rdfs:label "mandate predicate digest" ;
336
+ rdfs:comment "A predicate program the mandate covers, by its digest (appc:predicateDigest). The holder proves no program she did not agree to." .
337
+
338
+ appc:mandateIssuerKeyId a owl:DatatypeProperty ;
339
+ rdfs:domain appc:PresentationMandate ; rdfs:range xsd:string ;
340
+ rdfs:label "mandate issuer key id" ;
341
+ rdfs:comment "A facet (appc:facetKeyId) the mandate covers presenting under." .
342
+
343
+ appc:maxPresentations a owl:DatatypeProperty ;
344
+ rdfs:domain appc:PresentationMandate ; rdfs:range xsd:integer ;
345
+ rdfs:label "max presentations" ;
346
+ rdfs:comment "How many presentations the mandate allows; 0 on a standing wire means unbounded within its window, 1 on a derived child." .
347
+
348
+ appc:PresentationRelease a owl:Class ;
349
+ rdfs:subClassOf prov:Activity ;
350
+ rdfs:label "PresentationRelease" ;
351
+ rdfs:comment "ONE JUDGEMENT OF THE MANDATE FOR ONE SIGNATURE: the release checks the child mandate against the statement (audience · predicate digest · facet), its signature, its revocation on chain and its window, then signs the audience-bound challenge with the device key — or refuses with a code (`mandate-denied`, `challenge-unbound`, `audience-mismatch`, `approval-required`). Every decision, allowed or refused, is the receipt's raw material." .
352
+
353
+ appc:releasedUnder a owl:ObjectProperty ;
354
+ rdfs:domain appc:PresentationRelease ; rdfs:range appc:PresentationMandate ;
355
+ rdfs:label "released under" .
356
+
357
+ appc:releaseOutcome a owl:DatatypeProperty ;
358
+ rdfs:domain appc:PresentationRelease ; rdfs:range xsd:string ;
359
+ rdfs:label "release outcome" ;
360
+ rdfs:comment "`allow`, or the refusal code. A refusal signs nothing." .
361
+
362
+ # ═══ The verifier's policy, and the predicate as admission evidence ═══════════════════════════════
363
+
364
+ appc:VerifierPolicy a owl:Class ;
365
+ rdfs:subClassOf prov:Entity ;
366
+ rdfs:label "VerifierPolicy" ;
367
+ rdfs:comment "WHAT A VERIFIER (a door) ASKS AND ACCEPTS, declared where a holder can read it: the predicate program, the credential layout, the accepted bundle versions, whether a nullifier is required and at which grade and window, whether the issuer's status is required and how fresh, which issuer facets it trusts, and where the proof is verified. 1/OPENAC's `Deployment policy` layer is the authority plane's: nothing in a policy grants, it says what the door will LOOK AT." .
368
+
369
+ appc:policyAsksPredicate a owl:ObjectProperty ;
370
+ rdfs:domain appc:VerifierPolicy ; rdfs:range appc:PredicateProgram ;
371
+ rdfs:label "policy asks predicate" .
372
+
373
+ appc:requiresNullifier a owl:DatatypeProperty ;
374
+ rdfs:domain appc:VerifierPolicy ; rdfs:range xsd:boolean ;
375
+ rdfs:label "requires nullifier" .
376
+
377
+ appc:acceptsNullifierGrade a owl:ObjectProperty ;
378
+ rdfs:domain appc:VerifierPolicy ; rdfs:range skos:Concept ;
379
+ rdfs:label "accepts nullifier grade" ;
380
+ rdfs:comment "The lowest grade accepted (appc:nullifierGradeScheme)." .
381
+
382
+ appc:nullifierWindowSeconds a owl:DatatypeProperty ;
383
+ rdfs:domain appc:VerifierPolicy ; rdfs:range xsd:integer ;
384
+ rdfs:label "nullifier window seconds" ;
385
+ rdfs:comment "One visit per audience PER WINDOW: the store forgets a value after it (epoch-scoped persistence), and the store is keyed by the window too, so a door that changes its rule starts a fresh count. Absent means once, for as long as the door remembers." .
386
+
387
+ appc:requiresStatus a owl:DatatypeProperty ;
388
+ rdfs:domain appc:VerifierPolicy ; rdfs:range xsd:boolean ;
389
+ rdfs:label "requires status" .
390
+
391
+ appc:statusMaxAgeSeconds a owl:DatatypeProperty ;
392
+ rdfs:domain appc:VerifierPolicy ; rdfs:range xsd:integer ;
393
+ rdfs:label "status max age seconds" ;
394
+ rdfs:comment "How old the anchored sequence a status is verified against may be. Older is refused, not re-fetched." .
395
+
396
+ appc:trustsIssuerFacet a owl:ObjectProperty ;
397
+ rdfs:domain appc:VerifierPolicy ; rdfs:range appc:IssuerKeyFacet ;
398
+ rdfs:label "trusts issuer facet" ;
399
+ rdfs:comment "A facet the verifier will resolve a presentation's key id against — listed in a register and re-verified on the issuer's chain at every verification. Listing is not trust: the chain is." .
400
+
401
+ appc:verifierPlacement a owl:ObjectProperty ;
402
+ rdfs:range skos:Concept ;
403
+ rdfs:label "verifier placement" ;
404
+ rdfs:comment "Where the proof is verified (appc:verifierPlacementScheme): `node` when the verifying keys do not fit the edge runtime, `worker` when they do. On the policy as a declaration and on the evidence as a fact; a receipt that cannot say where a proof was checked is not a receipt." .
405
+
406
+ appc:PredicateAdmissionEvidence a owl:Class ;
407
+ rdfs:subClassOf prov:Entity ;
408
+ rdfs:label "PredicateAdmissionEvidence" ;
409
+ rdfs:comment "THE PREDICATE HELD, AS WHAT A DOOR KEPT: the facet the proof verified under, the predicate program's digest, the nullifier's grade, the status sequence read from neutral ground, where the proof was verified — beside the admission decision, contributed by the door's `binding-credential-presentation` stage. The `predicate` proof grade of spec 442 §7.2. EVIDENCE, NEVER AUTHORITY (ADR-0056/0057): it says a credential satisfied the door's question; the estate's own mandate still governs every act the visitor asks for. No claim value, no person; the acting account is the pairwise one." .
410
+
411
+ appc:evidenceFacet a owl:ObjectProperty ;
412
+ rdfs:domain appc:PredicateAdmissionEvidence ; rdfs:range appc:IssuerKeyFacet ;
413
+ rdfs:label "evidence facet" .
414
+
415
+ appc:evidencePredicateDigest a owl:DatatypeProperty ;
416
+ rdfs:domain appc:PredicateAdmissionEvidence ; rdfs:range xsd:string ;
417
+ rdfs:label "evidence predicate digest" ;
418
+ rdfs:comment "The DOOR'S own digest of the program it asked — computed from its request, never read from the presentation." .
419
+
420
+ appc:evidenceNullifierGrade a owl:ObjectProperty ;
421
+ rdfs:domain appc:PredicateAdmissionEvidence ; rdfs:range skos:Concept ;
422
+ rdfs:label "evidence nullifier grade" .
423
+
424
+ appc:evidenceStatusSequence a owl:DatatypeProperty ;
425
+ rdfs:domain appc:PredicateAdmissionEvidence ; rdfs:range xsd:integer ;
426
+ rdfs:label "evidence status sequence" .
427
+
428
+ appc:evidencedIn a owl:ObjectProperty ;
429
+ rdfs:domain appc:PredicateAdmissionEvidence ; rdfs:range apix:AdmissionReceipt ;
430
+ rdfs:label "evidenced in" ;
431
+ rdfs:comment "The admission receipt the evidence sits beside. Admission is not authorization (ADR-0043)." .
432
+
433
+ appc:proofGrade a owl:ObjectProperty ;
434
+ rdfs:range skos:Concept ;
435
+ rdfs:label "proof grade" ;
436
+ rdfs:comment "Which kind of proof a visitor presented at a door (appc:proofGradeScheme, spec 442 §7.2): `identity` (the agent as itself), `standing` (a leaf of another estate's authority projection), `predicate` (this module). A door says which grades it accepts; a grade is never a rank." .
@@ -0,0 +1,107 @@
1
+ # T-box — the public agent PROFILE facet (spec 217 / 282 / 331; facet-registries.md §2, G2–G4).
2
+ #
3
+ # What this module owns: the SA-keyed, owner-written, unconditionally PUBLIC self-description
4
+ # published through `AgentProfileResolver` under `atl:*` predicates and projected into the
5
+ # discovery knowledge graph as `approf:*` (apps/demo-discovery-indexer PROFILE_KEYS).
6
+ #
7
+ # Until now `approf:` was a declared namespace with NO T-box file: `approf:displayName`,
8
+ # `approf:description` and `approf:skills` were emitted into the production graph by the indexer
9
+ # and read by the MCP without ever being declared. This module closes that (ADR-0009: on-chain
10
+ # ontology governs records; ADR-0013: no read path for an undeclared term).
11
+ #
12
+ # ── The identifier / prose split (ADR-0051, facet-registries §7) ─────────────────────────────
13
+ # The on-chain predicate key is `atl:skills` and is immutable (its id is keccak256("atl:skills"),
14
+ # already registered and already written into live agents' profiles). The T-box term is
15
+ # `approf:skills`. Both are OPAQUE KEYS. What they carry is a set of DECLARED CAPABILITY
16
+ # PROJECTIONS (aps:CapabilityProtocolProjection, related by aps:declaresCapability) — the weakest
17
+ # of the three assertion strengths. Prose and UI always say "capability".
18
+ #
19
+ # ── Assertion strength (capability-architecture.md §2) ───────────────────────────────────────
20
+ # Everything in this module is SELF-DECLARED and unverified. It feeds discovery FIT scoring only.
21
+ # Nothing here is a claim credential (aps:claimsCapability — private vault VC), nothing here is
22
+ # demonstrated (aps:demonstratedCapability — execution provenance), and nothing here authorizes
23
+ # anything (authority is delegation ∩ entitlement ∩ policy, at the gate).
24
+
25
+ @prefix approf: <https://agenticprimitives.dev/ns/profile#> .
26
+ @prefix ap: <https://agenticprimitives.dev/ns/core#> .
27
+ @prefix aps: <https://agenticprimitives.dev/ns/skill#> .
28
+ @prefix apctx: <https://agenticprimitives.dev/ns/context#> .
29
+ @prefix apg: <https://agenticprimitives.dev/ns/geo#> .
30
+ @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
31
+ @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
32
+ @prefix owl: <http://www.w3.org/2002/07/owl#> .
33
+ @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
34
+ @prefix prov: <http://www.w3.org/ns/prov#> .
35
+ @prefix dul: <http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#> .
36
+
37
+ approf: a owl:Ontology ;
38
+ rdfs:label "Agentic Primitives — public agent profile ontology" ;
39
+ owl:versionInfo "0.1.0" ;
40
+ rdfs:comment "SA-keyed public self-description projected from AgentProfileResolver. Owner-asserted, opt-in, unconditionally public, discovery-rankable. Self-declared evidence only — never a credential, never authority." .
41
+
42
+ approf:AgentProfile a owl:Class ;
43
+ rdfs:subClassOf ap:Facet , prov:Entity , dul:InformationObject ;
44
+ rdfs:label "AgentProfile" ;
45
+ rdfs:comment "The public self-description facet of ONE Smart Agent, keyed by the SA address (never by a name node — it must survive a rename and exist for nameless agents, ADR-0010/0020)." .
46
+
47
+ approf:describesAgent a owl:ObjectProperty ;
48
+ rdfs:domain approf:AgentProfile ; rdfs:range ap:CanonicalAgentId ;
49
+ rdfs:label "describesAgent" .
50
+
51
+ # ─── Existing, live predicates — declared here for the first time ───────────
52
+
53
+ approf:displayName a owl:DatatypeProperty ;
54
+ rdfs:domain approf:AgentProfile ; rdfs:range xsd:string ;
55
+ rdfs:label "displayName" ;
56
+ rdfs:comment "atl:displayName. The agent's own public display name. Distinct from the name-node label and from any vault display name (agent-metadata-tiers.md: same field name ≠ same field; never auto-synced)." .
57
+
58
+ approf:description a owl:DatatypeProperty ;
59
+ rdfs:domain approf:AgentProfile ; rdfs:range xsd:string ;
60
+ rdfs:label "description" ;
61
+ rdfs:comment "atl:description, SA-keyed. NOT the node-keyed name-record description (apnam:description) — facet-registries G8: emitting both under this IRI lets tier 2 clobber tier 3 by loop order. Free text; a SECONDARY carrier only, never a structured filter target." .
62
+
63
+ approf:skills a owl:DatatypeProperty ;
64
+ rdfs:domain approf:AgentProfile ; rdfs:range xsd:string ;
65
+ rdfs:label "skills (declared capability projections)" ;
66
+ rdfs:comment "atl:skills (spec 282). Comma-joined DECLARED CAPABILITY PROJECTIONS — aps:CapabilityProtocolProjection nodes related by aps:declaresCapability. Legacy key retained for ABI (ADR-0051); prose says 'declared capabilities'. Spec 331 migrates the value space from free-text labels to canonical catalog capability ids." .
67
+
68
+ approf:declaresCapabilityId a owl:DatatypeProperty ;
69
+ rdfs:domain approf:AgentProfile ; rdfs:range xsd:string ;
70
+ rdfs:label "declaresCapabilityId" ;
71
+ rdfs:comment "Spec 331 — the PARSED, resolvable capability id carried inside an approf:skills token (e.g. 'adv:estate-planning'). One triple per id, projected by the indexer so the matcher can do set-membership instead of substring search. The datatype is a string, not an IRI, because the token is exactly what the agent wrote on chain; resolution to an aps:Capability IRI is the catalog's job and may fail (an unresolvable id is an honest miss, never a silent skip — ADR-0013)." .
72
+
73
+ # ─── G2 / G3 / G4 — the three facets registered by governor tx
74
+ # 0x53acec54d850b8a790da4feda055abf81a0c2f203c1a69d0644d1a1138a18789 ──────
75
+
76
+ approf:languages a owl:DatatypeProperty ;
77
+ rdfs:domain approf:AgentProfile ; rdfs:range xsd:string ;
78
+ rdfs:label "languages" ;
79
+ apctx:classifiedBy apctx:LanguageFacet ;
80
+ rdfs:comment "atl:languages (facet-registries G2). VALUE SPACE: comma-separated BCP-47 language tags, normalized lowercase, e.g. 'es,en,pt-br'. Matching is subtag-prefix based ('es' matches 'es-ES'), never substring. A flat string for parity with atl:skills; per-language proficiency waits for spec 330 and is a value-space migration inside this one predicate, not a new one. RANKING ROLE: soft boost, plus an OPT-IN hard mandate (requireLanguage) that a caller must ask for explicitly." .
81
+
82
+ approf:regions a owl:DatatypeProperty ;
83
+ rdfs:domain approf:AgentProfile ; rdfs:range xsd:string ;
84
+ rdfs:label "regions" ;
85
+ apctx:classifiedBy apctx:JurisdictionFacet ;
86
+ rdfs:comment "atl:regions (facet-registries G3). VALUE SPACE: comma-separated UPPERCASE codes drawn from the GeoFeatureRegistry controlled vocabulary (spec 251) — ISO 3166-1 alpha-2, ISO 3166-2 subdivisions, or a registered supranational feature code, e.g. 'EU,ES,ES-CT'. Requiring the value space to be GeoFeatureRegistry-drawn is what makes a later upgrade to explicit (featureId, version) references a VALUE-SPACE migration inside one predicate rather than a new predicate + projector + UI. RELATION COLLAPSE (accepted v1 limitation): this flattens the five apg:geoRelation values — servesWithin, operatesIn, licensedIn, residentOf, originIn — into one list. servesWithin and licensedIn are materially different claims for a regulated advisor; if that distinction becomes load-bearing, add a second predicate (atl:licensedIn), never structure inside this string. The full truth stays in the private apg: GeoClaimCredential." .
87
+
88
+ approf:focusAreas a owl:DatatypeProperty ;
89
+ rdfs:domain approf:AgentProfile ; rdfs:range xsd:string ;
90
+ rdfs:label "focusAreas" ;
91
+ apctx:classifiedBy apctx:KnowledgeDomain ;
92
+ rdfs:comment "atl:focusAreas (facet-registries G4). VALUE SPACE: comma-separated subject-domain labels, lowercase-hyphenated, e.g. 'modelo-720,forced-heirship'. Maps to the apctx:KnowledgeDomain facet so it stays ORTHOGONAL to capability identity — a focus area is a subject, never a declared capability (ADR-0051). RANKING ROLE: fitScore boost ONLY, capped hardest of the three. It must NEVER become a hard filter: a focus area is an emphasis, not a boundary, and an agent that has not published one is UNKNOWN, not absent." .
93
+
94
+ # ─── spec 347 §8.5 — how to obtain and run the agent's software ──────────────
95
+
96
+ approf:distribution a owl:DatatypeProperty ;
97
+ rdfs:domain approf:AgentProfile ; rdfs:range xsd:string ;
98
+ rdfs:label "distribution" ;
99
+ rdfs:comment "atl:distribution (spec 347 §8.5; docs/architecture/ard-acp-crosswalk.md §2–§3). A JSON literal per agent-profile `AgentDistributionV1` (JCS-canonical): `acp?` (Agent Client Protocol conformance — the eligibility flag for a hosted ACP registry.json projection), `version?` (implementation semver), `npx`/`uvx` { package, args?, env? }, `binary` { <platform>: { archive, cmd, sha256?, args?, env? } } with the six ACP platform keys. Field names mirror the ACP registry agent.schema.json so a registry file is a COPY of this fact, never a translation. SA-keyed (survives a rename, exists for nameless agents), written only by the agent itself. PUBLIC and on-chain-derivable (ADR-0040): the KB carries the string exactly as written on chain; a consumer parses it fail-closed (an unparsable literal is `null`, never a guess — ADR-0013). It describes distribution ONLY — it is not a capability claim, not a trust signal, and grants nothing." .
100
+
101
+ # ─── The value-space anchors these three point at ───────────────────────────
102
+
103
+ approf:regionVocabulary a owl:AnnotationProperty ;
104
+ rdfs:label "regionVocabulary" ;
105
+ rdfs:comment "Declares which controlled vocabulary an approf:regions value space draws from. Points at apg: (GeoFeatureRegistry) — see cbox/profile-facet-vocabulary.ttl." .
106
+
107
+ approf:regions approf:regionVocabulary apg:geoKind .
@@ -0,0 +1,73 @@
1
+ # T-box — the W3C PROV-O terms this substrate EMITS, declared (spec 389).
2
+ #
3
+ # ── Why a file that declares someone else's vocabulary ───────────────────────────────────────────
4
+ # PROV-O is a W3C Recommendation and its terms mean what the Recommendation says — nothing here
5
+ # redefines one. They are declared here for the same reason plan.ttl declares the P-Plan terms it
6
+ # uses: the build's ontology-bindings gate (`check:ontology-bindings`) and the SHACL shapes need every
7
+ # IRI a record binds to to be DECLARED somewhere in tbox/, or they cannot tell an imported standard
8
+ # term from a typo. A run's provenance record (`run.provenance:<runRef>`) binds its fields to these
9
+ # by IRI (`src/vault-records.ts`), and the run-provenance JSON-LD context maps its terms onto them.
10
+ #
11
+ # The list is exactly what the provenance projector emits (packages/provenance): the PROV core
12
+ # classes, the qualified association, and the direct relations. Nothing is declared that nothing
13
+ # emits — a term added here should be a term a record carries.
14
+ #
15
+ # Domains and ranges are omitted: PROV-O's own axioms govern, and restating them here would let the
16
+ # two drift.
17
+
18
+ @prefix prov: <http://www.w3.org/ns/prov#> .
19
+ @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
20
+ @prefix owl: <http://www.w3.org/2002/07/owl#> .
21
+
22
+ <https://agenticprimitives.dev/ns/prov-imports> a owl:Ontology ;
23
+ rdfs:label "Agentic Primitives — PROV-O terms in use" ;
24
+ owl:versionInfo "0.1.1" ;
25
+ rdfs:comment "Declarations of the W3C PROV-O terms the substrate's provenance records carry, so bindings and shapes can target them. Spec 389; spec 316 §6." .
26
+
27
+ # ═══ Core classes ═══
28
+
29
+ prov:Entity a owl:Class ; rdfs:label "Entity (PROV-O)" .
30
+ prov:Activity a owl:Class ; rdfs:label "Activity (PROV-O)" .
31
+ prov:Agent a owl:Class ; rdfs:label "Agent (PROV-O)" .
32
+ prov:SoftwareAgent a owl:Class ; rdfs:subClassOf prov:Agent ; rdfs:label "SoftwareAgent (PROV-O)" .
33
+ prov:Person a owl:Class ; rdfs:subClassOf prov:Agent ; rdfs:label "Person (PROV-O)" .
34
+ prov:Organization a owl:Class ; rdfs:subClassOf prov:Agent ; rdfs:label "Organization (PROV-O)" .
35
+ prov:Bundle a owl:Class ; rdfs:subClassOf prov:Entity ; rdfs:label "Bundle (PROV-O)" ;
36
+ rdfs:comment "A named set of provenance descriptions. One harness run = one bundle (an ep-plan:ExecutionTraceBundle, plan.ttl); a routed run's bundle prov:wasInformedBy the sender's." .
37
+ prov:Plan a owl:Class ; rdfs:subClassOf prov:Entity ; rdfs:label "Plan (PROV-O)" .
38
+ prov:Role a owl:Class ; rdfs:label "Role (PROV-O)" .
39
+ prov:Association a owl:Class ; rdfs:label "Association (PROV-O)" ;
40
+ rdfs:comment "The qualified form of wasAssociatedWith: which agent, under which plan (prov:hadPlan), in which capacity (prov:hadRole). A run carries two — the runtime under the run's ExecutionPlan, the agent under its playbook." .
41
+
42
+ # ═══ Direct relations ═══
43
+
44
+ prov:startedAtTime a owl:DatatypeProperty ; rdfs:label "startedAtTime (PROV-O)" .
45
+ prov:endedAtTime a owl:DatatypeProperty ; rdfs:label "endedAtTime (PROV-O)" .
46
+ # An ENTITY's two times, as distinct from an activity's start and end above (spec 410 §4 / estate.ttl): when the
47
+ # record came into being, and when it stopped holding. A retired vouch keeps its generatedAtTime and gains an
48
+ # invalidatedAtTime; it is never deleted, because a projection that silently forgets a retirement cannot be audited.
49
+ prov:generatedAtTime a owl:DatatypeProperty ; rdfs:label "generatedAtTime (PROV-O)" .
50
+ prov:invalidatedAtTime a owl:DatatypeProperty ; rdfs:label "invalidatedAtTime (PROV-O)" .
51
+ prov:wasAssociatedWith a owl:ObjectProperty ; rdfs:label "wasAssociatedWith (PROV-O)" .
52
+ prov:actedOnBehalfOf a owl:ObjectProperty ; rdfs:label "actedOnBehalfOf (PROV-O)" ;
53
+ rdfs:comment "PRIVATE DETAIL in this substrate: the S1 firewall (provenance/firewall.ts) rejects it from any public row (ADR-0040)." .
54
+ prov:wasAttributedTo a owl:ObjectProperty ; rdfs:label "wasAttributedTo (PROV-O)" .
55
+ prov:used a owl:ObjectProperty ; rdfs:label "used (PROV-O)" ;
56
+ rdfs:comment "What an activity consumed. For a harness step: every delegation in its verified chain, BY REFERENCE (apvr:usedDelegation ⊑ prov:used names the one it presented)." .
57
+ prov:generated a owl:ObjectProperty ; rdfs:label "generated (PROV-O)" .
58
+ prov:wasGeneratedBy a owl:ObjectProperty ; rdfs:label "wasGeneratedBy (PROV-O)" .
59
+ prov:wasInformedBy a owl:ObjectProperty ; rdfs:label "wasInformedBy (PROV-O)" ;
60
+ rdfs:comment "Activity-to-activity communication. A routed run's root activity wasInformedBy the sender's; a hand-off step wasInformedBy the child run. NOT containment — apexec:hasStep is (execution.ttl)." .
61
+ prov:wasDerivedFrom a owl:ObjectProperty ; rdfs:label "wasDerivedFrom (PROV-O)" .
62
+ prov:wasRevisionOf a owl:ObjectProperty ; rdfs:subPropertyOf prov:wasDerivedFrom ; rdfs:label "wasRevisionOf (PROV-O)" .
63
+
64
+ prov:Influence a owl:Class ; rdfs:label "Influence (PROV-O)" ;
65
+ rdfs:comment "The root of PROV's qualified relations. Spec 414: a harness-capability engagement (apexec:CapabilityEngagement) is one." .
66
+
67
+ # ═══ The qualified association ═══
68
+
69
+ prov:qualifiedAssociation a owl:ObjectProperty ; rdfs:label "qualifiedAssociation (PROV-O)" .
70
+ prov:agent a owl:ObjectProperty ; rdfs:label "agent (PROV-O)" .
71
+ prov:hadPlan a owl:ObjectProperty ; rdfs:label "hadPlan (PROV-O)" ;
72
+ rdfs:comment "The plan an association followed. A plan is never authority (plan.ttl): a run's hadPlan says which playbook version shaped it, and no gate reads it." .
73
+ prov:hadRole a owl:ObjectProperty ; rdfs:label "hadRole (PROV-O)" .