@kungfu-tech/buildchain 4.0.1-alpha.2 → 4.0.1-alpha.3

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.
Files changed (75) hide show
  1. package/architecture/decisions/0003-two-phase-delivery-warrant.md +152 -0
  2. package/architecture/internal-capabilities.json +94 -0
  3. package/architecture/maintainability-policy.json +75 -8
  4. package/architecture/v3-core-mechanism-inventory.json +2 -0
  5. package/architecture/v4-delivery-authority-parity.json +250 -0
  6. package/architecture/v4-delivery-warrant-shadow-fixtures.json +29 -6
  7. package/bin/buildchain.mjs +9 -1
  8. package/contracts/dev-delivery-authority-v2.schema.json +662 -0
  9. package/dist/site/agent-index.json +1 -0
  10. package/dist/site/artifact-schemas.json +2 -0
  11. package/dist/site/buildchain-contract.json +89 -6
  12. package/dist/site/buildchain-site.json +169 -18
  13. package/dist/site/capability-registry.json +2 -2
  14. package/dist/site/cli-registry.json +46 -2
  15. package/dist/site/kfd-claims.json +43 -9
  16. package/dist/site/kfd-upstream-aggregate.json +1 -1
  17. package/dist/site/manual-registry.json +3 -3
  18. package/dist/site/node-api-registry.json +1694 -165
  19. package/dist/site/page-registry.json +162 -11
  20. package/dist/site/public-surface-audit.json +367 -7
  21. package/dist/site/publication-registry.json +4 -4
  22. package/dist/site/release-provenance.json +2 -0
  23. package/dist/site/schemas/dev-delivery-authority-v2.schema.json +662 -0
  24. package/dist/site/site-manifest.json +7 -7
  25. package/dist/site/workflow-registry.json +22 -6
  26. package/docs/MAP.md +1 -0
  27. package/docs/cli-reference.md +211 -13
  28. package/docs/dev-delivery-qualification-landing-adr.md +251 -0
  29. package/docs/dev-delivery-warrant.md +326 -38
  30. package/docs/node-api-reference.md +113 -53
  31. package/package.json +5 -1
  32. package/packages/core/buildchain-contract.js +3 -2
  33. package/packages/core/dev-delivery-authority-candidate.js +270 -0
  34. package/packages/core/dev-delivery-authority-evidence.js +146 -0
  35. package/packages/core/dev-delivery-authority-landing.js +461 -0
  36. package/packages/core/dev-delivery-authority-observation.js +48 -0
  37. package/packages/core/dev-delivery-authority-qualification.js +591 -0
  38. package/packages/core/dev-delivery-authority-settlement.js +213 -0
  39. package/packages/core/dev-delivery-authority-state.js +583 -0
  40. package/packages/core/dev-delivery-candidate-identity.js +13 -0
  41. package/packages/core/dev-delivery-contract-surface.js +76 -0
  42. package/packages/core/dev-delivery-execution-failure.js +133 -0
  43. package/packages/core/dev-delivery-execution-transfer.js +572 -0
  44. package/packages/core/dev-delivery-landing-admission-core.js +119 -0
  45. package/packages/core/dev-delivery-landing-readback.js +598 -0
  46. package/packages/core/dev-delivery-landing-terminal-evidence.js +271 -0
  47. package/packages/core/dev-delivery-landing-testing-port.js +6 -0
  48. package/packages/core/dev-delivery-native-execution.js +110 -0
  49. package/packages/core/dev-delivery-native-proof.js +546 -0
  50. package/packages/core/dev-delivery-process-boundary.js +551 -0
  51. package/packages/core/dev-delivery-provider-attempt.js +127 -0
  52. package/packages/core/dev-delivery-provider-heartbeat.js +370 -0
  53. package/packages/core/dev-delivery-warrant-cancellation.js +1 -0
  54. package/packages/core/dev-delivery-warrant-qualification.js +145 -0
  55. package/packages/core/dev-delivery-warrant-settlement.js +237 -36
  56. package/packages/core/dev-delivery-warrant-state.js +565 -0
  57. package/packages/core/dev-delivery-warrant.js +320 -368
  58. package/scripts/buildchain-cli-help.mjs +11 -2
  59. package/scripts/dev-delivery-authority-command-adapters.mjs +206 -0
  60. package/scripts/dev-delivery-authority-provider.mjs +28 -0
  61. package/scripts/dev-delivery-authority.mjs +490 -0
  62. package/scripts/dev-delivery-native-run.mjs +177 -0
  63. package/scripts/dev-delivery-process-boundary.mjs +260 -0
  64. package/scripts/dev-delivery-proof.mjs +67 -2
  65. package/scripts/dev-delivery-provider-heartbeat.mjs +215 -0
  66. package/scripts/dev-delivery-two-phase-resume.mjs +345 -0
  67. package/scripts/dev-delivery-two-phase.mjs +573 -0
  68. package/scripts/dev-delivery-warrant-options.mjs +266 -0
  69. package/scripts/dev-delivery-warrant-store.mjs +227 -0
  70. package/scripts/dev-delivery-warrant.mjs +227 -193
  71. package/scripts/dev-pr-delivery-warrant.mjs +10 -0
  72. package/scripts/generate-site-bundle.mjs +26 -4
  73. package/scripts/npm-publish-transaction.mjs +2 -2
  74. package/scripts/site-capability-metadata.mjs +12 -0
  75. package/templates/native-dev-delivery.yml +141 -0
