@kungfu-tech/kfd 1.0.0-alpha.18 → 1.0.0-alpha.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -73,7 +73,25 @@ systems. KFD is part of that bootstrap: the worldview is forged through the same
73
73
  transparent and inspectable mechanisms it asks products to provide.
74
74
 
75
75
  This README states the architecture; KFD-1, KFD-2, and KFD-3 provide the
76
- detailed rules.
76
+ foundation rules.
77
+
78
+ ## Practice guidelines
79
+
80
+ KFDs after the foundation triad may define practice guidelines: procedures
81
+ that apply the foundation to a specific class of real-world product behavior.
82
+ They do not expand the foundation triad; they show how the foundation behaves
83
+ when a product must make a concrete kind of reality legible.
84
+
85
+ | Layer | Decision | Reader question | Commitment |
86
+ |---|---|---|---|
87
+ | 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. |
88
+
89
+ KFD-4 is the first such guideline. It applies KFD-1/2/3 to the problem of
90
+ perspective and timeline order. In a multi-machine or multi-agent world, a
91
+ product should not pretend to own a universal global clock. It should preserve
92
+ non-drifting facts, make trust start from those facts, and let participants
93
+ cooperate by exposing the observer, accepted ranges, causal constraints, and
94
+ projection policy behind the view.
77
95
 
78
96
  ## Adoption boundary
79
97
 
@@ -102,6 +120,8 @@ The first screen should be derived from this README:
102
120
  - First-screen explanation: the beginning of `Foundation model`, ending at the
103
121
  `non-drifting facts -> inspectable trust -> trusted value -> voluntary
104
122
  cooperation` chain.
123
+ - Practice signal: the `Practice guidelines` section, starting with KFD-4 as
124
+ the declared-observer rule for perspective-bearing timeline views.
105
125
 
106
126
  Decision cards, detail links, and machine paths should come from
107
127
  `registry.json`. The machine-readable site bundle lives at `site/kfd-site.json`
@@ -124,9 +144,9 @@ KFDs are not a detached manifesto, but they are not a demand that readers adopt
124
144
  a Kungfu product before understanding the decisions. A philosophy becomes
125
145
  load-bearing only when it can be seen in a concrete case. The first concrete
126
146
  case is this package itself: `standards.json`, `schemas/`, `docs/`,
127
- `site/kfd-site.json`, and `scripts/check.mjs` show how KFD-1, KFD-2, and KFD-3
128
- are expressed as consumable interfaces for both humans and agents. For the
129
- broader product case, use the main Kungfu product entrypoint
147
+ `site/kfd-site.json`, and `scripts/check.mjs` show how KFD-1, KFD-2, KFD-3,
148
+ and KFD-4 are expressed as consumable interfaces for both humans and agents.
149
+ For the broader product case, use the main Kungfu product entrypoint
130
150
  (`https://kungfu.tech`) for product philosophy, and Buildchain
131
151
  (`https://buildchain.libkungfu.dev`) for release and provenance
132
152
  accountability. This registry states the commitments; this package and those
@@ -184,6 +204,11 @@ KFD-3. The KFD-owned boundary is the standard vocabulary, schema IDs, and
184
204
  closed-world evidence shape. See
185
205
  [`docs/kfd-3-collaboration-interface.md`](docs/kfd-3-collaboration-interface.md).
186
206
 
207
+ KFD-4 publishes an observer-perspective schema under `schemas/kfd-4/`. It gives
208
+ humans and agents a standard vocabulary for observer, accepted facts,
209
+ projection policy, causal constraints, degraded evidence, and verification
210
+ state when a product shows a perspective-bearing timeline.
211
+
187
212
  ## Current decisions
188
213
 
189
214
  | ID | Kind | Axiom | Status |
@@ -191,6 +216,7 @@ closed-world evidence shape. See
191
216
  | [KFD-1](decisions/kfd-1.md) | procedure | Facts must not drift. | active |
192
217
  | [KFD-2](decisions/kfd-2.md) | principle | Trust must start from facts. | active |
193
218
  | [KFD-3](decisions/kfd-3.md) | principle | Cooperation must start from trusted value. | active |
219
+ | [KFD-4](decisions/kfd-4.md) | procedure | Timelines must declare their observer. | active |
194
220
 
195
221
  ## Decision metadata
196
222
 
@@ -3,13 +3,13 @@
3
3
  "contract": "kungfu-buildchain-contract-lock",
