@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.
@@ -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
@@ -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
@@ -4,7 +4,7 @@
4
4
  "line": "v1.0",
5
5
  "channel": "alpha",
6
6
  "npmPackage": "@kungfu-tech/kfd",
7
- "npmVersion": "1.0.0-alpha.20",
7
+ "npmVersion": "1.0.0-alpha.22",
8
8
  "source": {
9
9
  "repository": "kungfu-systems/kfd",
10
10
  "branch": "alpha/v1/v1.0"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kungfu-tech/kfd",
3
- "version": "1.0.0-alpha.20",
3
+ "version": "1.0.0-alpha.22",
4
4
  "description": "Kung Fu Decisions (KFD): the kungfu-systems organization-wide decision registry, as a consumable artifact",
5
5
  "license": "Apache-2.0",
6
6
  "files": [
@@ -8,8 +8,8 @@
8
8
  },
9
9
  "versionImpact": {
10
10
  "final": "minor",
11
- "source": "kfd-site-decision-usage-pages",
12
- "rationale": "This change additively exposes decision usage subpage mapping in the KFD site bundle, while preserving existing registry, package, and schemaVersion 1 compatibility."
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 decision usage subpage mapping in the site bundle, preserves existing package and schemaVersion 1 compatibility, and separates authoritative decision paths from numbered usage documentation."
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
- for (const concept of ["factSource", "contractWorld", "weldedSurfaceRegister", "witness", "surfaceClass", "compatibilityImpact", "impactProjection"]) {
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 an observer-perspective interface because KFD publishes the schema, standards metadata, decision text, and verification gate for observer-relative timeline views.",
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: [],
@@ -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",