@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,777 @@
|
|
|
1
|
+
// WHAT A VAULT RECORD KEY MEANS — spec 356 W1.
|
|
2
|
+
//
|
|
3
|
+
// A person's Home lists their organization's vault faithfully and uselessly:
|
|
4
|
+
//
|
|
5
|
+
// coordination.endeavor:end_05b57d9e-… · updated 2026-09-04 03:38:02 show
|
|
6
|
+
// org.invite:agent:0x8c5cddca… · updated 2026-09-04 00:16:11 show
|
|
7
|
+
//
|
|
8
|
+
// Every one of those keys IS something the T-box already has a class for — an Endeavor, an invitation, a
|
|
9
|
+
// roster. Nothing said which was which, so the only reader that could interpret a vault was a person who
|
|
10
|
+
// already knew the codebase, and every new question about vault data meant a new hand-written tool with
|
|
11
|
+
// its own gate (spec 356 §0).
|
|
12
|
+
//
|
|
13
|
+
// This is the missing sentence, and it is DATA bound BY IRI (spec 355 §1) rather than a switch statement:
|
|
14
|
+
// the class must exist in the T-box or `check:ontology-bindings` fails the build. The code may not invent
|
|
15
|
+
// domain vocabulary.
|
|
16
|
+
//
|
|
17
|
+
// WHAT THIS IS NOT: it is not permission. Knowing that `directory.data` holds a roster says nothing about
|
|
18
|
+
// who may read it — the delegation decides that, per subject, per record (spec 277, ADR-0041). A binding
|
|
19
|
+
// narrows what a question CAN MEAN; it never widens what an asker may see.
|
|
20
|
+
// Namespaces inlined rather than imported from ./index — index re-exports this file, so reading NS back
|
|
21
|
+
// would hit it in TDZ (the same cycle `party-roles.ts` and `grounded-vocabulary.ts` document).
|
|
22
|
+
import { CONTACT_PROFILE_PROPERTIES } from './contact-fields.js';
|
|
23
|
+
const APORG = 'https://agenticprimitives.dev/ns/org#';
|
|
24
|
+
const APCOORD = 'https://agenticprimitives.dev/ns/coordination#';
|
|
25
|
+
const APFUL = 'https://agenticprimitives.dev/ns/fulfillment#';
|
|
26
|
+
const APMSG = 'https://agenticprimitives.dev/ns/messaging#';
|
|
27
|
+
const APAR = 'https://agenticprimitives.dev/ns/agent-resolution#';
|
|
28
|
+
const APDEL = 'https://agenticprimitives.dev/ns/delegation#';
|
|
29
|
+
const APGOV = 'https://agenticprimitives.dev/ns/governance#';
|
|
30
|
+
const APS = 'https://agenticprimitives.dev/ns/skill#';
|
|
31
|
+
const APROF = 'https://agenticprimitives.dev/ns/profile#';
|
|
32
|
+
const AP = 'https://agenticprimitives.dev/ns/core#';
|
|
33
|
+
const APCTX = 'https://agenticprimitives.dev/ns/context#';
|
|
34
|
+
const APIX = 'https://agenticprimitives.dev/ns/interaction#';
|
|
35
|
+
const APHH = 'https://agenticprimitives.dev/ns/household#';
|
|
36
|
+
const APCON = 'https://agenticprimitives.dev/ns/contact#';
|
|
37
|
+
const APCR = 'https://agenticprimitives.dev/ns/credential#';
|
|
38
|
+
const APEXEC = 'https://agenticprimitives.dev/ns/execution#';
|
|
39
|
+
const APEST = 'https://agenticprimitives.dev/ns/estate#';
|
|
40
|
+
const APPC = 'https://agenticprimitives.dev/ns/privacy-credential#';
|
|
41
|
+
const APINF = 'https://agenticprimitives.dev/ns/inference#';
|
|
42
|
+
const APATT = 'https://agenticprimitives.dev/ns/attestation#';
|
|
43
|
+
const APACTOR = 'https://agenticprimitives.dev/ns/actor#';
|
|
44
|
+
const APVR = 'https://agenticprimitives.dev/ns/verification-receipt#';
|
|
45
|
+
const PROV = 'http://www.w3.org/ns/prov#';
|
|
46
|
+
const PPLAN = 'http://purl.org/net/p-plan#';
|
|
47
|
+
const EPPLAN = 'https://w3id.org/ep-plan#';
|
|
48
|
+
const APEVAL = 'https://agenticprimitives.dev/ns/evaluation#';
|
|
49
|
+
const DQV = 'http://www.w3.org/ns/dqv#';
|
|
50
|
+
/**
|
|
51
|
+
* The record kinds this substrate stores, each bound to what it IS.
|
|
52
|
+
*
|
|
53
|
+
* Deliberately not exhaustive over every key a vault may hold: an unbound key is UNCLASSIFIED, which is an
|
|
54
|
+
* honest state and the one that keeps this table from becoming a place to invent meanings. A question over
|
|
55
|
+
* an unbound kind is refused by name (spec 356 §2.3), never answered from a guess.
|
|
56
|
+
*/
|
|
57
|
+
export const VAULT_RECORD_BINDINGS = [
|
|
58
|
+
// ── Coordination (spec 332/334) ───────────────────────────────────────────────────────────────
|
|
59
|
+
// The events stream is matched BEFORE the endeavor itself: `coordination.endeavor:events:<id>` also
|
|
60
|
+
// starts with `coordination.endeavor:`, and the first match wins.
|
|
61
|
+
// An endeavor's event log: a projection OVER an Endeavor, not a class of its own. The T-box declares no
|
|
62
|
+
// EndeavorEvent, and inventing one so a binding compiles is the exact drift this gate exists to stop —
|
|
63
|
+
// it was here until the check started reading record bindings. You ask about endeavors; the log is how
|
|
64
|
+
// one of them got where it is.
|
|
65
|
+
{ match: { prefix: 'coordination.endeavor:events:' }, class: `${APCOORD}Endeavor`, label: 'endeavor history', plural: 'endeavor history', ownedBy: 'either', role: 'index' },
|
|
66
|
+
{ match: { prefix: 'coordination.endeavor:' }, class: `${APCOORD}Endeavor`, label: 'endeavor', plural: 'endeavors', ownedBy: 'either' },
|
|
67
|
+
{ match: { exact: 'coordination.requests' }, class: `${APCOORD}EndeavorRequest`, label: 'request for work', plural: 'requests for work', ownedBy: 'either' },
|
|
68
|
+
// ── The parties' own evidence of a transfer (spec 360) ────────────────────────────────────────
|
|
69
|
+
// A payment's StepReceipt is AUTHORITY evidence and lives in the audit sink. This is the different
|
|
70
|
+
// artifact the two PARTIES hold: what Alice can point at to say she paid, and what tells Bob he was
|
|
71
|
+
// paid, to which treasury, in what amount. Keyed by the transaction, because that is the one identifier
|
|
72
|
+
// both sides can check against the chain rather than take on trust.
|
|
73
|
+
{ match: { prefix: 'payment.receipt:' }, class: `${APIX}PaymentReceipt`, label: 'payment receipt', plural: 'payment receipts', ownedBy: 'either',
|
|
74
|
+
properties: {
|
|
75
|
+
payer: `${APIX}receiptPayer`,
|
|
76
|
+
payee: `${APIX}receiptPayee`,
|
|
77
|
+
asset: `${APIX}receiptAsset`,
|
|
78
|
+
amount: `${APIX}receiptAmount`,
|
|
79
|
+
txHash: `${APIX}receiptTx`,
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
// ── Organization membership (spec 324, ADR-0025) ──────────────────────────────────────────────
|
|
83
|
+
// The ROSTER an organization keeps of its own members. This is the record `organization.membership.list`
|
|
84
|
+
// reads today through its own hand-written invoker — W4 retires that in favour of this binding.
|
|
85
|
+
{ match: { exact: 'directory.data' }, class: `${APORG}DirectoryListing`, label: 'member listing', plural: 'member listings', ownedBy: 'organization' },
|
|
86
|
+
{ match: { prefix: 'org.invite:agent:' }, class: `${APORG}MembershipInvitation`, label: 'membership invitation', plural: 'membership invitations', ownedBy: 'organization' },
|
|
87
|
+
// Spec 401 — a person's contact: their own record of an agent they let in, with the grant they signed (membership on a person).
|
|
88
|
+
{ match: { prefix: 'contact:' }, class: `${APORG}Contact`, label: 'contact', plural: 'contacts', ownedBy: 'person' },
|
|
89
|
+
{ match: { exact: 'org.applications' }, class: `${APORG}MembershipApplication`, label: 'membership application', plural: 'membership applications', ownedBy: 'organization' },
|
|
90
|
+
// THE MEMBERSHIP ITSELF — spec 325's shape, in the organization's own vault. Distinct from the
|
|
91
|
+
// invitation, which the T-box files under "Enrollment instruments (NOT membership)": an invitation is
|
|
92
|
+
// how somebody came to be admitted, and satisfying one creates nothing. The membership is the record
|
|
93
|
+
// that they ARE admitted, carrying the role assignment and the delegation that materialises it.
|
|
94
|
+
//
|
|
95
|
+
// Keyed `org.membership:member:<address>` — inside the `vault:org.membership:*` scope the DO grant
|
|
96
|
+
// already carries, and clear of `org.membership:local-names`, which is a name map and not a member.
|
|
97
|
+
{
|
|
98
|
+
match: { prefix: 'org.membership:member:' }, class: `${APORG}OrganizationMembership`,
|
|
99
|
+
label: 'member', plural: 'members', ownedBy: 'organization',
|
|
100
|
+
// Spec 325's shape, field for field — this is what "readable by the ontology" looks like in practice.
|
|
101
|
+
properties: {
|
|
102
|
+
memberAgent: `${APORG}memberAgent`,
|
|
103
|
+
organizationAgent: `${APORG}organizationAgent`,
|
|
104
|
+
roleAssignment: `${APORG}hasRoleAssignment`,
|
|
105
|
+
'roleAssignment.assignedRole': `${APORG}assignedRole`,
|
|
106
|
+
'roleAssignment.materializedByDelegation': `${APORG}materializedByDelegation`,
|
|
107
|
+
// Spec 427 — the role a membership carries, as the organization offered it. Words and references:
|
|
108
|
+
// no gate reads any of them.
|
|
109
|
+
'roleAssignment.roleDefinitionId': `${APORG}roleDefinitionId`,
|
|
110
|
+
'roleAssignment.roleName': `${APORG}roleName`,
|
|
111
|
+
'roleAssignment.roleDescription': `${APORG}roleDescription`,
|
|
112
|
+
'roleAssignment.scope': `${APORG}roleScope`,
|
|
113
|
+
'roleAssignment.accessRole': `${APORG}accessRole`,
|
|
114
|
+
'roleAssignment.skillPackRefs': `${APORG}offeredSkillPack`,
|
|
115
|
+
'roleAssignment.assignedBy': `${APORG}assignedBy`,
|
|
116
|
+
'roleAssignment.assignedAt': `${APORG}assignedAt`,
|
|
117
|
+
'roleAssignment.roleSetAt': `${APORG}roleSetAt`,
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
// THE PERSON'S OWN CONTACT RECORD (spec 371 §2.2) — the private one of the three records that answer to
|
|
121
|
+
// "profile". Its fields are the ONE list in `contact-fields.ts`; the map here is derived from it, so an
|
|
122
|
+
// Ask that can change a name can change a street address, and the record's write allow-list agrees.
|
|
123
|
+
{
|
|
124
|
+
match: { exact: 'impact-profile' }, class: `${APCON}ContactProfile`,
|
|
125
|
+
label: 'contact profile', plural: 'contact profiles', ownedBy: 'person',
|
|
126
|
+
properties: { ...CONTACT_PROFILE_PROPERTIES, 'contact.location.precision': `${APCON}locationPrecision` },
|
|
127
|
+
},
|
|
128
|
+
// A PERSON's own record of who they are connected to — private, a vault credential and never an
|
|
129
|
+
// on-chain edge (ADR-0025). This is what answers "what organizations am I associated with".
|
|
130
|
+
{
|
|
131
|
+
// WHO THEY LIVE WITH, as they record it (spec 363 W4). PRIVATE TIER by construction: it is not on
|
|
132
|
+
// chain, not derivable from chain state, and may never reach the discovery KB (ADR-0040). One record
|
|
133
|
+
// per person holding their own household — not a shared roster, because two people's records can
|
|
134
|
+
// disagree and the honest model says whose you are reading.
|
|
135
|
+
match: { exact: 'household.data' }, class: `${APHH}Household`,
|
|
136
|
+
label: 'household', plural: 'household', ownedBy: 'person',
|
|
137
|
+
properties: {
|
|
138
|
+
'members[].agent': `${APHH}householdMember`,
|
|
139
|
+
'members[].role': `${APHH}householdRole`,
|
|
140
|
+
'members[].kin': `${APHH}kinRelation`,
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
{ match: { exact: 'relationships.data' }, class: `${APORG}OrganizationMembership`, label: 'organization you belong to', plural: 'organizations you belong to', ownedBy: 'person',
|
|
144
|
+
// The map is KEYED by the organization — the thing a reader most often gets wrong here.
|
|
145
|
+
properties: {
|
|
146
|
+
'orgs{}': `${APORG}organizationAgent`,
|
|
147
|
+
'orgs{}.orgName': `${APORG}localLabel`,
|
|
148
|
+
'orgs{}.delegations[]': `${APORG}materializedByDelegation`,
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
// ── Content (spec 347 / the field artifacts) ──────────────────────────────────────────────────
|
|
152
|
+
{ match: { prefix: 'content.artifact.' }, class: `${APFUL}Artifact`, label: 'artifact', plural: 'artifacts', ownedBy: 'either',
|
|
153
|
+
properties: {
|
|
154
|
+
'kind': `${APFUL}artifactKind`,
|
|
155
|
+
'commitment': `${APFUL}bodyHash`,
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
// ── Conversation (spec 313/316) ───────────────────────────────────────────────────────────────
|
|
159
|
+
// A message BODY is the content of one message; a topic is the conversation it sits in.
|
|
160
|
+
{ match: { prefix: 'message.body:' }, class: `${APFUL}Message`, label: 'message', plural: 'messages', ownedBy: 'either' },
|
|
161
|
+
{ match: { prefix: 'conversation.topic:' }, class: `${APMSG}DiscussionTopic`, label: 'discussion', plural: 'discussions', ownedBy: 'either' },
|
|
162
|
+
// ── Relationship credentials (spec 410 §8) ───────────────────────────────────────────────────
|
|
163
|
+
// The countersigned form of a relationship, one copy in each party's vault; the revocation likewise.
|
|
164
|
+
{ match: { prefix: 'relationships.credential:' }, class: `${AP}RelationshipCredential`, label: 'relationship credential', plural: 'relationship credentials', ownedBy: 'either',
|
|
165
|
+
properties: { kind: `${AP}relationshipKind` },
|
|
166
|
+
},
|
|
167
|
+
{ match: { prefix: 'relationships.revocation:' }, class: `${AP}RelationshipCredential`, label: 'relationship revocation', plural: 'relationship revocations', ownedBy: 'either',
|
|
168
|
+
properties: { credential: `${AP}revokes` },
|
|
169
|
+
},
|
|
170
|
+
// ── Governance of the common model (spec 410 §10) ────────────────────────────────────────────
|
|
171
|
+
{ match: { prefix: 'ontology.meaning:' }, class: `${APGOV}LocalMeaning`, label: 'local meaning of a common term', plural: 'local meanings', ownedBy: 'organization',
|
|
172
|
+
properties: { term: `${APGOV}ofTerm`, organization: `${APGOV}heldBy`, relation: `${APGOV}mappingRelation` },
|
|
173
|
+
},
|
|
174
|
+
{ match: { exact: 'ontology.adopted' }, class: `${APGOV}AdoptedVersion`, label: 'adopted ontology version', plural: 'adopted ontology versions', ownedBy: 'either',
|
|
175
|
+
properties: { manifestDigest: `${APGOV}manifestDigest`, adoptedAt: `${APGOV}adoptedAt`, proposalRef: `${APGOV}proposalRef` },
|
|
176
|
+
},
|
|
177
|
+
{ match: { prefix: 'ontology.steward:' }, class: `${APGOV}Steward`, label: 'steward of a term', plural: 'stewards', ownedBy: 'either',
|
|
178
|
+
properties: { subject: `${APGOV}stewards`, stewardAgent: `${APGOV}stewardAgent`, charterRef: `${APGOV}charterRef` },
|
|
179
|
+
},
|
|
180
|
+
// ── Delegation lineage (spec 410 §1.2) ───────────────────────────────────────────────────────
|
|
181
|
+
// A key-signed wire re-issued for a credential rotation, and which wire it replaces. The delegator's vault holds
|
|
182
|
+
// it; the delegate fetches the head of the lineage from the delegator's agent. Never a grant of anything new.
|
|
183
|
+
{ match: { prefix: 'delegation.lineage:' }, class: `${APDEL}Delegation`, label: 'delegation re-issued for a rotation', plural: 'delegations re-issued for a rotation', ownedBy: 'either',
|
|
184
|
+
properties: { supersedes: `${APDEL}supersedes` },
|
|
185
|
+
},
|
|
186
|
+
// ── Resolution (spec 338) ─────────────────────────────────────────────────────────────────────
|
|
187
|
+
{ match: { exact: 'resolution.grants' }, class: `${APAR}PrivateResolutionGrant`, label: 'way to reach someone', plural: 'ways to reach people', ownedBy: 'either',
|
|
188
|
+
// The held record names WHOSE agent it opens; the address itself comes from the resolver, per use.
|
|
189
|
+
properties: {
|
|
190
|
+
'grants[].owner': `${APAR}permitsDiscoveryOf`,
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
{ match: { exact: 'resolution.requests' }, class: `${APAR}AgentConnectionInvitation`, label: 'request for a way to reach an agent', plural: 'requests for a way to reach an agent', ownedBy: 'either' },
|
|
194
|
+
// ── What an agent IS and CAN DO ───────────────────────────────────────────────────────────────
|
|
195
|
+
{ match: { exact: 'capabilities.data' }, class: `${APS}CapabilityCatalog`, label: 'capability', plural: 'capabilities', ownedBy: 'either',
|
|
196
|
+
// The record is the catalogue; each ENTRY is a claim, so its fields map to SkillClaim's properties.
|
|
197
|
+
properties: {
|
|
198
|
+
'[].relation': `${APS}claimRelation`,
|
|
199
|
+
'[].label': `${APS}semanticType`,
|
|
200
|
+
},
|
|
201
|
+
},
|
|
202
|
+
{ match: { exact: 'skills.data' }, class: `${APS}SkillClaim`, label: 'skill claim', plural: 'skill claims', ownedBy: 'either',
|
|
203
|
+
properties: {
|
|
204
|
+
'[].definitionId': `${APS}definitionId`,
|
|
205
|
+
'[].subject': `${APS}claimSubject`,
|
|
206
|
+
'[].issuer': `${APS}claimIssuer`,
|
|
207
|
+
'[].relation': `${APS}claimRelation`,
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
// ── The person's Security section (spec 422 §3.1 / §3.3 / §9.3) ──────────────────────────────
|
|
211
|
+
// The chain is the SET of credentials; this record is their LABELS (device name, created, kind) keyed by
|
|
212
|
+
// digest or address. A label whose chain entry is gone renders as retired; a chain entry with no label
|
|
213
|
+
// renders as unlabelled — the record never decides what signs for her.
|
|
214
|
+
{ match: { exact: 'security.credentials' }, class: `${APCR}CredentialFacet`, label: 'sign-in credential', plural: 'sign-in credentials', ownedBy: 'person', role: 'index',
|
|
215
|
+
properties: { '[].kind': `${APCR}credentialKind` } },
|
|
216
|
+
// The emails and phones that open this home and are told when something changes. Never a signer.
|
|
217
|
+
{ match: { exact: 'security.channels' }, class: `${APCR}ChannelFacet`, label: 'contact channel', plural: 'contact channels', ownedBy: 'person', role: 'index' },
|
|
218
|
+
{ match: { exact: 'impact-profile' }, class: `${APROF}AgentProfile`, label: 'profile', plural: 'profile', ownedBy: 'either',
|
|
219
|
+
// Observed records carry only `contact`, which the T-box has no property for — see the coverage ledger.
|
|
220
|
+
properties: {
|
|
221
|
+
'displayName': `${APROF}displayName`,
|
|
222
|
+
'description': `${APROF}description`,
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
// An index over the artifacts, not a thing beside them.
|
|
226
|
+
{ match: { exact: 'content.catalog' }, class: `${APFUL}Artifact`, label: 'content index', plural: 'content index', ownedBy: 'either', role: 'index' },
|
|
227
|
+
// ── The card studio (spec 347) ────────────────────────────────────────────────────────────────
|
|
228
|
+
{ match: { prefix: 'agent-cards:' }, class: `${AP}A2AAgentCard`, label: 'agent card', plural: 'agent cards', ownedBy: 'either' },
|
|
229
|
+
// ── The playbook an agent runs under (spec 354) ───────────────────────────────────────────────
|
|
230
|
+
{
|
|
231
|
+
match: { exact: 'archetype.assignment' }, class: `${APS}ArchetypeAssignment`,
|
|
232
|
+
label: 'playbook', plural: 'playbook', ownedBy: 'either',
|
|
233
|
+
properties: {
|
|
234
|
+
archetypeId: `${APS}assignedArchetype`,
|
|
235
|
+
definitionDigest: `${APS}definitionDigest`,
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
// ── Run provenance (spec 381) — the durable half of a run's record, in the ACTING agent's vault ──
|
|
239
|
+
// One activity per step: what ran, under which authority, what receipt it left (by digest). Never the
|
|
240
|
+
// arguments, results or words — those are the task object's rebuildable copy (ADR-0055).
|
|
241
|
+
// Spec 389 — the record IS the graph: a JSON-LD document whose top-level node is the run's
|
|
242
|
+
// ep-plan:ExecutionTraceBundle and whose `graph` holds the run, its steps, what they used and what they
|
|
243
|
+
// generated. The field names are the context's terms (`run-provenance.jsonld`), so every field below is
|
|
244
|
+
// the same IRI the context maps it to — bound twice on purpose, checked once by the build.
|
|
245
|
+
{
|
|
246
|
+
match: { prefix: 'run.provenance:' }, class: `${EPPLAN}ExecutionTraceBundle`,
|
|
247
|
+
label: 'run provenance', plural: 'run provenances', ownedBy: 'either',
|
|
248
|
+
properties: {
|
|
249
|
+
wasAttributedTo: `${PROV}wasAttributedTo`,
|
|
250
|
+
wasInformedBy: `${PROV}wasInformedBy`,
|
|
251
|
+
hasTraceElement: `${EPPLAN}hasTraceElement`,
|
|
252
|
+
'graph[].startedAtTime': `${PROV}startedAtTime`,
|
|
253
|
+
'graph[].endedAtTime': `${PROV}endedAtTime`,
|
|
254
|
+
'graph[].endedAt': `${APEXEC}endedAt`,
|
|
255
|
+
'graph[].wasAssociatedWith': `${PROV}wasAssociatedWith`,
|
|
256
|
+
'graph[].actedOnBehalfOf': `${PROV}actedOnBehalfOf`,
|
|
257
|
+
'graph[].used': `${PROV}used`,
|
|
258
|
+
'graph[].usedDelegation': `${APVR}usedDelegation`,
|
|
259
|
+
'graph[].generated': `${PROV}generated`,
|
|
260
|
+
'graph[].wasGeneratedBy': `${PROV}wasGeneratedBy`,
|
|
261
|
+
'graph[].wasInformedBy': `${PROV}wasInformedBy`,
|
|
262
|
+
'graph[].wasAttributedTo': `${PROV}wasAttributedTo`,
|
|
263
|
+
'graph[].correspondsToStep': `${PPLAN}correspondsToStep`,
|
|
264
|
+
'graph[].isStepOfPlan': `${PPLAN}isStepOfPlan`,
|
|
265
|
+
'graph[].isPrecededBy': `${PPLAN}isPrecededBy`,
|
|
266
|
+
'graph[].hasStep': `${APEXEC}hasStep`,
|
|
267
|
+
'graph[].runRef': `${APEXEC}runRef`,
|
|
268
|
+
'graph[].intentDigest': `${APEXEC}intentDigest`,
|
|
269
|
+
'graph[].completionState': `${APEXEC}completionState`,
|
|
270
|
+
'graph[].receiptDigest': `${APEXEC}receiptDigest`,
|
|
271
|
+
'graph[].usedPlanContentHash': `${APEXEC}usedPlanContentHash`,
|
|
272
|
+
'graph[].realizesCapability': `${APEXEC}realizesCapability`,
|
|
273
|
+
'graph[].authorityDecision': `${APEXEC}authorityDecision`,
|
|
274
|
+
'graph[].afterApproval': `${APEXEC}afterApproval`,
|
|
275
|
+
'graph[].chainDigest': `${APEXEC}chainDigest`,
|
|
276
|
+
'graph[].accountabilityRoot': `${APEXEC}accountabilityRoot`,
|
|
277
|
+
'graph[].actorContext': `${APEXEC}actorContext`,
|
|
278
|
+
'graph[].delegatedToAgent': `${APEXEC}delegatedToAgent`,
|
|
279
|
+
'graph[].errorClass': `${APEXEC}errorClass`,
|
|
280
|
+
'graph[].traceId': `${APEXEC}traceId`,
|
|
281
|
+
'graph[].spanId': `${APEXEC}spanId`,
|
|
282
|
+
// Spec 410 §2 — what the adapter saw of the effect (which end committed it, and what it can show).
|
|
283
|
+
'graph[].observedOutcome': `${APEXEC}observedOutcome`,
|
|
284
|
+
'graph[].providerRef': `${APEXEC}providerRef`,
|
|
285
|
+
'graph[].observedAt': `${APEXEC}observedAt`,
|
|
286
|
+
// Spec 410 §4.4 — the estate the run was performed in, when the vault it lives in no longer implies it.
|
|
287
|
+
'graph[].estate': `${APEXEC}estate`,
|
|
288
|
+
// Spec 414 A1 — the trace from the door: how the run arrived, the model calls, the variant, the starting state,
|
|
289
|
+
// the governing skill contract and the harness-capability engagements (ids and numbers only).
|
|
290
|
+
'graph[].arrivedBy': `${APEXEC}arrivedBy`,
|
|
291
|
+
'graph[].doorKind': `${APEXEC}doorKind`,
|
|
292
|
+
'graph[].a2aMessageId': `${APEXEC}a2aMessageId`,
|
|
293
|
+
'graph[].a2aContextId': `${APEXEC}a2aContextId`,
|
|
294
|
+
'graph[].a2aTaskId': `${APEXEC}a2aTaskId`,
|
|
295
|
+
'graph[].hasModelInvocation': `${APEXEC}hasModelInvocation`,
|
|
296
|
+
'graph[].invocationRole': `${APEXEC}invocationRole`,
|
|
297
|
+
'graph[].modelId': `${APEXEC}modelId`,
|
|
298
|
+
'graph[].modelProvider': `${APEXEC}modelProvider`,
|
|
299
|
+
'graph[].promptTemplateDigest': `${APEXEC}promptTemplateDigest`,
|
|
300
|
+
'graph[].tokensIn': `${APEXEC}tokensIn`,
|
|
301
|
+
'graph[].tokensOut': `${APEXEC}tokensOut`,
|
|
302
|
+
'graph[].routeReason': `${APEXEC}routeReason`,
|
|
303
|
+
'graph[].underVariant': `${APEXEC}underVariant`,
|
|
304
|
+
'graph[].variantDigest': `${APEXEC}variantDigest`,
|
|
305
|
+
'graph[].plannerKind': `${APEXEC}plannerKind`,
|
|
306
|
+
'graph[].routePolicy': `${APEXEC}routePolicy`,
|
|
307
|
+
'graph[].harnessBuild': `${APEXEC}harnessBuild`,
|
|
308
|
+
'graph[].capabilityToggle': `${APEXEC}capabilityToggle`,
|
|
309
|
+
'graph[].fromStartingState': `${APEXEC}fromStartingState`,
|
|
310
|
+
'graph[].startingStateDigest': `${APEXEC}startingStateDigest`,
|
|
311
|
+
'graph[].governedBySkill': `${APEXEC}governedBySkill`,
|
|
312
|
+
'graph[].hasEngagement': `${APEXEC}hasEngagement`,
|
|
313
|
+
'graph[].hasEngagement[].ofCapability': `${APEXEC}ofCapability`,
|
|
314
|
+
'graph[].hasEngagement[].engagementEffect': `${APEXEC}engagementEffect`,
|
|
315
|
+
'graph[].hasEngagement[].capabilityVersion': `${APEXEC}capabilityVersion`,
|
|
316
|
+
'graph[].hasEngagement[].offeredCandidate': `${APEXEC}offeredCandidate`,
|
|
317
|
+
'graph[].hasEngagement[].chose': `${APEXEC}chose`,
|
|
318
|
+
'graph[].hasEngagement[].rejectedNeighbour': `${APEXEC}rejectedNeighbour`,
|
|
319
|
+
'graph[].effectProduces': `${APEXEC}effectProduces`,
|
|
320
|
+
'graph[].effectSucceeded': `${APEXEC}effectSucceeded`,
|
|
321
|
+
'graph[].decisionPoint': `${APEXEC}decisionPoint`,
|
|
322
|
+
'graph[].decisionRule': `${APEXEC}decisionRule`,
|
|
323
|
+
'graph[].artifactBytes': `${APEXEC}artifactBytes`,
|
|
324
|
+
'graph[].artifactDigest': `${APEXEC}artifactDigest`,
|
|
325
|
+
'graph[].actingAgent': `${APACTOR}actingAgent`,
|
|
326
|
+
'graph[].originatingAgent': `${APACTOR}originatingAgent`,
|
|
327
|
+
'graph[].rootPrincipal': `${APACTOR}rootPrincipal`,
|
|
328
|
+
'graph[].qualifiedAssociation[].hadPlan': `${PROV}hadPlan`,
|
|
329
|
+
'graph[].qualifiedAssociation[].hadRole': `${PROV}hadRole`,
|
|
330
|
+
'graph[].qualifiedAssociation[].agent': `${PROV}agent`,
|
|
331
|
+
},
|
|
332
|
+
},
|
|
333
|
+
// ── Run anchor (spec 410 §4.4) — WHERE the run's bundle is anchored, beside the bundle, in the same vault ──
|
|
334
|
+
// A bundle cannot carry its own digest's anchor; the citation is this second record. For an act performed in
|
|
335
|
+
// another estate it is the record that says which chain to ask (`anchorRegistry` is chain-qualified) and which
|
|
336
|
+
// estate it was (`estate`). A claim about where to look — the holder recomputes the digest and reads the registry.
|
|
337
|
+
{
|
|
338
|
+
match: { prefix: 'run.anchor:' }, class: `${APEXEC}ReceiptAnchor`,
|
|
339
|
+
label: 'run anchor', plural: 'run anchors', ownedBy: 'either',
|
|
340
|
+
properties: {
|
|
341
|
+
digest: `${APEXEC}anchorDigest`,
|
|
342
|
+
registry: `${APEXEC}anchorRegistry`,
|
|
343
|
+
anchoredBy: `${APEXEC}anchoredByAgent`,
|
|
344
|
+
txHash: `${APEXEC}anchorTransaction`,
|
|
345
|
+
estate: `${APEXEC}estate`,
|
|
346
|
+
},
|
|
347
|
+
},
|
|
348
|
+
// ── Run measurements (spec 414 A2) — numbers about a run, from its trace alone, beside its provenance ──
|
|
349
|
+
// One apeval:RunMeasures record per run: a measuring activity that used the run's bundle, and one DQV measurement per
|
|
350
|
+
// metric (and per step where the number is a step's). Descriptive, never judged; no words (shape M3).
|
|
351
|
+
{
|
|
352
|
+
match: { prefix: 'run.measures:' }, class: `${APEVAL}RunMeasures`,
|
|
353
|
+
label: 'run measurements', plural: 'run measurements', ownedBy: 'either',
|
|
354
|
+
properties: {
|
|
355
|
+
wasDerivedFrom: `${PROV}wasDerivedFrom`,
|
|
356
|
+
wasAttributedTo: `${PROV}wasAttributedTo`,
|
|
357
|
+
hasMeasurement: `${APEVAL}hasMeasurement`,
|
|
358
|
+
'graph[].used': `${PROV}used`,
|
|
359
|
+
'graph[].generated': `${PROV}generated`,
|
|
360
|
+
'graph[].wasAssociatedWith': `${PROV}wasAssociatedWith`,
|
|
361
|
+
'graph[].computedOn': `${DQV}computedOn`,
|
|
362
|
+
'graph[].isMeasurementOf': `${DQV}isMeasurementOf`,
|
|
363
|
+
'graph[].value': `${DQV}value`,
|
|
364
|
+
'graph[].unit': `${APEVAL}unit`,
|
|
365
|
+
'graph[].wasGeneratedBy': `${PROV}wasGeneratedBy`,
|
|
366
|
+
},
|
|
367
|
+
},
|
|
368
|
+
// ── An assessment of a run (spec 438 §5) — a SEPARATE signed assertion, never an edit to the run ──
|
|
369
|
+
// 414 §3.4 fixed the shape of a judgment and left the record to "a later spec"; 438 is it. The run record is
|
|
370
|
+
// immutable evidence of what happened; this is somebody's judgment OF it, bound to the subject by digest and to
|
|
371
|
+
// a criteria revision that pre-dates the subject (J2). A correction is a new assessment with `supersedes` — the
|
|
372
|
+
// earlier one stays readable, because a record of opinions that can be rewritten is not a record. J1 still holds:
|
|
373
|
+
// no verifier, admission stage or mandate reads one. Signed by the evaluator's SESSION key under its own wire
|
|
374
|
+
// (the service-agent-signing rule), or by a person's SA at her Home.
|
|
375
|
+
{
|
|
376
|
+
match: { prefix: 'run.assessment:' }, class: `${APEVAL}Assessment`,
|
|
377
|
+
label: 'run assessment', plural: 'run assessments', ownedBy: 'either',
|
|
378
|
+
properties: {
|
|
379
|
+
subject: `${PROV}used`,
|
|
380
|
+
recordDigest: `${APEXEC}anchorDigest`,
|
|
381
|
+
criteriaRevision: `${APEVAL}criteriaRevision`,
|
|
382
|
+
criterionDigest: `${APEVAL}criterionDigest`,
|
|
383
|
+
evaluator: `${PROV}wasAssociatedWith`,
|
|
384
|
+
evaluatorKind: `${APEVAL}judgeKind`,
|
|
385
|
+
evaluatorImplementation: `${APEVAL}evaluatorImplementation`,
|
|
386
|
+
supersedes: `${APEVAL}supersedes`,
|
|
387
|
+
'results[].outcome': `${PROV}generated`,
|
|
388
|
+
},
|
|
389
|
+
},
|
|
390
|
+
// ── What a second agent needs to carry on (spec 438 §3) — the continuation package for an Endeavor ──
|
|
391
|
+
// Objective, open decisions, live commitments, and the runs attached so far with their digests and evidence
|
|
392
|
+
// status. It carries NO MANDATE: the agent that picks the work up acts under its own authority, or not at all.
|
|
393
|
+
// That is the whole reason this is a record and not a handoff token.
|
|
394
|
+
{
|
|
395
|
+
match: { prefix: 'endeavor.continuation:' }, class: `${APCOORD}Endeavor`,
|
|
396
|
+
label: 'continuation package', plural: 'continuation packages', ownedBy: 'either',
|
|
397
|
+
properties: {
|
|
398
|
+
// The objective is the Endeavor's OutcomeSpecification — the observable success definition that already
|
|
399
|
+
// exists, not a prose restatement of it. An agent picking the work up is told what "done" means in the
|
|
400
|
+
// same terms the assessment will be judged against (spec 438 §5).
|
|
401
|
+
outcomeSpecification: `${APCOORD}hasOutcomeSpecification`,
|
|
402
|
+
'commitments[]': `${PROV}wasAssociatedWith`,
|
|
403
|
+
'runs[].runRef': `${APEXEC}workRef`,
|
|
404
|
+
'runs[].recordDigest': `${APEXEC}anchorDigest`,
|
|
405
|
+
'runs[].evidenceStatus': `${APEXEC}hasEvidenceStatus`,
|
|
406
|
+
},
|
|
407
|
+
},
|
|
408
|
+
// ── A dispute over a receipt (spec 410 §10) — one Interaction under dispute/1.0.0, held by BOTH parties ──
|
|
409
|
+
// Every exchange is one signed unit by its author; a steward's determination closes it; it reverses nothing.
|
|
410
|
+
{
|
|
411
|
+
match: { prefix: 'interaction.dispute:' }, class: `${APIX}Interaction`,
|
|
412
|
+
label: 'dispute', plural: 'disputes', ownedBy: 'either',
|
|
413
|
+
properties: {
|
|
414
|
+
profileVersion: `${APIX}profileVersion`,
|
|
415
|
+
'exchanges[].performative': `${APIX}performative`,
|
|
416
|
+
},
|
|
417
|
+
},
|
|
418
|
+
// ── The run's pointer to the dispute that cites it (spec 410 §10, `apexec:disputedBy`) ──
|
|
419
|
+
{
|
|
420
|
+
match: { prefix: 'run.dispute:' }, class: `${APEXEC}ServiceExecution`,
|
|
421
|
+
label: 'run dispute', plural: 'run disputes', ownedBy: 'either',
|
|
422
|
+
properties: {
|
|
423
|
+
disputedBy: `${APEXEC}disputedBy`,
|
|
424
|
+
},
|
|
425
|
+
},
|
|
426
|
+
// ── Run artifacts (spec 391) — a step's raw result, too large for the run's record, in the ACTING agent's vault ──
|
|
427
|
+
// The body a resume or a person fetches under the agent's grant; the receipt's outputDigest commits to it.
|
|
428
|
+
{
|
|
429
|
+
match: { prefix: 'run.artifact:' }, class: `${APEXEC}RunArtifact`,
|
|
430
|
+
label: 'run artifact', plural: 'run artifacts', ownedBy: 'either',
|
|
431
|
+
properties: {
|
|
432
|
+
digest: `${APEXEC}artifactDigest`,
|
|
433
|
+
bytes: `${APEXEC}artifactBytes`,
|
|
434
|
+
},
|
|
435
|
+
},
|
|
436
|
+
// ── Build artifacts (spec 398 §9 / ap-build B3) — what one build run left, in the WORKSPACE's vault ──
|
|
437
|
+
// The files the model wrote and the test evidence as recorded; the PR opened from it names this record.
|
|
438
|
+
{
|
|
439
|
+
match: { prefix: 'build.run:' }, class: `${APEXEC}BuildArtifact`,
|
|
440
|
+
label: 'build run', plural: 'build runs', ownedBy: 'either',
|
|
441
|
+
properties: {
|
|
442
|
+
repository: `${APEXEC}buildRepository`,
|
|
443
|
+
base: `${APEXEC}buildBase`,
|
|
444
|
+
task: `${APEXEC}buildTask`,
|
|
445
|
+
summary: `${APEXEC}buildSummary`,
|
|
446
|
+
'evidence.command': `${APEXEC}testCommand`,
|
|
447
|
+
'evidence.exitCode': `${APEXEC}testExitCode`,
|
|
448
|
+
'evidence.outputTail': `${APEXEC}testOutputTail`,
|
|
449
|
+
model: `${APEXEC}buildModel`,
|
|
450
|
+
digest: `${APEXEC}artifactDigest`,
|
|
451
|
+
},
|
|
452
|
+
},
|
|
453
|
+
// ── Build promotions (spec 398 §9.4 / ap-build B5) — the exact tuple a steward's signature was over ──
|
|
454
|
+
{
|
|
455
|
+
match: { prefix: 'build.promotion:' }, class: `${APEXEC}BuildPromotion`,
|
|
456
|
+
label: 'build promotion', plural: 'build promotions', ownedBy: 'either',
|
|
457
|
+
properties: {
|
|
458
|
+
repository: `${APEXEC}buildRepository`,
|
|
459
|
+
commit: `${APEXEC}promotedCommit`,
|
|
460
|
+
configDigest: `${APEXEC}promotedConfigDigest`,
|
|
461
|
+
environment: `${APEXEC}promotedEnvironment`,
|
|
462
|
+
migration: `${APEXEC}permittedMigration`,
|
|
463
|
+
promotedUnder: `${APEXEC}promotedUnder`,
|
|
464
|
+
},
|
|
465
|
+
},
|
|
466
|
+
// ── The agent's budget (P1.4) — what it may do in a day, declared by its steward ──
|
|
467
|
+
{
|
|
468
|
+
match: { exact: 'agent.budget' }, class: `${APCTX}AgentBudget`,
|
|
469
|
+
label: 'agent budget', plural: 'agent budget', ownedBy: 'either',
|
|
470
|
+
properties: { asksPerDay: `${APCTX}asksPerDay`, vaultCallsPerDay: `${APCTX}vaultCallsPerDay` },
|
|
471
|
+
},
|
|
472
|
+
// ── The town's model gateway (spec 434) — inference.svc's OWN records: policy, entitlements, receipts ──
|
|
473
|
+
// A receipt is evidence that a call occurred and what it cost, never that it was authorized; an entitlement is the
|
|
474
|
+
// service's own policy over its own resource, never a delegation (G8). `assertedAgent` is what the caller SAID.
|
|
475
|
+
{
|
|
476
|
+
match: { prefix: 'inference.receipt:' }, class: `${APINF}InferenceReceipt`,
|
|
477
|
+
label: 'inference receipt', plural: 'inference receipts', ownedBy: 'either',
|
|
478
|
+
properties: { profile: `${APINF}profileId`, profileVersion: `${APINF}profileVersion`, provider: `${APINF}modelProvider`, model: `${APINF}modelId`, principal: `${APINF}principal`, assertedAgent: `${APINF}assertedAgent`, costMicroUsd: `${APINF}costMicroUsd`, attempt: `${APINF}attempt`, fallbackOf: `${APINF}fallbackOf`, reconciliation: `${APINF}reconciliationState`, outcome: `${APINF}outcome`, purpose: `${APINF}purpose`, estate: `${APINF}estate`, clientKind: `${APINF}clientKind` },
|
|
479
|
+
},
|
|
480
|
+
{ match: { prefix: 'inference.profile:' }, class: `${APINF}ModelProfile`, label: 'model profile', plural: 'model profiles', ownedBy: 'either', properties: { id: `${APINF}profileId`, 'servesCapability[]': `${APINF}servesCapability` } },
|
|
481
|
+
{ match: { prefix: 'inference.model:' }, class: `${APINF}ModelCatalogEntry`, label: 'model catalog entry', plural: 'model catalog entries', ownedBy: 'either', properties: { provider: `${APINF}modelProvider`, model: `${APINF}modelId`, enabled: `${APINF}enabled` } },
|
|
482
|
+
{ match: { prefix: 'inference.client:' }, class: `${APINF}ClientEntitlement`, label: 'inference client', plural: 'inference clients', ownedBy: 'either', properties: { principal: `${APINF}principal`, estate: `${APINF}estate`, kind: `${APINF}clientKind` } },
|
|
483
|
+
{ match: { prefix: 'inference.policy-change:' }, class: `${APINF}PolicyChange`, label: 'inference policy change', plural: 'inference policy changes', ownedBy: 'either', properties: { recordKey: `${APINF}changedRecord`, reason: `${APINF}reason` } },
|
|
484
|
+
// ── Spec 435 / 436 / 437 — standing, manifests, the Town Ask's records ──
|
|
485
|
+
// The agent's own copy of its TownStanding VC (the chain holds the hash): read to show and renew; no gate reads it.
|
|
486
|
+
{ match: { prefix: 'town.standing:' }, class: `${APATT}TownStanding`, label: 'town standing', plural: 'town standings', ownedBy: 'either', properties: { town: `${APATT}standingTown`, estate: `${APATT}standingEstate`, steward: `${APATT}standingSteward`, validUntil: `${APATT}standingValidUntil` } },
|
|
487
|
+
// A service's own signed MCP tool manifest, as published; a holder pins its digest on `connector.mcp:` (spec 404).
|
|
488
|
+
{ match: { prefix: 'mcp.manifest:' }, class: `${APAR}McpToolManifest`, label: 'MCP tool manifest', plural: 'MCP tool manifests', ownedBy: 'either', properties: { 'server.url': `${APAR}manifestServerUrl` } },
|
|
489
|
+
{ match: { prefix: 'mcp.bundle:' }, class: `${APAR}McpToolBundle`, label: 'MCP tool bundle', plural: 'MCP tool bundles', ownedBy: 'either' },
|
|
490
|
+
// The Town Ask (spec 436 §5.5, 437): the context agents' memory of the Pulse — counts, never a person.
|
|
491
|
+
{ match: { prefix: 'pulse.day:' }, class: `${APINF}TownPulse`, label: "day's pulse", plural: 'daily pulses', ownedBy: 'either', properties: { day: `${APINF}pulseDay` } },
|
|
492
|
+
{ match: { prefix: 'pulse.sample:' }, class: `${APINF}TownPulse`, label: 'pulse sample', plural: 'pulse samples', ownedBy: 'either' },
|
|
493
|
+
{ match: { prefix: 'estate.checklist:' }, class: `${APINF}StandingChecklist`, label: 'standing checklist', plural: 'standing checklists', ownedBy: 'either' },
|
|
494
|
+
{ match: { prefix: 'estate.manifest:' }, class: `${APINF}EstateManifest`, label: 'estate manifest', plural: 'estate manifests', ownedBy: 'either' },
|
|
495
|
+
// ── External MCP servers as connectors (spec 404) — the holder's own; the token is NOT in the record ──
|
|
496
|
+
{
|
|
497
|
+
match: { prefix: 'connector.mcp:' }, class: `${APCTX}McpConnector`,
|
|
498
|
+
label: 'MCP connector', plural: 'MCP connectors', ownedBy: 'either',
|
|
499
|
+
properties: {
|
|
500
|
+
name: `${APCTX}connectorName`,
|
|
501
|
+
url: `${APCTX}connectorUrl`,
|
|
502
|
+
'server.name': `${APCTX}serverName`,
|
|
503
|
+
attachedAt: `${APCTX}attachedAt`,
|
|
504
|
+
'tools[].kind': `${APCTX}toolKind`,
|
|
505
|
+
},
|
|
506
|
+
},
|
|
507
|
+
// ── Conversation memory (spec 370 P7) — what the agent RESOLVED for the owner lately, in their vault ──
|
|
508
|
+
{
|
|
509
|
+
match: { exact: 'conversation.recent' }, class: `${APCTX}ConversationMemory`,
|
|
510
|
+
label: 'recent conversation', plural: 'recent conversations', ownedBy: 'person',
|
|
511
|
+
properties: {
|
|
512
|
+
'turns[].at': `${APCTX}recalledAt`,
|
|
513
|
+
'turns[].parties[].agent': `${APCTX}recalledParty`,
|
|
514
|
+
'turns[].parties[].raw': `${APCTX}recalledWords`,
|
|
515
|
+
},
|
|
516
|
+
},
|
|
517
|
+
// ── Learned memory (spec 358 W5) — what the owner TOLD the agent, in their own vault ────────────
|
|
518
|
+
{
|
|
519
|
+
match: { prefix: 'preference:' }, class: `${APCTX}LearnedPreference`,
|
|
520
|
+
label: 'thing you told me', plural: 'things you told me', ownedBy: 'person',
|
|
521
|
+
properties: {
|
|
522
|
+
subject: `${APCTX}preferenceSubject`,
|
|
523
|
+
trigger: `${APCTX}preferenceTrigger`,
|
|
524
|
+
learnedAt: `${APCTX}learnedAt`,
|
|
525
|
+
},
|
|
526
|
+
},
|
|
527
|
+
// ── Confirmation memory (spec 385; bound here by spec 394) — which "David" the owner chose, per scope ──
|
|
528
|
+
{
|
|
529
|
+
match: { exact: 'confirmation.preferences' }, class: `${APCTX}ConfirmationMemory`,
|
|
530
|
+
label: 'remembered choice', plural: 'remembered choices', ownedBy: 'person',
|
|
531
|
+
properties: {
|
|
532
|
+
'entries[].agent': `${APCTX}confirmedParty`,
|
|
533
|
+
'entries[].word': `${APCTX}confirmedWords`,
|
|
534
|
+
'entries[].capability': `${APCTX}confirmedFor`,
|
|
535
|
+
},
|
|
536
|
+
},
|
|
537
|
+
// ── Playbook memory — the agent's own counts on the subjects of one skill family ───────────────
|
|
538
|
+
{
|
|
539
|
+
match: { prefix: 'playbook.memory:' }, class: `${APCTX}PlaybookMemory`,
|
|
540
|
+
label: 'playbook memory', plural: 'playbook memories', ownedBy: 'either',
|
|
541
|
+
properties: {
|
|
542
|
+
family: `${APCTX}memoryFamily`,
|
|
543
|
+
rounds: `${APCTX}memoryRounds`,
|
|
544
|
+
},
|
|
545
|
+
},
|
|
546
|
+
// ── Card-room study records — the person's own play, read by a named coach service under a grant ──
|
|
547
|
+
{
|
|
548
|
+
match: { exact: 'cardroom.hand' }, class: `${APCTX}CardRoomHandRecord`,
|
|
549
|
+
label: 'hand record', plural: 'hand records', ownedBy: 'person',
|
|
550
|
+
properties: { hands: `${APCTX}handsRecorded` },
|
|
551
|
+
},
|
|
552
|
+
{ match: { exact: 'cardroom.style' }, class: `${APCTX}CardRoomStyleRecord`, label: 'playing style', plural: 'playing styles', ownedBy: 'person' },
|
|
553
|
+
{ match: { exact: 'cardroom.read' }, class: `${APCTX}CardRoomPlayerRead`, label: 'player read', plural: 'player reads', ownedBy: 'person' },
|
|
554
|
+
{
|
|
555
|
+
match: { exact: 'cardroom.note' }, class: `${APCTX}CardRoomCoachNote`,
|
|
556
|
+
label: 'coach note', plural: 'coach notes', ownedBy: 'person',
|
|
557
|
+
properties: { 'entries[].by': `${APCTX}coachedBy` },
|
|
558
|
+
},
|
|
559
|
+
{ match: { exact: 'cardroom.client' }, class: `${APCTX}CardRoomCoachClient`, label: 'coaching client', plural: 'coaching clients', ownedBy: 'either' },
|
|
560
|
+
{ match: { prefix: 'cardroom.hands:' }, class: `${APCTX}CardRoomHandRecord`, label: 'a day’s hands', plural: 'days of hands', ownedBy: 'person' },
|
|
561
|
+
{ match: { exact: 'cardroom.prefs' }, class: `${APCTX}CardRoomPreferences`, label: 'card-room preferences', plural: 'card-room preferences', ownedBy: 'person' },
|
|
562
|
+
// Who the person is as a player — ONE record across games (cr:PlayerProfile in the card-room ontology).
|
|
563
|
+
{ match: { exact: 'cardroom.profile' }, class: `${APCTX}CardRoomPlayerProfile`, label: 'player profile', plural: 'player profiles', ownedBy: 'person' },
|
|
564
|
+
// A CLUB, kept by its own workspace agent (apctx:CardRoomClub…): the profile, the rule it meets by, and
|
|
565
|
+
// the nights as they diverge from the rule. The roster is the organization's own membership records.
|
|
566
|
+
{ match: { exact: 'cardroom.club.profile' }, class: `${APCTX}CardRoomClub`, label: 'club', plural: 'clubs', ownedBy: 'organization' },
|
|
567
|
+
{ match: { exact: 'cardroom.club.schedule' }, class: `${APCTX}CardRoomClubSchedule`, label: 'club schedule', plural: 'club schedules', ownedBy: 'organization' },
|
|
568
|
+
{ match: { exact: 'cardroom.club.nights' }, class: `${APCTX}CardRoomClubNights`, label: 'club nights', plural: 'club nights', ownedBy: 'organization' },
|
|
569
|
+
// A MISSION, kept by its own organization (apctx:CardRoomMission…): the presence a card room's map shows,
|
|
570
|
+
// the steward's signed covenant, and the confidential contact — written in the registration ceremony.
|
|
571
|
+
{ match: { exact: 'cardroom.mission.presence' }, class: `${APCTX}CardRoomMission`, label: 'mission presence', plural: 'mission presences', ownedBy: 'organization' },
|
|
572
|
+
{ match: { exact: 'cardroom.mission.covenant' }, class: `${APCTX}CardRoomMissionCovenant`, label: 'mission covenant', plural: 'mission covenants', ownedBy: 'organization' },
|
|
573
|
+
{ match: { exact: 'cardroom.mission.contact' }, class: `${APCTX}CardRoomMissionContact`, label: 'mission contact', plural: 'mission contacts', ownedBy: 'organization' },
|
|
574
|
+
// ONE CABINET PER GAME: hold'em's study records are the bare names above; every other game's carry the
|
|
575
|
+
// family — canasta's here, the same classes, a different coach's grant.
|
|
576
|
+
{
|
|
577
|
+
match: { exact: 'cardroom.canasta.hand' }, class: `${APCTX}CardRoomHandRecord`,
|
|
578
|
+
label: 'canasta round record', plural: 'canasta round records', ownedBy: 'person',
|
|
579
|
+
properties: { hands: `${APCTX}handsRecorded` },
|
|
580
|
+
},
|
|
581
|
+
{ match: { exact: 'cardroom.canasta.style' }, class: `${APCTX}CardRoomStyleRecord`, label: 'canasta playing style', plural: 'canasta playing styles', ownedBy: 'person' },
|
|
582
|
+
{ match: { exact: 'cardroom.canasta.read' }, class: `${APCTX}CardRoomPlayerRead`, label: 'canasta player read', plural: 'canasta player reads', ownedBy: 'person' },
|
|
583
|
+
{
|
|
584
|
+
match: { exact: 'cardroom.canasta.note' }, class: `${APCTX}CardRoomCoachNote`,
|
|
585
|
+
label: 'canasta coach note', plural: 'canasta coach notes', ownedBy: 'person',
|
|
586
|
+
properties: { 'entries[].by': `${APCTX}coachedBy` },
|
|
587
|
+
},
|
|
588
|
+
{ match: { prefix: 'cardroom.canasta.hands:' }, class: `${APCTX}CardRoomHandRecord`, label: 'a day’s canasta rounds', plural: 'days of canasta rounds', ownedBy: 'person' },
|
|
589
|
+
// ── Standing instructions (spec 394) — the owner's declared defaults, per room ──────────────────
|
|
590
|
+
{
|
|
591
|
+
match: { exact: 'standing.instructions' }, class: `${APCTX}StandingInstruction`,
|
|
592
|
+
label: 'standing instruction', plural: 'standing instructions', ownedBy: 'person',
|
|
593
|
+
properties: {
|
|
594
|
+
'entries[].capability': `${APCTX}instructionCapability`,
|
|
595
|
+
'entries[].arg': `${APCTX}instructionArgument`,
|
|
596
|
+
'entries[].value': `${APCTX}instructionValue`,
|
|
597
|
+
'entries[].context': `${APCTX}instructionContext`,
|
|
598
|
+
'entries[].at': `${APCTX}declaredAt`,
|
|
599
|
+
},
|
|
600
|
+
},
|
|
601
|
+
// ── Declared routines (spec 402 W3 · 323 W6) — the owner's routines as a record that travels ─────
|
|
602
|
+
{
|
|
603
|
+
match: { exact: 'routines.data' }, class: `${APCTX}DeclaredRoutine`,
|
|
604
|
+
label: 'declared routine', plural: 'declared routines', ownedBy: 'person',
|
|
605
|
+
properties: {
|
|
606
|
+
'entries[].ask': `${APCTX}routineAsk`,
|
|
607
|
+
'entries[].every': `${APCTX}routineEvery`,
|
|
608
|
+
'entries[].declared.saidAs': `${APCTX}routineSaidAs`,
|
|
609
|
+
'entries[].declared.tz': `${APCTX}routineZone`,
|
|
610
|
+
},
|
|
611
|
+
},
|
|
612
|
+
// ── The person's preferences (spec 403 W2/W4) — nudges and how to answer ─────────────────────────
|
|
613
|
+
{
|
|
614
|
+
match: { exact: 'person.preferences' }, class: `${APCTX}PersonPreferences`,
|
|
615
|
+
label: 'preferences', plural: 'preferences', ownedBy: 'person',
|
|
616
|
+
properties: { 'notify.email': `${APCTX}nudgeByEmail`, 'answer.style': `${APCTX}answerStyle`, 'answer.language': `${APCTX}answerLanguage` },
|
|
617
|
+
},
|
|
618
|
+
// ── Remembered facts (spec 402 W1) — what the owner's agent knows about the owner ────────────────
|
|
619
|
+
{
|
|
620
|
+
match: { exact: 'memory.facts' }, class: `${APCTX}RememberedFact`,
|
|
621
|
+
label: 'remembered fact', plural: 'remembered facts', ownedBy: 'person',
|
|
622
|
+
properties: {
|
|
623
|
+
'entries[].fact': `${APCTX}factWords`,
|
|
624
|
+
'entries[].source': `${APCTX}factSource`,
|
|
625
|
+
'entries[].learnedAt': `${APCTX}learnedAt`,
|
|
626
|
+
'entries[].from': `${APCTX}learnedFrom`,
|
|
627
|
+
},
|
|
628
|
+
},
|
|
629
|
+
// ── What an estate vouches for, with its opening (spec 410 §4; ap-federation F1) ──────────────────
|
|
630
|
+
// Held in the vault of the agent that anchors the estate's roots — its registry agent. ADR-0055 decides
|
|
631
|
+
// it: the blind exists nowhere else, so wiping this store leaves roots nobody can ever prove a leaf
|
|
632
|
+
// against. A rebuild is fine; this would be a bereavement. The Durable Object stays as the serving
|
|
633
|
+
// projection, rebuilt from these records and never their only copy.
|
|
634
|
+
{
|
|
635
|
+
match: { prefix: 'federation.projection-submission:' }, class: `${APEST}ProjectionSubmission`,
|
|
636
|
+
label: 'projection submission', plural: 'projection submissions', ownedBy: 'either',
|
|
637
|
+
properties: {
|
|
638
|
+
set: `${APEST}projectionSet`,
|
|
639
|
+
digest: `${APEST}vouchedDigest`,
|
|
640
|
+
blind: `${APEST}leafBlind`,
|
|
641
|
+
subject: `${APEST}leafSubject`,
|
|
642
|
+
submittedBy: `${APEST}submittedBy`,
|
|
643
|
+
source: `${APEST}submissionSource`,
|
|
644
|
+
submittedAt: `${PROV}generatedAtTime`,
|
|
645
|
+
expiresAt: `${APEST}vouchExpiresAt`,
|
|
646
|
+
'retired.at': `${PROV}invalidatedAtTime`,
|
|
647
|
+
'retired.reason': `${APEST}retiredReason`,
|
|
648
|
+
estate: `${APEXEC}estate`,
|
|
649
|
+
},
|
|
650
|
+
},
|
|
651
|
+
// ── Anonymous credentials (tbox/privacy-credential.ttl; specs 304 / 305 / 443 W5) ───────────────────
|
|
652
|
+
// THE HOLDER'S records: a credential made to be proved about, the custodied device key it is bound to, the
|
|
653
|
+
// holder secret her pairwise accounts derive from. ADR-0055 decides each: lose the credential and the issuer
|
|
654
|
+
// holds only its digest; lose the device key and no presentation can ever be made; lose the secret and every
|
|
655
|
+
// pairwise account at every verifier is unreachable. Bereavements, all three — vault records, never a cache.
|
|
656
|
+
// None of these is read by any gate: the mandate is judged per signature by the presentation release (ADR-0041).
|
|
657
|
+
{
|
|
658
|
+
match: { prefix: 'credential.anonymous:' }, class: `${APPC}AnonymousCredential`,
|
|
659
|
+
label: 'anonymous credential', plural: 'anonymous credentials', ownedBy: 'person',
|
|
660
|
+
properties: {
|
|
661
|
+
issuerKeyId: `${APPC}facetKeyId`,
|
|
662
|
+
digest: `${APPC}credentialDigest`,
|
|
663
|
+
claimSchema: `${APPC}claimSchema`,
|
|
664
|
+
deviceKeyThumbprint: `${APPC}deviceKeyThumbprint`,
|
|
665
|
+
issuedAt: `${PROV}generatedAtTime`,
|
|
666
|
+
},
|
|
667
|
+
},
|
|
668
|
+
{
|
|
669
|
+
match: { prefix: 'credential.device-key:' }, class: `${APPC}DeviceKey`,
|
|
670
|
+
label: 'device key', plural: 'device keys', ownedBy: 'person',
|
|
671
|
+
properties: { thumbprint: `${APPC}deviceKeyThumbprint`, createdAt: `${PROV}generatedAtTime` },
|
|
672
|
+
},
|
|
673
|
+
{ match: { prefix: 'credential.holder-secret:' }, class: `${APPC}PairwiseAccount`, label: 'holder secret (pairwise accounts derive from it)', plural: 'holder secrets', ownedBy: 'person' },
|
|
674
|
+
// Her standing `credential.present` wire — a delegation, kept under its own family because what it bounds (venues,
|
|
675
|
+
// programs, facets) is this module's vocabulary. The release judges it per signature (ADR-0041); no gate reads it.
|
|
676
|
+
{
|
|
677
|
+
match: { prefix: 'credential.presentation-mandate:' }, class: `${APPC}PresentationMandate`,
|
|
678
|
+
label: 'presentation mandate', plural: 'presentation mandates', ownedBy: 'person',
|
|
679
|
+
properties: { audiences: `${APPC}mandateAudience`, predicateDigests: `${APPC}mandatePredicateDigest`, issuerKeyIds: `${APPC}mandateIssuerKeyId`, maxPresentations: `${APPC}maxPresentations`, issuedAt: `${PROV}generatedAtTime` },
|
|
680
|
+
},
|
|
681
|
+
// THE ISSUER'S records: its key facets (public documents, kept with their attestation uid so a rotation knows what
|
|
682
|
+
// to revoke) — the live set's leaves are `federation.projection-submission:` rows in the `live-credential` set.
|
|
683
|
+
{
|
|
684
|
+
match: { prefix: 'credential.issuer-facet:' }, class: `${APPC}IssuerKeyFacet`,
|
|
685
|
+
label: 'issuer key facet', plural: 'issuer key facets', ownedBy: 'organization',
|
|
686
|
+
properties: {
|
|
687
|
+
keyId: `${APPC}facetKeyId`,
|
|
688
|
+
thumbprint: `${APPC}facetPublicKeyThumbprint`,
|
|
689
|
+
facetHash: `${APPC}facetHash`,
|
|
690
|
+
attestation: `${APPC}anchoredBy`,
|
|
691
|
+
validFrom: `${APPC}facetValidFrom`,
|
|
692
|
+
validUntil: `${APPC}facetValidUntil`,
|
|
693
|
+
},
|
|
694
|
+
},
|
|
695
|
+
// THE DOOR'S record of a predicate held — beside the admission decision; the digests, never the bundle.
|
|
696
|
+
{
|
|
697
|
+
match: { prefix: 'door.credential:' }, class: `${APPC}PredicateAdmissionEvidence`,
|
|
698
|
+
label: 'predicate admission', plural: 'predicate admissions', ownedBy: 'either',
|
|
699
|
+
properties: {
|
|
700
|
+
issuerKeyId: `${APPC}facetKeyId`,
|
|
701
|
+
predicateDigest: `${APPC}evidencePredicateDigest`,
|
|
702
|
+
nullifierGrade: `${APPC}evidenceNullifierGrade`,
|
|
703
|
+
statusSequence: `${APPC}evidenceStatusSequence`,
|
|
704
|
+
verifierPlacement: `${APPC}verifierPlacement`,
|
|
705
|
+
at: `${PROV}generatedAtTime`,
|
|
706
|
+
},
|
|
707
|
+
},
|
|
708
|
+
// ── At the company's door (tbox/identity.ttl; spec 442 §3 / §4 / §8) ────────────────────────────
|
|
709
|
+
// What a person's agent holds for the doors it presents at. ADR-0055 decides each: lose the key binding and
|
|
710
|
+
// the service cannot present until the agent signs a new one (a credential, rebuilt by a ceremony, kept here
|
|
711
|
+
// because the ceremony is the owner's act); lose the pairwise secret and every company's `sub` is unreachable
|
|
712
|
+
// forever; lose an account link and the person is signed out at that company. The binding and the link are
|
|
713
|
+
// credentials the Security section LISTS (spec 422) — never the identity, never a Worker secret, read by no
|
|
714
|
+
// verifier (ADR-0041): what the agent may DO at a door is a mandate, judged per step.
|
|
715
|
+
{
|
|
716
|
+
match: { prefix: 'identity.client-key-binding:' }, class: `${AP}ClientKeyBinding`,
|
|
717
|
+
label: 'client key binding', plural: 'client key bindings', ownedBy: 'either',
|
|
718
|
+
properties: {
|
|
719
|
+
clientId: `${AP}clientId`,
|
|
720
|
+
jwkThumbprint: `${AP}jwkThumbprint`,
|
|
721
|
+
alg: `${AP}jwsAlgorithm`,
|
|
722
|
+
custodyEpoch: `${AP}boundUnderCustodyEpoch`,
|
|
723
|
+
notBefore: `${AP}bindingNotBefore`,
|
|
724
|
+
notAfter: `${AP}bindingNotAfter`,
|
|
725
|
+
},
|
|
726
|
+
},
|
|
727
|
+
// The secret her pairwise subjects derive from — one record, per person; a rotation is a new `sub` everywhere.
|
|
728
|
+
{ match: { exact: 'identity.pairwise-secret' }, class: `${AP}PairwiseSubject`, label: 'pairwise secret (company subjects derive from it)', plural: 'pairwise secrets', ownedBy: 'person' },
|
|
729
|
+
{
|
|
730
|
+
match: { prefix: 'identity.external-account-link:' }, class: `${AP}ExternalAccountLink`,
|
|
731
|
+
label: 'account at a company', plural: 'accounts at companies', ownedBy: 'person',
|
|
732
|
+
properties: {
|
|
733
|
+
issuer: `${AP}pairwiseIssuer`,
|
|
734
|
+
pairwiseSubjectDigest: `${AP}pairwiseSubjectDigest`,
|
|
735
|
+
scopes: `${AP}grantedScope`,
|
|
736
|
+
grantedAt: `${AP}accountGrantedAt`,
|
|
737
|
+
expiresAt: `${AP}accountExpiresAt`,
|
|
738
|
+
lastUsedAt: `${AP}accountLastUsedAt`,
|
|
739
|
+
},
|
|
740
|
+
},
|
|
741
|
+
// ── PROJECTIONS, not things (role: 'index') ───────────────────────────────────────────────────
|
|
742
|
+
// Listed so that "not askable" is a DECISION on the record rather than an absence in this table. A
|
|
743
|
+
// question answered from an index is a question answered from a cache.
|
|
744
|
+
{ match: { exact: 'conversation.index' }, class: `${APMSG}Conversation`, label: 'conversation index', plural: 'conversation index', ownedBy: 'either', role: 'index' },
|
|
745
|
+
{ match: { exact: 'coordination.index' }, class: `${APCOORD}Endeavor`, label: 'endeavor index', plural: 'endeavor index', ownedBy: 'either', role: 'index' },
|
|
746
|
+
{ match: { exact: 'inbox.data' }, class: `${APMSG}Conversation`, label: 'inbox', plural: 'inbox', ownedBy: 'either', role: 'index' },
|
|
747
|
+
{ match: { exact: 'org.membership:local-names' }, class: `${APORG}OrganizationMembership`, label: 'local name map', plural: 'local name map', ownedBy: 'organization', role: 'index' },
|
|
748
|
+
];
|
|
749
|
+
/** What this record key IS, or `undefined` when nothing binds it. Longest match first, so a family and the
|
|
750
|
+
* narrower family inside it (`…endeavor:` and `…endeavor:events:`) cannot be confused for one another. */
|
|
751
|
+
export function bindingForRecordType(recordType) {
|
|
752
|
+
const key = recordType.trim();
|
|
753
|
+
const exact = VAULT_RECORD_BINDINGS.find((b) => b.match.exact === key);
|
|
754
|
+
if (exact)
|
|
755
|
+
return exact;
|
|
756
|
+
return [...VAULT_RECORD_BINDINGS]
|
|
757
|
+
.filter((b) => b.match.prefix && key.startsWith(b.match.prefix))
|
|
758
|
+
.sort((a, b) => (b.match.prefix.length - a.match.prefix.length))[0];
|
|
759
|
+
}
|
|
760
|
+
/** The kinds a question may be ASKED about — label → class. The askable set is this, never the model's. */
|
|
761
|
+
export function askableRecordKinds() {
|
|
762
|
+
const seen = new Set();
|
|
763
|
+
const out = [];
|
|
764
|
+
for (const b of VAULT_RECORD_BINDINGS) {
|
|
765
|
+
// An index is not a thing to ask about — see `VaultRecordRole`.
|
|
766
|
+
if ((b.role ?? 'entity') !== 'entity' || seen.has(b.class))
|
|
767
|
+
continue;
|
|
768
|
+
seen.add(b.class);
|
|
769
|
+
out.push({ label: b.label, plural: b.plural, class: b.class });
|
|
770
|
+
}
|
|
771
|
+
return out;
|
|
772
|
+
}
|
|
773
|
+
/** Every record type bound to this class — what a query over a kind must actually read. */
|
|
774
|
+
export function recordTypesForClass(classIri) {
|
|
775
|
+
return VAULT_RECORD_BINDINGS.filter((b) => b.class === classIri);
|
|
776
|
+
}
|
|
777
|
+
//# sourceMappingURL=vault-records.js.map
|