@agenticprimitives/ontology 1.0.0-alpha.18 → 1.0.0-alpha.20

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.
@@ -0,0 +1,87 @@
1
+ # T-box — FamilyOffice (apfo:): the family-office organization + its member
2
+ # RELATIONSHIPS modeled as Situations (DnS, apsit:Situation). The codelists (the
3
+ # concept values) live in cbox/familyoffice-vocabulary.ttl; this file declares what
4
+ # a FAMILY OFFICE and each RELATIONSHIP are. New City AI domain ontology over the
5
+ # neutral substrate — a family office is an OrganizationAgent whose members hold
6
+ # typed, hashed, ontology-referenced relationships (never bare enums or edges).
7
+
8
+ @prefix apfo: <https://agenticprimitives.dev/ns/familyoffice#> .
9
+ @prefix apsit: <https://agenticprimitives.dev/ns/situation#> .
10
+ @prefix ap: <https://agenticprimitives.dev/ns/core#> .
11
+ @prefix aps: <https://agenticprimitives.dev/ns/skill#> .
12
+ @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
13
+ @prefix owl: <http://www.w3.org/2002/07/owl#> .
14
+
15
+ apfo: a owl:Ontology ;
16
+ rdfs:label "Agentic Primitives — FamilyOffice vocabulary" ;
17
+ owl:versionInfo "0.1.0" ;
18
+ rdfs:comment "The family-office organization + its member relationships as Situations: kinship, guardianship, ownership, trusteeship. A family office is an OrganizationAgent; each relationship is an apsit:Situation with agent role bindings + a typed body naming apfo: codelist concepts." .
19
+
20
+ # ─── The organization ─────────────────────────────────────────────────────
21
+ apfo:FamilyOffice a owl:Class ;
22
+ rdfs:subClassOf ap:OrganizationAgent ;
23
+ rdfs:label "Family Office" ;
24
+ rdfs:comment "The organization that stewards a family's wealth, entities, and relationships; its members are family members, advisors, and service providers. An OrganizationAgent (steward + member roster ride the aporg: membership Situations)." .
25
+
26
+ # ─── Relationship situations (each ⊑ apsit:Situation) ─────────────────────
27
+ apfo:FamilyOfficeRelation a owl:Class ;
28
+ rdfs:subClassOf apsit:Situation ;
29
+ rdfs:label "Family-office relationship" ;
30
+ rdfs:comment "Abstract base for a typed relationship between family-office members: a Situation with agent role bindings + a typed body. NOT a delegation and NOT a directory listing." .
31
+
32
+ apfo:Kinship a owl:Class ;
33
+ rdfs:subClassOf apfo:FamilyOfficeRelation ;
34
+ rdfs:label "Kinship" ;
35
+ rdfs:comment "A family tie between two persons. Its kind (spouse/parent/child/sibling/…) is an apfo:kinshipKind concept in the body." .
36
+ apfo:SpouseRelation a owl:Class ; rdfs:subClassOf apfo:Kinship ; rdfs:label "Spouse relation" ;
37
+ rdfs:comment "Symmetric — role slots apfo:spouseA and apfo:spouseB (canonical ordering for a stable hash)." .
38
+ apfo:ParentChildRelation a owl:Class ; rdfs:subClassOf apfo:Kinship ; rdfs:label "Parent-child relation" ;
39
+ rdfs:comment "Directed — apfo:parent to apfo:child." .
40
+ apfo:SiblingRelation a owl:Class ; rdfs:subClassOf apfo:Kinship ; rdfs:label "Sibling relation" ;
41
+ rdfs:comment "Symmetric — apfo:siblingA and apfo:siblingB." .
42
+
43
+ apfo:Guardianship a owl:Class ;
44
+ rdfs:subClassOf apfo:FamilyOfficeRelation ;
45
+ rdfs:label "Guardianship" ;
46
+ rdfs:comment "A directed guardian→ward relationship (a legal guardian's oversight of a minor or dependent). The CANONICAL guardianship record — replaces the fragmented encoding (a kinship link in each person's vault plus a 0-bps custodial ownership edge). Role kind (e.g. LegalGuardian) is an apfo:roleKind concept in the body." .
47
+
48
+ apfo:Ownership a owl:Class ;
49
+ rdfs:subClassOf apfo:FamilyOfficeRelation ;
50
+ rdfs:label "Ownership" ;
51
+ rdfs:comment "An owner's interest in an asset or entity — apfo:owner (agent) over apfo:ownedAsset (resource). Kind (sole/joint/beneficial/…) is an apfo:ownershipKind concept." .
52
+
53
+ apfo:Trusteeship a owl:Class ;
54
+ rdfs:subClassOf apfo:FamilyOfficeRelation ;
55
+ rdfs:label "Trusteeship" ;
56
+ rdfs:comment "A trustee's fiduciary role over a trust entity — apfo:trustee (agent) over apfo:trust (resource). Role kind (trustee/successor-trustee) is an apfo:roleKind concept." .
57
+
58
+ # ─── Role properties (the SituationRole slots; ranges are ap:Agent or resources) ──
59
+ apfo:spouseA a owl:ObjectProperty ; rdfs:range ap:Agent ; rdfs:label "spouse A" .
60
+ apfo:spouseB a owl:ObjectProperty ; rdfs:range ap:Agent ; rdfs:label "spouse B" .
61
+ apfo:parent a owl:ObjectProperty ; rdfs:range ap:Agent ; rdfs:label "parent" .
62
+ apfo:child a owl:ObjectProperty ; rdfs:range ap:Agent ; rdfs:label "child" .
63
+ apfo:siblingA a owl:ObjectProperty ; rdfs:range ap:Agent ; rdfs:label "sibling A" .
64
+ apfo:siblingB a owl:ObjectProperty ; rdfs:range ap:Agent ; rdfs:label "sibling B" .
65
+ apfo:guardian a owl:ObjectProperty ; rdfs:range ap:Agent ; rdfs:label "guardian" ;
66
+ rdfs:comment "The guardian in an apfo:Guardianship." .
67
+ apfo:ward a owl:ObjectProperty ; rdfs:range ap:Agent ; rdfs:label "ward" ;
68
+ rdfs:comment "The person under guardianship in an apfo:Guardianship." .
69
+ apfo:owner a owl:ObjectProperty ; rdfs:range ap:Agent ; rdfs:label "owner" .
70
+ apfo:ownedAsset a owl:ObjectProperty ; rdfs:label "owned asset" .
71
+ apfo:trustee a owl:ObjectProperty ; rdfs:range ap:Agent ; rdfs:label "trustee" .
72
+ apfo:trust a owl:ObjectProperty ; rdfs:label "trust" .
73
+
74
+ # ─── Body annotation properties (ranges are the cbox concept schemes) ──────
75
+ apfo:hasKinshipKind a owl:ObjectProperty ; rdfs:label "has kinship kind" ;
76
+ rdfs:comment "The apfo:kinshipKind concept a Kinship situation names in its body." .
77
+ apfo:hasRoleKind a owl:ObjectProperty ; rdfs:label "has role kind" ;
78
+ rdfs:comment "The apfo:roleKind concept a Guardianship or Trusteeship names (e.g. apfo:LegalGuardian)." .
79
+ apfo:hasOwnershipKind a owl:ObjectProperty ; rdfs:label "has ownership kind" ;
80
+ rdfs:comment "The apfo:ownershipKind concept an Ownership situation names in its body." .
81
+
82
+ # ─── Bridge to the generic capability substrate (apfo ↔ aps) ───────────────
83
+ apfo:advisoryCatalog a owl:ObjectProperty ;
84
+ rdfs:domain apfo:FamilyOffice ;
85
+ rdfs:range aps:CapabilityCatalog ;
86
+ rdfs:label "advisory catalog" ;
87
+ rdfs:comment "A family office's advisory catalog IS an aps:CapabilityCatalog — no new catalog type. Its advisors are aporg:OrganizationMembership members that aps:declaresCapability FROM it, so 'who advises on what' rides the generic capability plumbing (declared/claimed/demonstrated) rather than a bespoke advisor table." .
package/tbox/identity.ttl CHANGED
@@ -43,6 +43,12 @@ apnam:resolvesTo a owl:ObjectProperty ;
43
43
  rdfs:domain apnam:NameFacet ;
