@kungfu-tech/kfd 1.0.0-alpha.20 → 1.0.0-alpha.22
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 +55 -34
- package/.buildchain/kfd-2/kfd-foundation.trust-assessment.json +12 -12
- package/.buildchain/kfd-2/kfd-foundation.trust-claims.json +12 -12
- package/.buildchain/kfd-2/public-release-trust.claim.json +14 -14
- package/.buildchain/kfd-3/collaboration-interface.artifact.json +52 -52
- package/.buildchain/kfd-3/collaboration-interface.prebuild.json +16 -16
- package/README.md +10 -3
- package/decisions/KFD-1.md +29 -2
- package/decisions/KFD-4.md +27 -0
- package/docs/KFD-1-usage.md +42 -0
- package/docs/KFD-4-usage.md +14 -0
- package/docs/MAP.md +1 -0
- package/kfd.release.json +1 -1
- package/package.json +1 -1
- package/release-impact.json +9 -3
- package/schemas/kfd-1/publication-url-semantics.schema.json +255 -0
- package/schemas/kfd-4/observer-perspective.schema.json +28 -0
- package/scripts/check.mjs +32 -3
- package/scripts/update-kfd-2-claim.mjs +3 -3
- package/site/kfd-site.json +3 -3
- package/standards.json +39 -5
package/docs/KFD-1-usage.md
CHANGED
|
@@ -12,6 +12,9 @@ The KFD package implements KFD-1 through a declared contract world:
|
|
|
12
12
|
surface register.
|
|
13
13
|
- `schemas/kfd-1/contract-world.schema.json` defines the contract-world schema.
|
|
14
14
|
- `schemas/kfd-1/witness.schema.json` defines the witness schema.
|
|
15
|
+
- `schemas/kfd-1/publication-url-semantics.schema.json` defines the
|
|
16
|
+
canonical/latest/immutable publication URL contract for papers,
|
|
17
|
+
specifications, release notes, and other long-lived publication artifacts.
|
|
15
18
|
- `.buildchain/kfd-1/contract-world.witness.json` projects registered surfaces,
|
|
16
19
|
source hashes, artifact hashes, surface classes, and impact projections.
|
|
17
20
|
- `scripts/check.mjs` verifies the register, schema enums, witness hashes, and
|
|
@@ -30,6 +33,45 @@ Release versioning is only one projection of those classes. Other domains can
|
|
|
30
33
|
project the same core into config migration, ABI epochs, API namespaces,
|
|
31
34
|
runtime compatibility bridges, or workflow gates.
|
|
32
35
|
|
|
36
|
+
## Publication URL Semantics
|
|
37
|
+
|
|
38
|
+
Publication artifacts frequently need both mutable and immutable routes. A
|
|
39
|
+
canonical reader page may remain stable while its content is updated to point
|
|
40
|
+
at the latest recommended version. A versioned PDF, source bundle, release
|
|
41
|
+
passport, publication registry entry, or site bundle is different: once
|
|
42
|
+
published, the versioned URL and digest are facts that downstream readers,
|
|
43
|
+
agents, release passports, citations, and audits may weld to.
|
|
44
|
+
|
|
45
|
+
The KFD-1 publication URL schema gives Buildchain and site repositories a
|
|
46
|
+
shared vocabulary:
|
|
47
|
+
|
|
48
|
+
- `canonicalUrl`: stable reader entrypoint; it may display the latest
|
|
49
|
+
recommended version.
|
|
50
|
+
- `latestUrl`: mutable latest alias or evidence entrypoint; it may move when a
|
|
51
|
+
new version is published.
|
|
52
|
+
- `immutableVersionBaseUrl`: version-addressed archive prefix; its published
|
|
53
|
+
artifacts must not change content.
|
|
54
|
+
- `immutableArtifacts[]`: digest-bound artifacts such as PDF, source bundle,
|
|
55
|
+
release passport, site bundle, or publication registry entry.
|
|
56
|
+
- `sourceCoordinate`: repository commit, tag, source bundle, release passport,
|
|
57
|
+
or equivalent coordinate for the source fact.
|
|
58
|
+
- `archivePolicy`: the rule that same-version digest drift fails, destructive
|
|
59
|
+
sync must not cover immutable prefixes, and site builds must preserve
|
|
60
|
+
declared historical versions.
|
|
61
|
+
|
|
62
|
+
KFD does not choose bucket names, CDN providers, product slugs, or exact route
|
|
63
|
+
layout. Concrete packages declare those facts in their own site bundle or
|
|
64
|
+
Buildchain release metadata. KFD owns the route semantics so those facts can be
|
|
65
|
+
validated consistently.
|
|
66
|
+
|
|
67
|
+
This connects the foundation triad:
|
|
68
|
+
|
|
69
|
+
- KFD-1: the immutable artifact URL and digest must not drift.
|
|
70
|
+
- KFD-2: trust in the publication starts from version, digest, source
|
|
71
|
+
coordinate, release passport, and archive location.
|
|
72
|
+
- KFD-3: site renderers and agents should see the route facts instead of
|
|
73
|
+
reverse-engineering or forking them locally.
|
|
74
|
+
|
|
33
75
|
## Dogfood Role
|
|
34
76
|
|
|
35
77
|
This package uses KFD-1 on itself. New public package surfaces should be added
|
package/docs/KFD-4-usage.md
CHANGED
|
@@ -23,9 +23,23 @@ Use KFD-4 when a product surface represents time, history, replay, sync,
|
|
|
23
23
|
ordering, or mixed-source work state. A product that does not present a
|
|
24
24
|
perspective-bearing timeline does not need a KFD-4 gate.
|
|
25
25
|
|
|
26
|
+
The gate is about the view's declared perspective. A product may pass the KFD-4
|
|
27
|
+
interface boundary by exposing view-subject, observer, accepted-fact,
|
|
28
|
+
projection-policy, causal-constraint, degraded-evidence, and verification
|
|
29
|
+
metadata. That package or product still needs separate evidence for any
|
|
30
|
+
stronger claim, such as
|
|
31
|
+
"this adapter captured every remote event" or "this product timeline is
|
|
32
|
+
complete and correct."
|
|
33
|
+
|
|
26
34
|
## Trust Relation
|
|
27
35
|
|
|
28
36
|
KFD-4 claims can be assessed by KFD-2. The KFD package does this through
|
|
29
37
|
`.buildchain/kfd-2/kfd-foundation.trust-claims.json` and
|
|
30
38
|
`.buildchain/kfd-2/kfd-foundation.trust-assessment.json`, where KFD-4 is
|
|
31
39
|
assessed as an `observer-perspective` subject.
|
|
40
|
+
|
|
41
|
+
The KFD package's own KFD-2 assessment proves the package-level interface
|
|
42
|
+
surface: decision text, standards metadata, schema, and self-check wiring. It
|
|
43
|
+
does not transfer trust to an adopter's runtime timeline. Adopters should make
|
|
44
|
+
their own KFD-2 claim or release passport when they want users or agents to
|
|
45
|
+
trust a concrete timeline implementation.
|
package/docs/MAP.md
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
| How should a product show timeline order from a declared perspective? | [KFD-4](../decisions/KFD-4.md) |
|
|
10
10
|
| What schema should products use for KFD-4 observer-relative timeline views? | [`../schemas/kfd-4/observer-perspective.schema.json`](../schemas/kfd-4/observer-perspective.schema.json) |
|
|
11
11
|
| What are the package implementation notes for KFD-1? | [`KFD-1-usage.md`](KFD-1-usage.md) |
|
|
12
|
+
| What schema should papers, specifications, or sites use for canonical/latest/immutable publication URL semantics? | [`../schemas/kfd-1/publication-url-semantics.schema.json`](../schemas/kfd-1/publication-url-semantics.schema.json) and [`KFD-1-usage.md`](KFD-1-usage.md#publication-url-semantics) |
|
|
12
13
|
| What are the package implementation notes for KFD-2? | [`KFD-2-usage.md`](KFD-2-usage.md) |
|
|
13
14
|
| What are the package implementation notes for KFD-3? | [`KFD-3-usage.md`](KFD-3-usage.md) |
|
|
14
15
|
| What are the package implementation notes for KFD-4? | [`KFD-4-usage.md`](KFD-4-usage.md) |
|
package/kfd.release.json
CHANGED
package/package.json
CHANGED
package/release-impact.json
CHANGED
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
},
|
|
9
9
|
"versionImpact": {
|
|
10
10
|
"final": "minor",
|
|
11
|
-
"source": "kfd-
|
|
12
|
-
"rationale": "This change additively exposes
|
|
11
|
+
"source": "kfd-1-publication-url-semantics",
|
|
12
|
+
"rationale": "This change additively exposes KFD-1 publication URL semantics for canonical/latest/immutable publication routes, while preserving existing registry, package, and schemaVersion 1 compatibility."
|
|
13
13
|
},
|
|
14
14
|
"surfaceImpacts": [
|
|
15
15
|
{
|
|
@@ -107,7 +107,13 @@
|
|
|
107
107
|
"impact": "minor",
|
|
108
108
|
"class": "additive",
|
|
109
109
|
"rationale": "standards.json now publishes the KFD package surface register as the KFD-1 fact source, and the KFD-1 witness projects each registered surface class and impact projection from that fact source."
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"id": "kfd-1-publication-url-semantics",
|
|
113
|
+
"impact": "minor",
|
|
114
|
+
"class": "additive",
|
|
115
|
+
"rationale": "KFD-1 now publishes a machine-readable schema for canonical reader URLs, latest aliases, immutable version artifact URLs, artifact digests, source coordinates, lineage, site consumption, and archive policies that prevent same-version digest drift or destructive deletion of immutable publication prefixes."
|
|
110
116
|
}
|
|
111
117
|
],
|
|
112
|
-
"summary": "KFD v1.0 production promotion is minor-impact because it additively exposes
|
|
118
|
+
"summary": "KFD v1.0 production promotion is minor-impact because it additively exposes publication URL semantics and related machine metadata while preserving existing package and schemaVersion 1 compatibility."
|
|
113
119
|
}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://kfd.libkungfu.dev/schemas/kfd-1/publication-url-semantics.schema.json",
|
|
4
|
+
"title": "KFD-1 publication URL semantics",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": [
|
|
7
|
+
"schemaVersion",
|
|
8
|
+
"contract",
|
|
9
|
+
"standard",
|
|
10
|
+
"publication",
|
|
11
|
+
"routes",
|
|
12
|
+
"immutableArtifacts",
|
|
13
|
+
"archivePolicy"
|
|
14
|
+
],
|
|
15
|
+
"properties": {
|
|
16
|
+
"schemaVersion": {
|
|
17
|
+
"const": 1
|
|
18
|
+
},
|
|
19
|
+
"contract": {
|
|
20
|
+
"const": "kfd-1-publication-url-semantics"
|
|
21
|
+
},
|
|
22
|
+
"standard": {
|
|
23
|
+
"const": "kfd-1"
|
|
24
|
+
},
|
|
25
|
+
"publication": {
|
|
26
|
+
"$ref": "#/$defs/publication"
|
|
27
|
+
},
|
|
28
|
+
"routes": {
|
|
29
|
+
"$ref": "#/$defs/routes"
|
|
30
|
+
},
|
|
31
|
+
"immutableArtifacts": {
|
|
32
|
+
"type": "array",
|
|
33
|
+
"items": {
|
|
34
|
+
"$ref": "#/$defs/immutableArtifact"
|
|
35
|
+
},
|
|
36
|
+
"minItems": 1
|
|
37
|
+
},
|
|
38
|
+
"archivePolicy": {
|
|
39
|
+
"$ref": "#/$defs/archivePolicy"
|
|
40
|
+
},
|
|
41
|
+
"lineage": {
|
|
42
|
+
"$ref": "#/$defs/lineage"
|
|
43
|
+
},
|
|
44
|
+
"siteConsumption": {
|
|
45
|
+
"$ref": "#/$defs/siteConsumption"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"additionalProperties": false,
|
|
49
|
+
"$defs": {
|
|
50
|
+
"uri": {
|
|
51
|
+
"type": "string",
|
|
52
|
+
"format": "uri"
|
|
53
|
+
},
|
|
54
|
+
"digest": {
|
|
55
|
+
"type": "string",
|
|
56
|
+
"pattern": "^[0-9a-f]{64}$"
|
|
57
|
+
},
|
|
58
|
+
"publication": {
|
|
59
|
+
"type": "object",
|
|
60
|
+
"required": [
|
|
61
|
+
"id",
|
|
62
|
+
"version",
|
|
63
|
+
"sourceCoordinate"
|
|
64
|
+
],
|
|
65
|
+
"properties": {
|
|
66
|
+
"id": {
|
|
67
|
+
"type": "string",
|
|
68
|
+
"pattern": "^[a-z0-9]+(-[a-z0-9]+)*$"
|
|
69
|
+
},
|
|
70
|
+
"title": {
|
|
71
|
+
"type": "string",
|
|
72
|
+
"minLength": 1
|
|
73
|
+
},
|
|
74
|
+
"version": {
|
|
75
|
+
"type": "string",
|
|
76
|
+
"minLength": 1
|
|
77
|
+
},
|
|
78
|
+
"sourceCoordinate": {
|
|
79
|
+
"$ref": "#/$defs/sourceCoordinate"
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
"additionalProperties": false
|
|
83
|
+
},
|
|
84
|
+
"sourceCoordinate": {
|
|
85
|
+
"type": "object",
|
|
86
|
+
"required": [
|
|
87
|
+
"kind",
|
|
88
|
+
"repository",
|
|
89
|
+
"ref"
|
|
90
|
+
],
|
|
91
|
+
"properties": {
|
|
92
|
+
"kind": {
|
|
93
|
+
"enum": [
|
|
94
|
+
"git-commit",
|
|
95
|
+
"git-tag",
|
|
96
|
+
"source-bundle",
|
|
97
|
+
"release-passport",
|
|
98
|
+
"other"
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
"repository": {
|
|
102
|
+
"type": "string",
|
|
103
|
+
"minLength": 1
|
|
104
|
+
},
|
|
105
|
+
"ref": {
|
|
106
|
+
"type": "string",
|
|
107
|
+
"minLength": 1
|
|
108
|
+
},
|
|
109
|
+
"digest": {
|
|
110
|
+
"$ref": "#/$defs/digest"
|
|
111
|
+
},
|
|
112
|
+
"url": {
|
|
113
|
+
"$ref": "#/$defs/uri"
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
"additionalProperties": false
|
|
117
|
+
},
|
|
118
|
+
"routes": {
|
|
119
|
+
"type": "object",
|
|
120
|
+
"required": [
|
|
121
|
+
"canonicalUrl",
|
|
122
|
+
"immutableVersionBaseUrl"
|
|
123
|
+
],
|
|
124
|
+
"properties": {
|
|
125
|
+
"canonicalUrl": {
|
|
126
|
+
"$ref": "#/$defs/uri",
|
|
127
|
+
"description": "Stable reader entrypoint. It may show the latest recommended version."
|
|
128
|
+
},
|
|
129
|
+
"latestUrl": {
|
|
130
|
+
"$ref": "#/$defs/uri",
|
|
131
|
+
"description": "Mutable latest alias or evidence entrypoint. It may move as new versions are published."
|
|
132
|
+
},
|
|
133
|
+
"evidenceUrl": {
|
|
134
|
+
"$ref": "#/$defs/uri",
|
|
135
|
+
"description": "Reader or agent entrypoint for release evidence."
|
|
136
|
+
},
|
|
137
|
+
"immutableVersionBaseUrl": {
|
|
138
|
+
"$ref": "#/$defs/uri",
|
|
139
|
+
"description": "Version-addressed base URL whose artifact contents must not change after publication."
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
"additionalProperties": false
|
|
143
|
+
},
|
|
144
|
+
"immutableArtifact": {
|
|
145
|
+
"type": "object",
|
|
146
|
+
"required": [
|
|
147
|
+
"id",
|
|
148
|
+
"kind",
|
|
149
|
+
"url",
|
|
150
|
+
"sha256"
|
|
151
|
+
],
|
|
152
|
+
"properties": {
|
|
153
|
+
"id": {
|
|
154
|
+
"type": "string",
|
|
155
|
+
"pattern": "^[a-z0-9]+(-[a-z0-9]+)*$"
|
|
156
|
+
},
|
|
157
|
+
"kind": {
|
|
158
|
+
"enum": [
|
|
159
|
+
"pdf",
|
|
160
|
+
"source-bundle",
|
|
161
|
+
"release-passport",
|
|
162
|
+
"site-bundle",
|
|
163
|
+
"publication-registry",
|
|
164
|
+
"other"
|
|
165
|
+
]
|
|
166
|
+
},
|
|
167
|
+
"url": {
|
|
168
|
+
"$ref": "#/$defs/uri"
|
|
169
|
+
},
|
|
170
|
+
"path": {
|
|
171
|
+
"type": "string",
|
|
172
|
+
"minLength": 1
|
|
173
|
+
},
|
|
174
|
+
"mediaType": {
|
|
175
|
+
"type": "string",
|
|
176
|
+
"minLength": 1
|
|
177
|
+
},
|
|
178
|
+
"sha256": {
|
|
179
|
+
"$ref": "#/$defs/digest"
|
|
180
|
+
},
|
|
181
|
+
"sourceCoordinate": {
|
|
182
|
+
"$ref": "#/$defs/sourceCoordinate"
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
"additionalProperties": false
|
|
186
|
+
},
|
|
187
|
+
"archivePolicy": {
|
|
188
|
+
"type": "object",
|
|
189
|
+
"required": [
|
|
190
|
+
"immutability",
|
|
191
|
+
"sameVersionDigestPolicy",
|
|
192
|
+
"destructiveSyncPolicy",
|
|
193
|
+
"historyRetention"
|
|
194
|
+
],
|
|
195
|
+
"properties": {
|
|
196
|
+
"immutability": {
|
|
197
|
+
"const": "published-version-artifacts-are-append-only"
|
|
198
|
+
},
|
|
199
|
+
"sameVersionDigestPolicy": {
|
|
200
|
+
"const": "fail-on-digest-change"
|
|
201
|
+
},
|
|
202
|
+
"destructiveSyncPolicy": {
|
|
203
|
+
"const": "must-not-delete-immutable-prefix"
|
|
204
|
+
},
|
|
205
|
+
"historyRetention": {
|
|
206
|
+
"const": "site-builds-must-preserve-declared-historical-versions"
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
"additionalProperties": false
|
|
210
|
+
},
|
|
211
|
+
"lineage": {
|
|
212
|
+
"type": "object",
|
|
213
|
+
"properties": {
|
|
214
|
+
"supersedes": {
|
|
215
|
+
"type": "array",
|
|
216
|
+
"items": {
|
|
217
|
+
"type": "string"
|
|
218
|
+
},
|
|
219
|
+
"uniqueItems": true
|
|
220
|
+
},
|
|
221
|
+
"supersededBy": {
|
|
222
|
+
"type": "array",
|
|
223
|
+
"items": {
|
|
224
|
+
"type": "string"
|
|
225
|
+
},
|
|
226
|
+
"uniqueItems": true
|
|
227
|
+
},
|
|
228
|
+
"revisionNote": {
|
|
229
|
+
"type": "string"
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
"additionalProperties": false
|
|
233
|
+
},
|
|
234
|
+
"siteConsumption": {
|
|
235
|
+
"type": "object",
|
|
236
|
+
"required": [
|
|
237
|
+
"latestPackageRole",
|
|
238
|
+
"archiveRole",
|
|
239
|
+
"rendererRole"
|
|
240
|
+
],
|
|
241
|
+
"properties": {
|
|
242
|
+
"latestPackageRole": {
|
|
243
|
+
"const": "may-update-canonical-and-latest-pages"
|
|
244
|
+
},
|
|
245
|
+
"archiveRole": {
|
|
246
|
+
"const": "owns-immutable-version-artifacts"
|
|
247
|
+
},
|
|
248
|
+
"rendererRole": {
|
|
249
|
+
"const": "render-and-link-without-forking-route-facts"
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
"additionalProperties": false
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
@@ -27,6 +27,9 @@
|
|
|
27
27
|
"type": "string",
|
|
28
28
|
"minLength": 1
|
|
29
29
|
},
|
|
30
|
+
"viewSubject": {
|
|
31
|
+
"$ref": "#/$defs/viewSubject"
|
|
32
|
+
},
|
|
30
33
|
"observer": {
|
|
31
34
|
"$ref": "#/$defs/observer"
|
|
32
35
|
},
|
|
@@ -60,6 +63,31 @@
|
|
|
60
63
|
},
|
|
61
64
|
"additionalProperties": false,
|
|
62
65
|
"$defs": {
|
|
66
|
+
"viewSubject": {
|
|
67
|
+
"type": "object",
|
|
68
|
+
"required": [
|
|
69
|
+
"kind",
|
|
70
|
+
"description"
|
|
71
|
+
],
|
|
72
|
+
"properties": {
|
|
73
|
+
"kind": {
|
|
74
|
+
"enum": [
|
|
75
|
+
"timeline",
|
|
76
|
+
"history",
|
|
77
|
+
"replay",
|
|
78
|
+
"sync",
|
|
79
|
+
"ordering",
|
|
80
|
+
"mixed-source-work-state",
|
|
81
|
+
"other"
|
|
82
|
+
]
|
|
83
|
+
},
|
|
84
|
+
"description": {
|
|
85
|
+
"type": "string",
|
|
86
|
+
"minLength": 1
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
"additionalProperties": false
|
|
90
|
+
},
|
|
63
91
|
"observer": {
|
|
64
92
|
"type": "object",
|
|
65
93
|
"required": [
|
package/scripts/check.mjs
CHANGED
|
@@ -273,16 +273,23 @@ if (kfd1?.schemaIds?.contractWorld !== "https://kfd.libkungfu.dev/schemas/kfd-1/
|
|
|
273
273
|
if (kfd1?.schemaIds?.witness !== "https://kfd.libkungfu.dev/schemas/kfd-1/witness.schema.json") {
|
|
274
274
|
fail("KFD-1 standards metadata must expose the canonical witness schema URI");
|
|
275
275
|
}
|
|
276
|
-
|
|
276
|
+
if (kfd1?.schemaIds?.publicationUrlSemantics !== "https://kfd.libkungfu.dev/schemas/kfd-1/publication-url-semantics.schema.json") {
|
|
277
|
+
fail("KFD-1 standards metadata must expose the canonical publicationUrlSemantics schema URI");
|
|
278
|
+
}
|
|
279
|
+
if (kfd1?.schemaPaths?.publicationUrlSemantics !== "schemas/kfd-1/publication-url-semantics.schema.json") {
|
|
280
|
+
fail("KFD-1 standards metadata must expose the publicationUrlSemantics schema path");
|
|
281
|
+
}
|
|
282
|
+
for (const concept of ["factSource", "contractWorld", "weldedSurfaceRegister", "witness", "surfaceClass", "compatibilityImpact", "impactProjection", "publicationUrlSemantics", "canonicalUrl", "latestUrl", "immutableVersionUrl", "immutableArtifact", "archivePolicy", "sourceCoordinate"]) {
|
|
277
283
|
if (!kfd1?.concepts?.[concept]) fail(`KFD-1 standards metadata missing concept ${concept}`);
|
|
278
284
|
}
|
|
279
|
-
for (const iface of ["contractWorld", "witness"]) {
|
|
285
|
+
for (const iface of ["contractWorld", "witness", "publicationUrlSemantics"]) {
|
|
280
286
|
if (!kfd1?.interfaces?.[iface]) fail(`KFD-1 standards metadata missing interface ${iface}`);
|
|
281
287
|
}
|
|
282
288
|
const expectedKfd1SurfaceClasses = ["integration-time", "cross-time"];
|
|
283
289
|
const expectedKfd1ImpactClasses = ["breaking", "additive", "none", "unclassifiable"];
|
|
284
290
|
const kfd1ContractWorldSchema = JSON.parse(readFileSync("schemas/kfd-1/contract-world.schema.json", "utf8"));
|
|
285
291
|
const kfd1WitnessSchema = JSON.parse(readFileSync("schemas/kfd-1/witness.schema.json", "utf8"));
|
|
292
|
+
const kfd1PublicationUrlSemanticsSchema = JSON.parse(readFileSync("schemas/kfd-1/publication-url-semantics.schema.json", "utf8"));
|
|
286
293
|
for (const [schemaName, schemaDoc] of [["contractWorld", kfd1ContractWorldSchema], ["witness", kfd1WitnessSchema]]) {
|
|
287
294
|
requireSameEnum(schemaDoc.$defs?.surfaceClass?.enum, expectedKfd1SurfaceClasses, `KFD-1 ${schemaName} surfaceClass`);
|
|
288
295
|
requireSameEnum(schemaDoc.$defs?.compatibilityImpact?.enum, expectedKfd1ImpactClasses, `KFD-1 ${schemaName} compatibilityImpact`);
|
|
@@ -292,6 +299,27 @@ for (const [schemaName, schemaDoc] of [["contractWorld", kfd1ContractWorldSchema
|
|
|
292
299
|
}
|
|
293
300
|
}
|
|
294
301
|
}
|
|
302
|
+
if (kfd1PublicationUrlSemanticsSchema.properties?.contract?.const !== "kfd-1-publication-url-semantics") {
|
|
303
|
+
fail("KFD-1 publicationUrlSemantics schema must describe the kfd-1-publication-url-semantics contract");
|
|
304
|
+
}
|
|
305
|
+
if (kfd1PublicationUrlSemanticsSchema.properties?.standard?.const !== "kfd-1") {
|
|
306
|
+
fail("KFD-1 publicationUrlSemantics schema must declare standard kfd-1");
|
|
307
|
+
}
|
|
308
|
+
for (const requiredField of ["canonicalUrl", "immutableVersionBaseUrl"]) {
|
|
309
|
+
if (!kfd1PublicationUrlSemanticsSchema.$defs?.routes?.required?.includes(requiredField)) {
|
|
310
|
+
fail(`KFD-1 publicationUrlSemantics routes must require ${requiredField}`);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
for (const [field, expectedConst] of [
|
|
314
|
+
["immutability", "published-version-artifacts-are-append-only"],
|
|
315
|
+
["sameVersionDigestPolicy", "fail-on-digest-change"],
|
|
316
|
+
["destructiveSyncPolicy", "must-not-delete-immutable-prefix"],
|
|
317
|
+
["historyRetention", "site-builds-must-preserve-declared-historical-versions"],
|
|
318
|
+
]) {
|
|
319
|
+
if (kfd1PublicationUrlSemanticsSchema.$defs?.archivePolicy?.properties?.[field]?.const !== expectedConst) {
|
|
320
|
+
fail(`KFD-1 publicationUrlSemantics archivePolicy.${field} must be ${expectedConst}`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
295
323
|
const kfd1SurfaceRegister = kfd1?.surfaceRegister;
|
|
296
324
|
if (kfd1SurfaceRegister?.factSource !== "standards.json#/standards/kfd-1/surfaceRegister") {
|
|
297
325
|
fail("KFD-1 surfaceRegister must declare standards.json as its fact source");
|
|
@@ -494,7 +522,7 @@ const kfd4ObserverPerspectiveSchema = JSON.parse(readFileSync("schemas/kfd-4/obs
|
|
|
494
522
|
if (kfd4ObserverPerspectiveSchema.properties?.contract?.const !== "kfd-4-observer-perspective") {
|
|
495
523
|
fail("KFD-4 observerPerspective schema must describe the kfd-4-observer-perspective contract");
|
|
496
524
|
}
|
|
497
|
-
for (const concept of ["observer", "declaredPerspective", "observerPerspective", "acceptedFacts", "projectionPolicy", "causalDominance", "degradedEvidence", "timeline"]) {
|
|
525
|
+
for (const concept of ["observer", "declaredPerspective", "observerPerspective", "viewSubject", "acceptedFacts", "projectionPolicy", "causalDominance", "degradedEvidence", "timeline"]) {
|
|
498
526
|
if (!kfd4?.concepts?.[concept]) fail(`KFD-4 standards metadata missing concept ${concept}`);
|
|
499
527
|
}
|
|
500
528
|
if (!kfd4?.interfaces?.observerPerspective) fail("KFD-4 standards metadata missing interface observerPerspective");
|
|
@@ -552,6 +580,7 @@ if (!kfd1Witness) {
|
|
|
552
580
|
const witnessedSurfaceNames = new Set(kfd1Witness.surfaces.map((surface) => surface.name));
|
|
553
581
|
for (const requiredSurface of [
|
|
554
582
|
"readme",
|
|
583
|
+
"kfd-1-publication-url-semantics-schema",
|
|
555
584
|
"kfd-2-trust-taxonomy-schema",
|
|
556
585
|
"kfd-2-trust-claims-schema",
|
|
557
586
|
"kfd-2-trust-assessment-schema",
|
|
@@ -200,7 +200,7 @@ const trustClaims = {
|
|
|
200
200
|
{
|
|
201
201
|
id: "kfd-4-observer-perspective-trust",
|
|
202
202
|
statement:
|
|
203
|
-
"KFD-4 is trustable as
|
|
203
|
+
"KFD-4 is trustable as a package-level observer-perspective interface because KFD publishes the schema, standards metadata, decision text, and verification gate for observer-relative timeline views; adopter-specific timeline correctness remains a separate KFD-2 claim.",
|
|
204
204
|
subject: {
|
|
205
205
|
kind: "observer-perspective",
|
|
206
206
|
id: "kfd-4-observer-perspective",
|
|
@@ -215,14 +215,14 @@ const trustClaims = {
|
|
|
215
215
|
evidence: [
|
|
216
216
|
evidence("schema", "schemas/kfd-4/observer-perspective.schema.json", "KFD-4 observer-perspective schema is published."),
|
|
217
217
|
evidence("file", "standards.json", "Standards metadata exposes the KFD-4 schema ID, path, interface version, and concept names."),
|
|
218
|
-
evidence("file", "scripts/check.mjs", "The package check gate validates the KFD-4 schema and standards metadata."),
|
|
218
|
+
evidence("file", "scripts/check.mjs", "The package check gate validates the KFD-4 schema and standards metadata; it does not assess adopter-specific timeline correctness."),
|
|
219
219
|
],
|
|
220
220
|
verification: {
|
|
221
221
|
command: "node scripts/check.mjs",
|
|
222
222
|
expectedResult: "pass",
|
|
223
223
|
},
|
|
224
224
|
auditBoundary: {
|
|
225
|
-
scope: "KFD-4 decision text, observer-perspective schema, standards metadata, and self-verification gate",
|
|
225
|
+
scope: "KFD-4 package decision text, observer-perspective schema, standards metadata, and self-verification gate; excludes adopter runtime timeline correctness",
|
|
226
226
|
enumerability: "closed-world",
|
|
227
227
|
},
|
|
228
228
|
residualRisk: [],
|
package/site/kfd-site.json
CHANGED
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
],
|
|
83
83
|
"explanation": [
|
|
84
84
|
"| Layer | Decision | Reader question | Commitment | |---|---|---|---| | Perspective-bearing views | KFD-4 | How should a product show time, history, replay, sync, or mixed-source work state? | Timelines must declare their observer: a useful view states who is observing, which facts were accepted, and how concurrent facts were projected. |",
|
|
85
|
-
"KFD-4 is the first such guideline. It applies KFD-1/2/3 to the problem of perspective and timeline order. In a multi-machine or multi-agent world, a product should not pretend to own a universal global clock. It should preserve non-drifting facts, make trust start from those facts, and let participants cooperate by exposing the observer, accepted ranges, causal constraints, and projection policy behind the view."
|
|
85
|
+
"KFD-4 is the first such guideline. It applies KFD-1/2/3 to the problem of perspective and timeline order. In a multi-machine or multi-agent world, a product should not pretend to own a universal global clock. It should preserve non-drifting facts, make trust start from those facts, and let participants cooperate by exposing the observer, accepted ranges, causal constraints, and projection policy behind the view. KFD-4 gates perspective-bearing views; it does not claim that importing the KFD-4 schema proves an adopter's concrete timeline implementation is complete or correct."
|
|
86
86
|
]
|
|
87
87
|
},
|
|
88
88
|
"productProofPath": {
|
|
@@ -136,7 +136,7 @@
|
|
|
136
136
|
"homepagePriority": 27,
|
|
137
137
|
"defaultPresentation": "practice-table",
|
|
138
138
|
"includeInFirstScreen": false,
|
|
139
|
-
"markdown": "KFDs after the foundation triad may define practice guidelines: procedures\nthat apply the foundation to a specific class of real-world product behavior.\nThey do not expand the foundation triad; they show how the foundation behaves\nwhen a product must make a concrete kind of reality legible.\n\n| Layer | Decision | Reader question | Commitment |\n|---|---|---|---|\n| Perspective-bearing views | KFD-4 | How should a product show time, history, replay, sync, or mixed-source work state? | Timelines must declare their observer: a useful view states who is observing, which facts were accepted, and how concurrent facts were projected. |\n\nKFD-4 is the first such guideline. It applies KFD-1/2/3 to the problem of\nperspective and timeline order. In a multi-machine or multi-agent world, a\nproduct should not pretend to own a universal global clock. It should preserve\nnon-drifting facts, make trust start from those facts, and let participants\ncooperate by exposing the observer, accepted ranges, causal constraints, and\nprojection policy behind the view."
|
|
139
|
+
"markdown": "KFDs after the foundation triad may define practice guidelines: procedures\nthat apply the foundation to a specific class of real-world product behavior.\nThey do not expand the foundation triad; they show how the foundation behaves\nwhen a product must make a concrete kind of reality legible.\n\n| Layer | Decision | Reader question | Commitment |\n|---|---|---|---|\n| Perspective-bearing views | KFD-4 | How should a product show time, history, replay, sync, or mixed-source work state? | Timelines must declare their observer: a useful view states who is observing, which facts were accepted, and how concurrent facts were projected. |\n\nKFD-4 is the first such guideline. It applies KFD-1/2/3 to the problem of\nperspective and timeline order. In a multi-machine or multi-agent world, a\nproduct should not pretend to own a universal global clock. It should preserve\nnon-drifting facts, make trust start from those facts, and let participants\ncooperate by exposing the observer, accepted ranges, causal constraints, and\nprojection policy behind the view. KFD-4 gates perspective-bearing views; it\ndoes not claim that importing the KFD-4 schema proves an adopter's concrete\ntimeline implementation is complete or correct."
|
|
140
140
|
},
|
|
141
141
|
{
|
|
142
142
|
"id": "product-proof-path",
|
|
@@ -158,7 +158,7 @@
|
|
|
158
158
|
"homepagePriority": 40,
|
|
159
159
|
"defaultPresentation": "ordered-steps",
|
|
160
160
|
"includeInFirstScreen": false,
|
|
161
|
-
"markdown": "Agents consuming this package should start from the same sources as humans:\n\n1. Read this README for the foundation model and package map.\n2. Read `standards.json` for canonical KFD numbers, schema IDs, concept names,\n and interface contracts.\n3. Use `site/kfd-site.json` decision metadata or the KFD-3 collaboration\n interface fact-source metadata to identify the public KFD fact source.\n4. Use `schemas/kfd-2/trust-taxonomy.schema.json` for KFD-2 residual-risk and\n trust-downgrade values. Unknown taxonomy values are invalid.\n5. Use `schemas/kfd-2/trust-claims.schema.json` and\n `schemas/kfd-2/trust-assessment.schema.json` when a claim needs generic\n KFD-2 assessment instead of a release-specific passport.\n6. Use `schemas/kfd-3/collaboration-interface.schema.json` and\n `schemas/kfd-3/witness.schema.json` to inspect collaboration interfaces.\n7. If a needed KFD-2 taxonomy value is missing, open a KFD GitHub issue rather\n than inventing a local value:\n `https://github.com/kungfu-systems/kfd/issues/new?title=KFD-2%20trust%20taxonomy%20extension%20request`.\n\nKFD package semver is only the distribution version. KFD-owned machine\ninterfaces carry their own `schemaVersion` and `contract` fields. Compatible\nadditions may keep the same interface version; semantic changes, required-field\nchanges, verification meaning changes, or responsibility-boundary changes must\nuse a new interface version or contract.\n\nKFD-2 publishes trust-taxonomy, trust-claims, trust-assessment,\nrelease-claims, and release-trust-passport schemas under `schemas/kfd-2/`.\nThe generic schemas let humans, agents, Buildchain, and other systems assess\nwhether claims about KFD-1, KFD-3, KFD-4, future KFDs, or product surfaces are\nbound to source facts, evidence, hashes, audit boundaries, residual risk, and\nresponsibility state. The release schemas are a release-specific projection of\nthat model. See [`docs/KFD-2-usage.md`](docs/KFD-2-usage.md).\n\nKFD-3 also publishes a general collaboration-interface schema and witness\nschema under `schemas/kfd-3/`. These schemas are for participant-facing product\ninterfaces, not only agent APIs. A product such as Kungfu may implement an\nagent-first profile, but that profile remains a product-specific realization of\nKFD-3. The KFD-owned boundary is the standard vocabulary, schema IDs, and\nclosed-world evidence shape. See\n[`docs/KFD-3-usage.md`](docs/KFD-3-usage.md).\n\nKFD-4 publishes an observer-perspective schema under `schemas/kfd-4/`. It gives\nhumans and agents a standard vocabulary for observer, accepted facts,\nprojection policy, causal constraints, degraded evidence, and verification\nstate when a product shows a perspective-bearing timeline."
|
|
161
|
+
"markdown": "Agents consuming this package should start from the same sources as humans:\n\n1. Read this README for the foundation model and package map.\n2. Read `standards.json` for canonical KFD numbers, schema IDs, concept names,\n and interface contracts.\n3. Use `site/kfd-site.json` decision metadata or the KFD-3 collaboration\n interface fact-source metadata to identify the public KFD fact source.\n4. Use `schemas/kfd-2/trust-taxonomy.schema.json` for KFD-2 residual-risk and\n trust-downgrade values. Unknown taxonomy values are invalid.\n5. Use `schemas/kfd-2/trust-claims.schema.json` and\n `schemas/kfd-2/trust-assessment.schema.json` when a claim needs generic\n KFD-2 assessment instead of a release-specific passport.\n6. Use `schemas/kfd-3/collaboration-interface.schema.json` and\n `schemas/kfd-3/witness.schema.json` to inspect collaboration interfaces.\n7. Use `schemas/kfd-1/publication-url-semantics.schema.json` when a package,\n paper, specification, or site bundle must distinguish stable reader URLs,\n latest aliases, and immutable versioned artifacts.\n8. If a needed KFD-2 taxonomy value is missing, open a KFD GitHub issue rather\n than inventing a local value:\n `https://github.com/kungfu-systems/kfd/issues/new?title=KFD-2%20trust%20taxonomy%20extension%20request`.\n\nKFD package semver is only the distribution version. KFD-owned machine\ninterfaces carry their own `schemaVersion` and `contract` fields. Compatible\nadditions may keep the same interface version; semantic changes, required-field\nchanges, verification meaning changes, or responsibility-boundary changes must\nuse a new interface version or contract.\n\nKFD-2 publishes trust-taxonomy, trust-claims, trust-assessment,\nrelease-claims, and release-trust-passport schemas under `schemas/kfd-2/`.\nThe generic schemas let humans, agents, Buildchain, and other systems assess\nwhether claims about KFD-1, KFD-3, KFD-4, future KFDs, or product surfaces are\nbound to source facts, evidence, hashes, audit boundaries, residual risk, and\nresponsibility state. The release schemas are a release-specific projection of\nthat model. See [`docs/KFD-2-usage.md`](docs/KFD-2-usage.md).\n\nKFD-3 also publishes a general collaboration-interface schema and witness\nschema under `schemas/kfd-3/`. These schemas are for participant-facing product\ninterfaces, not only agent APIs. A product such as Kungfu may implement an\nagent-first profile, but that profile remains a product-specific realization of\nKFD-3. The KFD-owned boundary is the standard vocabulary, schema IDs, and\nclosed-world evidence shape. See\n[`docs/KFD-3-usage.md`](docs/KFD-3-usage.md).\n\nKFD-4 publishes an observer-perspective schema under `schemas/kfd-4/`. It gives\nhumans and agents a standard vocabulary for observer, accepted facts,\nprojection policy, causal constraints, degraded evidence, and verification\nstate when a product shows a perspective-bearing timeline. The package-level\nclaim proves the KFD-owned interface surface; adopter runtime correctness\nrequires adopter-owned KFD-2 evidence."
|
|
162
162
|
},
|
|
163
163
|
{
|
|
164
164
|
"id": "decision-metadata",
|