@kungfu-tech/kfd 1.0.0-alpha.1 → 1.0.0-alpha.13
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/.buildchain/kfd-1/contract-world.witness.json +249 -0
- package/.buildchain/kfd-2/public-release-trust.claim.json +113 -0
- package/.buildchain/kfd-3/collaboration-interface.artifact.json +574 -0
- package/.buildchain/kfd-3/collaboration-interface.json +323 -0
- package/.buildchain/kfd-3/collaboration-interface.prebuild.json +897 -0
- package/README.md +112 -29
- package/TRADEMARKS.md +60 -0
- package/buildchain.release-propagation.json +32 -0
- package/decisions/kfd-1.md +37 -23
- package/decisions/kfd-2.md +30 -11
- package/decisions/kfd-3.md +25 -6
- package/docs/MAP.md +9 -0
- package/docs/kfd-2-release-trust.md +78 -0
- package/docs/kfd-3-collaboration-interface.md +77 -0
- package/kfd.release.json +13 -0
- package/package.json +34 -2
- package/registry.json +1 -1
- package/release-impact.json +65 -0
- package/schemas/kfd-1/contract-world.schema.json +57 -0
- package/schemas/kfd-1/witness.schema.json +63 -0
- package/schemas/kfd-2/release-claims.schema.json +331 -0
- package/schemas/kfd-2/release-trust-passport.schema.json +276 -0
- package/schemas/kfd-2/trust-taxonomy.schema.json +219 -0
- package/schemas/kfd-3/collaboration-interface.schema.json +482 -0
- package/schemas/kfd-3/witness.schema.json +159 -0
- package/schemas/kfd-standards.schema.json +239 -0
- package/site/kfd-site.json +37 -8
- package/standards.json +205 -0
|
@@ -0,0 +1,897 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"contract": "kungfu-buildchain-kfd-3-collaboration-interface-prebuild-witness",
|
|
4
|
+
"id": "kfd-repository",
|
|
5
|
+
"standard": "kfd-3",
|
|
6
|
+
"supportLevel": "release",
|
|
7
|
+
"source": {
|
|
8
|
+
"repo": "kungfu-systems/kfd"
|
|
9
|
+
},
|
|
10
|
+
"sourceRegistry": {
|
|
11
|
+
"id": "kfd-collaboration-interface",
|
|
12
|
+
"path": ".buildchain/kfd-3/collaboration-interface.json",
|
|
13
|
+
"sha256": "e32f2196399d37db202ccc656386bddc346871243c3db6782d26b5a88f831595"
|
|
14
|
+
},
|
|
15
|
+
"collaborationInterfaceDigest": "sha256:e32f2196399d37db202ccc656386bddc346871243c3db6782d26b5a88f831595",
|
|
16
|
+
"collaborationInterface": {
|
|
17
|
+
"schemaVersion": 1,
|
|
18
|
+
"contract": "kfd-3-collaboration-interface",
|
|
19
|
+
"standard": "kfd-3",
|
|
20
|
+
"product": {
|
|
21
|
+
"name": "KFD",
|
|
22
|
+
"version": "v1.0",
|
|
23
|
+
"repository": "kungfu-systems/kfd"
|
|
24
|
+
},
|
|
25
|
+
"sourceRegistry": {
|
|
26
|
+
"path": "registry.json"
|
|
27
|
+
},
|
|
28
|
+
"factSources": [
|
|
29
|
+
{
|
|
30
|
+
"id": "public-kfd-fact-source",
|
|
31
|
+
"kind": "git-repository",
|
|
32
|
+
"host": "github",
|
|
33
|
+
"repository": "kungfu-systems/kfd",
|
|
34
|
+
"url": "https://github.com/kungfu-systems/kfd",
|
|
35
|
+
"loadBearingCoordinate": "commit-addressed repository contents",
|
|
36
|
+
"stableRenderedIndex": "https://kfd.libkungfu.dev",
|
|
37
|
+
"canonicalPaths": [
|
|
38
|
+
"decisions/kfd-N.md",
|
|
39
|
+
"registry.json",
|
|
40
|
+
"standards.json"
|
|
41
|
+
],
|
|
42
|
+
"projectionSurfaces": [
|
|
43
|
+
"https://kfd.libkungfu.dev/N",
|
|
44
|
+
"npm:@kungfu-tech/kfd",
|
|
45
|
+
"Buildchain release passports"
|
|
46
|
+
],
|
|
47
|
+
"extensionRequestNote": "GitHub issues are extension request paths; KFD facts are created only by committed repository contents."
|
|
48
|
+
}
|
|
49
|
+
],
|
|
50
|
+
"participants": [
|
|
51
|
+
{
|
|
52
|
+
"id": "human-reader",
|
|
53
|
+
"kind": "human",
|
|
54
|
+
"description": "A person reading KFD decisions, philosophy, and release evidence."
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "agent-reader",
|
|
58
|
+
"kind": "agent",
|
|
59
|
+
"description": "An agent consuming KFD registry, standards metadata, schemas, and package exports."
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"id": "maintainer",
|
|
63
|
+
"kind": "maintainer",
|
|
64
|
+
"description": "A human or agent maintaining KFD decisions, metadata, package surfaces, and release evidence."
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"id": "package-consumer",
|
|
68
|
+
"kind": "api-consumer",
|
|
69
|
+
"description": "A downstream repository consuming the @kungfu-tech/kfd package."
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"id": "site-consumer",
|
|
73
|
+
"kind": "service-integrator",
|
|
74
|
+
"description": "A site repository consuming KFD's site bundle, registry, standards metadata, and decision text."
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": "release-system",
|
|
78
|
+
"kind": "service-integrator",
|
|
79
|
+
"description": "A release system consuming KFD witnesses, impact ledgers, and release propagation contracts."
|
|
80
|
+
}
|
|
81
|
+
],
|
|
82
|
+
"minimalEntrypoints": [
|
|
83
|
+
{
|
|
84
|
+
"id": "readme",
|
|
85
|
+
"surface": "README.md",
|
|
86
|
+
"participants": [
|
|
87
|
+
"human-reader",
|
|
88
|
+
"agent-reader"
|
|
89
|
+
],
|
|
90
|
+
"purpose": "Start from the KFD worldview and current decision set."
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": "docs-map",
|
|
94
|
+
"surface": "docs/MAP.md",
|
|
95
|
+
"participants": [
|
|
96
|
+
"human-reader",
|
|
97
|
+
"agent-reader",
|
|
98
|
+
"maintainer"
|
|
99
|
+
],
|
|
100
|
+
"purpose": "Route readers and agents to the right KFD document or machine surface."
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"id": "official-status-and-trademarks",
|
|
104
|
+
"surface": "TRADEMARKS.md",
|
|
105
|
+
"participants": [
|
|
106
|
+
"human-reader",
|
|
107
|
+
"agent-reader",
|
|
108
|
+
"package-consumer"
|
|
109
|
+
],
|
|
110
|
+
"purpose": "Understand what Apache-2.0 covers and what remains official, trademark-bound, or endorsement-bound."
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"id": "registry",
|
|
114
|
+
"surface": "registry.json",
|
|
115
|
+
"participants": [
|
|
116
|
+
"agent-reader",
|
|
117
|
+
"package-consumer",
|
|
118
|
+
"site-consumer"
|
|
119
|
+
],
|
|
120
|
+
"purpose": "Consume the authoritative decision index."
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"id": "standards",
|
|
124
|
+
"surface": "standards.json",
|
|
125
|
+
"participants": [
|
|
126
|
+
"agent-reader",
|
|
127
|
+
"package-consumer",
|
|
128
|
+
"release-system"
|
|
129
|
+
],
|
|
130
|
+
"purpose": "Discover KFD schema IDs, schema paths, concepts, and interface contracts."
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"id": "package-exports",
|
|
134
|
+
"surface": "package.json#exports",
|
|
135
|
+
"participants": [
|
|
136
|
+
"package-consumer",
|
|
137
|
+
"agent-reader"
|
|
138
|
+
],
|
|
139
|
+
"purpose": "Consume the shipped npm package surfaces."
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"id": "release-anchor",
|
|
143
|
+
"surface": "kfd.release.json",
|
|
144
|
+
"participants": [
|
|
145
|
+
"release-system",
|
|
146
|
+
"agent-reader"
|
|
147
|
+
],
|
|
148
|
+
"purpose": "Inspect the explicit KFD package version anchor for the current Buildchain release line."
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"id": "kfd-2-public-release-trust-claim",
|
|
152
|
+
"surface": ".buildchain/kfd-2/public-release-trust.claim.json",
|
|
153
|
+
"participants": [
|
|
154
|
+
"release-system",
|
|
155
|
+
"agent-reader",
|
|
156
|
+
"package-consumer"
|
|
157
|
+
],
|
|
158
|
+
"purpose": "Inspect the explicit public KFD-2 claim passed into Buildchain release passport generation."
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"id": "site-bundle",
|
|
162
|
+
"surface": "site/kfd-site.json",
|
|
163
|
+
"participants": [
|
|
164
|
+
"site-consumer",
|
|
165
|
+
"agent-reader"
|
|
166
|
+
],
|
|
167
|
+
"purpose": "Render KFD-owned site text and decision pages without duplicating extraction logic."
|
|
168
|
+
}
|
|
169
|
+
],
|
|
170
|
+
"surfaces": [
|
|
171
|
+
{
|
|
172
|
+
"id": "readme",
|
|
173
|
+
"kind": "markdown-doc",
|
|
174
|
+
"participants": [
|
|
175
|
+
"human-reader",
|
|
176
|
+
"agent-reader"
|
|
177
|
+
],
|
|
178
|
+
"value": "KFD's public worldview entrypoint and site homepage text source.",
|
|
179
|
+
"discoverability": {
|
|
180
|
+
"fromMinimalEntrypoint": true,
|
|
181
|
+
"path": "README.md"
|
|
182
|
+
},
|
|
183
|
+
"maturity": "stable"
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
"id": "docs-map",
|
|
187
|
+
"kind": "markdown-doc",
|
|
188
|
+
"participants": [
|
|
189
|
+
"human-reader",
|
|
190
|
+
"agent-reader",
|
|
191
|
+
"maintainer"
|
|
192
|
+
],
|
|
193
|
+
"value": "Document map for routing questions to KFD decisions and machine surfaces.",
|
|
194
|
+
"discoverability": {
|
|
195
|
+
"fromMinimalEntrypoint": true,
|
|
196
|
+
"path": "docs/MAP.md"
|
|
197
|
+
},
|
|
198
|
+
"maturity": "stable"
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"id": "official-status-and-trademarks",
|
|
202
|
+
"kind": "markdown-doc",
|
|
203
|
+
"participants": [
|
|
204
|
+
"human-reader",
|
|
205
|
+
"agent-reader",
|
|
206
|
+
"package-consumer"
|
|
207
|
+
],
|
|
208
|
+
"value": "Apache-2.0 reuse boundary, trademark boundary, official source boundary, fork/derivative guidance, and agent-facing authority rule.",
|
|
209
|
+
"discoverability": {
|
|
210
|
+
"fromMinimalEntrypoint": true,
|
|
211
|
+
"path": "TRADEMARKS.md"
|
|
212
|
+
},
|
|
213
|
+
"maturity": "stable"
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
"id": "decision-texts",
|
|
217
|
+
"kind": "markdown-doc",
|
|
218
|
+
"participants": [
|
|
219
|
+
"human-reader",
|
|
220
|
+
"agent-reader",
|
|
221
|
+
"maintainer"
|
|
222
|
+
],
|
|
223
|
+
"value": "Append-only authoritative KFD decision texts.",
|
|
224
|
+
"discoverability": {
|
|
225
|
+
"fromMinimalEntrypoint": true,
|
|
226
|
+
"path": "decisions/*.md"
|
|
227
|
+
},
|
|
228
|
+
"maturity": "stable"
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
"id": "registry-json",
|
|
232
|
+
"kind": "json-api",
|
|
233
|
+
"participants": [
|
|
234
|
+
"agent-reader",
|
|
235
|
+
"package-consumer",
|
|
236
|
+
"site-consumer"
|
|
237
|
+
],
|
|
238
|
+
"value": "Authoritative machine-readable KFD decision index.",
|
|
239
|
+
"discoverability": {
|
|
240
|
+
"fromMinimalEntrypoint": true,
|
|
241
|
+
"path": "registry.json"
|
|
242
|
+
},
|
|
243
|
+
"maturity": "stable"
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
"id": "standards-json",
|
|
247
|
+
"kind": "json-api",
|
|
248
|
+
"participants": [
|
|
249
|
+
"agent-reader",
|
|
250
|
+
"package-consumer",
|
|
251
|
+
"release-system"
|
|
252
|
+
],
|
|
253
|
+
"value": "Machine-readable KFD standards metadata and schema/interface registry.",
|
|
254
|
+
"discoverability": {
|
|
255
|
+
"fromMinimalEntrypoint": true,
|
|
256
|
+
"path": "standards.json"
|
|
257
|
+
},
|
|
258
|
+
"maturity": "stable"
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
"id": "schemas",
|
|
262
|
+
"kind": "json-api",
|
|
263
|
+
"participants": [
|
|
264
|
+
"agent-reader",
|
|
265
|
+
"package-consumer",
|
|
266
|
+
"release-system"
|
|
267
|
+
],
|
|
268
|
+
"value": "KFD-owned JSON schemas for standards metadata and KFD-1/2/3 interfaces.",
|
|
269
|
+
"discoverability": {
|
|
270
|
+
"fromMinimalEntrypoint": true,
|
|
271
|
+
"path": "schemas/**/*.json"
|
|
272
|
+
},
|
|
273
|
+
"maturity": "stable"
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
"id": "package-exports",
|
|
277
|
+
"kind": "package",
|
|
278
|
+
"participants": [
|
|
279
|
+
"package-consumer",
|
|
280
|
+
"agent-reader"
|
|
281
|
+
],
|
|
282
|
+
"value": "The npm package export map for KFD registry, standards, decisions, docs, schemas, and witnesses.",
|
|
283
|
+
"discoverability": {
|
|
284
|
+
"fromMinimalEntrypoint": true,
|
|
285
|
+
"path": "package.json#exports"
|
|
286
|
+
},
|
|
287
|
+
"maturity": "stable"
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
"id": "site-bundle-json",
|
|
291
|
+
"kind": "json-api",
|
|
292
|
+
"participants": [
|
|
293
|
+
"site-consumer",
|
|
294
|
+
"agent-reader"
|
|
295
|
+
],
|
|
296
|
+
"value": "KFD-owned content projection consumed by the public site renderer, including decision metadata and the public KFD fact-source boundary.",
|
|
297
|
+
"discoverability": {
|
|
298
|
+
"fromMinimalEntrypoint": true,
|
|
299
|
+
"path": "site/kfd-site.json"
|
|
300
|
+
},
|
|
301
|
+
"maturity": "stable"
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
"id": "release-impact-json",
|
|
305
|
+
"kind": "json-api",
|
|
306
|
+
"participants": [
|
|
307
|
+
"release-system",
|
|
308
|
+
"maintainer",
|
|
309
|
+
"agent-reader"
|
|
310
|
+
],
|
|
311
|
+
"value": "Release impact declaration consumed by Buildchain release passports.",
|
|
312
|
+
"discoverability": {
|
|
313
|
+
"fromMinimalEntrypoint": true,
|
|
314
|
+
"path": "release-impact.json"
|
|
315
|
+
},
|
|
316
|
+
"maturity": "stable"
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
"id": "release-anchor-json",
|
|
320
|
+
"kind": "json-api",
|
|
321
|
+
"participants": [
|
|
322
|
+
"release-system",
|
|
323
|
+
"agent-reader",
|
|
324
|
+
"maintainer"
|
|
325
|
+
],
|
|
326
|
+
"value": "Anchored/manual release manifest that declares the exact npm version as a release fact.",
|
|
327
|
+
"discoverability": {
|
|
328
|
+
"fromMinimalEntrypoint": true,
|
|
329
|
+
"path": "kfd.release.json"
|
|
330
|
+
},
|
|
331
|
+
"maturity": "stable"
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
"id": "release-propagation-json",
|
|
335
|
+
"kind": "json-api",
|
|
336
|
+
"participants": [
|
|
337
|
+
"release-system",
|
|
338
|
+
"site-consumer"
|
|
339
|
+
],
|
|
340
|
+
"value": "Release propagation graph from KFD to downstream site surfaces.",
|
|
341
|
+
"discoverability": {
|
|
342
|
+
"fromMinimalEntrypoint": true,
|
|
343
|
+
"path": "buildchain.release-propagation.json"
|
|
344
|
+
},
|
|
345
|
+
"maturity": "stable"
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
"id": "kfd-1-witness",
|
|
349
|
+
"kind": "json-api",
|
|
350
|
+
"participants": [
|
|
351
|
+
"release-system",
|
|
352
|
+
"maintainer",
|
|
353
|
+
"agent-reader"
|
|
354
|
+
],
|
|
355
|
+
"value": "KFD-1 contract-world witness for source-to-artifact drift checks.",
|
|
356
|
+
"discoverability": {
|
|
357
|
+
"fromMinimalEntrypoint": true,
|
|
358
|
+
"path": ".buildchain/kfd-1/contract-world.witness.json"
|
|
359
|
+
},
|
|
360
|
+
"maturity": "stable"
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
"id": "kfd-2-public-release-trust-claim",
|
|
364
|
+
"kind": "json-api",
|
|
365
|
+
"participants": [
|
|
366
|
+
"release-system",
|
|
367
|
+
"maintainer",
|
|
368
|
+
"agent-reader",
|
|
369
|
+
"package-consumer"
|
|
370
|
+
],
|
|
371
|
+
"value": "Explicit public KFD-2 claim that binds KFD package release trust to declared source facts, machine evidence, artifacts, verification, responsibility, and residual risk.",
|
|
372
|
+
"discoverability": {
|
|
373
|
+
"fromMinimalEntrypoint": true,
|
|
374
|
+
"path": ".buildchain/kfd-2/public-release-trust.claim.json"
|
|
375
|
+
},
|
|
376
|
+
"maturity": "stable"
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
"id": "kfd-3-self-witnesses",
|
|
380
|
+
"kind": "json-api",
|
|
381
|
+
"participants": [
|
|
382
|
+
"release-system",
|
|
383
|
+
"maintainer",
|
|
384
|
+
"agent-reader"
|
|
385
|
+
],
|
|
386
|
+
"value": "KFD-3 self collaboration-interface witnesses for pre-build and artifact-side closure checks.",
|
|
387
|
+
"discoverability": {
|
|
388
|
+
"fromMinimalEntrypoint": true,
|
|
389
|
+
"path": ".buildchain/kfd-3/*.json"
|
|
390
|
+
},
|
|
391
|
+
"maturity": "stable"
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
"id": "release-workflows",
|
|
395
|
+
"kind": "config",
|
|
396
|
+
"participants": [
|
|
397
|
+
"release-system",
|
|
398
|
+
"maintainer"
|
|
399
|
+
],
|
|
400
|
+
"value": "GitHub Actions workflows that invoke Buildchain verification, promotion, and propagation.",
|
|
401
|
+
"discoverability": {
|
|
402
|
+
"fromMinimalEntrypoint": true,
|
|
403
|
+
"path": ".github/workflows/*.yml"
|
|
404
|
+
},
|
|
405
|
+
"maturity": "stable"
|
|
406
|
+
}
|
|
407
|
+
],
|
|
408
|
+
"transparentConstraints": [
|
|
409
|
+
{
|
|
410
|
+
"id": "append-only-decisions",
|
|
411
|
+
"surface": "decisions/*.md",
|
|
412
|
+
"constraint": "Substantive semantic changes supersede older KFD numbers instead of rewriting them.",
|
|
413
|
+
"reason": "Decision history must remain inspectable by humans and agents.",
|
|
414
|
+
"review": "CONTRIBUTING.md and node scripts/check.mjs"
|
|
415
|
+
},
|
|
416
|
+
{
|
|
417
|
+
"id": "kfd-site-boundary",
|
|
418
|
+
"surface": "site/kfd-site.json",
|
|
419
|
+
"constraint": "KFD owns homepage text, decision text, registry, and standards metadata; the site owns rendering style and layout.",
|
|
420
|
+
"reason": "Text remains a single fact source while the site stays free to render it.",
|
|
421
|
+
"review": "site/kfd-site.json renderingBoundary"
|
|
422
|
+
},
|
|
423
|
+
{
|
|
424
|
+
"id": "package-export-boundary",
|
|
425
|
+
"surface": "package.json#exports",
|
|
426
|
+
"constraint": "Public package surfaces must be explicitly exported and verified.",
|
|
427
|
+
"reason": "Agents and downstream repositories should not rely on hidden package internals.",
|
|
428
|
+
"review": "node scripts/check.mjs"
|
|
429
|
+
},
|
|
430
|
+
{
|
|
431
|
+
"id": "standard-not-runtime",
|
|
432
|
+
"surface": "README.md",
|
|
433
|
+
"constraint": "KFD provides decisions, standards metadata, schemas, and witnesses; it does not provide the Kungfu runtime, GUI, or CLI.",
|
|
434
|
+
"reason": "KFD should remain a standard/decision package, not a product runtime.",
|
|
435
|
+
"review": "docs/MAP.md"
|
|
436
|
+
}
|
|
437
|
+
],
|
|
438
|
+
"choicePaths": [
|
|
439
|
+
{
|
|
440
|
+
"id": "read-human-docs",
|
|
441
|
+
"participants": [
|
|
442
|
+
"human-reader"
|
|
443
|
+
],
|
|
444
|
+
"choice": "Read README.md, docs/MAP.md, and decisions/*.md directly."
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
"id": "consume-machine-metadata",
|
|
448
|
+
"participants": [
|
|
449
|
+
"agent-reader",
|
|
450
|
+
"package-consumer",
|
|
451
|
+
"release-system"
|
|
452
|
+
],
|
|
453
|
+
"choice": "Consume registry.json, standards.json, schemas, and package exports."
|
|
454
|
+
},
|
|
455
|
+
{
|
|
456
|
+
"id": "render-site",
|
|
457
|
+
"participants": [
|
|
458
|
+
"site-consumer"
|
|
459
|
+
],
|
|
460
|
+
"choice": "Consume site/kfd-site.json and own rendering/style decisions downstream."
|
|
461
|
+
},
|
|
462
|
+
{
|
|
463
|
+
"id": "maintain-through-pr",
|
|
464
|
+
"participants": [
|
|
465
|
+
"maintainer"
|
|
466
|
+
],
|
|
467
|
+
"choice": "Change KFD through PR review, node scripts/check.mjs, and Buildchain release gates."
|
|
468
|
+
}
|
|
469
|
+
],
|
|
470
|
+
"extensionRequests": [
|
|
471
|
+
{
|
|
472
|
+
"id": "kfd-2-trust-taxonomy-extension",
|
|
473
|
+
"participants": [
|
|
474
|
+
"agent-reader",
|
|
475
|
+
"maintainer",
|
|
476
|
+
"release-system",
|
|
477
|
+
"package-consumer"
|
|
478
|
+
],
|
|
479
|
+
"trigger": "A human or agent needs a residual-risk, trust-impact, machine-provability, agent-action, or downgrade-reason value that is not present in schemas/kfd-2/trust-taxonomy.schema.json.",
|
|
480
|
+
"requestPath": {
|
|
481
|
+
"kind": "github-issue",
|
|
482
|
+
"target": "https://github.com/kungfu-systems/kfd/issues/new?title=KFD-2%20trust%20taxonomy%20extension%20request",
|
|
483
|
+
"template": "State the missing value, the taxonomy field, the product or release scenario, and why existing KFD-2 values cannot express the case."
|
|
484
|
+
},
|
|
485
|
+
"expectedOutcome": "KFD maintainers either add the value to the KFD-2 trust taxonomy schema or explain which existing value should be used."
|
|
486
|
+
}
|
|
487
|
+
],
|
|
488
|
+
"closure": {
|
|
489
|
+
"classificationMode": "closed-world",
|
|
490
|
+
"unclassifiedEntrypointsPolicy": "fail",
|
|
491
|
+
"reachableSurfaceSource": "This file plus package.json#exports, docs/MAP.md, registry.json, standards.json, and Buildchain witness files."
|
|
492
|
+
}
|
|
493
|
+
},
|
|
494
|
+
"participantProfiles": [
|
|
495
|
+
"human-reader",
|
|
496
|
+
"agent-reader",
|
|
497
|
+
"maintainer",
|
|
498
|
+
"package-consumer",
|
|
499
|
+
"site-consumer",
|
|
500
|
+
"release-system"
|
|
501
|
+
],
|
|
502
|
+
"surfaces": [
|
|
503
|
+
{
|
|
504
|
+
"id": "readme",
|
|
505
|
+
"name": "readme",
|
|
506
|
+
"kind": "markdown-doc",
|
|
507
|
+
"participantProfile": "human-reader,agent-reader",
|
|
508
|
+
"availability": "stable",
|
|
509
|
+
"visibility": "public",
|
|
510
|
+
"participantFacing": true,
|
|
511
|
+
"public": true,
|
|
512
|
+
"sourcePath": "README.md"
|
|
513
|
+
},
|
|
514
|
+
{
|
|
515
|
+
"id": "docs-map",
|
|
516
|
+
"name": "docs-map",
|
|
517
|
+
"kind": "markdown-doc",
|
|
518
|
+
"participantProfile": "human-reader,agent-reader,maintainer",
|
|
519
|
+
"availability": "stable",
|
|
520
|
+
"visibility": "public",
|
|
521
|
+
"participantFacing": true,
|
|
522
|
+
"public": true,
|
|
523
|
+
"sourcePath": "docs/MAP.md"
|
|
524
|
+
},
|
|
525
|
+
{
|
|
526
|
+
"id": "official-status-and-trademarks",
|
|
527
|
+
"name": "official-status-and-trademarks",
|
|
528
|
+
"kind": "markdown-doc",
|
|
529
|
+
"participantProfile": "human-reader,agent-reader,package-consumer",
|
|
530
|
+
"availability": "stable",
|
|
531
|
+
"visibility": "public",
|
|
532
|
+
"participantFacing": true,
|
|
533
|
+
"public": true,
|
|
534
|
+
"sourcePath": "TRADEMARKS.md"
|
|
535
|
+
},
|
|
536
|
+
{
|
|
537
|
+
"id": "decision-texts",
|
|
538
|
+
"name": "decision-texts",
|
|
539
|
+
"kind": "markdown-doc",
|
|
540
|
+
"participantProfile": "human-reader,agent-reader,maintainer",
|
|
541
|
+
"availability": "stable",
|
|
542
|
+
"visibility": "public",
|
|
543
|
+
"participantFacing": true,
|
|
544
|
+
"public": true,
|
|
545
|
+
"sourcePath": "decisions/*.md"
|
|
546
|
+
},
|
|
547
|
+
{
|
|
548
|
+
"id": "registry-json",
|
|
549
|
+
"name": "registry-json",
|
|
550
|
+
"kind": "json-api",
|
|
551
|
+
"participantProfile": "agent-reader,package-consumer,site-consumer",
|
|
552
|
+
"availability": "stable",
|
|
553
|
+
"visibility": "public",
|
|
554
|
+
"participantFacing": true,
|
|
555
|
+
"public": true,
|
|
556
|
+
"sourcePath": "registry.json"
|
|
557
|
+
},
|
|
558
|
+
{
|
|
559
|
+
"id": "standards-json",
|
|
560
|
+
"name": "standards-json",
|
|
561
|
+
"kind": "json-api",
|
|
562
|
+
"participantProfile": "agent-reader,package-consumer,release-system",
|
|
563
|
+
"availability": "stable",
|
|
564
|
+
"visibility": "public",
|
|
565
|
+
"participantFacing": true,
|
|
566
|
+
"public": true,
|
|
567
|
+
"sourcePath": "standards.json"
|
|
568
|
+
},
|
|
569
|
+
{
|
|
570
|
+
"id": "schemas",
|
|
571
|
+
"name": "schemas",
|
|
572
|
+
"kind": "json-api",
|
|
573
|
+
"participantProfile": "agent-reader,package-consumer,release-system",
|
|
574
|
+
"availability": "stable",
|
|
575
|
+
"visibility": "public",
|
|
576
|
+
"participantFacing": true,
|
|
577
|
+
"public": true,
|
|
578
|
+
"sourcePath": "schemas/**/*.json"
|
|
579
|
+
},
|
|
580
|
+
{
|
|
581
|
+
"id": "package-exports",
|
|
582
|
+
"name": "package-exports",
|
|
583
|
+
"kind": "package",
|
|
584
|
+
"participantProfile": "package-consumer,agent-reader",
|
|
585
|
+
"availability": "stable",
|
|
586
|
+
"visibility": "public",
|
|
587
|
+
"participantFacing": true,
|
|
588
|
+
"public": true,
|
|
589
|
+
"sourcePath": "package.json#exports"
|
|
590
|
+
},
|
|
591
|
+
{
|
|
592
|
+
"id": "site-bundle-json",
|
|
593
|
+
"name": "site-bundle-json",
|
|
594
|
+
"kind": "json-api",
|
|
595
|
+
"participantProfile": "site-consumer,agent-reader",
|
|
596
|
+
"availability": "stable",
|
|
597
|
+
"visibility": "public",
|
|
598
|
+
"participantFacing": true,
|
|
599
|
+
"public": true,
|
|
600
|
+
"sourcePath": "site/kfd-site.json"
|
|
601
|
+
},
|
|
602
|
+
{
|
|
603
|
+
"id": "release-impact-json",
|
|
604
|
+
"name": "release-impact-json",
|
|
605
|
+
"kind": "json-api",
|
|
606
|
+
"participantProfile": "release-system,maintainer,agent-reader",
|
|
607
|
+
"availability": "stable",
|
|
608
|
+
"visibility": "public",
|
|
609
|
+
"participantFacing": true,
|
|
610
|
+
"public": true,
|
|
611
|
+
"sourcePath": "release-impact.json"
|
|
612
|
+
},
|
|
613
|
+
{
|
|
614
|
+
"id": "release-anchor-json",
|
|
615
|
+
"name": "release-anchor-json",
|
|
616
|
+
"kind": "json-api",
|
|
617
|
+
"participantProfile": "release-system,agent-reader,maintainer",
|
|
618
|
+
"availability": "stable",
|
|
619
|
+
"visibility": "public",
|
|
620
|
+
"participantFacing": true,
|
|
621
|
+
"public": true,
|
|
622
|
+
"sourcePath": "kfd.release.json"
|
|
623
|
+
},
|
|
624
|
+
{
|
|
625
|
+
"id": "release-propagation-json",
|
|
626
|
+
"name": "release-propagation-json",
|
|
627
|
+
"kind": "json-api",
|
|
628
|
+
"participantProfile": "release-system,site-consumer",
|
|
629
|
+
"availability": "stable",
|
|
630
|
+
"visibility": "public",
|
|
631
|
+
"participantFacing": true,
|
|
632
|
+
"public": true,
|
|
633
|
+
"sourcePath": "buildchain.release-propagation.json"
|
|
634
|
+
},
|
|
635
|
+
{
|
|
636
|
+
"id": "kfd-1-witness",
|
|
637
|
+
"name": "kfd-1-witness",
|
|
638
|
+
"kind": "json-api",
|
|
639
|
+
"participantProfile": "release-system,maintainer,agent-reader",
|
|
640
|
+
"availability": "stable",
|
|
641
|
+
"visibility": "public",
|
|
642
|
+
"participantFacing": true,
|
|
643
|
+
"public": true,
|
|
644
|
+
"sourcePath": ".buildchain/kfd-1/contract-world.witness.json"
|
|
645
|
+
},
|
|
646
|
+
{
|
|
647
|
+
"id": "kfd-2-public-release-trust-claim",
|
|
648
|
+
"name": "kfd-2-public-release-trust-claim",
|
|
649
|
+
"kind": "json-api",
|
|
650
|
+
"participantProfile": "release-system,maintainer,agent-reader,package-consumer",
|
|
651
|
+
"availability": "stable",
|
|
652
|
+
"visibility": "public",
|
|
653
|
+
"participantFacing": true,
|
|
654
|
+
"public": true,
|
|
655
|
+
"sourcePath": ".buildchain/kfd-2/public-release-trust.claim.json"
|
|
656
|
+
},
|
|
657
|
+
{
|
|
658
|
+
"id": "kfd-3-self-witnesses",
|
|
659
|
+
"name": "kfd-3-self-witnesses",
|
|
660
|
+
"kind": "json-api",
|
|
661
|
+
"participantProfile": "release-system,maintainer,agent-reader",
|
|
662
|
+
"availability": "stable",
|
|
663
|
+
"visibility": "public",
|
|
664
|
+
"participantFacing": true,
|
|
665
|
+
"public": true,
|
|
666
|
+
"sourcePath": ".buildchain/kfd-3/*.json"
|
|
667
|
+
},
|
|
668
|
+
{
|
|
669
|
+
"id": "release-workflows",
|
|
670
|
+
"name": "release-workflows",
|
|
671
|
+
"kind": "config",
|
|
672
|
+
"participantProfile": "release-system,maintainer",
|
|
673
|
+
"availability": "stable",
|
|
674
|
+
"visibility": "public",
|
|
675
|
+
"participantFacing": true,
|
|
676
|
+
"public": true,
|
|
677
|
+
"sourcePath": ".github/workflows/*.yml"
|
|
678
|
+
},
|
|
679
|
+
{
|
|
680
|
+
"id": "registry",
|
|
681
|
+
"name": "registry",
|
|
682
|
+
"kind": "entrypoint",
|
|
683
|
+
"participantProfile": "agent-reader,package-consumer,site-consumer",
|
|
684
|
+
"availability": "shipped",
|
|
685
|
+
"visibility": "public",
|
|
686
|
+
"participantFacing": true,
|
|
687
|
+
"public": true,
|
|
688
|
+
"sourcePath": "registry.json"
|
|
689
|
+
},
|
|
690
|
+
{
|
|
691
|
+
"id": "standards",
|
|
692
|
+
"name": "standards",
|
|
693
|
+
"kind": "entrypoint",
|
|
694
|
+
"participantProfile": "agent-reader,package-consumer,release-system",
|
|
695
|
+
"availability": "shipped",
|
|
696
|
+
"visibility": "public",
|
|
697
|
+
"participantFacing": true,
|
|
698
|
+
"public": true,
|
|
699
|
+
"sourcePath": "standards.json"
|
|
700
|
+
},
|
|
701
|
+
{
|
|
702
|
+
"id": "release-anchor",
|
|
703
|
+
"name": "release-anchor",
|
|
704
|
+
"kind": "entrypoint",
|
|
705
|
+
"participantProfile": "release-system,agent-reader",
|
|
706
|
+
"availability": "shipped",
|
|
707
|
+
"visibility": "public",
|
|
708
|
+
"participantFacing": true,
|
|
709
|
+
"public": true,
|
|
710
|
+
"sourcePath": "kfd.release.json"
|
|
711
|
+
},
|
|
712
|
+
{
|
|
713
|
+
"id": "site-bundle",
|
|
714
|
+
"name": "site-bundle",
|
|
715
|
+
"kind": "entrypoint",
|
|
716
|
+
"participantProfile": "site-consumer,agent-reader",
|
|
717
|
+
"availability": "shipped",
|
|
718
|
+
"visibility": "public",
|
|
719
|
+
"participantFacing": true,
|
|
720
|
+
"public": true,
|
|
721
|
+
"sourcePath": "site/kfd-site.json"
|
|
722
|
+
}
|
|
723
|
+
],
|
|
724
|
+
"docs": [
|
|
725
|
+
{
|
|
726
|
+
"id": "doc:readme",
|
|
727
|
+
"sourcePath": "README.md",
|
|
728
|
+
"sha256": "25d733aa98a62dad100df10b9a3393364442f0cd06c2daab08e4a99471dd447b"
|
|
729
|
+
},
|
|
730
|
+
{
|
|
731
|
+
"id": "doc:trademarks",
|
|
732
|
+
"sourcePath": "TRADEMARKS.md",
|
|
733
|
+
"sha256": "c59e3e936c2a0f2e3598fc7f8977c734dfc1c23df506c8c8360eb39e8e2ee3e1"
|
|
734
|
+
},
|
|
735
|
+
{
|
|
736
|
+
"id": "doc:docs-map",
|
|
737
|
+
"sourcePath": "docs/MAP.md",
|
|
738
|
+
"sha256": "c53b0d7bdc83c7e7c335e4aa23f54a76c9874908ea4d9e5d7861be3b0875bd8d"
|
|
739
|
+
},
|
|
740
|
+
{
|
|
741
|
+
"id": "doc:kfd-2-release-trust",
|
|
742
|
+
"sourcePath": "docs/kfd-2-release-trust.md",
|
|
743
|
+
"sha256": "9ba323334750cf285f08de21286f58c04b872189febf38a4e8fd50c0791020b3"
|
|
744
|
+
},
|
|
745
|
+
{
|
|
746
|
+
"id": "doc:kfd-3-collaboration-interface",
|
|
747
|
+
"sourcePath": "docs/kfd-3-collaboration-interface.md",
|
|
748
|
+
"sha256": "d483ff6f8423a2e3f8e5dc547b62139d5c365678f9974d62063f8b523f14edb0"
|
|
749
|
+
},
|
|
750
|
+
{
|
|
751
|
+
"id": "decision:kfd-1",
|
|
752
|
+
"sourcePath": "decisions/kfd-1.md",
|
|
753
|
+
"sha256": "32016c0962edcea9286db04ba24dab6c55400e9b26ce16a9d4b4ad647e17e7df"
|
|
754
|
+
},
|
|
755
|
+
{
|
|
756
|
+
"id": "decision:kfd-2",
|
|
757
|
+
"sourcePath": "decisions/kfd-2.md",
|
|
758
|
+
"sha256": "0c2da2113df6ef2829592f7ba67593059cb06e195ea527ee742501939efb3b9b"
|
|
759
|
+
},
|
|
760
|
+
{
|
|
761
|
+
"id": "decision:kfd-3",
|
|
762
|
+
"sourcePath": "decisions/kfd-3.md",
|
|
763
|
+
"sha256": "f37320562b6d82630358663acc239a3ee84bdc930b287c6cb0b2fb0295110672"
|
|
764
|
+
}
|
|
765
|
+
],
|
|
766
|
+
"schemas": [
|
|
767
|
+
{
|
|
768
|
+
"id": "schema:kfd-standards",
|
|
769
|
+
"sourcePath": "schemas/kfd-standards.schema.json",
|
|
770
|
+
"sha256": "2ecc7049d13463700f143f4e8c40488d6587484c94d26e827c239eeedc892336"
|
|
771
|
+
},
|
|
772
|
+
{
|
|
773
|
+
"id": "schema:kfd-1:contract-world",
|
|
774
|
+
"sourcePath": "schemas/kfd-1/contract-world.schema.json",
|
|
775
|
+
"sha256": "6be00cca75c80bf96429eb62336989d8931ea380d86388fcb8b834dcf8d3c13b"
|
|
776
|
+
},
|
|
777
|
+
{
|
|
778
|
+
"id": "schema:kfd-1:witness",
|
|
779
|
+
"sourcePath": "schemas/kfd-1/witness.schema.json",
|
|
780
|
+
"sha256": "50104a2962cb75cc1da634fa65553e993f87d8fb9b3c237f0609a2208ad4c1f3"
|
|
781
|
+
},
|
|
782
|
+
{
|
|
783
|
+
"id": "schema:kfd-2:trust-taxonomy",
|
|
784
|
+
"sourcePath": "schemas/kfd-2/trust-taxonomy.schema.json",
|
|
785
|
+
"sha256": "a663d301a663cadb8567e3010361f5a630b76b6518ed7603dfd58cbd4e64a658"
|
|
786
|
+
},
|
|
787
|
+
{
|
|
788
|
+
"id": "schema:kfd-2:release-claims",
|
|
789
|
+
"sourcePath": "schemas/kfd-2/release-claims.schema.json",
|
|
790
|
+
"sha256": "0f52c4a9949f62163a0fbe14fefc2f2f93f548ae18b6b5c07eb87aedca4c0be0"
|
|
791
|
+
},
|
|
792
|
+
{
|
|
793
|
+
"id": "schema:kfd-2:release-trust-passport",
|
|
794
|
+
"sourcePath": "schemas/kfd-2/release-trust-passport.schema.json",
|
|
795
|
+
"sha256": "df7f828605f680f3ff52fe3468cbf8f5e20151fac0d5c31cd9a0de9765efecc1"
|
|
796
|
+
},
|
|
797
|
+
{
|
|
798
|
+
"id": "schema:kfd-3:collaboration-interface",
|
|
799
|
+
"sourcePath": "schemas/kfd-3/collaboration-interface.schema.json",
|
|
800
|
+
"sha256": "e8d1f67914751b956c5a075eddbcc1ba482ddd21ce7298ab3a8b9df359a0ae44"
|
|
801
|
+
},
|
|
802
|
+
{
|
|
803
|
+
"id": "schema:kfd-3:witness",
|
|
804
|
+
"sourcePath": "schemas/kfd-3/witness.schema.json",
|
|
805
|
+
"sha256": "95c25c7967e5d40a2aa2312e3cdfe984ce00e85db2457a370ce3d863cfa82c84"
|
|
806
|
+
}
|
|
807
|
+
],
|
|
808
|
+
"standardsMetadata": [
|
|
809
|
+
{
|
|
810
|
+
"id": "metadata:registry",
|
|
811
|
+
"sourcePath": "registry.json",
|
|
812
|
+
"sha256": "f58ec6929da6a5daada78265b937b9d0aebec7cbfb42325b279bb6ae77df830f"
|
|
813
|
+
},
|
|
814
|
+
{
|
|
815
|
+
"id": "metadata:standards",
|
|
816
|
+
"sourcePath": "standards.json",
|
|
817
|
+
"sha256": "7ac1410e182f5e66e5723c46f914ab652b2b4fad5b8fe5411172230c9ef146fc"
|
|
818
|
+
},
|
|
819
|
+
{
|
|
820
|
+
"id": "metadata:release-impact",
|
|
821
|
+
"sourcePath": "release-impact.json",
|
|
822
|
+
"sha256": "ae55c7758d53f7e57593e0ddec72142babd9a8ff7c9003e98f8b468b953e0d7e"
|
|
823
|
+
},
|
|
824
|
+
{
|
|
825
|
+
"id": "metadata:release-anchor",
|
|
826
|
+
"sourcePath": "kfd.release.json",
|
|
827
|
+
"sha256": "fefebbaaac172609ce0a22b505d15556739c89971e7fdac2c9ef3c4ca4776a68"
|
|
828
|
+
},
|
|
829
|
+
{
|
|
830
|
+
"id": "metadata:kfd-2-public-release-trust-claim",
|
|
831
|
+
"sourcePath": ".buildchain/kfd-2/public-release-trust.claim.json",
|
|
832
|
+
"sha256": "71986f6fd5d73a1fd74c1b6b68bcf6fe16bf67c2cea9cb3595bdbeebee10182c"
|
|
833
|
+
}
|
|
834
|
+
],
|
|
835
|
+
"packageExports": [
|
|
836
|
+
{
|
|
837
|
+
"id": "export:package-json",
|
|
838
|
+
"sourcePath": "package.json#exports",
|
|
839
|
+
"sha256": "c082af3754b3b382219e8fb1973a228f0f38ab8846178ade639488be2626cdb6"
|
|
840
|
+
},
|
|
841
|
+
{
|
|
842
|
+
"id": "export:npm-files",
|
|
843
|
+
"sourcePath": "package.json#files",
|
|
844
|
+
"sha256": "c082af3754b3b382219e8fb1973a228f0f38ab8846178ade639488be2626cdb6"
|
|
845
|
+
}
|
|
846
|
+
],
|
|
847
|
+
"siteConsumptionContracts": [
|
|
848
|
+
{
|
|
849
|
+
"id": "site:kfd-site-bundle",
|
|
850
|
+
"sourcePath": "site/kfd-site.json",
|
|
851
|
+
"sha256": "cb837c81d6fe02700528c5111558597225414c0c4fd9ab7279c94c61a3b4390c"
|
|
852
|
+
},
|
|
853
|
+
{
|
|
854
|
+
"id": "site:release-propagation",
|
|
855
|
+
"sourcePath": "buildchain.release-propagation.json",
|
|
856
|
+
"sha256": "71f9b54b9e76111178635804615fb0b4600f3131a7871b7c7817395b708c6fb3"
|
|
857
|
+
}
|
|
858
|
+
],
|
|
859
|
+
"auditBoundary": {
|
|
860
|
+
"mode": "closed-world",
|
|
861
|
+
"scope": "KFD participant-facing public collaboration/control surfaces shipped in the repository and npm package",
|
|
862
|
+
"reachableSurfaceMode": "declared-boundary",
|
|
863
|
+
"unclassifiedPolicy": "fail",
|
|
864
|
+
"nonExhaustivelyEnumerableSurfaces": [
|
|
865
|
+
{
|
|
866
|
+
"id": "human-language-interpretation",
|
|
867
|
+
"definedBy": "https://kfd.libkungfu.dev/schemas/kfd-2/trust-taxonomy.schema.json#/$defs/residualRisk",
|
|
868
|
+
"riskType": "natural-language-semantic-risk",
|
|
869
|
+
"trustImpact": "downgrade-warning",
|
|
870
|
+
"machineProvability": "not-exhaustively-enumerable",
|
|
871
|
+
"agentAction": "semantic-review-required",
|
|
872
|
+
"reason": "Natural-language standard interpretation is inspectable and reviewable but not exhaustively enumerable from package bytes.",
|
|
873
|
+
"owner": "KFD maintainers"
|
|
874
|
+
}
|
|
875
|
+
]
|
|
876
|
+
},
|
|
877
|
+
"residualRisk": [
|
|
878
|
+
{
|
|
879
|
+
"id": "human-language-interpretation",
|
|
880
|
+
"definedBy": "https://kfd.libkungfu.dev/schemas/kfd-2/trust-taxonomy.schema.json#/$defs/residualRisk",
|
|
881
|
+
"riskType": "natural-language-semantic-risk",
|
|
882
|
+
"trustImpact": "downgrade-warning",
|
|
883
|
+
"machineProvability": "not-exhaustively-enumerable",
|
|
884
|
+
"agentAction": "semantic-review-required",
|
|
885
|
+
"reason": "Natural-language standard interpretation is inspectable and reviewable but not exhaustively enumerable from package bytes.",
|
|
886
|
+
"owner": "KFD maintainers"
|
|
887
|
+
}
|
|
888
|
+
],
|
|
889
|
+
"responsibility": {
|
|
890
|
+
"registryFactsOwner": "KFD maintainers",
|
|
891
|
+
"artifactVerificationOwner": "KFD package self-verification",
|
|
892
|
+
"releasePassportProofOwner": "Buildchain"
|
|
893
|
+
},
|
|
894
|
+
"expectedArtifactVerification": {
|
|
895
|
+
"command": "node scripts/check.mjs"
|
|
896
|
+
}
|
|
897
|
+
}
|