44
44
  rdfs:range ap:Agent .
45
45
 
46
+ apnam:description a owl:DatatypeProperty ;
47
+ rdfs:label "description (name record)" ;
48
+ rdfs:domain apnam:NameFacet ;
49
+ rdfs:range xsd:string ;
50
+ rdfs:comment "atl:description read NODE-KEYED off AgentNameAttributeResolver — the description attached to the NAME RECORD, written by the name's owner. facet-registries G8: it shares the on-chain predicate key keccak256(\"atl:description\") with the SA-keyed profile description, but it is NOT the same fact and must NOT be emitted as approf:description, which tbox/profile.ttl reserves for the agent's own self-description. The two differ in author (name owner vs the agent itself), in subject (name node vs Smart Agent), and in survival: this one TRANSFERS WITH THE NAME and disappears if the name lapses, while approf:description survives a rename and exists for nameless agents (ADR-0010/0020). Projecting both under one IRI let the node-keyed loop clobber the SA-keyed one by loop order. Descriptive, low-authority, free text — never a filter target and never evidence." .
51
+
46
52
  aporg:memberOf a owl:ObjectProperty ;
47
53
  rdfs:label "memberOf" ;
48
54
  rdfs:domain ap:Agent ;
package/tbox/intents.ttl CHANGED
@@ -92,6 +92,16 @@ apint:AssignRoleIntent a owl:Class ;
92
92
  rdfs:subClassOf apint:RelationshipIntent ;
