Repository navigation
Expand file tree
/
Copy pathcapabilities.json
More file actions
286 lines (286 loc) · 15.1 KB
/
Copy pathcapabilities.json
File metadata and controls
286 lines (286 loc) · 15.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
{
"_comment": "Single source of truth for VAID capability STATUS. Prose (the marketing site, docs) renders status FROM this file rather than asserting it, so a sentence can never carry a stale status. Guarded by TWO CI checks: (1) a DRIFT check — every vendored copy (e.g. the site's) must byte-match this file; (2) a VERIFICATION check (scripts/verify-capabilities.mjs) — status must match reality: a `shipped` capability's package version must be published on its registry (or its repo_ref must resolve), and a `roadmap`/`planned` capability blocked on a PR must have that PR still OPEN (a capability blocked on a merged PR is a status that should have flipped). See docs/adr/0002-capabilities-manifest.md. NOTE: `status_text` is the one hand-written field — a review item at release, not generated.",
"version": 1,
"capabilities": [
{
"id": "request-pop-verification",
"title": "Request proof-of-possession verification",
"status": "shipped",
"landed_in": "vaid-pop 0.1.0",
"packages": [
{
"language": "rust",
"registry": "crates.io",
"package": "vaid-pop",
"version": "0.2.0"
},
{
"language": "python",
"registry": "pypi",
"package": "vaid-pop",
"version": "0.1.0"
},
{
"language": "typescript",
"registry": "npm",
"package": "vaid-pop",
"version": "0.3.0"
}
],
"status_text": "A request's proof-of-possession is verifiable by any holder of the signer's public key — offline, no service. All three implementations ship the conformance firewall as an installable executable (`vaid-pop-conformance`); Rust gained one at 0.2.0, closing the gap where its only check ran from a repository checkout. A consumer therefore reproduces the frozen digest and signature from the artifact they received, in any of the three.",
"blocked_on": null
},
{
"id": "reference-mint",
"title": "Reference mint (issuance, delegation, attenuation)",
"status": "shipped",
"landed_in": "vaid-mint 0.1.2",
"packages": [
{
"language": "rust",
"registry": "crates.io",
"package": "vaid-mint",
"version": "0.1.2"
},
{
"language": "python",
"registry": "pypi",
"package": "vaid-mint",
"version": "0.1.3"
},
{
"language": "typescript",
"registry": "npm",
"package": "vaid-mint",
"version": "0.3.0"
}
],
"status_text": "A reference mint issues VAIDs and mints attenuated child VAIDs; published and installable. Rust and Python version independently — Python 0.1.3 is a docs-only PyPI re-release over the same 0.1.2 behaviour — so byte-for-byte agreement is asserted at the conformance-vector level, not the version number.",
"blocked_on": null
},
{
"id": "cross-language-conformance",
"title": "Cross-language conformance",
"status": "shipped",
"landed_in": "vaid-pop 0.1.0",
"packages": [
{
"language": "rust",
"registry": "crates.io",
"package": "vaid-pop",
"version": "0.1.0"
},
{
"language": "python",
"registry": "pypi",
"package": "vaid-pop",
"version": "0.1.0"
},
{
"language": "typescript",
"registry": "npm",
"package": "vaid-mint",
"version": "0.3.0"
}
],
"status_text": "Rust and Python reproduce a frozen conformance vector byte-for-byte.",
"blocked_on": null
},
{
"id": "langchain-adapter",
"title": "LangChain request-signing adapter",
"status": "shipped",
"landed_in": "vaid-langchain 0.1.0",
"packages": [
{
"language": "python",
"registry": "pypi",
"package": "vaid-langchain",
"version": "0.1.0"
}
],
"status_text": "A LangChain adapter that signs requests under the VAID proof-of-possession contract.",
"blocked_on": null
},
{
"id": "vaid-document-verification",
"title": "Public-key VAID document verification",
"status": "shipped",
"landed_in": "vaid-mint 0.2.0",
"packages": [
{
"language": "rust",
"registry": "crates.io",
"package": "vaid-mint",
"version": "0.2.0"
},
{
"language": "python",
"registry": "pypi",
"package": "vaid-mint",
"version": "0.2.0"
},
{
"language": "typescript",
"registry": "npm",
"package": "vaid-mint",
"version": "0.3.0"
}
],
"status_text": "Verifying a VAID document's authenticity from the issuer's public key alone — no issuer instance.",
"blocked_on": null
},
{
"id": "revocation-lineage-aware",
"title": "Three-state, lineage-aware revocation seam",
"status": "shipped",
"landed_in": "vaid-mint 0.2.0",
"packages": [
{
"language": "rust",
"registry": "crates.io",
"package": "vaid-mint",
"version": "0.2.0"
},
{
"language": "python",
"registry": "pypi",
"package": "vaid-mint",
"version": "0.2.0"
},
{
"language": "typescript",
"registry": "npm",
"package": "vaid-mint",
"version": "0.3.0"
}
],
"status_text": "Revocation checked over a VAID's full lineage — three-state, revoking a parent revokes its children, and a status that cannot be determined (Unavailable) fails closed. THE DEFAULT IS FAIL-CLOSED FROM vaid-mint 0.9.0, published on crates.io, PyPI and npm. Every vaid-mint published before 0.9.0 constructs the issuer with an assume-nothing-revoked in-memory store, which vouches NotRevoked for every VAID it was never told about and cannot detect its own restart — a fail-open posture reached by assumption, so a VAID revoked before a restart verifies clean. See GHSA-p336-fc9m-vcq4. On an affected version an integrator gets fail-closed behaviour only by holding the store absent or injecting a durable RevocationCheck. See revocation-fail-closed-default.",
"blocked_on": null
},
{
"id": "revocation-fail-closed-default",
"title": "Fail-closed revocation by default",
"status": "shipped",
"landed_in": "vaid-mint 0.9.0",
"packages": [
{
"language": "rust",
"registry": "crates.io",
"package": "vaid-mint",
"version": "0.9.0"
},
{
"language": "python",
"registry": "pypi",
"package": "vaid-mint",
"version": "0.9.0"
},
{
"language": "typescript",
"registry": "npm",
"package": "vaid-mint",
"version": "0.9.0"
}
],
"status_text": "ReferenceIssuer's revocation store starts ABSENT, so verification fails closed until revocation state is loaded (spec R.4.5), and durable revocation becomes two stores (R.4.6: revoked set AND lineage). Breaking in all three languages. Released as vaid-mint 0.9.0 on crates.io, PyPI and npm. Each leg was verified from a clean install against the packaged conformance firewall, and all three reproduce the same frozen mint_v1 digest. Security advisory for the fail-open default this replaces: GHSA-p336-fc9m-vcq4.",
"blocked_on": null
},
{
"id": "typescript-implementation",
"title": "TypeScript implementation (third conforming language)",
"status": "shipped",
"landed_in": "vaid-pop / vaid-mint / vaid-client 0.3.0 (npm)",
"packages": [
{
"language": "typescript",
"registry": "npm",
"package": "vaid-pop",
"version": "0.3.0"
},
{
"language": "typescript",
"registry": "npm",
"package": "vaid-mint",
"version": "0.3.0"
},
{
"language": "typescript",
"registry": "npm",
"package": "vaid-client",
"version": "0.3.0"
}
],
"status_text": "A third conforming implementation in TypeScript — minting with attenuation, public-key VAID verification, request proof-of-possession, and the three-state revocation seam. It reproduces all five frozen conformance vectors byte-for-byte in CI alongside Rust and Python. Published on npm (vaid-pop, vaid-mint, vaid-client), landing at 0.3.0 — the version this capability LANDED IN, not an install instruction: the three packages version independently and have moved since. What you get installing today is registry-checked separately and must never be sourced from this file. Each ships a packaged conformance firewall — `npx -p vaid-mint vaid-mint-conformance` and the two siblings — which reproduces the frozen digests from the INSTALLED package, so a consumer can check the artifact they actually received rather than trusting this claim.",
"blocked_on": null
},
{
"id": "attenuation-verification",
"title": "Third-party attenuation (authority) verification",
"status": "shipped",
"landed_in": "vaid-mint 0.4.0",
"packages": [
{
"language": "rust",
"registry": "crates.io",
"package": "vaid-mint",
"version": "0.4.0"
},
{
"language": "python",
"registry": "pypi",
"package": "vaid-mint",
"version": "0.4.0"
},
{
"language": "typescript",
"registry": "npm",
"package": "vaid-mint",
"version": "0.4.0"
}
],
"status_text": "A third party holding the issuer's kernel PUBLIC key and the ancestor documents a presenter supplies can verify that a child's authority is within its parent's, at every hop — scope, capabilities, expiry, and the qualified (trust_domain, tenant_id) pair. A child's expiry is contained by its parent's, and a chain with a lapsed ancestor is refused rather than reported attenuated. Containment reuses the mint-time matchers, so verify-time cannot drift from the check that gated issuance. Achieved by detached chain presentation (ADR-0003) with NO change to the VAID document: no new field, no sig_version bump, no mint_v1 re-freeze. That last sentence is a statement about ADR-0003 and about nothing else: it describes what THAT change cost, not the current state of the wire format. ADR-0009 later typed scope_boundary's entries, which did move sig_version to 4 and did re-freeze mint_v1 — containment reuses the same matchers over the typed entries, so the capability described here is unchanged by it. Pinned cross-language by chain_v1.json. LIMITS, stated because they are load-bearing: the presenter must retain and present the ancestors, so a leaf whose ancestor documents were discarded has unverifiable attenuation; and full-chain verification requires full-chain disclosure.",
"blocked_on": null
},
{
"id": "lineage-chain-verification",
"title": "Third-party end-to-end lineage verification",
"status": "shipped",
"landed_in": "vaid-mint 0.4.0",
"packages": [
{
"language": "rust",
"registry": "crates.io",
"package": "vaid-mint",
"version": "0.4.0"
},
{
"language": "python",
"registry": "pypi",
"package": "vaid-mint",
"version": "0.4.0"
},
{
"language": "typescript",
"registry": "npm",
"package": "vaid-mint",
"version": "0.4.0"
}
],
"status_text": "A third party can walk a full delegation chain from a presented bundle: every document authenticated, every hop pinned against the signed parent_vaid, and any gap — an unpresented ancestor, a cycle, an implausible depth — failing closed as attenuation-unverifiable rather than attenuation-satisfied. Chains that cross kernel keys additionally require a detached consent attestation from the issuer that minted the parent (attestation_v1.json), because nothing in a VAID document otherwise proves the parent consented; a cross-key hop without valid consent never verifies. LIMITS: revocation is NOT consulted by chain verification anywhere on the chain, and the leaf's OWN expiry is not consulted either — expiry is enforced BETWEEN hops, so a lapsed ancestor is refused, but the presented leaf must still be checked by the caller (vaid#76); and consent is time-bounded rather than revocable — retraction inside an attestation's window needs durable revocation, which this implementation does not provide (docs/spec/revocation.md R.4.6, docs/spec/consent-attestation.md C.6).",
"blocked_on": null
},
{
"id": "cross-deployment-verification",
"title": "Cross-deployment VAID verification",
"status": "planned",
"landed_in": null,
"packages": [],
"status_text": "Verifying a VAID issued by one deployment from another. v3 (ADR-0004) supplies the missing identifier — the document names its issuing trust domain and commits to the key that signed it — and the publication route exists: the SYNTHERA substrate's kernel public key is published, with its RFC 7638 thumbprint in three independent channels, so a third party can obtain the key and confirm it is the right one (see /trust-anchor). The substrate emits both v3 identity fields today: the revision serving 100% of substrate traffic is built from synthera 8556828, whose crates/synthera-types/src/vaid.rs sets sig_version 3, trust_domain and kernel_key_thumbprint on every document it constructs; and a production VAID captured on 2026-08-07 (synthera docs/evidence/vaid-third-party-verification-2026-08-07/production-vaid.json) verifies VALID under published vaid-mint 0.7.0 against the published anchor key, by the open standard's own verifier, with no substrate cooperation. Authenticity across deployments therefore works today (verified 2026-09-21). What remains is not a deploy: (1) the substrate's trust_domain is 'substrate.internal', reserved by RFC 6761, and docs/trust-anchor.md says a conforming verifier SHOULD refuse to bind a trust bundle to a special-use name — so key selection works by thumbprint while domain binding does not exist, pending an issuer-naming decision that is irreversible once verifiers bind to it; and (2) per synthera ADR-0034 the substrate's document carries an additional external_identity member, so it is a superset of the standard's document rather than the same document — it verifies only because ADR-0006 canonicalizes over presented bytes, and a verifier that re-projects into its own struct would reject it.",
"blocked_on": {
"type": "decision",
"ref": "an issuer-naming decision: the substrate's trust_domain is the RFC 6761 special-use name 'substrate.internal', so no trust bundle can be bound to it. Substrate adoption of the v3 identity fields (synthera ADR-0034) is DONE and serving; the kernel public key publication route (synthera#16) is CLEARED, published 2026-08-03"
}
}
]
}