4
4
  "buildchain": {
5
5
  "ref": "v2",
6
- "resolvedSha": "93a42bdfbf60f32fc24e5cc6640f5352eec97224",
6
+ "resolvedSha": "aa039c39e7d5a5a74d078025a21a47676fadca82",
7
7
  "contract": "kungfu-buildchain-runtime-contract-world",
8
- "contractDigest": "sha256:7b2fed2dacdf37234ca03e656904611b9c3dd48a4f229be387c7c1393f57fc5b",
9
- "compatibilityDigest": "sha256:36421b592a782decbfe31a7d8d42d70ce1100a56a2c4f4a0ccc21f0617dc72bf",
8
+ "contractDigest": "sha256:590724458a59dfed521c876c24cedec43124409b4be79f4ce839ce26ce9f98de",
9
+ "compatibilityDigest": "sha256:407d6d5ee6a96a34d2cc30db9ac64cf4b1819ab6d77bd7a57a07a124f22101ca",
10
10
  "majorLine": "v2",
11
11
  "compatibilityPolicy": "major-compatible",
12
- "acceptedAt": "2026-07-07T09:29:33.317Z",
12
+ "acceptedAt": "2026-07-08T02:03:03.789Z",
13
13
  "surfaces": [
14
14
  {
15
15
  "id": "reusable-build",
@@ -21,6 +21,11 @@
21
21
  "kind": "workflow",
22
22
  "breakingDigest": "sha256:403d2fcdb0c5eabe749e89102defad69745f70a1556707bec7831fcc2e9fa8f8"
23
23
  },
24
+ {
25
+ "id": "web-surface",
26
+ "kind": "workflow",
27
+ "breakingDigest": "sha256:82ee63cb336e40d832dfff4a1c5e6cbfa221a4fc8b2359990033bc931bffc43a"
28
+ },
24
29
  {
25
30
  "id": "promote-buildchain-ref-action",
26
31
  "kind": "action",
@@ -54,7 +59,17 @@
54
59
  {
55
60
  "id": "buildchain-cli",
56
61
  "kind": "cli",
57
- "breakingDigest": "sha256:097db3e67509bedda8c6548bf1edfbfcf57f7b5510520b6a7b7e078d7ec087c8"
62
+ "breakingDigest": "sha256:90a73892b2d6c214048448d5f45df75639bdf7b7e8fefd9c596e04b087407bcc"
63
+ },
64
+ {
65
+ "id": "homebrew-distribution-index",
66
+ "kind": "node-api",
67
+ "breakingDigest": "sha256:148c0387ff4cea76433bbde80cd9d77c5aa67e1a29856ced33e4d819366f2213"
68
+ },
69
+ {
70
+ "id": "readme-badge-facts",
71
+ "kind": "node-api",
72
+ "breakingDigest": "sha256:bcd72ad6dfba8013c96f8b2f7b0a307d2e7713972a1219348f0d5ecc493939a0"
58
73
  },
59
74
  {
60
75
  "id": "agent-manual-registry",
@@ -0,0 +1,182 @@
1
+ # KFD-4: Timelines must declare their observer — useful views need a stated perspective
2
+
3
+ - Status: active
4
+ - Number: 4
5
+ - Kind: procedure
6
+ - Applies to: every kungfu-systems product, repository, release surface, extension surface, hosted surface, and agent-facing interface that represents time, ordering, history, timelines, sync, replay, or mixed-source work facts
7
+
8
+ ## One sentence
9
+
10
+ Timelines must declare their observer.
11
+
12
+ A product must not present a mixed-source ordering as an absolute view from
13
+ nowhere. A useful view of reality must state who is observing, which facts were
14
+ accepted, and how concurrent facts were projected.
15
+
16
+ ## Decision type
17
+
18
+ KFDs can be principles or procedures:
19
+
20
+ - A **principle** states what must remain true across kungfu-systems even as
21
+ products, repositories, and release lines change.
22
+ - A **procedure** states how a class of work enforces or protects a principle.
23
+
24
+ This KFD is a procedure. It is not a fourth foundation principle beside
25
+ KFD-1/2/3. It is the first practice guideline derived from the foundation
26
+ triad: once facts are non-drifting, trust starts from facts, and cooperation
27
+ starts from trusted value, a product still has to say from which perspective a
28
+ time-ordered view is being offered.
29
+
30
+ ## Practice role
31
+
32
+ Within the KFD structure, KFD-1/2/3 form the foundation:
33
+
34
+ ```text
35
+ facts must not drift
36
+ -> trust must start from facts
37
+ -> cooperation must start from trusted value
38
+ ```
39
+
40
+ KFD-4 applies that foundation to perspective, ordering, and action. It answers
41
+ this practice question:
42
+
43
+ ```text
44
+ In a complex world, from which declared perspective is this view useful,
45
+ stable, and trustworthy?
46
+ ```
47
+
48
+ ## Procedure
49
+
50
+ When a product combines facts from multiple machines, agents, processes,
51
+ sessions, sources, repositories, providers, or external systems, it should
52
+ treat the visible timeline as an observer-relative projection over accepted
53
+ facts, not as a claim that the product has found one absolute global clock.
54
+
55
+ The authoritative record should be facts and evidence:
56
+
57
+ - source-local records and their local order;
58
+ - provenance for source, participant, location, session, run, or adapter;
59
+ - accepted ranges, heads, cursors, watermarks, and capture boundaries;
60
+ - causal links between observations, decisions, actions, and results;
61
+ - payload hashes, schema bindings, receipts, redaction states, and verification
62
+ results.
63
+
64
+ The visible timeline is a view over those facts. Its perspective must be
65
+ declared enough that another human or agent can reproduce the same view from
66
+ the same accepted facts.
67
+
68
+ ## What a declared perspective should include
69
+
70
+ A perspective-bearing timeline should identify, where applicable:
71
+
72
+ - the observer or observer location whose view is being presented;
73
+ - the accepted fact sources, ranges, watermarks, and freshness boundaries;
74
+ - the projection policy version;
75
+ - the ordering rule for concurrent or causally unrelated facts;
76
+ - the deterministic tie-breaker used when policy and source-local order are not
77
+ enough;
78
+ - the degraded state when causality, payloads, schemas, accepted ranges, or
79
+ freshness are incomplete.
80
+
81
+ Causal facts dominate projection policy. A product may order concurrent facts
82
+ by observer policy, source priority, or deterministic tie-breaker, but it must
83
+ not invert a known causal dependency. If it cannot produce a valid total order
84
+ without hiding missing causality or missing evidence, it should report a
85
+ degraded view rather than silently sorting by wall-clock time.
86
+
87
+ ## What it requires
88
+
89
+ - GUI, CLI, API, export, and agent-facing timeline surfaces should make the
90
+ observer or projection policy inspectable when they mix sources.
91
+ - Wall-clock time may be used for display, latency, diagnostics, and
92
+ source-local ordering, but it must not be the only proof of cross-source
93
+ order.
94
+ - Exported bundles that claim a timeline order should carry enough perspective
95
+ metadata for another consumer to reproduce that order.
96
+ - Storage and sync systems should preserve source provenance, accepted ranges,
97
+ and causal links rather than flattening remote facts into anonymous local
98
+ records.
99
+ - Fsck, release gates, or other verification systems should eventually be able
100
+ to check that a projected view does not contradict known facts, invert known
101
+ causality, or hide an incomplete accepted range.
102
+
103
+ ## What it does not require
104
+
105
+ - It does not say there are no facts. Facts and causality remain load-bearing.
106
+ - It does not permit arbitrary narratives, invented evidence, or convenient
107
+ ordering.
108
+ - It does not require a universal global clock, a permanent global sequencer,
109
+ or distributed consensus for every timeline.
110
+ - It does not forbid a product from having a default observer policy.
111
+ - It does not solve conflicts between independently written authority roots.
112
+ Conflict policy must be explicit when it exists.
113
+ - It does not supersede KFD-1, KFD-2, or KFD-3. It applies them to
114
+ perspective-bearing views.
115
+
116
+ ## Relation to KFD-1, KFD-2, and KFD-3
117
+
118
+ KFD-1 says facts must not drift. KFD-4 depends on that: a perspective-bearing
119
+ timeline must stand on accepted facts, not on a driftable story.
120
+
121
+ KFD-2 says trust must start from facts. KFD-4 applies that to ordering: trust
122
+ in a timeline comes from reproducibility under declared facts and declared
123
+ projection policy, not from an undeclared claim to absolute time.
124
+
125
+ KFD-3 says cooperation must start from trusted value. KFD-4 applies that to
126
+ multi-participant work: humans and agents may carry different perspectives,
127
+ but cooperation becomes possible when those perspectives expose their facts,
128
+ constraints, and view policies instead of forcing everyone into a hidden
129
+ ordering.
130
+
131
+ Together:
132
+
133
+ ```text
134
+ KFD-1: facts must not drift.
135
+ KFD-2: trust must start from facts.
136
+ KFD-3: cooperation must start from trusted value.
137
+ KFD-4: timelines must declare their observer.
138
+ ```
139
+
140
+ The first three define the foundation. KFD-4 is a practice guideline for how
141
+ that foundation behaves when a product shows time, history, replay, sync, or
142
+ mixed-source work state.
143
+
144
+ ## Implementation case: Kungfu observer timelines
145
+
146
+ Kungfu's observer-relative timeline design is the first concrete product case.
147
+ Kungfu stores causal runtime facts, source provenance, accepted ranges,
148
+ manifests, payload evidence, and verification results. A mixed-source timeline
149
+ is a deterministic projection from an explicit observer policy; it is not a
150
+ claim that Kungfu has discovered one universal global clock.
151
+
152
+ That design lets a local user sync facts from another machine, inspect agent
153
+ work that happened elsewhere, and still ask precise questions:
154
+
155
+ ```text
156
+ which facts did this observer accept?
157
+ which source or location did each fact come from?
158
+ which causal links constrain the order?
159
+ which concurrent facts were ordered by policy?
160
+ can another consumer reproduce the same view?
161
+ ```
162
+
163
+ This is the product-level form of the KFD-4 procedure.
164
+
165
+ ## Implementation case: the KFD package
166
+
167
+ The `@kungfu-tech/kfd` npm package publishes a KFD-4 observer-perspective
168
+ schema under `schemas/kfd-4/observer-perspective.schema.json`. The schema is
169
+ not a mandatory runtime data model for every adopter. It is the KFD-owned
170
+ vocabulary for declaring observer, accepted facts, projection policy, causal
171
+ constraints, and degraded evidence state in products that need a
172
+ perspective-bearing timeline.
173
+
174
+ ## Adopters
175
+
176
+ Each adopting repository cites this KFD when designing or changing a timeline,
177
+ history view, replay view, source sync flow, multi-machine view, multi-agent
178
+ view, audit bundle, or exported record that orders facts from more than one
179
+ source or perspective.
180
+
181
+ Adopters should keep local implementation detail in repository documents and
182
+ reference this KFD rather than restating it.
package/docs/MAP.md CHANGED
@@ -5,8 +5,11 @@
5
5
  | What is KFD, and what decisions exist? | [`../README.md`](../README.md) |
6
6
  | What is the KFD-1/2/3 foundation triad? | [`../README.md`](../README.md#foundation-triad) |
7
7
  | What worldview structure does the foundation triad express? | [`../README.md`](../README.md#foundation-model) |
8
+ | What practice guidelines are derived from the foundation triad? | [`../README.md`](../README.md#practice-guidelines) |
9
+ | How should a product show timeline order from a declared perspective? | [KFD-4](../decisions/kfd-4.md) |
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) |
8
11
  | How should an agent quickly understand this package? | [`../README.md`](../README.md#agent-quickstart) |
9
- | What is the concrete self-proof case for KFD-1/2/3? | [`../README.md`](../README.md#product-proof-path) and the implementation case in each KFD |
12
+ | What is the concrete self-proof case for KFD-1/2/3/4? | [`../README.md`](../README.md#product-proof-path) and the implementation case in each KFD |
10
13
  | Where is the public KFD fact source? | [`../README.md`](../README.md#decision-metadata) and [`../site/kfd-site.json`](../site/kfd-site.json) decision metadata |
11
14
  | What does Apache-2.0 cover, and what remains official/trademark-bound? | [`../TRADEMARKS.md`](../TRADEMARKS.md) |
12
15
  | What should a site renderer consume to render `kfd.libkungfu.dev`? | [`../site/kfd-site.json`](../site/kfd-site.json) |
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.18",
7
+ "npmVersion": "1.0.0-alpha.19",
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.18",
3
+ "version": "1.0.0-alpha.19",
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": [
package/registry.json CHANGED
@@ -31,6 +31,16 @@
31
31
  "status": "active",
32
32
  "path": "decisions/kfd-3.md",
33
33
  "url": "https://kfd.libkungfu.dev/3"
34
+ },
35
+ {
36
+ "number": 4,
37
+ "id": "KFD-4",
38
+ "slug": "kfd-4",
39
+ "title": "Timelines must declare their observer: useful views need a stated perspective",
40
+ "kind": "procedure",
41
+ "status": "active",
42
+ "path": "decisions/kfd-4.md",
43
+ "url": "https://kfd.libkungfu.dev/4"
34
44
  }
35
45
  ]
36
46
  }
@@ -9,14 +9,14 @@
9
9
  "versionImpact": {
10
10
  "final": "minor",
11
11
  "source": "kfd-surface-register",
12
- "rationale": "This change additively registers KFD-owned standards metadata, the KFD-2 trust taxonomy, KFD-2 release trust schemas, KFD-3 collaboration-interface schemas, KFD-3 self-verification witnesses, KFD-1 document/interface integrity bindings, and the README-backed KFD site homepage projection while keeping existing registry and decision surfaces compatible."
12
+ "rationale": "This change additively registers KFD-owned standards metadata, the KFD-2 trust taxonomy, KFD-2 release trust schemas, KFD-3 collaboration-interface schemas, KFD-3 self-verification witnesses, KFD-4 observer-perspective schema, KFD-1 document/interface integrity bindings, and the README-backed KFD site homepage projection while keeping existing registry and decision surfaces compatible."
13
13
  },
14
14
  "surfaceImpacts": [
15
15
  {
16
16
  "id": "kfd-content",
17
17
  "impact": "patch",
18
18
  "class": "content",
19
- "rationale": "KFD documents are append-only content coordinates; current documentation changes add the public adoption boundary that keeps KFD an engineering discipline rather than a belief test, while preserving the existing decision numbers and registry shape."
19
+ "rationale": "KFD documents are append-only content coordinates; current documentation changes add KFD-4 as a practice guideline for declared observer timelines, while preserving existing decision numbers and registry shape."
20
20
  },
21
21
  {
22
22
  "id": "kfd-registry-schema",
@@ -28,13 +28,13 @@
28
28
  "id": "kfd-standards-metadata",
29
29
  "impact": "minor",
30
30
  "class": "additive",
31
- "rationale": "standards.json and schemas/ add the KFD-2 trust-taxonomy schema ID, release-claims and release-trust-passport schema IDs, explicit KFD-1/2/3 interface versions, KFD document SHA-256 bindings, KFD-owned concept names, KFD-3 fact-source interface metadata, and official-status interface metadata for downstream consumers."
31
+ "rationale": "standards.json and schemas/ add the KFD-2 trust-taxonomy schema ID, release-claims and release-trust-passport schema IDs, explicit KFD-1/2/3/4 interface versions, KFD-4 observer-perspective schema metadata, KFD document SHA-256 bindings, KFD-owned concept names, KFD-3 fact-source interface metadata, and official-status interface metadata for downstream consumers."
32
32
  },
33
33
  {
34
34
  "id": "kfd-package-structure",
35
35
  "impact": "minor",
36
36
  "class": "additive",
37
- "rationale": "The npm package now publishes the KFD-2 trust taxonomy, KFD-2 schemas, KFD-2 documentation, KFD-3 self collaboration-interface witnesses, TRADEMARKS.md, public fact-source metadata, agent quickstart/self-proof documentation, Buildchain contract lock metadata, and repository verification scripts through existing schemas/, docs/, standards.json, site/, scripts/, .buildchain/, and subpath exports while preserving existing README.md, decisions/, registry.json, and site/ paths."
37
+ "rationale": "The npm package now publishes the KFD-2 trust taxonomy, KFD-2 schemas, KFD-2 documentation, KFD-3 self collaboration-interface witnesses, KFD-4 observer-perspective schema, TRADEMARKS.md, public fact-source metadata, agent quickstart/self-proof documentation, Buildchain contract lock metadata, and repository verification scripts through existing schemas/, docs/, standards.json, site/, scripts/, .buildchain/, and subpath exports while preserving existing README.md, decisions/, registry.json, and site/ paths."
38
38
  },
39
39
  {
40
40
  "id": "kfd-buildchain-contract-lock",
@@ -46,7 +46,7 @@
46
46
  "id": "kfd-site-homepage-bundle",
47
47
  "impact": "minor",
48
48
  "class": "additive",
49
- "rationale": "site/kfd-site.json now exposes generated README-backed homepage.sections and homepage.displayPlan fields, including the adoption-boundary homepage section, and scripts/check.mjs verifies the checked-in bundle matches the README projection so downstream sites can render KFD-owned homepage content without maintaining their own README parser or drifting copy."
49
+ "rationale": "site/kfd-site.json now exposes generated README-backed homepage.sections and homepage.displayPlan fields, including the adoption-boundary and practice-guidelines homepage sections, and scripts/check.mjs verifies the checked-in bundle matches the README projection so downstream sites can render KFD-owned homepage content without maintaining their own README parser or drifting copy."
50
50
  },
51
51
  {
52
52
  "id": "kfd-3-self-collaboration",
@@ -73,5 +73,5 @@
73
73
  "rationale": "The KFD to site-libkungfu-dev propagation graph now targets the downstream site's actual main branch and documents the exact KFD package surfaces consumed by kfd.libkungfu.dev, without changing the release propagation graph contract."
74
74
  }
75
75
  ],
76
- "summary": "KFD v1.0 production promotion is minor-impact because it additively exposes KFD-2 trust taxonomy and release trust metadata, KFD-1/2/3 interface version metadata, KFD-3 self-verification witnesses, Buildchain contract lock metadata, document integrity bindings, a README-backed homepage bundle/display plan, and a corrected site release-propagation target for Buildchain and other consumers; existing registry, decision text, site bundle, and propagation graph contracts remain compatible."
76
+ "summary": "KFD v1.0 production promotion is minor-impact because it additively exposes KFD-2 trust taxonomy and release trust metadata, KFD-1/2/3/4 interface version metadata, KFD-3 self-verification witnesses, KFD-4 observer-perspective schema, Buildchain contract lock metadata, document integrity bindings, a README-backed homepage bundle/display plan, and a corrected site release-propagation target for Buildchain and other consumers; existing registry, decision text, site bundle, and propagation graph contracts remain compatible."
77
77
  }
@@ -0,0 +1,272 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://kfd.libkungfu.dev/schemas/kfd-4/observer-perspective.schema.json",
4
+ "title": "KFD-4 observer perspective",
5
+ "type": "object",
6
+ "required": [
7
+ "schemaVersion",
8
+ "contract",
9
+ "standard",
10
+ "id",
11
+ "observer",
12
+ "acceptedFacts",
13
+ "projectionPolicy",
14
+ "verification"
15
+ ],
16
+ "properties": {
17
+ "schemaVersion": {
18
+ "const": 1
19
+ },
20
+ "contract": {
21
+ "const": "kfd-4-observer-perspective"
22
+ },
23
+ "standard": {
24
+ "const": "kfd-4"
25
+ },
26
+ "id": {
27
+ "type": "string",
28
+ "minLength": 1
29
+ },
30
+ "observer": {
31
+ "$ref": "#/$defs/observer"
32
+ },
33
+ "acceptedFacts": {
34
+ "type": "array",
35
+ "items": {
36
+ "$ref": "#/$defs/acceptedFactSource"
37
+ },
38
+ "minItems": 1
39
+ },
40
+ "projectionPolicy": {
41
+ "$ref": "#/$defs/projectionPolicy"
42
+ },
43
+ "causalConstraints": {
44
+ "type": "array",
45
+ "items": {
46
+ "$ref": "#/$defs/causalConstraint"
47
+ },
48
+ "default": []
49
+ },
50
+ "degradedEvidence": {
51
+ "type": "array",
52
+ "items": {
53
+ "$ref": "#/$defs/degradedEvidence"
54
+ },
55
+ "default": []
56
+ },
57
+ "verification": {
58
+ "$ref": "#/$defs/verification"
59
+ }
60
+ },
61
+ "additionalProperties": false,
62
+ "$defs": {
63
+ "observer": {
64
+ "type": "object",
65
+ "required": [
66
+ "id",
67
+ "kind"
68
+ ],
69
+ "properties": {
70
+ "id": {
71
+ "type": "string",
72
+ "minLength": 1
73
+ },
74
+ "kind": {
75
+ "enum": [
76
+ "human",
77
+ "agent",
78
+ "runtime-location",
79
+ "product-view",
80
+ "service",
81
+ "other"
82
+ ]
83
+ },
84
+ "location": {
85
+ "type": "string"
86
+ },
87
+ "description": {
88
+ "type": "string"
89
+ }
90
+ },
91
+ "additionalProperties": false
92
+ },
93
+ "acceptedFactSource": {
94
+ "type": "object",
95
+ "required": [
96
+ "sourceId",
97
+ "sourceKind"
98
+ ],
99
+ "properties": {
100
+ "sourceId": {
101
+ "type": "string",
102
+ "minLength": 1
103
+ },
104
+ "sourceKind": {
105
+ "enum": [
106
+ "local-runtime",
107
+ "remote-runtime",
108
+ "imported-bundle",
109
+ "adapter",
110
+ "repository",
111
+ "release-artifact",
112
+ "external-system",
113
+ "other"
114
+ ]
115
+ },
116
+ "location": {
117
+ "type": "string"
118
+ },
119
+ "acceptedRange": {
120
+ "type": "string"
121
+ },
122
+ "watermark": {
123
+ "type": "string"
124
+ },
125
+ "manifest": {
126
+ "type": "string"
127
+ },
128
+ "freshness": {
129
+ "type": "string"
130
+ },
131
+ "provenance": {
132
+ "type": "string"
133
+ }
134
+ },
135
+ "additionalProperties": false
136
+ },
137
+ "projectionPolicy": {
138
+ "type": "object",
139
+ "required": [
140
+ "policyVersion",
141
+ "causalDominance",
142
+ "tieBreaker"
143
+ ],
144
+ "properties": {
145
+ "policyVersion": {
146
+ "type": "string",
147
+ "minLength": 1
148
+ },
149
+ "observerLocation": {
150
+ "type": "string"
151
+ },
152
+ "sourcePriority": {
153
+ "type": "array",
154
+ "items": {
155
+ "type": "string"
156
+ },
157
+ "default": []
158
+ },
159
+ "causalDominance": {
160
+ "const": true
161
+ },
162
+ "concurrentOrdering": {
163
+ "type": "string",
164
+ "description": "How concurrent or causally unrelated facts are ordered under this perspective."
165
+ },
166
+ "tieBreaker": {
167
+ "type": "string",
168
+ "minLength": 1
169
+ }
170
+ },
171
+ "additionalProperties": false
172
+ },
173
+ "causalConstraint": {
174
+ "type": "object",
175
+ "required": [
176
+ "before",
177
+ "after",
178
+ "basis"
179
+ ],
180
+ "properties": {
181
+ "before": {
182
+ "type": "string",
183
+ "minLength": 1
184
+ },
185
+ "after": {
186
+ "type": "string",
187
+ "minLength": 1
188
+ },
189
+ "basis": {
190
+ "enum": [
191
+ "causal-parent",
192
+ "trigger-frame",
193
+ "stream-topology",
194
+ "manifest-boundary",
195
+ "accepted-range",
196
+ "source-local-order",
197
+ "other"
198
+ ]
199
+ },
200
+ "evidence": {
201
+ "type": "string"
202
+ }
203
+ },
204
+ "additionalProperties": false
205
+ },
206
+ "degradedEvidence": {
207
+ "type": "object",
208
+ "required": [
209
+ "id",
210
+ "state",
211
+ "reason"
212
+ ],
213
+ "properties": {
214
+ "id": {
215
+ "type": "string",
216
+ "minLength": 1
217
+ },
218
+ "state": {
219
+ "enum": [
220
+ "missing-causality",
221
+ "missing-payload",
222
+ "missing-schema",
223
+ "stale-source",
224
+ "incomplete-range",
225
+ "unknown-policy-version",
226
+ "unverified-source",
227
+ "other"
228
+ ]
229
+ },
230
+ "reason": {
231
+ "type": "string",
232
+ "minLength": 1
233
+ },
234
+ "impact": {
235
+ "enum": [
236
+ "display-warning",
237
+ "trust-downgrade",
238
+ "view-invalid",
239
+ "action-required"
240
+ ]
241
+ }
242
+ },
243
+ "additionalProperties": false
244
+ },
245
+ "verification": {
246
+ "type": "object",
247
+ "required": [
248
+ "result"
249
+ ],
250
+ "properties": {
251
+ "result": {
252
+ "enum": [
253
+ "pass",
254
+ "degraded",
255
+ "fail",
256
+ "not-checked"
257
+ ]
258
+ },
259
+ "command": {
260
+ "type": "string"
261
+ },
262
+ "checkedAt": {
263
+ "type": "string"
264
+ },
265
+ "notes": {
266
+ "type": "string"
267
+ }
268
+ },
269
+ "additionalProperties": false
270
+ }
271
+ }
272
+ }