93
93
  rdfs:label "AssignRoleIntent" .
94
94
 
95
+ # ─── Consultation (spec 329 — org assistant member routing) ──────────
96
+ # Layer-2 spine artifact ONLY: a ConsultationIntent DESCRIBES a routed org→member
97
+ # consult; it is EXECUTED by the ADR-0044 Ring-0 loop over the A2A task rail —
98
+ # never by the W1 marketplace resolver (the spine describes; the loop executes).
99
+
100
+ apint:ConsultationIntent a owl:Class ;
101
+ rdfs:subClassOf apint:Intent ;
102
+ rdfs:label "ConsultationIntent" ;
103
+ rdfs:comment "An org's signed request that a specific member agent answer a discussion question. Layer-2 spine artifact; executed via the A2A task rail (spec 329), never the marketplace resolver. direction 'receive'; object = the consult-answer IRI; expressedBy the org SA; addressedTo exactly one member SA. Wire binding: `ap.consultation-intent.v1` ↔ this class (TS mirror: fabric ConsultationIntentV1)." .
104
+
95
105
  apint:MatchInitiation a owl:Class ;
96
106
  rdfs:subClassOf prov:Activity ;
97
107
  rdfs:label "MatchInitiation" ;
@@ -143,6 +143,22 @@ apmsg:invitationStatus a owl:DatatypeProperty ;
143
143
  rdfs:label "invitationStatus" ;
144
144
  rdfs:comment "Concept from apmsg:discussionInvitationStatusScheme: invited | accepted | declined | revoked." .
145
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
+
146
162
  apmsg:inConversation a owl:ObjectProperty ;
147
163
  rdfs:domain apmsg:Discussion ; rdfs:range apmsg:Conversation ;
148
164
  rdfs:label "inConversation" .
@@ -157,6 +173,39 @@ apmsg:ConversationProfile a owl:Class ;
157
173
  rdfs:label "ConversationProfile" ;
158
174
  rdfs:comment "direct | group | discussion | broadcast | forum | announcement | support." .
159
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
+
160
209
  # ─── Classes + predicates (aporg extension: the membership listing) ──
161
210
 
162
211
  aporg:DirectoryListing a owl:Class ;
@@ -188,3 +237,8 @@ aporg:listingHash a owl:DatatypeProperty ;
188
237
  rdfs:domain aporg:DirectoryListing ; rdfs:range xsd:string ;
189
238
  rdfs:label "listingHash" ;
