@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.
- package/README.md +59 -21
- package/cbox/agent-facet-shapes.shacl.ttl +130 -0
- package/cbox/capability-catalog-shapes.shacl.ttl +284 -0
- package/cbox/card-projection-shapes.shacl.ttl +216 -0
- package/cbox/consultation-shapes.shacl.ttl +85 -0
- package/cbox/content-vocabulary.ttl +52 -0
- package/cbox/controlled-vocabularies.ttl +224 -4
- package/cbox/discovery-graph-shapes.shacl.ttl +284 -0
- package/cbox/familyoffice-shapes.shacl.ttl +92 -0
- package/cbox/familyoffice-vocabulary.ttl +48 -0
- package/cbox/geo-vocabulary.ttl +36 -0
- package/cbox/guidance-vocabulary.ttl +22 -0
- package/cbox/interaction-shapes.shacl.ttl +218 -0
- package/cbox/interaction-vocabulary.ttl +159 -0
- package/cbox/judgment-shapes.shacl.ttl +83 -0
- package/cbox/naming-registry-shapes.shacl.ttl +272 -0
- package/cbox/org-team-shapes.shacl.ttl +184 -0
- package/cbox/privacy-credential-shapes.shacl.ttl +187 -0
- package/cbox/profile-facet-vocabulary.ttl +50 -0
- package/cbox/registry-vocabulary.ttl +86 -0
- package/cbox/run-measures-shapes.shacl.ttl +59 -0
- package/cbox/run-provenance-shapes.shacl.ttl +264 -0
- package/cbox/scope-vocabulary.ttl +112 -0
- package/cbox/skill-grounding-vocabulary.ttl +18 -0
- package/cbox/skill-vocabulary.ttl +50 -0
- package/context.jsonld +37 -1
- package/dist/arg-types.d.ts +60 -0
- package/dist/arg-types.d.ts.map +1 -0
- package/dist/arg-types.js +143 -0
- package/dist/arg-types.js.map +1 -0
- package/dist/artifacts.d.ts +9 -2
- package/dist/artifacts.d.ts.map +1 -1
- package/dist/artifacts.js +153 -2
- package/dist/artifacts.js.map +1 -1
- package/dist/contact-fields.d.ts +28 -0
- package/dist/contact-fields.d.ts.map +1 -0
- package/dist/contact-fields.js +38 -0
- package/dist/contact-fields.js.map +1 -0
- package/dist/decisions.d.ts +69 -0
- package/dist/decisions.d.ts.map +1 -0
- package/dist/decisions.js +98 -0
- package/dist/decisions.js.map +1 -0
- package/dist/evaluation-context.d.ts +134 -0
- package/dist/evaluation-context.d.ts.map +1 -0
- package/dist/evaluation-context.js +136 -0
- package/dist/evaluation-context.js.map +1 -0
- package/dist/governance.d.ts +84 -0
- package/dist/governance.d.ts.map +1 -0
- package/dist/governance.js +88 -0
- package/dist/governance.js.map +1 -0
- package/dist/grounded-vocabulary.d.ts +29 -0
- package/dist/grounded-vocabulary.d.ts.map +1 -0
- package/dist/grounded-vocabulary.js +110 -0
- package/dist/grounded-vocabulary.js.map +1 -0
- package/dist/household.d.ts +19 -0
- package/dist/household.d.ts.map +1 -0
- package/dist/household.js +41 -0
- package/dist/household.js.map +1 -0
- package/dist/index.d.ts +1091 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1323 -5
- package/dist/index.js.map +1 -1
- package/dist/outcomes.d.ts +47 -0
- package/dist/outcomes.d.ts.map +1 -0
- package/dist/outcomes.js +40 -0
- package/dist/outcomes.js.map +1 -0
- package/dist/participant-vocabulary.d.ts +57 -0
- package/dist/participant-vocabulary.d.ts.map +1 -0
- package/dist/participant-vocabulary.js +66 -0
- package/dist/participant-vocabulary.js.map +1 -0
- package/dist/party-roles.d.ts +115 -0
- package/dist/party-roles.d.ts.map +1 -0
- package/dist/party-roles.js +343 -0
- package/dist/party-roles.js.map +1 -0
- package/dist/payload-classes.d.ts +22 -0
- package/dist/payload-classes.d.ts.map +1 -0
- package/dist/payload-classes.js +30 -0
- package/dist/payload-classes.js.map +1 -0
- package/dist/plan-shapes.d.ts +18 -0
- package/dist/plan-shapes.d.ts.map +1 -0
- package/dist/plan-shapes.js +38 -0
- package/dist/plan-shapes.js.map +1 -0
- package/dist/principles.generated.d.ts +11 -0
- package/dist/principles.generated.d.ts.map +1 -0
- package/dist/principles.generated.js +293 -0
- package/dist/principles.generated.js.map +1 -0
- package/dist/published-works.d.ts +13 -0
- package/dist/published-works.d.ts.map +1 -0
- package/dist/published-works.js +18 -0
- package/dist/published-works.js.map +1 -0
- package/dist/relations.d.ts +44 -0
- package/dist/relations.d.ts.map +1 -0
- package/dist/relations.js +104 -0
- package/dist/relations.js.map +1 -0
- package/dist/run-measures-context.d.ts +74 -0
- package/dist/run-measures-context.d.ts.map +1 -0
- package/dist/run-measures-context.js +77 -0
- package/dist/run-measures-context.js.map +1 -0
- package/dist/run-provenance-context.d.ts +315 -0
- package/dist/run-provenance-context.d.ts.map +1 -0
- package/dist/run-provenance-context.js +323 -0
- package/dist/run-provenance-context.js.map +1 -0
- package/dist/transitions.d.ts +42 -0
- package/dist/transitions.d.ts.map +1 -0
- package/dist/transitions.js +100 -0
- package/dist/transitions.js.map +1 -0
- package/dist/vault-records.d.ts +74 -0
- package/dist/vault-records.d.ts.map +1 -0
- package/dist/vault-records.js +777 -0
- package/dist/vault-records.js.map +1 -0
- package/dist/versions.generated.d.ts +262 -0
- package/dist/versions.generated.d.ts.map +1 -0
- package/dist/versions.generated.js +318 -0
- package/dist/versions.generated.js.map +1 -0
- package/evaluation.jsonld +133 -0
- package/mappings/actor-context-standards.ttl +89 -0
- package/mappings/agent-discovery-standards.ttl +127 -0
- package/mappings/collaboration-crosswalk-actors.ttl +30 -0
- package/mappings/collaboration-crosswalk-authority.ttl +31 -0
- package/mappings/collaboration-crosswalk-guidance.ttl +29 -0
- package/mappings/collaboration-crosswalk-intent.ttl +29 -0
- package/mappings/collaboration-crosswalk-messaging.ttl +37 -0
- package/mappings/collaboration-crosswalk-organization.ttl +66 -0
- package/mappings/collaboration-crosswalk-protocols.ttl +49 -0
- package/mappings/collaboration-crosswalk-skills.ttl +50 -0
- package/mappings/collaboration-profile.ttl +82 -0
- package/mappings/commerce-engagement-crosswalk.ttl +83 -0
- package/mappings/spine-standards.ttl +83 -0
- package/package.json +31 -9
- package/run-measures.jsonld +34 -0
- package/run-provenance.jsonld +314 -0
- package/tbox/actor-context.ttl +145 -0
- package/tbox/agent-resolution.ttl +308 -0
- package/tbox/agreement.ttl +77 -0
- package/tbox/attestation.ttl +156 -0
- package/tbox/card-projection.ttl +350 -0
- package/tbox/constraints.ttl +150 -0
- package/tbox/contact.ttl +61 -0
- package/tbox/content.ttl +76 -0
- package/tbox/context.ttl +508 -0
- package/tbox/coordination.ttl +263 -0
- package/tbox/core.ttl +325 -7
- package/tbox/dcat-imports.ttl +19 -0
- package/tbox/discovery.ttl +273 -0
- package/tbox/dqv-imports.ttl +29 -0
- package/tbox/earl-imports.ttl +32 -0
- package/tbox/engagement.ttl +349 -0
- package/tbox/entitlement.ttl +41 -0
- package/tbox/estate.ttl +78 -0
- package/tbox/evaluation.ttl +330 -0
- package/tbox/execution.ttl +720 -0
- package/tbox/familyoffice.ttl +87 -0
- package/tbox/fulfillment.ttl +140 -0
- package/tbox/geo.ttl +28 -0
- package/tbox/governance.ttl +67 -0
- package/tbox/guidance.ttl +40 -0
- package/tbox/household.ttl +142 -0
- package/tbox/identity.ttl +133 -6
- package/tbox/inference.ttl +177 -0
- package/tbox/intents.ttl +241 -0
- package/tbox/interaction.ttl +297 -0
- package/tbox/messaging.ttl +244 -0
- package/tbox/naming.ttl +114 -0
- package/tbox/org.ttl +410 -0
- package/tbox/payload.ttl +94 -0
- package/tbox/payment.ttl +124 -0
- package/tbox/plan.ttl +169 -0
- package/tbox/principles.ttl +212 -0
- package/tbox/privacy-credential.ttl +436 -0
- package/tbox/profile.ttl +107 -0
- package/tbox/prov-imports.ttl +73 -0
- package/tbox/registry.ttl +382 -0
- package/tbox/resolution.ttl +108 -0
- package/tbox/scope.ttl +59 -0
- package/tbox/security-exposure.ttl +102 -0
- package/tbox/situation.ttl +56 -0
- package/tbox/skills.ttl +316 -0
- package/tbox/skos-imports.ttl +54 -0
- package/tbox/transition.ttl +63 -0
- package/tbox/trust.ttl +210 -0
- package/tbox/values.ttl +81 -0
- package/tbox/verification-receipt.ttl +134 -0
- package/versions.adoption.json +173 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# C-box — SHACL shapes for Agentic Interaction (spec 340; ADR-0058, extending ADR-0048).
|
|
2
|
+
#
|
|
3
|
+
# WHAT THESE ARE AND ARE NOT. Graph/documentation shapes, declared here and ENFORCED by fabric's TS
|
|
4
|
+
# validators (golden-vectored) — the same arrangement as the messaging and consultation shapes. SHACL
|
|
5
|
+
# conformance is NEVER authorization and never truth: a graph can conform perfectly and describe an
|
|
6
|
+
# entirely unauthorized act. That is deliberate. An unauthorized Command MUST be recordable, so it
|
|
7
|
+
# must be shape-valid; refusing to record it is how the evidence disappears.
|
|
8
|
+
#
|
|
9
|
+
# So these constrain STRUCTURE, not permission. Each exists because its absence lets a record be
|
|
10
|
+
# written that cannot later be INTERPRETED:
|
|
11
|
+
#
|
|
12
|
+
# an Answer with no Question — unanswerable: what was asked?
|
|
13
|
+
# an Exchange with no context pin — unreplayable: what was known when this was decided?
|
|
14
|
+
# an Exchange with no profile pin — downgradable: a Negotiation reread as a Conversation
|
|
15
|
+
# an Accept with no Offer — unresolvable: accepted WHICH of the two offers?
|
|
16
|
+
# a bare Receipt — unreadable: what does it actually prove?
|
|
17
|
+
#
|
|
18
|
+
# Every one of those is a record that looks fine today and is useless in a year, which is the exact
|
|
19
|
+
# failure a governed interaction model exists to prevent.
|
|
20
|
+
#
|
|
21
|
+
# IF YOU RUN THESE THROUGH A SHACL ENGINE, CHECK ITS SUBCLASS HANDLING FIRST. Several shapes target a
|
|
22
|
+
# SUPERCLASS (apix:Receipt, apix:CommunicativeAct) and rely on `sh:targetClass`/`sh:class` meaning
|
|
23
|
+
# SHACL-instance-of, i.e. rdf:type/rdfs:subClassOf*. shacl-engine 1.1.2 does NOT compute that closure:
|
|
24
|
+
# a DeliveryReceipt is simply not seen as a Receipt, the superclass shape matches nothing, and the run
|
|
25
|
+
# reports conformance by not looking. The house test materializes the closure before validating; any
|
|
26
|
+
# other consumer must either do the same or load an RDFS-inferencing store.
|
|
27
|
+
|
|
28
|
+
@prefix apix: <https://agenticprimitives.dev/ns/interaction#> .
|
|
29
|
+
@prefix sh: <http://www.w3.org/ns/shacl#> .
|
|
30
|
+
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
|
31
|
+
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
|
|
32
|
+
|
|
33
|
+
# ─── The situation ──────────────────────────────────────────────────────────
|
|
34
|
+
|
|
35
|
+
apix:InteractionShape a sh:NodeShape ;
|
|
36
|
+
rdfs:label "Interaction shape" ;
|
|
37
|
+
sh:targetClass apix:Interaction ;
|
|
38
|
+
|
|
39
|
+
# The profile is what makes an interaction interpretable: permitted roles, permitted acts, state
|
|
40
|
+
# machine. Without one, "what is allowed here" has no answer — and the convenient answer is "anything".
|
|
41
|
+
sh:property [
|
|
42
|
+
sh:path apix:hasProfile ;
|
|
43
|
+
sh:minCount 1 ; sh:maxCount 1 ;
|
|
44
|
+
sh:class apix:InteractionProfile ;
|
|
45
|
+
sh:message "An Interaction MUST pin exactly one InteractionProfile — an unprofiled interaction has no defined permitted acts or state machine (ADR-0058)." ;
|
|
46
|
+
] ;
|
|
47
|
+
|
|
48
|
+
sh:property [
|
|
49
|
+
sh:path apix:hasParticipation ;
|
|
50
|
+
sh:minCount 1 ;
|
|
51
|
+
sh:class apix:Participation ;
|
|
52
|
+
sh:message "An Interaction MUST have at least one Participation." ;
|
|
53
|
+
] .
|
|
54
|
+
|
|
55
|
+
apix:InteractionProfileShape a sh:NodeShape ;
|
|
56
|
+
rdfs:label "InteractionProfile shape" ;
|
|
57
|
+
sh:targetClass apix:InteractionProfile ;
|
|
58
|
+
|
|
59
|
+
sh:property [
|
|
60
|
+
sh:path apix:profileVersion ;
|
|
61
|
+
sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:string ;
|
|
62
|
+
sh:message "An InteractionProfile MUST carry an exact version — it is pinned into every Exchange to make downgrade detectable (ADR-0058)." ;
|
|
63
|
+
] .
|
|
64
|
+
|
|
65
|
+
# ─── The unit that crosses the boundary ─────────────────────────────────────
|
|
66
|
+
|
|
67
|
+
apix:ExchangeShape a sh:NodeShape ;
|
|
68
|
+
rdfs:label "Exchange shape" ;
|
|
69
|
+
sh:targetClass apix:Exchange ;
|
|
70
|
+
|
|
71
|
+
sh:property [
|
|
72
|
+
sh:path apix:occursIn ;
|
|
73
|
+
sh:minCount 1 ; sh:maxCount 1 ; sh:class apix:Interaction ;
|
|
74
|
+
sh:message "An Exchange MUST belong to exactly one Interaction. An Exchange without an Interaction is a message (ADR-0058 §12)." ;
|
|
75
|
+
] ;
|
|
76
|
+
|
|
77
|
+
# actor and principal are separate and BOTH required. Collapsing them erases who actually acted:
|
|
78
|
+
# the service agent vanishes behind the principal it acted for, and provenance loses the only party
|
|
79
|
+
# answerable for the act itself (ADR-0048 §1). Equal values are fine; a missing one is not.
|
|
80
|
+
sh:property [
|
|
81
|
+
sh:path apix:actor ;
|
|
82
|
+
sh:minCount 1 ; sh:maxCount 1 ;
|
|
83
|
+
sh:message "An Exchange MUST name exactly one actor — WHO performed the move." ;
|
|
84
|
+
] ;
|
|
85
|
+
sh:property [
|
|
86
|
+
sh:path apix:principal ;
|
|
87
|
+
sh:minCount 1 ; sh:maxCount 1 ;
|
|
88
|
+
sh:message "An Exchange MUST name exactly one principal — ON WHOSE BEHALF. Equals actor when undelegated; never omitted." ;
|
|
89
|
+
] ;
|
|
90
|
+
|
|
91
|
+
sh:property [
|
|
92
|
+
sh:path apix:pinsContext ;
|
|
93
|
+
sh:minCount 1 ; sh:maxCount 1 ; sh:class apix:ContextSnapshot ;
|
|
94
|
+
sh:message "An Exchange MUST pin exactly one ContextSnapshot — without it the decision is unreplayable (ADR-0058)." ;
|
|
95
|
+
] ;
|
|
96
|
+
|
|
97
|
+
sh:property [
|
|
98
|
+
sh:path apix:pinsProfileVersion ;
|
|
99
|
+
sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:string ;
|
|
100
|
+
sh:message "An Exchange MUST record the exact profile version it was made under, on itself — reading it off the live Interaction lets a Negotiation be reread as a Conversation after the fact (ADR-0058)." ;
|
|
101
|
+
] ;
|
|
102
|
+
|
|
103
|
+
sh:property [
|
|
104
|
+
sh:path apix:realizesAct ;
|
|
105
|
+
sh:minCount 1 ;
|
|
106
|
+
sh:class apix:CommunicativeAct ;
|
|
107
|
+
sh:message "An Exchange MUST realize at least one CommunicativeAct — an exchange conveying no act is transport with no meaning." ;
|
|
108
|
+
] .
|
|
109
|
+
|
|
110
|
+
# ─── Acts ───────────────────────────────────────────────────────────────────
|
|
111
|
+
|
|
112
|
+
apix:CommunicativeActShape a sh:NodeShape ;
|
|
113
|
+
rdfs:label "CommunicativeAct shape" ;
|
|
114
|
+
sh:targetClass apix:CommunicativeAct ;
|
|
115
|
+
|
|
116
|
+
# This closes SHAPE.CommunicativeAct, which named a shape defined in no file — a dangle that
|
|
117
|
+
# survived because nothing parsed the C-box until the tbox-parses gate landed.
|
|
118
|
+
sh:property [
|
|
119
|
+
sh:path apix:performative ;
|
|
120
|
+
sh:minCount 1 ; sh:maxCount 1 ;
|
|
121
|
+
sh:message "A CommunicativeAct MUST declare exactly one performative from apix:performativeScheme." ;
|
|
122
|
+
] .
|
|
123
|
+
|
|
124
|
+
apix:AcceptActShape a sh:NodeShape ;
|
|
125
|
+
rdfs:label "AcceptAct shape" ;
|
|
126
|
+
sh:targetClass apix:AcceptAct ;
|
|
127
|
+
|
|
128
|
+
# Points at the Offer, not at the Exchange that carried it: one Exchange may convey two offers, and
|
|
129
|
+
# "responds to that exchange" cannot say which one was accepted.
|
|
130
|
+
sh:property [
|
|
131
|
+
sh:path apix:accepts ;
|
|
132
|
+
sh:minCount 1 ; sh:class apix:Offer ;
|
|
133
|
+
sh:message "An AcceptAct MUST identify the Offer it accepts. Identifying is not authorizing — acceptance by an unauthorized party still creates no Commitment (ADR-0058 §15)." ;
|
|
134
|
+
] .
|
|
135
|
+
|
|
136
|
+
apix:CounterOfferActShape a sh:NodeShape ;
|
|
137
|
+
rdfs:label "CounterOfferAct shape" ;
|
|
138
|
+
sh:targetClass apix:CounterOfferAct ;
|
|
139
|
+
|
|
140
|
+
sh:property [
|
|
141
|
+
sh:path apix:counters ;
|
|
142
|
+
sh:minCount 1 ; sh:class apix:Offer ;
|
|
143
|
+
sh:message "A CounterOfferAct MUST identify the Offer it counters — it proposes a NEW Offer and never mutates its predecessor, which stays in evidence exactly as sent (ADR-0058 §15)." ;
|
|
144
|
+
] .
|
|
145
|
+
|
|
146
|
+
# The supersession half of the same rule, at the level where supersession is modelled. Written as
|
|
147
|
+
# ¬(realizes a counter) ∨ (supersedes something) — SHACL-Core has no if-then, and this is the portable
|
|
148
|
+
# spelling of one. It is the enforceable form of "a correction is a new Exchange, never an edit".
|
|
149
|
+
apix:CounteringExchangeShape a sh:NodeShape ;
|
|
150
|
+
rdfs:label "Countering-Exchange shape" ;
|
|
151
|
+
sh:targetClass apix:Exchange ;
|
|
152
|
+
sh:or (
|
|
153
|
+
[ sh:not [ sh:property [
|
|
154
|
+
sh:path apix:realizesAct ;
|
|
155
|
+
sh:qualifiedValueShape [ sh:class apix:CounterOfferAct ] ;
|
|
156
|
+
sh:qualifiedMinCount 1 ;
|
|
157
|
+
] ] ]
|
|
158
|
+
[ sh:property [ sh:path apix:supersedes ; sh:minCount 1 ] ]
|
|
159
|
+
) ;
|
|
160
|
+
sh:message "An Exchange realizing a CounterOfferAct MUST supersede the Exchange it replaces (ADR-0058 §15)." .
|
|
161
|
+
|
|
162
|
+
# ─── Content ────────────────────────────────────────────────────────────────
|
|
163
|
+
|
|
164
|
+
apix:AnswerShape a sh:NodeShape ;
|
|
165
|
+
rdfs:label "Answer shape" ;
|
|
166
|
+
sh:targetClass apix:Answer ;
|
|
167
|
+
|
|
168
|
+
# The distinction being enforced: content that identifies no question is an Inform. Both are
|
|
169
|
+
# legitimate; conflating them makes a Q&A interaction's resolution state uncomputable.
|
|
170
|
+
sh:property [
|
|
171
|
+
sh:path apix:answers ;
|
|
172
|
+
sh:minCount 1 ; sh:class apix:Question ;
|
|
173
|
+
sh:message "An Answer MUST identify the Question it addresses. An answer with no question is an Inform (ADR-0058)." ;
|
|
174
|
+
] .
|
|
175
|
+
|
|
176
|
+
# ─── Reproducible context ───────────────────────────────────────────────────
|
|
177
|
+
|
|
178
|
+
apix:ContextSnapshotShape a sh:NodeShape ;
|
|
179
|
+
rdfs:label "ContextSnapshot shape" ;
|
|
180
|
+
sh:targetClass apix:ContextSnapshot ;
|
|
181
|
+
|
|
182
|
+
sh:property [
|
|
183
|
+
sh:path apix:contextDigest ;
|
|
184
|
+
sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:string ;
|
|
185
|
+
sh:message "A ContextSnapshot MUST carry its digest — it is addressed BY content, never by a name that could later point elsewhere." ;
|
|
186
|
+
] ;
|
|
187
|
+
|
|
188
|
+
# The floating-pointer ban, made checkable. A historical record that resolves to whatever exists
|
|
189
|
+
# today says nothing about the moment it was made.
|
|
190
|
+
sh:property [
|
|
191
|
+
sh:path apix:pinsProfileVersion ;
|
|
192
|
+
sh:not [ sh:in ( "current" "latest" "HEAD" ) ] ;
|
|
193
|
+
sh:message "`current`/`latest`/`HEAD` are FORBIDDEN inside a historical record — a floating version makes the Exchange unreplayable (ADR-0058)." ;
|
|
194
|
+
] .
|
|
195
|
+
|
|
196
|
+
# ─── Typed evidence ─────────────────────────────────────────────────────────
|
|
197
|
+
|
|
198
|
+
apix:ReceiptShape a sh:NodeShape ;
|
|
199
|
+
rdfs:label "Receipt shape" ;
|
|
200
|
+
sh:targetClass apix:Receipt ;
|
|
201
|
+
|
|
202
|
+
sh:property [
|
|
203
|
+
sh:path apix:attests ;
|
|
204
|
+
sh:minCount 1 ;
|
|
205
|
+
sh:message "A Receipt MUST identify what it attests to." ;
|
|
206
|
+
] ;
|
|
207
|
+
|
|
208
|
+
# A bare Receipt asserts that SOMETHING happened without saying what — which is precisely how a
|
|
209
|
+
# delivery receipt gets read as an approval, and why every receipt is typed (ADR-0058 §16).
|
|
210
|
+
sh:or (
|
|
211
|
+
[ sh:class apix:DeliveryReceipt ]
|
|
212
|
+
[ sh:class apix:AdmissionReceipt ]
|
|
213
|
+
[ sh:class apix:ReadReceipt ]
|
|
214
|
+
[ sh:class apix:AcknowledgementReceipt ]
|
|
215
|
+
[ sh:class apix:DecisionReceipt ]
|
|
216
|
+
[ sh:class apix:ExecutionReceipt ]
|
|
217
|
+
) ;
|
|
218
|
+
sh:message "Use a TYPED receipt (Delivery / Admission / Read / Acknowledgement / Decision / Execution). A bare Receipt does not say what it proves (ADR-0058 §16)." .
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# C-box — interaction / organization controlled vocabularies (spec 324 §4).
|
|
2
|
+
# Closed SKOS codelists for performatives, membership/enrollment/role status,
|
|
3
|
+
# conversation profiles, and discussion status.
|
|
4
|
+
|
|
5
|
+
@prefix apix: <https://agenticprimitives.dev/ns/interaction#> .
|
|
6
|
+
@prefix apmsg: <https://agenticprimitives.dev/ns/messaging#> .
|
|
7
|
+
@prefix aporg: <https://agenticprimitives.dev/ns/org#> .
|
|
8
|
+
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
|
|
9
|
+
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
|
10
|
+
|
|
11
|
+
# ─── performative (apix:CommunicativeAct) ──────────────────────────────
|
|
12
|
+
# MOVED apmsg: → apix: with ADR-0058, following CommunicativeAct itself. A performative is what an
|
|
13
|
+
# act DOES; apmsg: is the delivery/inbox projection (folders, labels, unread, retention). The thirteen
|
|
14
|
+
# concepts are unchanged and remain the exact set `fabric`'s `Performative` TS union emits.
|
|
15
|
+
|
|
16
|
+
apix:performativeScheme a skos:ConceptScheme ;
|
|
17
|
+
rdfs:label "performative" ;
|
|
18
|
+
skos:definition "Communicative acts. Aligned to FIPA and ActivityStreams via mappings/, never imported as authoritative semantics. Extensible: only acts with distinctive CONSEQUENCES are promoted to OWL classes in tbox/interaction.ttl." ;
|
|
19
|
+
skos:hasTopConcept apix:INFORM, apix:QUERY, apix:REQUEST, apix:PROPOSE, apix:COUNTER,
|
|
20
|
+
apix:ACCEPT, apix:REJECT, apix:NOTIFY, apix:ACKNOWLEDGE, apix:ISSUE, apix:RETRACT,
|
|
21
|
+
apix:SUBSCRIBE, apix:UNSUBSCRIBE .
|
|
22
|
+
|
|
23
|
+
apix:INFORM a skos:Concept ; skos:inScheme apix:performativeScheme ; skos:prefLabel "INFORM" .
|
|
24
|
+
apix:QUERY a skos:Concept ; skos:inScheme apix:performativeScheme ; skos:prefLabel "QUERY" .
|
|
25
|
+
apix:REQUEST a skos:Concept ; skos:inScheme apix:performativeScheme ; skos:prefLabel "REQUEST" .
|
|
26
|
+
apix:PROPOSE a skos:Concept ; skos:inScheme apix:performativeScheme ; skos:prefLabel "PROPOSE" .
|
|
27
|
+
apix:COUNTER a skos:Concept ; skos:inScheme apix:performativeScheme ; skos:prefLabel "COUNTER" .
|
|
28
|
+
apix:ACCEPT a skos:Concept ; skos:inScheme apix:performativeScheme ; skos:prefLabel "ACCEPT" .
|
|
29
|
+
apix:REJECT a skos:Concept ; skos:inScheme apix:performativeScheme ; skos:prefLabel "REJECT" .
|
|
30
|
+
apix:NOTIFY a skos:Concept ; skos:inScheme apix:performativeScheme ; skos:prefLabel "NOTIFY" .
|
|
31
|
+
apix:ACKNOWLEDGE a skos:Concept ; skos:inScheme apix:performativeScheme ; skos:prefLabel "ACKNOWLEDGE" .
|
|
32
|
+
apix:ISSUE a skos:Concept ; skos:inScheme apix:performativeScheme ; skos:prefLabel "ISSUE" .
|
|
33
|
+
apix:RETRACT a skos:Concept ; skos:inScheme apix:performativeScheme ; skos:prefLabel "RETRACT" .
|
|
34
|
+
apix:SUBSCRIBE a skos:Concept ; skos:inScheme apix:performativeScheme ; skos:prefLabel "SUBSCRIBE" .
|
|
35
|
+
apix:UNSUBSCRIBE a skos:Concept ; skos:inScheme apix:performativeScheme ; skos:prefLabel "UNSUBSCRIBE" .
|
|
36
|
+
|
|
37
|
+
# ─── membership status ─────────────────────────────────────────────────
|
|
38
|
+
|
|
39
|
+
aporg:membershipStatusScheme a skos:ConceptScheme ;
|
|
40
|
+
rdfs:label "membershipStatus" ;
|
|
41
|
+
skos:hasTopConcept aporg:membershipActive, aporg:membershipSuspended, aporg:membershipEnded .
|
|
42
|
+
|
|
43
|
+
aporg:membershipActive a skos:Concept ; skos:inScheme aporg:membershipStatusScheme ; skos:prefLabel "active" .
|
|
44
|
+
aporg:membershipSuspended a skos:Concept ; skos:inScheme aporg:membershipStatusScheme ; skos:prefLabel "suspended" .
|
|
45
|
+
aporg:membershipEnded a skos:Concept ; skos:inScheme aporg:membershipStatusScheme ; skos:prefLabel "ended" .
|
|
46
|
+
|
|
47
|
+
# ─── membership end reason ─────────────────────────────────────────────
|
|
48
|
+
|
|
49
|
+
aporg:membershipEndReasonScheme a skos:ConceptScheme ;
|
|
50
|
+
rdfs:label "membershipEndReason" ;
|
|
51
|
+
skos:hasTopConcept aporg:endLeft, aporg:endRemoved, aporg:endExcluded, aporg:endExpired .
|
|
52
|
+
|
|
53
|
+
aporg:endLeft a skos:Concept ; skos:inScheme aporg:membershipEndReasonScheme ; skos:prefLabel "left" .
|
|
54
|
+
aporg:endRemoved a skos:Concept ; skos:inScheme aporg:membershipEndReasonScheme ; skos:prefLabel "removed" .
|
|
55
|
+
aporg:endExcluded a skos:Concept ; skos:inScheme aporg:membershipEndReasonScheme ; skos:prefLabel "excluded" .
|
|
56
|
+
aporg:endExpired a skos:Concept ; skos:inScheme aporg:membershipEndReasonScheme ; skos:prefLabel "expired" .
|
|
57
|
+
|
|
58
|
+
# ─── enrollment status ─────────────────────────────────────────────────
|
|
59
|
+
|
|
60
|
+
aporg:enrollmentStatusScheme a skos:ConceptScheme ;
|
|
61
|
+
rdfs:label "enrollmentStatus" ;
|
|
62
|
+
skos:hasTopConcept aporg:enrollDraft, aporg:enrollSubmitted, aporg:enrollUnderReview,
|
|
63
|
+
aporg:enrollApproved, aporg:enrollRejected, aporg:enrollWithdrawn, aporg:enrollExpired .
|
|
64
|
+
|
|
65
|
+
aporg:enrollDraft a skos:Concept ; skos:inScheme aporg:enrollmentStatusScheme ; skos:prefLabel "draft" .
|
|
66
|
+
aporg:enrollSubmitted a skos:Concept ; skos:inScheme aporg:enrollmentStatusScheme ; skos:prefLabel "submitted" .
|
|
67
|
+
aporg:enrollUnderReview a skos:Concept ; skos:inScheme aporg:enrollmentStatusScheme ; skos:prefLabel "under-review" .
|
|
68
|
+
aporg:enrollApproved a skos:Concept ; skos:inScheme aporg:enrollmentStatusScheme ; skos:prefLabel "approved" .
|
|
69
|
+
aporg:enrollRejected a skos:Concept ; skos:inScheme aporg:enrollmentStatusScheme ; skos:prefLabel "rejected" .
|
|
70
|
+
aporg:enrollWithdrawn a skos:Concept ; skos:inScheme aporg:enrollmentStatusScheme ; skos:prefLabel "withdrawn" .
|
|
71
|
+
aporg:enrollExpired a skos:Concept ; skos:inScheme aporg:enrollmentStatusScheme ; skos:prefLabel "expired" .
|
|
72
|
+
|
|
73
|
+
# ─── role assignment status ──────────────────────────────────────────────
|
|
74
|
+
|
|
75
|
+
aporg:roleAssignmentStatusScheme a skos:ConceptScheme ;
|
|
76
|
+
rdfs:label "roleAssignmentStatus" ;
|
|
77
|
+
skos:hasTopConcept aporg:roleActive, aporg:roleSuspended, aporg:roleRevoked, aporg:roleExpired .
|
|
78
|
+
|
|
79
|
+
aporg:roleActive a skos:Concept ; skos:inScheme aporg:roleAssignmentStatusScheme ; skos:prefLabel "active" .
|
|
80
|
+
aporg:roleSuspended a skos:Concept ; skos:inScheme aporg:roleAssignmentStatusScheme ; skos:prefLabel "suspended" .
|
|
81
|
+
aporg:roleRevoked a skos:Concept ; skos:inScheme aporg:roleAssignmentStatusScheme ; skos:prefLabel "revoked" .
|
|
82
|
+
aporg:roleExpired a skos:Concept ; skos:inScheme aporg:roleAssignmentStatusScheme ; skos:prefLabel "expired" .
|
|
83
|
+
|
|
84
|
+
# ─── conversation profile ──────────────────────────────────────────────
|
|
85
|
+
|
|
86
|
+
apmsg:conversationProfileScheme a skos:ConceptScheme ;
|
|
87
|
+
rdfs:label "conversationProfile" ;
|
|
88
|
+
skos:hasTopConcept apmsg:profileDirect, apmsg:profileGroup, apmsg:profileDiscussion,
|
|
89
|
+
apmsg:profileBroadcast, apmsg:profileForum, apmsg:profileAnnouncement, apmsg:profileSupport .
|
|
90
|
+
|
|
91
|
+
apmsg:profileDirect a skos:Concept ; skos:inScheme apmsg:conversationProfileScheme ; skos:prefLabel "direct" .
|
|
92
|
+
apmsg:profileGroup a skos:Concept ; skos:inScheme apmsg:conversationProfileScheme ; skos:prefLabel "group" .
|
|
93
|
+
apmsg:profileDiscussion a skos:Concept ; skos:inScheme apmsg:conversationProfileScheme ; skos:prefLabel "discussion" .
|
|
94
|
+
apmsg:profileBroadcast a skos:Concept ; skos:inScheme apmsg:conversationProfileScheme ; skos:prefLabel "broadcast" .
|
|
95
|
+
apmsg:profileForum a skos:Concept ; skos:inScheme apmsg:conversationProfileScheme ; skos:prefLabel "forum" .
|
|
96
|
+
apmsg:profileAnnouncement a skos:Concept ; skos:inScheme apmsg:conversationProfileScheme ; skos:prefLabel "announcement" .
|
|
97
|
+
apmsg:profileSupport a skos:Concept ; skos:inScheme apmsg:conversationProfileScheme ; skos:prefLabel "support" .
|
|
98
|
+
|
|
99
|
+
# ─── discussion status — RETIRED (spec 340 W11) ──────────────────────────
|
|
100
|
+
# Declared here, implemented NOWHERE, and on inspection its three values were two axes:
|
|
101
|
+
# open / closed → the interaction lifecycle, which is `apix:InteractionState` (active / concluded)
|
|
102
|
+
# archived → SHELVING, which is `apix:InboxState.archived` — a different machine, per viewer
|
|
103
|
+
# Keeping the scheme would have been a second vocabulary for concepts that already have homes, which
|
|
104
|
+
# is the duplication ADR-0058 exists to end. Retired rather than crosswalked: there was nothing live
|
|
105
|
+
# to migrate, and a crosswalk would have preserved the ambiguity instead of removing it.
|
|
106
|
+
|
|
107
|
+
# ─── discussion participation policy (open vs restricted topics) ────────
|
|
108
|
+
|
|
109
|
+
apmsg:participationPolicyScheme a skos:ConceptScheme ;
|
|
110
|
+
rdfs:label "participationPolicy" ;
|
|
111
|
+
skos:hasTopConcept apmsg:openParticipation, apmsg:restrictedParticipation .
|
|
112
|
+
|
|
113
|
+
apmsg:openParticipation a skos:Concept ; skos:inScheme apmsg:participationPolicyScheme ;
|
|
114
|
+
skos:prefLabel "open" ;
|
|
115
|
+
skos:definition "Every organization member is automatically a participant. Participation is DERIVED from aporg:OrganizationMembership at read time — never stored per topic." .
|
|
116
|
+
apmsg:restrictedParticipation a skos:Concept ; skos:inScheme apmsg:participationPolicyScheme ;
|
|
117
|
+
skos:prefLabel "restricted" ;
|
|
118
|
+
skos:definition "Invite-only. Participation is ASSERTED: DiscussionInvitation → acceptance → DiscussionParticipation with a discussion-scoped RoleAssignment." .
|
|
119
|
+
|
|
120
|
+
# ─── discussion participant roles (discussion-scoped RoleAssignment) ────
|
|
121
|
+
|
|
122
|
+
apmsg:discussionRoleScheme a skos:ConceptScheme ;
|
|
123
|
+
rdfs:label "discussionRole" ;
|
|
124
|
+
skos:hasTopConcept apmsg:discussionFacilitator, apmsg:discussionContributor .
|
|
125
|
+
|
|
126
|
+
apmsg:discussionFacilitator a skos:Concept ; skos:inScheme apmsg:discussionRoleScheme ;
|
|
127
|
+
skos:prefLabel "facilitator" ;
|
|
128
|
+
skos:definition "Manages the topic: invite/remove participants, archive. Topic creator and org custodians are facilitators." .
|
|
129
|
+
apmsg:discussionContributor a skos:Concept ; skos:inScheme apmsg:discussionRoleScheme ;
|
|
130
|
+
skos:prefLabel "contributor" ;
|
|
131
|
+
skos:definition "May post and reply in the topic. In OPEN topics every org member is a contributor (derived)." .
|
|
132
|
+
|
|
133
|
+
# ─── discussion invitation status ────────────────────────────────────────
|
|
134
|
+
|
|
135
|
+
apmsg:discussionInvitationStatusScheme a skos:ConceptScheme ;
|
|
136
|
+
rdfs:label "discussionInvitationStatus" ;
|
|
137
|
+
skos:hasTopConcept apmsg:invitationInvited, apmsg:invitationAccepted, apmsg:invitationDeclined, apmsg:invitationRevoked .
|
|
138
|
+
|
|
139
|
+
apmsg:invitationInvited a skos:Concept ; skos:inScheme apmsg:discussionInvitationStatusScheme ; skos:prefLabel "invited" .
|
|
140
|
+
apmsg:invitationAccepted a skos:Concept ; skos:inScheme apmsg:discussionInvitationStatusScheme ; skos:prefLabel "accepted" .
|
|
141
|
+
apmsg:invitationDeclined a skos:Concept ; skos:inScheme apmsg:discussionInvitationStatusScheme ; skos:prefLabel "declined" .
|
|
142
|
+
apmsg:invitationRevoked a skos:Concept ; skos:inScheme apmsg:discussionInvitationStatusScheme ; skos:prefLabel "revoked" .
|
|
143
|
+
|
|
144
|
+
# ─── contextRef kinds (platform-known; the wire field stays app-open) ────
|
|
145
|
+
# ContextRefV1.kind is deliberately app-defined on the wire (ADR-0021); this codelist names only
|
|
146
|
+
# the PLATFORM-defined kinds UIs chip on. spec 329: `routed-consultation` rides the turn-1 status
|
|
147
|
+
# post and the turn-2 synthesis; its ref id is `<orgSA>/<topicId>/<questionId>`.
|
|
148
|
+
|
|
149
|
+
apmsg:contextRefKindScheme a skos:ConceptScheme ;
|
|
150
|
+
rdfs:label "contextRefKind" ;
|
|
151
|
+
skos:hasTopConcept apmsg:routedConsultation, apmsg:endeavorRef .
|
|
152
|
+
|
|
153
|
+
apmsg:routedConsultation a skos:Concept ; skos:inScheme apmsg:contextRefKindScheme ;
|
|
154
|
+
skos:prefLabel "routed-consultation" ;
|
|
155
|
+
skos:definition "A board post produced by the spec-329 routing pipeline (turn-1 status post or turn-2 synthesized reply). Ref id = <orgSA>/<topicId>/<questionId>; UIs render it as a consultation chip with member attribution." .
|
|
156
|
+
|
|
157
|
+
apmsg:endeavorRef a skos:Concept ; skos:inScheme apmsg:contextRefKindScheme ;
|
|
158
|
+
skos:prefLabel "endeavor" ;
|
|
159
|
+
skos:definition "A message about a coordination Endeavor (spec 334 §9). Ref id = <managingPrincipalSA>/<endeavorId>; UIs render it as an endeavor chip deep-linking to the Endeavor detail. A pointer only — never authority, never a coordination record." .
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# C-box — SHACL shapes for a JUDGMENT record (spec 414 §3.4 principles; first binding: skill selection, 415 SEL-1).
|
|
2
|
+
#
|
|
3
|
+
# JU1 a judgment cites its criterion by digest (J2) and was made by a NAMED judge of a DECLARED kind (J3);
|
|
4
|
+
# JU2 its verdict is EARL-shaped and CONSISTENT: a selection class from the declared scheme whose EARL outcome agrees —
|
|
5
|
+
# `undetected` is `cantTell`, never a pass or a fail (J8); correct / acceptable / abstention pass; the rest fail;
|
|
6
|
+
# JU3 the assertion names its subject, its test and its result;
|
|
7
|
+
# JU4 no words (J7): what a verdict carries beyond IRIs is an evidence kind and canonical ids, never a sentence.
|
|
8
|
+
# Evidence, never authority (J1): no verifier reads these shapes or the record.
|
|
9
|
+
# ENGINE NOTE: one sh:sparql per NodeShape (shacl-engine compiles a shape's SPARQL constraints as one unit).
|
|
10
|
+
|
|
11
|
+
@prefix apeval: <https://agenticprimitives.dev/ns/evaluation#> .
|
|
12
|
+
@prefix earl: <http://www.w3.org/ns/earl#> .
|
|
13
|
+
@prefix prov: <http://www.w3.org/ns/prov#> .
|
|
14
|
+
@prefix sh: <http://www.w3.org/ns/shacl#> .
|
|
15
|
+
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
|
16
|
+
|
|
17
|
+
apeval:JudgmentShape a sh:NodeShape ;
|
|
18
|
+
rdfs:label "JU1 — a judgment cites its criterion by digest and names its judge and kind" ;
|
|
19
|
+
sh:targetClass apeval:Judgment ;
|
|
20
|
+
sh:property [ sh:path apeval:criterionDigest ; sh:minCount 1 ; sh:maxCount 1 ; sh:pattern "^sha256:[0-9a-f]{64}$" ;
|
|
21
|
+
sh:message "JU1: the judgment cites no criterion by sha256 digest — a verdict against an unstated expectation is not evidence (spec 414 §3.4 J2)." ] ;
|
|
22
|
+
sh:property [ sh:path prov:wasAssociatedWith ; sh:minCount 1 ; sh:maxCount 1 ; sh:class apeval:Judge ;
|
|
23
|
+
sh:message "JU1: the judgment names no judge (spec 414 §3.4 J3)." ] ;
|
|
24
|
+
sh:property [ sh:path prov:used ; sh:minCount 1 ;
|
|
25
|
+
sh:message "JU1: the judgment used nothing — what was judged? (spec 414 §3.4)." ] .
|
|
26
|
+
|
|
27
|
+
apeval:JudgeShape a sh:NodeShape ;
|
|
28
|
+
rdfs:label "JU1 — a judge declares its kind" ;
|
|
29
|
+
sh:targetClass apeval:Judge ;
|
|
30
|
+
sh:property [ sh:path apeval:judgeKind ; sh:minCount 1 ; sh:maxCount 1 ; sh:in ( "mechanical" "model" "human" ) ;
|
|
31
|
+
sh:message "JU1: the judge declares no kind (mechanical · model · human) — verdicts of different kinds are never pooled (J3, J4)." ] .
|
|
32
|
+
|
|
33
|
+
apeval:AssertionShape a sh:NodeShape ;
|
|
34
|
+
rdfs:label "JU3 — an assertion names its subject, test and result" ;
|
|
35
|
+
sh:targetClass earl:Assertion ;
|
|
36
|
+
sh:property [ sh:path earl:subject ; sh:minCount 1 ; sh:nodeKind sh:IRI ; sh:message "JU3: the assertion names no subject (spec 414 §3.4)." ] ;
|
|
37
|
+
sh:property [ sh:path earl:test ; sh:minCount 1 ; sh:nodeKind sh:IRI ; sh:message "JU3: the assertion names no test (the criterion it applied)." ] ;
|
|
38
|
+
sh:property [ sh:path earl:result ; sh:minCount 1 ; sh:maxCount 1 ; sh:class earl:TestResult ; sh:message "JU3: the assertion has no result." ] .
|
|
39
|
+
|
|
40
|
+
apeval:SelectionResultShape a sh:NodeShape ;
|
|
41
|
+
rdfs:label "JU2 — a selection verdict is a declared class whose EARL outcome agrees" ;
|
|
42
|
+
sh:targetClass earl:TestResult ;
|
|
43
|
+
sh:property [ sh:path earl:outcome ; sh:minCount 1 ; sh:maxCount 1 ; sh:in ( earl:passed earl:failed earl:cantTell earl:inapplicable ) ;
|
|
44
|
+
sh:message "JU2: the result has no EARL outcome (passed · failed · cantTell · inapplicable)." ] ;
|
|
45
|
+
sh:sparql [
|
|
46
|
+
sh:message "JU2: the selection class is not in the declared scheme (spec 415 §3a)." ;
|
|
47
|
+
sh:select """
|
|
48
|
+
SELECT $this ?c WHERE {
|
|
49
|
+
$this <https://agenticprimitives.dev/ns/evaluation#selectionOutcome> ?c .
|
|
50
|
+
FILTER NOT EXISTS { ?c <http://www.w3.org/2004/02/skos/core#inScheme> <https://agenticprimitives.dev/ns/evaluation#SelectionOutcomes> }
|
|
51
|
+
}
|
|
52
|
+
""" ;
|
|
53
|
+
] .
|
|
54
|
+
|
|
55
|
+
apeval:SelectionOutcomeConsistencyShape a sh:NodeShape ;
|
|
56
|
+
rdfs:label "JU2 — the EARL outcome agrees with the selection class (one sh:sparql per NodeShape — shacl-engine)" ;
|
|
57
|
+
sh:targetClass earl:TestResult ;
|
|
58
|
+
sh:sparql [
|
|
59
|
+
sh:message "JU2: the EARL outcome contradicts the selection class — undetected is cantTell (J8); correct, acceptable and abstention pass; misses and spurious selections fail." ;
|
|
60
|
+
sh:select """
|
|
61
|
+
SELECT $this ?c ?o WHERE {
|
|
62
|
+
$this <https://agenticprimitives.dev/ns/evaluation#selectionOutcome> ?c ; <http://www.w3.org/ns/earl#outcome> ?o .
|
|
63
|
+
BIND(STRAFTER(STR(?c), "#so-") AS ?k)
|
|
64
|
+
BIND(IF(?k = "undetected", <http://www.w3.org/ns/earl#cantTell>, IF(?k IN ("tp", "tpAlt", "tn"), <http://www.w3.org/ns/earl#passed>, <http://www.w3.org/ns/earl#failed>)) AS ?want)
|
|
65
|
+
FILTER(?o != ?want)
|
|
66
|
+
}
|
|
67
|
+
""" ;
|
|
68
|
+
] .
|
|
69
|
+
|
|
70
|
+
apeval:NoWordsInVerdictsShape a sh:NodeShape ;
|
|
71
|
+
rdfs:label "JU4 — a verdict carries ids, never a sentence" ;
|
|
72
|
+
sh:targetClass earl:TestResult ;
|
|
73
|
+
sh:property [ sh:path apeval:evidenceKind ; sh:maxCount 1 ; sh:in ( "stamped" "inferred" ) ; sh:message "JU4: the evidence kind is neither stamped nor inferred — never pooled (spec 415 §3a)." ] ;
|
|
74
|
+
sh:property [ sh:path apeval:chargedTo ; sh:pattern "^[^\\s]{1,200}$" ; sh:message "JU4: a charged skill is not a canonical id — a verdict names skills, it does not describe them (J7)." ] ;
|
|
75
|
+
sh:sparql [
|
|
76
|
+
sh:message "JU4: the verdict carries a literal other than its evidence kind and charged ids (J7)." ;
|
|
77
|
+
sh:select """
|
|
78
|
+
SELECT $this ?p ?v WHERE {
|
|
79
|
+
$this ?p ?v . FILTER(isLiteral(?v))
|
|
80
|
+
FILTER(?p NOT IN (<https://agenticprimitives.dev/ns/evaluation#evidenceKind>, <https://agenticprimitives.dev/ns/evaluation#chargedTo>))
|
|
81
|
+
}
|
|
82
|
+
""" ;
|
|
83
|
+
] .
|