@@ -0,0 +1,213 @@
1
+ import {
2
+ devDeliveryExactRoot as exactRoot,
3
+ devDeliveryExactSha as exactSha,
4
+ devDeliveryPositiveInteger as positiveInteger,
5
+ devDeliveryText as text,
6
+ devDeliveryTimestamp as timestamp,
7
+ } from "./dev-delivery-common.js";
8
+ import {
9
+ DEV_DELIVERY_QUALIFICATION_LEASE_SCHEMA,
10
+ TERMINAL_STATES,
11
+ normalizeDevDeliveryAuthorityState,
12
+ receipt,
13
+ transition,
14
+ } from "./dev-delivery-authority-state.js";
15
+ import { schedulerWake } from "./dev-delivery-authority-qualification.js";
16
+ import { verifyLandingSettlementReadback } from "./dev-delivery-landing-terminal-evidence.js";
17
+ import { normalizeDevDeliveryTerminalProviderEvidence } from "./dev-delivery-provider-attempt.js";
18
+ import { normalizeProviderFailureAuthorityBinding } from "./dev-delivery-warrant-settlement.js";
19
+
20
+ export function assertDevDeliveryLandingWarrant(
21
+ state,
22
+ input,
23
+ now,
24
+ { allowExpired = false } = {},
25
+ ) {
26
+ if (text(input?.schema) === DEV_DELIVERY_QUALIFICATION_LEASE_SCHEMA)
27
+ throw new Error("Qualification Lease cannot admit merge_group");
28
+ if (!state.landingWarrant) throw new Error("no active Landing Warrant");
29
+ const token = exactRoot(input?.token, "Landing Warrant token");
30
+ const generation = positiveInteger(
31
+ input?.generation,
32
+ "Landing Warrant generation",
33
+ );
34
+ const candidateId = exactRoot(input?.candidateId, "candidateId");
35
+ if (token !== state.landingWarrant.token)
36
+ throw new Error("stale Landing Warrant token");
37
+ if (generation !== state.landingWarrant.generation)
38
+ throw new Error("stale Landing Warrant generation");
39
+ if (candidateId !== state.landingWarrant.candidateId)
40
+ throw new Error("Landing Warrant candidate mismatch");
41
+ if (
42
+ !allowExpired &&
43
+ Date.parse(state.landingWarrant.expiresAt) <= Date.parse(now)
44
+ )
45
+ throw new Error("Landing Warrant expired");
46
+ return state.landingWarrant;
47
+ }
48
+
49
+ export function settleDevDeliveryAuthorityCandidateInternal(
50
+ stateInput,
51
+ input,
52
+ { now = new Date().toISOString(), sealedProviderReadback = null } = {},
53
+ ) {
54
+ const currentTime = timestamp(now, "now");
55
+ const initial = normalizeDevDeliveryAuthorityState(stateInput);
56
+ const requestedPullRequestNumber = positiveInteger(
57
+ input?.pullRequestNumber,
58
+ "pullRequestNumber",
59
+ );
60
+ const requestedSourceHead = exactSha(input?.sourceHead, "sourceHead");
61
+ const initialCandidate = initial.candidates.find(
62
+ (entry) =>
63
+ entry.pullRequestNumber === requestedPullRequestNumber &&
64
+ entry.sourceHead === requestedSourceHead &&
65
+ initial.landingWarrant?.candidateId === entry.candidateId,
66
+ );
67
+ const verifiedLanding =
68
+ initialCandidate && initial.landingWarrant
69
+ ? verifyLandingSettlementReadback({
70
+ state: initial,
71
+ candidate: initialCandidate,
72
+ warrant: initial.landingWarrant,
73
+ sealedProviderReadback,
74
+ })
75
+ : null;
76
+ const outcome = text(verifiedLanding?.outcome || input?.outcome);
77
+ if (!TERMINAL_STATES.has(outcome))
78
+ throw new Error(
79
+ `outcome must be one of ${[...TERMINAL_STATES].join(", ")}`,
80
+ );
81
+ const evidenceRoot = verifiedLanding
82
+ ? verifiedLanding.evidenceRoot
83
+ : exactRoot(input?.evidenceRoot, "evidenceRoot");
84
+ const providerFailureAuthority = normalizeProviderFailureAuthorityBinding(
85
+ input || {},
86
+ );
87
+ if (providerFailureAuthority && outcome !== "terminal-failure") {
88
+ throw new Error(
89
+ "provider failure authority is valid only for terminal-failure",
90
+ );
91
+ }
92
+ const transaction = transition(
93
+ stateInput,
94
+ (state, before) => {
95
+ const matching = state.candidates.filter(
96
+ (entry) =>
97
+ entry.pullRequestNumber === requestedPullRequestNumber &&
98
+ entry.sourceHead === requestedSourceHead,
99
+ );
100
+ const activeIds = new Set(
101
+ [
102
+ ...before.qualificationLeases.map((lease) => lease.candidateId),
103
+ before.landingWarrant?.candidateId,
104
+ ].filter(Boolean),
105
+ );
106
+ const candidate =
107
+ matching.find((entry) => activeIds.has(entry.candidateId)) ||
108
+ matching.at(-1);
109
+ if (!candidate)
110
+ return {
111
+ candidate: null,
112
+ released: null,
113
+ action: "terminal-event-not-applicable",
114
+ mutated: false,
115
+ };
116
+ if (TERMINAL_STATES.has(candidate.status)) {
117
+ if (candidate.status !== outcome)
118
+ throw new Error(
119
+ "terminal candidate outcome does not match terminal event",
120
+ );
121
+ if (candidate.terminal.evidenceRoot !== evidenceRoot)
122
+ throw new Error("duplicate terminal event evidenceRoot drift");
123
+ const durableFailureAuthority =
124
+ normalizeProviderFailureAuthorityBinding(candidate.terminal);
125
+ if (
126
+ JSON.stringify(durableFailureAuthority) !==
127
+ JSON.stringify(providerFailureAuthority)
128
+ )
129
+ throw new Error(
130
+ "duplicate terminal event provider failure authority drift",
131
+ );
132
+ return {
133
+ candidate,
134
+ released: null,
135
+ action: "duplicate-terminal-event-noop",
136
+ mutated: false,
137
+ };
138
+ }
139
+ if (
140
+ outcome === "merged" &&
141
+ before.landingWarrant?.candidateId !== candidate.candidateId
142
+ )
143
+ throw new Error(
144
+ "merged settlement requires the exact active Landing Warrant",
145
+ );
146
+ let released = null;
147
+ const qualificationLease = before.qualificationLeases.find(
148
+ (entry) => entry.candidateId === candidate.candidateId,
149
+ );
150
+ if (qualificationLease) {
151
+ const token = exactRoot(input?.authorityToken, "authorityToken");
152
+ const generation = positiveInteger(
153
+ input?.authorityGeneration,
154
+ "authorityGeneration",
155
+ );
156
+ if (
157
+ token !== qualificationLease.token ||
158
+ generation !== qualificationLease.generation
159
+ )
160
+ throw new Error(
161
+ "terminal settlement qualification authority mismatch",
162
+ );
163
+ state.qualificationLeases = state.qualificationLeases.filter(
164
+ (entry) => entry.candidateId !== candidate.candidateId,
165
+ );
166
+ released = { kind: "qualification-lease", token };
167
+ }
168
+ if (before.landingWarrant?.candidateId === candidate.candidateId) {
169
+ assertDevDeliveryLandingWarrant(
170
+ before,
171
+ {
172
+ candidateId: candidate.candidateId,
173
+ token: input?.authorityToken,
174
+ generation: input?.authorityGeneration,
175
+ },
176
+ currentTime,
177
+ { allowExpired: true },
178
+ );
179
+ state.landingWarrant = null;
180
+ released = {
181
+ kind: "landing-warrant",
182
+ token: before.landingWarrant.token,
183
+ };
184
+ }
185
+ candidate.status = outcome;
186
+ candidate.terminal = {
187
+ outcome,
188
+ evidenceRoot,
189
+ reason: text(verifiedLanding?.reason || input?.reason),
190
+ settledAt: currentTime,
191
+ ...(providerFailureAuthority || {}),
192
+ ...normalizeDevDeliveryTerminalProviderEvidence({
193
+ providerAttempt: before.landingWarrant?.providerAttempt,
194
+ providerTerminalReadbackRoot: verifiedLanding?.readbackRoot,
195
+ }),
196
+ };
197
+ candidate.updatedAt = currentTime;
198
+ return { candidate, released, action: "terminal-authority-released" };
199
+ },
200
+ currentTime,
201
+ );
202
+ const changed = receipt(transaction, transaction.result.action, {
203
+ candidateId: transaction.result.candidate?.candidateId || null,
204
+ outcome,
205
+ evidenceRoot,
206
+ releasedAuthority: transaction.result.released,
207
+ providerTerminalReadbackRoot: verifiedLanding?.readbackRoot || null,
208
+ ...(providerFailureAuthority || {}),
209
+ nextAction:
210
+ "Authority is released immediately; select the next eligible candidate.",
211
+ });
212
+ return { ...changed, wake: schedulerWake(changed.state) };
213
+ }