190
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." .
package/tbox/plan.ttl ADDED
@@ -0,0 +1,169 @@
1
+ # T-box — P-Plan grounding (spec 332 §4; closes the outstanding spec-316 W5 `plan.ttl` item).
2
+ #
3
+ # ── Why ONE module for three plans ───────────────────────────────────────────────────────────────
4
+ # The substrate has three plan-shaped objects, and confusing them is the recurring failure this
5
+ # module exists to prevent (ADR-0054 §3):
6
+ #
7
+ # apcoord:CoordinationPlan — DURABLE, SHARED, versioned. Multi-principal. Adopted by decision.
8
+ # apexec:ExecutionPlan — RUN-SPECIFIC. One goal, one executor, one loop (spec 330 §8).
9
+ # service-agent PrimitivePlan — the deterministic compile target (spec 316 §6; runtime-owned,
10
+ # typed as p-plan:Plan in A-box emission, no T-box class here).
11
+ #
12
+ # All are p-plan:Plan. They are related ONLY through compilation provenance
13
+ # (prov:wasDerivedFrom): a CoordinationPlan step COMPILES INTO run ExecutionPlans; it is never a
14
+ # synonym for one. The run bridge is p-plan:correspondsToStep + the spec-330 §9 qualified
15
+ # association — that pair is what makes a whole coordination process reconstructable: who
16
+ # (prov:agent + prov:hadRole), did what (activities), on what (prov:used, by hash), producing what
17
+ # (prov:generated), under WHICH plan step and revision (prov:hadPlan + correspondsToStep).
18
+ #
19
+ # A plan is never authority: activating, adopting, or corresponding to a plan grants nothing
20
+ # (capability-architecture §2 axiom 6; ADR-0041). No gate reads a p-plan: term.
21
+
22
+ @prefix p-plan: <http://purl.org/net/p-plan#> .
23
+ @prefix ep-plan: <https://w3id.org/ep-plan#> .
24
+ @prefix apcoord: <https://agenticprimitives.dev/ns/coordination#> .
25
+ @prefix apexec: <https://agenticprimitives.dev/ns/execution#> .
26
+ @prefix prov: <http://www.w3.org/ns/prov#> .
27
+ @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
28
+ @prefix owl: <http://www.w3.org/2002/07/owl#> .
29
+
30
+ <https://agenticprimitives.dev/ns/plan> a owl:Ontology ;
31
+ rdfs:label "Agentic Primitives — P-Plan grounding" ;
32
+ owl:versionInfo "0.1.0" ;
33
+ rdfs:comment "Declares the imported P-Plan terms the substrate uses and grounds the plan-shaped objects (durable apcoord:CoordinationPlan, run-specific apexec:ExecutionPlan, service-agent PrimitivePlan) as p-plan:Plan. Spec 332 §4; spec 316 §6; spec 330 §9." .
34
+
35
+ # ═══ Imported P-Plan terms (declared so shapes and A-box rows target something real) ═══
36
+
37
+ p-plan:Plan a owl:Class ;
38
+ rdfs:subClassOf prov:Plan , prov:Entity ;
39
+ rdfs:label "Plan (P-Plan)" ;
40
+ rdfs:comment "A prescriptive description of intended activities. In this substrate every plan variant is a p-plan:Plan first." .
41
+
42
+ p-plan:Step a owl:Class ;
43
+ rdfs:label "Step (P-Plan)" ;
44
+ rdfs:comment "One planned element of a p-plan:Plan. Prescriptive — an executed activity CORRESPONDS to a step; it never IS the step." .
45
+
46
+ p-plan:Variable a owl:Class ;
47
+ rdfs:label "Variable (P-Plan)" ;
48
+ rdfs:comment "A typed input/output slot of a Step, bound at execution time to concrete entities (artifacts, context snapshots — referenced by hash)." .
49
+
50
+ p-plan:isStepOfPlan a owl:ObjectProperty ;
51
+ rdfs:domain p-plan:Step ; rdfs:range p-plan:Plan ;
52
+ rdfs:label "isStepOfPlan" .
53
+
54
+ p-plan:isPrecededBy a owl:ObjectProperty ;
55
+ rdfs:domain p-plan:Step ; rdfs:range p-plan:Step ;
56
+ rdfs:label "isPrecededBy" ;
57
+ rdfs:comment "Step ordering. apcoord:PlanEdge kind `precedes` projects onto this property; the richer typed edges (depends-on / alternative / condition / compensates / refines) stay apcoord:-reified." .
58
+
59
+ p-plan:correspondsToStep a owl:ObjectProperty ;
60
+ rdfs:domain prov:Activity ; rdfs:range p-plan:Step ;
61
+ rdfs:label "correspondsToStep" ;
62
+ rdfs:comment "THE run bridge: an executed activity (apexec:ServiceExecution / an apful:Task's activity) points at the durable planned step it enacted. Paired with the spec-330 §9 qualified association (prov:agent + prov:hadRole + prov:hadPlan = the exact adopted plan revision), this is what makes an Endeavor's whole process reconstructable." .
63
+
64
+ p-plan:hasInputVar a owl:ObjectProperty ;
65
+ rdfs:domain p-plan:Step ; rdfs:range p-plan:Variable ;
66
+ rdfs:label "hasInputVar" .
67
+
68
+ p-plan:hasOutputVar a owl:ObjectProperty ;
69
+ rdfs:domain p-plan:Step ; rdfs:range p-plan:Variable ;
70
+ rdfs:label "hasOutputVar" .
71
+
72
+ p-plan:isVariableOfPlan a owl:ObjectProperty ;
73
+ rdfs:domain p-plan:Variable ; rdfs:range p-plan:Plan ;
74
+ rdfs:label "isVariableOfPlan" .
75
+
76
+ # ═══ Imported EP-PLAN terms (https://w3id.org/ep-plan — Markovic/Garijo/Edwards/Vasconcelos) ═══
77
+ #
78
+ # EP-PLAN is the published PROV extension for EXACTLY our plan↔execution gap: it aligns with
79
+ # P-PLAN (ep-plan:correspondsToStep ≡ p-plan:correspondsToStep) and adds the four things P-PLAN
80
+ # lacks that this substrate already produces as facts without vocabulary:
81
+ #
82
+ # 1. the TRACE BUNDLE — projectEndeavorProvenance's per-Endeavor graph IS an
83
+ # ep-plan:ExecutionTraceBundle (⊑ prov:Bundle);
84
+ # 2. CONSTRAINTS + their EVALUATION — commitment bounds / plan-step criteria evaluated against
85
+ # trace activities, with satisfied/violated as facts, not inference;
86
+ # 3. OBJECTIVES — apcoord:OutcomeSpecification is what the plan is FOR;
87
+ # 4. STEP→PLAN DECOMPOSITION — the CoordinationPlan-step → run-ExecutionPlan compile bridge as
88
+ # a first-class relation (alongside prov:wasDerivedFrom).
89
+ #
90
+ # Deliberately NOT imported: ep-plan:Policy/ResponsibleAgent/hasPermittedAgent — anything reading
91
+ # like permission. A plan is never authority here (axiom above); authority stays with the
92
+ # delegation/entitlement/custody gates, so no term that could be misread as a gate input crosses
93
+ # the boundary. Communication* is fabric's job; MultiVariable/MultiStep wait for a reader.
94
+
95
+ ep-plan:ExecutionTraceBundle a owl:Class ;
96
+ rdfs:subClassOf prov:Bundle , prov:Entity ;
97
+ rdfs:label "Execution Trace Bundle (EP-PLAN)" ;
98
+ rdfs:comment "A collection of trace elements generated during a single plan execution. The graph projectEndeavorProvenance emits per Endeavor is one; its members attach via ep-plan:hasTraceElement." .
99
+
100
+ ep-plan:hasTraceElement a owl:ObjectProperty ;
101
+ rdfs:domain ep-plan:ExecutionTraceBundle ;
102
+ rdfs:label "hasTraceElement" ;
103
+ rdfs:comment "Links the bundle to its activities, agents, and entities. Range: prov:Activity ∪ prov:Agent ∪ prov:Entity." .
104
+
105
+ ep-plan:Constraint a owl:Class ;
106
+ rdfs:label "Constraint (EP-PLAN)" ;
107
+ rdfs:comment "A restriction placed on a step or plan, evaluated against the execution trace. Commitment bounds (deadline) and step-level requirements ground here. EP-PLAN explicitly does NOT require a constraint be satisfied for execution to continue — violations are recordable facts, which is what makes honest audit possible." .
108
+
109
+ ep-plan:hasConstraint a owl:ObjectProperty ;
110
+ rdfs:range ep-plan:Constraint ;
111
+ rdfs:label "hasConstraint" ;
112
+ rdfs:comment "Attaches a Constraint to a p-plan:Plan or Step (apcoord:CoordinationPlan / apcoord:PlanStep / apexec:ExecutionPlan)." .
113
+
114
+ ep-plan:ConstraintEvaluation a owl:Class ;
115
+ rdfs:label "Constraint Evaluation (EP-PLAN)" ;
116
+ rdfs:comment "Qualifies HOW a trace activity was checked against a constraint (evaluator, method, when). The reified form behind satisfied/violated — the same qualified-relation pattern as prov:qualifiedAssociation." .
117
+
118
+ ep-plan:evaluatedAgainst a owl:ObjectProperty ;
119
+ rdfs:range ep-plan:Constraint ;
120
+ rdfs:label "evaluatedAgainst" ;
121
+ rdfs:comment "A trace activity was evaluated against a constraint. Use the subproperties `satisfied` / `violated` to record the verdict as a FACT (never inferred from conversation — spec 334 §3 rule 2d applies to verdicts too)." .
122
+
123
+ ep-plan:satisfied a owl:ObjectProperty ;
124
+ rdfs:subPropertyOf ep-plan:evaluatedAgainst ;
125
+ rdfs:range ep-plan:Constraint ;
126
+ rdfs:label "satisfied" ;
127
+ rdfs:comment "The activity satisfied the constraint. apcoord PlanStepSatisfied events (with evidenceRefs) project here." .
128
+
129
+ ep-plan:violated a owl:ObjectProperty ;
130
+ rdfs:subPropertyOf ep-plan:evaluatedAgainst ;
131
+ rdfs:range ep-plan:Constraint ;
132
+ rdfs:label "violated" ;
133
+ rdfs:comment "The activity violated the constraint — recorded, never silently dropped (ADR-0013)." .
134
+
135
+ ep-plan:FailedActivity a owl:Class ;
136
+ rdfs:subClassOf prov:Activity ;
137
+ rdfs:label "Failed Activity (EP-PLAN)" ;
138
+ rdfs:comment "An activity not executed in full — the point where a plan execution was interrupted. Failed apexec executions / withdrawn-commitment steps type here so failure is a first-class trace fact." .
139
+
140
+ ep-plan:Objective a owl:Class ;
141
+ rdfs:label "Objective (EP-PLAN)" ;
142
+ rdfs:comment "The purpose a plan serves. apcoord:OutcomeSpecification grounds here: the outcome an Endeavor's adopted plan is FOR." .
143
+
144
+ ep-plan:isAchievedBy a owl:ObjectProperty ;
145
+ rdfs:domain ep-plan:Objective ;
146
+ rdfs:label "isAchievedBy" ;
147
+ rdfs:comment "Objective → the plan (or plan element) expected to achieve it. Inverse: ep-plan:achieves." .
148
+
149
+ ep-plan:achieves a owl:ObjectProperty ;
150
+ rdfs:range ep-plan:Objective ;
151
+ rdfs:label "achieves" ;
152
+ rdfs:comment "Plan (element) → Objective. apcoord:MilestoneAchievement / EndeavorSatisfied evidence projects onto this." .
153
+
154
+ ep-plan:isDecomposedAsPlan a owl:ObjectProperty ;
155
+ rdfs:range p-plan:Plan ;
156
+ rdfs:label "isDecomposedAsPlan" ;
157
+ rdfs:comment "THE compile bridge, named: an apcoord:PlanStep is decomposed as the run-specific apexec:ExecutionPlan that enacts it. Emitted ALONGSIDE prov:wasDerivedFrom (derivation says where the run plan came from; decomposition says which step it elaborates). EP-PLAN scopes the domain to MultiStep; we use it for any step that compiles to a plan and keep the domain open here." .
158
+
159
+ ep-plan:isSubPlanOfPlan a owl:ObjectProperty ;
160
+ rdfs:domain p-plan:Plan ; rdfs:range p-plan:Plan ;
161
+ rdfs:label "isSubPlanOfPlan" ;
162
+ rdfs:comment "Transitive plan containment — future CoordinationPlan hierarchies (child endeavor plans) without inventing a new relation." .
163
+
164
+ # ═══ Grounding the substrate's plan variants ═══
165
+
166
+ apexec:ExecutionPlan a owl:Class ;
167
+ rdfs:subClassOf p-plan:Plan ;
168
+ rdfs:label "ExecutionPlan" ;
169
+ rdfs:comment "RUN-SPECIFIC plan (spec 330 §8): one goal, one executor, one ADR-0044 loop. When it compiles an apcoord:PlanStep it is prov:wasDerivedFrom that step's adopted CoordinationPlan revision AND ep-plan:isDecomposedAsPlan of that step — never the durable shared plan itself. Declared here (ahead of the parked spec-330 W1) because plan.ttl owns the plan trichotomy; W1 extends, it does not rewrite." .
@@ -0,0 +1,100 @@
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
+ # ─── The value-space anchors these three point at ───────────────────────────
95
+
96
+ approf:regionVocabulary a owl:AnnotationProperty ;
97
+ rdfs:label "regionVocabulary" ;
98
+ rdfs:comment "Declares which controlled vocabulary an approf:regions value space draws from. Points at apg: (GeoFeatureRegistry) — see cbox/profile-facet-vocabulary.ttl." .
99
+
100
+ approf:regions approf:regionVocabulary apg:geoKind .
package/tbox/skills.ttl CHANGED
@@ -120,3 +120,135 @@ aps:matchedSkill a owl:ObjectProperty ;
120
120
  rdfs:subPropertyOf aps:matchedCapability ;
121
121
  rdfs:domain aps:IntentCapabilityMatch ; rdfs:range aps:CapabilityDefinition ;
122
122
  rdfs:label "matchedSkill (deprecated)" .
123
+
124
+ # ═══════════════════════════════════════════════════════════════════════════
125
+ # Capability IDENTITY, the independent relations, and CATALOGS
126
+ # (spec 330 W0 §5 — unparked by spec 331; capability-architecture.md §2 + §8)
127
+ # ═══════════════════════════════════════════════════════════════════════════
128
+ #
129
+ # Prefixes used below beyond the header: apctx: (context facets), apguide: (playbooks),
130
+ # apexec: (executions — declared in spec 330 W1, referenced here by IRI only), prov:, skos:.
131
+ #
132
+ # THE DISTINCTION THIS SECTION EXISTS TO HOLD (architecture §1):
133
+ # aps:Capability — the stable, provider-independent IDENTITY of an outcome.
134
+ # aps:CapabilityDefinition — a VERSIONED artifact that defines it (above).
135
+ # aps:CapabilityProtocolProjection — an ADVERTISEMENT of it (a card AgentSkill, an
136
+ # atl:skills token, an offering). Above.
137
+ # Until now identity was implicit in the definition. Spec 331 mints it explicitly, because a
138
+ # domain catalog needs many agents to reference ONE id across MANY definition versions.
139
+
140
+ @prefix apctx: <https://agenticprimitives.dev/ns/context#> .
141
+ @prefix apguide: <https://agenticprimitives.dev/ns/guidance#> .
142
+ @prefix apexec: <https://agenticprimitives.dev/ns/execution#> .
143
+ @prefix prov: <http://www.w3.org/ns/prov#> .
144
+ @prefix skos: <http://www.w3.org/2004/02/skos/core#> .
145
+ @prefix sh: <http://www.w3.org/ns/shacl#> .
146
+ @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
147
+
148
+ aps:Capability a owl:Class ;
149
+ rdfs:label "Capability" ;
150
+ rdfs:comment "The stable, provider-independent identity of an achievable OUTCOME. Not a service, not a plan, not a taxonomy term, not an execution, and not a subject domain. Its identity NEVER depends on one provider, one jurisdiction, one language, or one playbook — those are apctx: facets of a realization. A capability is not a prov:Activity: it is what COULD be achieved; an activity is an occurrence that attempted it (architecture §5)." .
151
+
152
+ aps:CapabilityCatalog a owl:Class ;
153
+ rdfs:label "CapabilityCatalog" ;
154
+ rdfs:comment "A named, versioned, steward-owned set of capability definitions for one bounded context (e.g. the family-office advisory catalog, spec 331). A catalog is a DISTRIBUTION and GOVERNANCE unit, never a taxonomy: membership implies no hierarchy, and a capability may appear in several catalogs." .
155
+
156
+ aps:catalogSteward a owl:ObjectProperty ;
157
+ rdfs:domain aps:CapabilityCatalog ; rdfs:range ap:CanonicalAgentId ;
158
+ rdfs:label "catalogSteward" ;
159
+ rdfs:comment "The account authorized to publish/version definitions in this catalog (SkillDefinitionRegistry stewardAccount)." .
160
+
161
+ aps:inCatalog a owl:ObjectProperty ;
162
+ rdfs:domain aps:CapabilityDefinition ; rdfs:range aps:CapabilityCatalog ;
163
+ rdfs:label "inCatalog" .
164
+
165
+ aps:capabilityId a owl:DatatypeProperty ;
166
+ rdfs:domain aps:Capability ; rdfs:range xsd:string ;
167
+ rdfs:label "capabilityId" ;
168
+ rdfs:comment "The canonical, human-readable, STABLE id string (a CURIE, e.g. 'adv:succession-plan-design'). keccak256 of this exact string is the on-chain SkillDefinitionRegistry skillId — the same keccak-of-CURIE convention atl:* predicates use. Once published it is never re-spelled: a rename is a new capability plus a skos:exactMatch, never an edit." .
169
+
170
+ aps:outcomeStatement a owl:DatatypeProperty ;
171
+ rdfs:domain aps:CapabilityDefinition ; rdfs:range xsd:string ;
172
+ rdfs:label "outcomeStatement" ;
173
+ rdfs:comment "One sentence in the PASSIVE COMPLETED voice naming what is true when the capability has been realized ('a target asset allocation and its implementation are determined for a stated mandate'). Written this way deliberately: an outcome statement that can only be phrased as an activity ('advises on…') is a signal the term is a service or a subject domain, not a capability." .
174
+
175
+ # ─── The independent relations. NEVER an overloaded `implementsCapability`. ──
176
+
177
+ aps:definesCapability a owl:ObjectProperty ;
178
+ rdfs:domain aps:CapabilityDefinition ; rdfs:range aps:Capability ;
179
+ rdfs:label "definesCapability" ;
180
+ rdfs:comment "Which versioned artifact defines it. Many definition VERSIONS, one capability identity." .
181
+
182
+ aps:classifiesCapability a owl:ObjectProperty ;
183
+ rdfs:range aps:Capability ;
184
+ rdfs:label "classifiesCapability" ;
185
+ rdfs:comment "External taxon → capability, via SKOS alignment. Classification is never possession and never authorization (architecture §2 axiom 4). External taxa are ALIGNED, never term-copied into this T-box (invariant 11)." .
186
+
187
+ aps:assertsCapability a owl:ObjectProperty ;
188
+ rdfs:range aps:Capability ;
189
+ rdfs:label "assertsCapability" ;
190
+ rdfs:comment "Abstract parent of the three ASSERTION STRENGTHS. They are subproperties rather than a datatype rank because the asserter and the verification path differ STRUCTURALLY, not in degree. They must be surfaced to users separately and never summed as one signal." .
191
+
192
+ aps:declaresCapability a owl:ObjectProperty ;
193
+ rdfs:subPropertyOf aps:assertsCapability ; rdfs:range aps:Capability ;
194
+ rdfs:label "declaresCapability" ;
195
+ rdfs:comment "SELF-declared, owner-signed, UNVERIFIED: an atl:skills token, a card AgentSkill, a crawled offering. Costs one transaction and nothing else — anyone may declare anything. Feeds discovery FIT scoring only, and must never be presented as endorsement." .
196
+
197
+ aps:claimsCapability a owl:ObjectProperty ;
198
+ rdfs:subPropertyOf aps:assertsCapability ; rdfs:range aps:Capability ;
199
+ rdfs:label "claimsCapability" ;
200
+ rdfs:comment "CREDENTIALED: an aps:SkillClaim credential (self or endorsed), vault-resident, referencing an on-chain (definitionId, version). A SELF claim is bounded (SELF_MAX_PROFICIENCY) and forbidden the endorsement relations; an ENDORSED claim carries a distinct issuer. Feeds TRUST scoring — and only through its public commitment, never its body (ADR-0040)." .
201
+
202
+ aps:demonstratedCapability a owl:ObjectProperty ;
203
+ rdfs:subPropertyOf aps:assertsCapability ; rdfs:range aps:Capability ;
204
+ rdfs:label "demonstratedCapability" ;
205
+ rdfs:comment "EARNED: evidenced by execution provenance — a conforming apexec:ServiceExecution that realized the capability. Derived, never asserted by the subject. Feeds an OUTCOME signal, and is the only assertion strength that cannot be produced by writing a string." .
206
+
207
+ # ─── Structure: a DAG of composition/specialisation, never a single-parent tree ──
208
+
209
+ aps:specializesCapability a owl:ObjectProperty ;
210
+ rdfs:domain aps:Capability ; rdfs:range aps:Capability ;
211
+ a owl:TransitiveProperty ;
212
+ rdfs:label "specializesCapability" ;
213
+ rdfs:comment "A genuinely NARROWER FORM OF THE SAME ability (private fund diligence ⊏ manager selection & diligence). Multi-parent is legal and expected; only cycles are forbidden. NOT rdfs:subClassOf — capabilities are individuals, not classes, and subclassing them would make every facet stack into a hierarchy. A jurisdiction, a language or an asset class is NEVER a specialization: those are apctx: facets." .
214
+
215
+ aps:hasComponentCapability a owl:ObjectProperty ;
216
+ rdfs:domain aps:Capability ; rdfs:range aps:Capability ;
217
+ rdfs:label "hasComponentCapability" ;
218
+ rdfs:comment "A broader outcome DEPENDS ON constituent abilities that are part of achieving it. NO ORDERING is implied — ordering lives in an apexec:ExecutionPlan (apexec:precedes), never in capability semantics (architecture invariant 8)." .
219
+
220
+ aps:requiresCapability a owl:ObjectProperty ;
221
+ rdfs:domain aps:Capability ; rdfs:range aps:Capability ;
222
+ rdfs:label "requiresCapability" ;
223
+ rdfs:comment "A DEPENDENCY: the object must be realizable for the subject to be realizable, but is not a part of it (covenant analysis requires secured-lending structuring — you cannot stress-test a facility that was never structured). Distinct from hasComponentCapability, which is part-of." .
224
+
225
+ apguide:supportsCapability a owl:ObjectProperty ;
226
+ rdfs:range aps:Capability ;
227
+ rdfs:label "supportsCapability" ;
228
+ rdfs:comment "AgentSkillPackage (SKILL.md playbook) → capability, 0..N. Which plans MAY inform a realization. GUIDANCE ONLY — never authority, never identity (ADR-0050). A card projection is never wired to exactly one playbook (architecture §2 axiom 1)." .
229
+
230
+ apexec:realizesCapability a owl:ObjectProperty ;
231
+ rdfs:range aps:Capability ;
232
+ rdfs:label "realizesCapability" ;
233
+ rdfs:comment "ServiceExecution → capability. What actually occurred. Declared here (the aps: module owns the capability end of the relation); the apexec: classes land with spec 330 W1." .
234
+
235
+ # ─── Realization contracts ──────────────────────────────────────────────────
236
+
237
+ aps:CapabilityRealizationContract a owl:Class ;
238
+ rdfs:subClassOf sh:NodeShape ;
239
+ rdfs:label "CapabilityRealizationContract" ;
240
+ rdfs:comment "A SHACL shape over PROV stating what a CONFORMING realization of one capability must contain: activity type, required prov:agent roles, prov:used input types, prov:generated output types, the prov:qualifiedAssociation carrying prov:hadPlan, and completion conditions. It governs SHAPE, not outcome — a recorded decline is a conforming realization. It is NOT a test suite and NOT an authorization: no gate may read it." .
241
+
242
+ aps:hasRealizationContract a owl:ObjectProperty ;
243
+ rdfs:domain aps:CapabilityDefinition ; rdfs:range aps:CapabilityRealizationContract ;
244
+ rdfs:label "hasRealizationContract" .
245
+
246
+ aps:contractStatus a owl:DatatypeProperty ;
247
+ rdfs:domain aps:CapabilityDefinition ; rdfs:range xsd:string ;
248
+ rdfs:label "contractStatus" ;
249
+ rdfs:comment "'enforced' | 'deferred'. DEFERRED IS FIRST-CLASS AND HONEST: a capability whose realizations this substrate cannot yet observe declares 'deferred' plus the evidence that would be needed, rather than carrying a contract nothing validates. An unenforceable contract is worse than an absent one — it makes a claim about verification the system cannot keep (ADR-0013)." .
250
+
251
+ aps:deferredContractRationale a owl:DatatypeProperty ;
252
+ rdfs:domain aps:CapabilityDefinition ; rdfs:range xsd:string ;
253
+ rdfs:label "deferredContractRationale" ;
254
+ rdfs:comment "Required when contractStatus = 'deferred': one line naming the evidence that would make a contract enforceable." .