@kungfu-tech/buildchain 3.0.9-alpha.8 → 4.0.0-alpha.0

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 (255) hide show
  1. package/AGENTS.md +39 -0
  2. package/README.md +17 -13
  3. package/actions/promote-buildchain-ref/README.md +0 -10
  4. package/actions/release-tail/README.md +6 -10
  5. package/architecture/internal-capabilities.json +502 -0
  6. package/architecture/maintainability-baseline.json +59 -0
  7. package/architecture/maintainability-policy.json +1384 -0
  8. package/architecture/release-tail-contract-inventory.json +587 -0
  9. package/architecture/v3-core-mechanism-inventory.json +1043 -0
  10. package/architecture/v3-core-mechanism-inventory.md +67 -0
  11. package/architecture/v4-adopter-delivery-parity.json +47 -0
  12. package/architecture/v4-architecture-constitution.md +210 -0
  13. package/architecture/v4-bootstrap-authority.json +56 -0
  14. package/architecture/v4-canonical-contract-fixtures.json +105 -0
  15. package/architecture/v4-capability-state-machine-manifest.json +480 -0
  16. package/architecture/v4-capability-state-machine-manifest.schema.json +202 -0
  17. package/architecture/v4-delivery-warrant-shadow-bootstrap-plan.json +830 -0
  18. package/architecture/v4-delivery-warrant-shadow-bootstrap-plan.md +223 -0
  19. package/architecture/v4-delivery-warrant-shadow-bootstrap-plan.schema.json +318 -0
  20. package/architecture/v4-delivery-warrant-shadow-fixtures.json +227 -0
  21. package/architecture/v4-delivery-warrant-shadow-fixtures.schema.json +67 -0
  22. package/architecture/v4-exception-ledger.json +5 -0
  23. package/architecture/v4-exception-ledger.schema.json +56 -0
  24. package/architecture/v4-partial-mutation-recovery-qualification.json +65 -0
  25. package/architecture/v4-platform-stage-checkpoints.json +97 -0
  26. package/architecture/v4-provider-operation-journal-contract.json +113 -0
  27. package/architecture/v4-release-activation-shadow-domain.json +61 -0
  28. package/architecture/v4-release-train-parity.json +68 -0
  29. package/architecture/v4-rust-libnode-bridge-evaluation.json +107 -0
  30. package/architecture/v4-rust-libnode-bridge-spike.md +85 -0
  31. package/architecture/v4-stable-publication-fence.json +66 -0
  32. package/architecture/v4-stage-capsule-contract.json +90 -0
  33. package/architecture/v4-stage-capsule-qualification.json +99 -0
  34. package/architecture/v4-stage-capsule-resume-planner.json +52 -0
  35. package/architecture/v4-stage-capsule-store-contract.json +72 -0
  36. package/bin/buildchain.mjs +15 -6
  37. package/contracts/auditable-demo-scenario-v1.schema.json +1 -1
  38. package/contracts/buildchain-v2-residuals-v1.json +2 -2
  39. package/contracts/fixtures/v4-delivery-warrant-trace-v1/golden.json +158 -0
  40. package/contracts/fixtures/v4-delivery-warrant-trace-v1/property.json +380 -0
  41. package/contracts/fixtures/v4-delivery-warrant-trace-v1/replay.json +163 -0
  42. package/contracts/fixtures/v4-partial-mutation-recovery-v1/shared.json +155 -0
  43. package/contracts/fixtures/v4-provider-operation-journal-v1/shared.json +457 -0
  44. package/contracts/fixtures/v4-provider-readback-idempotency-v1/shared.json +682 -0
  45. package/contracts/fixtures/v4-release-activation-shadow-v1/shared.json +53 -0
  46. package/contracts/fixtures/v4-stable-publication-fence-v1/shared.json +56 -0
  47. package/contracts/fixtures/v4-stage-capsule-resume-v1/late-platform-failure.json +176 -0
  48. package/contracts/fixtures/v4-stage-capsule-store-v1/shared.json +132 -0
  49. package/contracts/fixtures/v4-stage-capsule-v1/shared.json +111 -0
  50. package/contracts/v4-canonical-contracts-v1.schema.json +182 -0
  51. package/contracts/v4-delivery-warrant-semantic-diff-report-v1.schema.json +284 -0
  52. package/contracts/v4-delivery-warrant-trace-v1.schema.json +215 -0
  53. package/contracts/v4-host-contract-v1.schema.json +135 -0
  54. package/contracts/v4-partial-mutation-recovery-v1.schema.json +168 -0
  55. package/contracts/v4-provider-operation-journal-v1.schema.json +381 -0
  56. package/contracts/v4-release-activation-shadow-v1.schema.json +186 -0
  57. package/contracts/v4-stable-publication-fence-v1.schema.json +125 -0
  58. package/contracts/v4-stage-capsule-resume-v1.schema.json +225 -0
  59. package/contracts/v4-stage-capsule-store-v1.schema.json +154 -0
  60. package/contracts/v4-stage-capsule-v1.schema.json +178 -0
  61. package/crates/buildchain-v4-bridge/Cargo.lock +213 -0
  62. package/crates/buildchain-v4-bridge/Cargo.toml +12 -0
  63. package/crates/buildchain-v4-bridge/src/main.rs +495 -0
  64. package/dist/site/agent-index.json +0 -3
  65. package/dist/site/artifact-schemas.json +0 -6
  66. package/dist/site/buildchain-contract.json +103 -397
  67. package/dist/site/buildchain-site.json +302 -270
  68. package/dist/site/capability-registry.json +9 -11
  69. package/dist/site/cli-registry.json +8 -30
  70. package/dist/site/controller-registry.json +48 -8
  71. package/dist/site/kfd-claims.json +129 -142
  72. package/dist/site/kfd-upstream-aggregate.json +9 -9
  73. package/dist/site/manual-registry.json +18 -49
  74. package/dist/site/node-api-registry.json +1882 -4118
  75. package/dist/site/page-registry.json +278 -230
  76. package/dist/site/public-surface-audit.json +87 -185
  77. package/dist/site/publication-authority-registry.json +11 -1
  78. package/dist/site/publication-registry.json +4 -4
  79. package/dist/site/release-provenance.json +3 -7
  80. package/dist/site/schemas/kfd-support-projection-v1.schema.json +106 -0
  81. package/dist/site/site-manifest.json +22 -38
  82. package/dist/site/workflow-registry.json +80 -35
  83. package/docs/MAP.md +8 -4
  84. package/docs/auditable-demo.md +2 -2
  85. package/docs/aws-us-elastic-runner-burst-plane.md +7 -59
  86. package/docs/cli-reference.md +15 -92
  87. package/docs/cli.md +14 -14
  88. package/docs/dev-alpha-candidate-patrol.md +3 -11
  89. package/docs/dev-delivery-warrant.md +28 -100
  90. package/docs/engineering-housekeeper.md +12 -4
  91. package/docs/getting-started.md +1 -1
  92. package/docs/install.md +5 -5
  93. package/docs/kfd-support.md +2 -7
  94. package/docs/lifecycle-protocol.md +2 -4
  95. package/docs/node-api-reference.md +414 -523
  96. package/docs/release-flow.md +31 -31
  97. package/docs/release-governance.md +16 -28
  98. package/docs/release-passport.md +2 -15
  99. package/docs/release-tail-contract.md +13 -6
  100. package/docs/release-tail-provider-plane.md +13 -19
  101. package/docs/release-train.md +4 -4
  102. package/docs/reusable-build-surface.md +14 -27
  103. package/docs/site-bundle-contract.md +1 -5
  104. package/docs/stable-candidate-patrol.md +7 -7
  105. package/docs/v4-canonical-contracts.md +92 -0
  106. package/docs/v4-delivery-warrant-read-candidate.md +73 -0
  107. package/docs/v4-delivery-warrant-semantic-diff.md +75 -0
  108. package/docs/v4-production-release.md +63 -0
  109. package/docs/v4-stage-capsule.md +193 -0
  110. package/docs/versioning.md +3 -3
  111. package/package.json +19 -17
  112. package/packages/core/adopter-delivery-gate.js +576 -0
  113. package/packages/core/adopter-delivery-json.js +66 -0
  114. package/packages/core/artifact-signing.js +0 -61
  115. package/packages/core/artifact-verification-envelope.js +5 -5
  116. package/packages/core/build-facts.js +12 -4
  117. package/packages/core/buildchain-agent-manuals.js +0 -2
  118. package/packages/core/buildchain-config.js +4 -69
  119. package/packages/core/buildchain-contract.js +232 -46
  120. package/packages/core/buildchain-kfd-claims.js +1 -1
  121. package/packages/core/channel-candidate.js +0 -8
  122. package/packages/core/channel-promotion-baseline.js +0 -52
  123. package/packages/core/controller-evidence.js +3 -4
  124. package/packages/core/dev-alpha-candidate-selection.js +2 -10
  125. package/packages/core/dev-delivery-warrant-cancellation.js +0 -1
  126. package/packages/core/dev-delivery-warrant-settlement.js +1 -5
  127. package/packages/core/dev-delivery-warrant.js +12 -52
  128. package/packages/core/diagnostics.js +3 -8
  129. package/packages/core/github-governance-authority.js +3 -1
  130. package/packages/core/kfd-adopter-category-driver.js +167 -0
  131. package/packages/core/kfd-adopter-manifest.js +47 -46
  132. package/packages/core/kfd-gate.js +15 -45
  133. package/packages/core/paper-agent-entry.js +7 -16
  134. package/packages/core/paper-fleet.js +2 -2
  135. package/packages/core/paper-repository.js +2 -3
  136. package/packages/core/paper-scaffold-content.js +2 -23
  137. package/packages/core/paper.js +11 -43
  138. package/packages/core/publication-reproducibility.js +4 -4
  139. package/packages/core/release-line-bootstrap.js +21 -8
  140. package/packages/core/release-passport-contract.js +5 -5
  141. package/packages/core/release-passport.js +20 -131
  142. package/packages/core/self-dogfood-version.js +48 -35
  143. package/packages/core/spawn-command.js +232 -8
  144. package/packages/core/v4-adopter-delivery-parity.js +219 -0
  145. package/packages/core/v4-canonical-contracts.js +284 -0
  146. package/packages/core/v4-delivery-warrant-fixture-runner.js +371 -0
  147. package/packages/core/v4-delivery-warrant-read-candidate.js +279 -0
  148. package/packages/core/v4-delivery-warrant-semantic-diff-gate.js +352 -0
  149. package/packages/core/v4-delivery-warrant-shadow-adapter.js +447 -0
  150. package/packages/core/v4-partial-mutation-recovery-qualification.js +395 -0
  151. package/packages/core/v4-platform-stage-checkpoints.js +471 -0
  152. package/packages/core/v4-provider-operation-journal.js +531 -0
  153. package/packages/core/v4-provider-readback-idempotency.js +394 -0
  154. package/packages/core/v4-release-activation-shadow.js +519 -0
  155. package/packages/core/v4-stable-publication-fence.js +357 -0
  156. package/packages/core/v4-stage-capsule-local-store.js +426 -0
  157. package/packages/core/v4-stage-capsule-qualification-campaign.js +512 -0
  158. package/packages/core/v4-stage-capsule-qualification.js +456 -0
  159. package/packages/core/v4-stage-capsule-resume-planner.js +397 -0
  160. package/packages/core/v4-stage-capsule-store.js +401 -0
  161. package/packages/core/v4-stage-capsule.js +319 -0
  162. package/scripts/assemble-self-publication-admission.mjs +1 -1
  163. package/scripts/audit-publication-control-plane.mjs +5 -5
  164. package/scripts/auditable-demo-bundle-verification.mjs +3 -2
  165. package/scripts/auditable-demo-platform.mjs +2 -2
  166. package/scripts/auditable-demo-renditions.mjs +1 -1
  167. package/scripts/auditable-demo.mjs +2 -2
  168. package/scripts/aws-macos-jit-controller-core.mjs +13 -346
  169. package/scripts/aws-macos-jit-controller-runtime.mjs +2 -210
  170. package/scripts/aws-macos-jit-controller.mjs +37 -275
  171. package/scripts/aws-macos-jit-core.mjs +3 -41
  172. package/scripts/aws-macos-jit.mjs +0 -12
  173. package/scripts/aws-windows-jit-campaign.mjs +2 -2
  174. package/scripts/aws-windows-jit-controller-core.mjs +1 -1
  175. package/scripts/aws-windows-jit-controller.mjs +3 -3
  176. package/scripts/build-contract-core.mjs +3 -8
  177. package/scripts/build-standalone-binary.mjs +3 -14
  178. package/scripts/buildchain-channel-router.mjs +4 -0
  179. package/scripts/buildchain-cli-help.mjs +7 -13
  180. package/scripts/buildchain-contract-lock.mjs +0 -6
  181. package/scripts/check-action-bundles.mjs +3 -4
  182. package/scripts/check-internal-architecture.mjs +7 -6
  183. package/scripts/check-inventory.mjs +30 -25
  184. package/scripts/check-v4-public-dogfood-contract.mjs +270 -0
  185. package/scripts/create-release-bundle.mjs +8 -4
  186. package/scripts/dev-alpha-candidate-patrol.mjs +1 -22
  187. package/scripts/dev-delivery-proof.mjs +2 -54
  188. package/scripts/dev-delivery-warrant.mjs +59 -77
  189. package/scripts/dev-pr-auto-merge.mjs +4 -30
  190. package/scripts/dev-pr-delivery-warrant.mjs +0 -55
  191. package/scripts/dispatch-artifact-signing-authority.mjs +7 -4
  192. package/scripts/generate-buildchain-kfd-witnesses.mjs +94 -88
  193. package/scripts/generate-channel-build-workflow.mjs +54 -24
  194. package/scripts/generate-channel-promotion-workflow.mjs +15 -6
  195. package/scripts/generate-site-bundle.mjs +5 -21
  196. package/scripts/git-fetch-process-tree.mjs +34 -1
  197. package/scripts/init-repo.mjs +64 -159
  198. package/scripts/inspect-artifact-signing-requests.mjs +0 -6
  199. package/scripts/locked-source-checkout.mjs +3 -4
  200. package/scripts/maintainability-metrics.mjs +8 -2
  201. package/scripts/npm-publish-dry-run.mjs +2 -2
  202. package/scripts/npm-publish-transaction.mjs +2 -2
  203. package/scripts/publication-commit-evidence.mjs +23 -69
  204. package/scripts/release-candidate-resolver.mjs +11 -17
  205. package/scripts/release-tail.mjs +3 -49
  206. package/scripts/resume-from-candidate-run.mjs +9 -123
  207. package/scripts/run-lifecycle-core.mjs +12 -13
  208. package/scripts/seal-artifact-signing-requests.mjs +17 -21
  209. package/scripts/site-capability-metadata.mjs +2 -7
  210. package/scripts/stable-candidate-qualification.mjs +10 -10
  211. package/scripts/v4-architecture.mjs +12 -2
  212. package/scripts/v4-bridge-bootstrap.mjs +141 -0
  213. package/scripts/v4-bridge-evidence.mjs +141 -0
  214. package/scripts/v4-host-adapter.mjs +182 -0
  215. package/scripts/v4-platform-stage-checkpoint-rehearsal.mjs +207 -0
  216. package/scripts/v4-stage-capsule-qualification.mjs +528 -0
  217. package/scripts/v4-stage-capsule-resume-rehearsal.mjs +57 -0
  218. package/scripts/v4-warrant-shadow-plan.mjs +601 -0
  219. package/scripts/verify-golden-path.mjs +5 -5
  220. package/scripts/web-surface-cloudfront-rewrite.mjs +15 -15
  221. package/scripts/web-surface-core.mjs +2 -8
  222. package/scripts/workflow-call-contract.mjs +5 -184
  223. package/contracts/fixtures/kfd-adopter-release-v1/kfd-4-perspective.json +0 -16
  224. package/contracts/fixtures/kfd-adopter-release-v1/kfd-4-replay.json +0 -57
  225. package/contracts/fixtures/next-development-transition-v1/anchored-manual-waiting.json +0 -47
  226. package/contracts/fixtures/next-development-transition-v1/semver-auto-planned.json +0 -47
  227. package/contracts/fixtures/next-development-transition-v1/version-model-cases.json +0 -40
  228. package/contracts/next-development-request-v1.schema.json +0 -66
  229. package/contracts/next-development-transition-v1.schema.json +0 -292
  230. package/contracts/publication-rehearsal-capsule-v1.schema.json +0 -173
  231. package/dist/site/schemas/publication-rehearsal-capsule-v1.schema.json +0 -269
  232. package/dist/site/schemas/release-tail-capabilities-v1.schema.json +0 -353
  233. package/dist/site/schemas/release-tail-provider-bindings-v1.schema.json +0 -94
  234. package/docs/next-development-transition.md +0 -119
  235. package/docs/publication-rehearsal.md +0 -94
  236. package/packages/core/buildchain-compatibility-proof.js +0 -631
  237. package/packages/core/dev-delivery-native-proof.js +0 -333
  238. package/packages/core/dev-delivery-warrant-shadow.js +0 -502
  239. package/packages/core/next-development-candidate-reservation.js +0 -186
  240. package/packages/core/next-development-controller.js +0 -726
  241. package/packages/core/next-development-projection.js +0 -288
  242. package/packages/core/next-development-transition.js +0 -738
  243. package/packages/core/publication-rehearsal-projection.js +0 -173
  244. package/packages/core/publication-rehearsal-runtime.js +0 -921
  245. package/scripts/aws-macos-jit-instance-rehydrate.mjs +0 -260
  246. package/scripts/aws-macos-jit-source-rebind.mjs +0 -724
  247. package/scripts/dev-delivery-native-run.mjs +0 -187
  248. package/scripts/dev-delivery-two-phase.mjs +0 -598
  249. package/scripts/generate-next-development-guidance.mjs +0 -49
  250. package/scripts/materialize-self-release-candidate-version.mjs +0 -137
  251. package/scripts/next-development-self-dogfood-harness.mjs +0 -409
  252. package/scripts/next-development-self-dogfood.mjs +0 -532
  253. package/scripts/next-development-transition.mjs +0 -47
  254. package/scripts/release-candidate-tail-reseal.mjs +0 -426
  255. package/templates/native-dev-delivery.yml +0 -82
@@ -49,8 +49,8 @@ function runAws(args, { allowFailure = false } = {}) {
49
49
  return { ok: true, status: result.status, stdout, stderr };
50
50
  }
51
51
 
52
- function runAwsJson(args, options = {}) {
53
- const result = runAws([...args, "--output", "json"], options);
52
+ function runAwsJson(args, options = {}, runAwsCommand = runAws) {
53
+ const result = runAwsCommand([...args, "--output", "json"], options);
54
54
  if (!result.ok) {
55
55
  return { ok: false, data: null, stderr: result.stderr };
56
56
  }
@@ -83,10 +83,10 @@ function writeFunctionCode(tmpDir) {
83
83
  return file;
84
84
  }
85
85
 
86
- function ensureFunction({ name, comment, codeFile }) {
86
+ function ensureFunction({ name, comment, codeFile, runAwsCommand }) {
87
87
  const described = runAwsJson(["cloudfront", "describe-function", "--name", name, "--stage", "DEVELOPMENT"], {
88
88
  allowFailure: true,
89
- });
89
+ }, runAwsCommand);
90
90
  if (!described.ok) {
91
91
  const created = runAwsJson([
92
92
  "cloudfront",
@@ -97,7 +97,7 @@ function ensureFunction({ name, comment, codeFile }) {
97
97
  functionConfig(comment),
98
98
  "--function-code",
99
99
  `fileb://${codeFile}`,
100
- ]);
100
+ ], {}, runAwsCommand);
101
101
  return {
102
102
  etag: created.data?.ETag || "",
103
103
  action: "created",
@@ -118,14 +118,14 @@ function ensureFunction({ name, comment, codeFile }) {
118
118
  functionConfig(comment),
119
119
  "--function-code",
120
120
  `fileb://${codeFile}`,
121
- ]);
121
+ ], {}, runAwsCommand);
122
122
  return {
123
123
  etag: updated.data?.ETag || etag,
124
124
  action: "updated",
125
125
  };
126
126
  }
127
127
 
128
- function publishFunction({ name, etag }) {
128
+ function publishFunction({ name, etag, runAwsCommand }) {
129
129
  if (!etag) {
130
130
  throw new Error(`cloudfront publish-function requires an ETag for ${name}`);
131
131
  }
@@ -136,7 +136,7 @@ function publishFunction({ name, etag }) {
136
136
  name,
137
137
  "--if-match",
138
138
  etag,
139
- ]);
139
+ ], {}, runAwsCommand);
140
140
  const summary = published.data?.FunctionSummary || {};
141
141
  const arn = summary.FunctionMetadata?.FunctionARN || summary.FunctionARN || "";
142
142
  if (!arn) {
@@ -148,10 +148,10 @@ function publishFunction({ name, etag }) {
148
148
  };
149
149
  }
150
150
 
151
- function attachFunction({ distributionId, functionArn }) {
151
+ function attachFunction({ distributionId, functionArn, runAwsCommand }) {
152
152
  let previousViewerRequestFunction;
153
153
  for (let attempt = 1; attempt <= DISTRIBUTION_UPDATE_MAX_ATTEMPTS; attempt += 1) {
154
- const current = runAwsJson(["cloudfront", "get-distribution-config", "--id", distributionId]);
154
+ const current = runAwsJson(["cloudfront", "get-distribution-config", "--id", distributionId], {}, runAwsCommand);
155
155
  const etag = current.data?.ETag || "";
156
156
  const config = current.data?.DistributionConfig;
157
157
  if (!etag || !config) {
@@ -207,7 +207,7 @@ function attachFunction({ distributionId, functionArn }) {
207
207
  "--distribution-config",
208
208
  `file://${configFile}`,
209
209
  ];
210
- updated = runAws(args, { allowFailure: true });
210
+ updated = runAwsCommand(args, { allowFailure: true });
211
211
  } finally {
212
212
  fs.rmSync(tmpDir, { recursive: true, force: true });
213
213
  }
@@ -233,7 +233,7 @@ function attachFunction({ distributionId, functionArn }) {
233
233
  export function ensureCloudFrontDirectoryIndexRewrite({
234
234
  distributionId = "",
235
235
  functionName = "",
236
- comment = "Buildchain web-surface directory index rewrite",
236
+ comment = "Buildchain web-surface directory index rewrite", runAwsCommand = runAws,
237
237
  } = {}) {
238
238
  if (!distributionId) {
239
239
  throw new Error("--distribution-id is required");
@@ -244,9 +244,9 @@ export function ensureCloudFrontDirectoryIndexRewrite({
244
244
  const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "buildchain-cloudfront-function-"));
245
245
  try {
246
246
  const codeFile = writeFunctionCode(tmpDir);
247
- const ensured = ensureFunction({ name: functionName, comment, codeFile });
248
- const published = publishFunction({ name: functionName, etag: ensured.etag });
249
- const attached = attachFunction({ distributionId, functionArn: published.arn });
247
+ const ensured = ensureFunction({ name: functionName, comment, codeFile, runAwsCommand });
248
+ const published = publishFunction({ name: functionName, etag: ensured.etag, runAwsCommand });
249
+ const attached = attachFunction({ distributionId, functionArn: published.arn, runAwsCommand });
250
250
  return {
251
251
  schemaVersion: 1,
252
252
  contract: "kungfu-buildchain-web-surface-cloudfront-directory-index-rewrite",
@@ -1725,13 +1725,12 @@ async function fetchWithRetry(url, {
1725
1725
  attempts = 3,
1726
1726
  intervalMs = 5000,
1727
1727
  shouldRetry = () => false,
1728
- requestOptions = { redirect: "follow" },
1729
1728
  } = {}) {
1730
1729
  const maxAttempts = Math.max(1, Number(attempts) || 1);
1731
1730
  let lastError = null;
1732
1731
  for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
1733
1732
  try {
1734
- const response = await fetchImpl(url, requestOptions);
1733
+ const response = await fetchImpl(url, { redirect: "follow" });
1735
1734
  if (attempt >= maxAttempts || !shouldRetry(response)) {
1736
1735
  return { response, attempts: attempt };
1737
1736
  }
@@ -1752,11 +1751,6 @@ function retryableHealthResponse(response) {
1752
1751
  return response.status === 403 || response.status === 404 || response.status >= 500;
1753
1752
  }
1754
1753
 
1755
- function retryingHealthFetch(fetchImpl, attempts, intervalMs) {
1756
- return (url, requestOptions) => fetchWithRetry(url, { fetchImpl, attempts, intervalMs,
1757
- shouldRetry: retryableHealthResponse, requestOptions }).then(({ response }) => response);
1758
- }
1759
-
1760
1754
  const DEFAULT_HEALTH_HTTP_RETRY_ATTEMPTS = 12;
1761
1755
  const DEFAULT_HEALTH_HTTP_RETRY_INTERVAL_MS = 10000;
1762
1756
 
@@ -1990,7 +1984,7 @@ export async function checkWebSurfaceHealth({
1990
1984
  };
1991
1985
  const evidence = await verifyInstallerPublicReadback({
1992
1986
  publication: projected,
1993
- fetchImpl: retryingHealthFetch(fetchImpl, httpRetryAttempts, httpRetryIntervalMs),
1987
+ fetchImpl,
1994
1988
  });
1995
1989
  checks.push({
1996
1990
  surface: "__installer__",
@@ -4,170 +4,13 @@ import path from "node:path";
4
4
  import { execFileSync } from "node:child_process";
5
5
  import { pathToFileURL } from "node:url";
6
6
  import { evaluateWorkflowCallContract } from "../packages/core/workflow-call-contract.js";
7
- import { parseWorkflowDocument } from "../packages/core/workflow-yaml-contract.js";
8
-
9
- export const SELF_RELEASE_REF = "cc6c32845ab5779009aeb48cc34efe65e229fe30";
10
- export const SELF_RELEASE_PUBLIC_WORKFLOW = `kungfu-systems/buildchain/.github/workflows/release-candidate-promote.yml@${SELF_RELEASE_REF}`;
11
-
12
- function parityFailure(message) {
13
- throw new Error(`self-release route parity: ${message}`);
14
- }
15
-
16
- function literal(job, name) {
17
- const value = job?.with?.[name];
18
- if (!value || value.kind === "expression") {
19
- parityFailure(`${job?.id || "<missing>"}.${name} must be a literal`);
20
- }
21
- return value.value;
22
- }
23
-
24
- export function selfReleaseRouteIdentity(workflowText, jobId = "promote") {
25
- const job = parseWorkflowDocument(workflowText).callJobs.find(
26
- (entry) => entry.id === jobId,
27
- );
28
- if (!job) parityFailure(`reusable workflow job is missing: ${jobId}`);
29
- if (
30
- job.uses.startsWith("./") ||
31
- job.uses.includes("/.release-candidate-promote.yml@")
32
- ) {
33
- parityFailure(
34
- `authoritative caller uses an internal or checkout-relative route: ${job.uses}`,
35
- );
36
- }
37
- if (job.uses !== SELF_RELEASE_PUBLIC_WORKFLOW) {
38
- parityFailure(
39
- `caller uses ${job.uses}, expected ${SELF_RELEASE_PUBLIC_WORKFLOW}`,
40
- );
41
- }
42
- if (literal(job, "buildchain-ref") !== SELF_RELEASE_REF) {
43
- parityFailure("caller runtime ref differs from the public workflow ref");
44
- }
45
- if (literal(job, "declarative-release-tail") !== true) {
46
- parityFailure(
47
- "caller does not require the declarative release-tail provider plane",
48
- );
49
- }
50
- return {
51
- publicWorkflow: job.uses,
52
- runtimeRef: SELF_RELEASE_REF,
53
- declarationContract: "kungfu-buildchain-release-tail-capabilities/v1",
54
- declarationCompiler:
55
- "packages/core/release-tail-provider-plane.js#compileReleaseTailDeclaration",
56
- transaction:
57
- "packages/core/release-tail-provider-plane.js#executeReleaseTailTransaction",
58
- providerAdapter:
59
- "packages/core/release-tail-provider-adapters.js#createGitHubReleaseAssetsAdapter",
60
- receiptValidator:
61
- "packages/core/release-tail-provider-plane.js#validateReleaseTailTransaction",
62
- };
63
- }
64
-
65
- export function assertSelfReleaseRouteParity({
66
- selfWorkflowText,
67
- consumerWorkflowText,
68
- routing,
69
- publicWorkflowText,
70
- advancedWorkflowText,
71
- actionText,
72
- providerPlanText,
73
- } = {}) {
74
- const self = selfReleaseRouteIdentity(selfWorkflowText);
75
- const consumer = selfReleaseRouteIdentity(consumerWorkflowText);
76
- if (JSON.stringify(self) !== JSON.stringify(consumer)) {
77
- parityFailure(
78
- "Buildchain self-release and representative consumer identities differ",
79
- );
80
- }
81
- const alphaShellRef = routing?.alpha?.callRef;
82
- if (alphaShellRef !== "train/v3/v3.0/consumer-equivalent-self-dogfood") {
83
- parityFailure(
84
- "alpha workflow shell does not resolve through the self-dogfood train",
85
- );
86
- }
87
- for (const required of [
88
- "uses: kungfu-systems/buildchain/.github/workflows/.release-candidate-promote.yml@train/v3/v3.0/consumer-equivalent-self-dogfood",
89
- "declarative-release-tail: ${{ inputs.declarative-release-tail }}",
90
- ]) {
91
- if (!publicWorkflowText.includes(required)) {
92
- parityFailure(`public router is missing: ${required}`);
93
- }
94
- }
95
- for (const required of [
96
- "declarative-release-tail:",
97
- "declarative-release-tail: ${{ inputs.declarative-release-tail }}",
98
- "release-tail-transaction-root:",
99
- ]) {
100
- if (!advancedWorkflowText.includes(required)) {
101
- parityFailure(`advanced workflow shell is missing: ${required}`);
102
- }
103
- }
104
- for (const required of [
105
- "executeReleaseTailTransaction",
106
- "createGitHubReleaseAssetsAdapter",
107
- "publishDeclarativeGitHubReleaseEvidence",
108
- ]) {
109
- if (!actionText.includes(required)) {
110
- parityFailure(
111
- `promotion action is missing provider-plane identity: ${required}`,
112
- );
113
- }
114
- }
115
- for (const required of [
116
- "compileReleaseTailDeclaration",
117
- "githubReleaseAssetsTargetRoot",
118
- "createDeclarativeGitHubReleasePlan",
119
- ]) {
120
- if (!providerPlanText.includes(required)) {
121
- parityFailure(`declarative GitHub Release plan is missing: ${required}`);
122
- }
123
- }
124
- return {
125
- schema: "kungfu.buildchain.self-release-route-parity/v1",
126
- ok: true,
127
- self,
128
- consumer,
129
- workflowShellRef: routing.alpha.callRef,
130
- };
131
- }
132
-
133
- export function checkSelfReleaseRouteParity({ root, observed = {} } = {}) {
134
- const read = (relative) => fs.readFileSync(path.join(root, relative), "utf8");
135
- const report = assertSelfReleaseRouteParity({
136
- selfWorkflowText: read(".github/workflows/buildchain-ref-promotion.yml"),
137
- consumerWorkflowText: read(
138
- "tests/fixtures/self-release-route/external-consumer.yml",
139
- ),
140
- routing: JSON.parse(read(".buildchain/promotion-shell-routing.json")),
141
- publicWorkflowText: read(".github/workflows/release-candidate-promote.yml"),
142
- advancedWorkflowText: read(
143
- ".github/workflows/.release-candidate-promote.yml",
144
- ),
145
- actionText: `${read("actions/promote-buildchain-ref/index.js")}\n${read("actions/promote-buildchain-ref/github-release.js")}`,
146
- providerPlanText: read("actions/promote-buildchain-ref/github-release.js"),
147
- });
148
- const rootPattern = /^sha256:[0-9a-f]{64}$/u;
149
- const shaPattern = /^[0-9a-f]{40}$/u;
150
- for (const [name, value] of Object.entries(observed)) {
151
- if (!value) continue;
152
- const valid =
153
- name === "runtimeSha" ? shaPattern.test(value) : rootPattern.test(value);
154
- if (!valid)
155
- parityFailure(`observed ${name} is not an exact rooted identity`);
156
- }
157
- return { ...report, observed };
158
- }
159
7
 
160
8
  function usage() {
161
- return `usage:
162
- node scripts/workflow-call-contract.mjs check \\
9
+ return `usage: node scripts/workflow-call-contract.mjs check \\
163
10
  --caller-workflow <path> --job <id> --caller-repository <owner/repo> \\
164
11
  --callee-root <checkout> --callee-workflow <path> --callee-repository <owner/repo> \\
165
12
  --trusted-event <event[:type]> [--trusted-event ...] \\
166
- [--expected-contract-root sha256:...] [--allow-dirty] [--output <path>]
167
- node scripts/workflow-call-contract.mjs self-release-parity \\
168
- [--root <checkout>] [--runtime-sha <sha>] [--contract-root <root>] \\
169
- [--release-tail-declaration-root <root>] [--release-tail-transaction-root <root>] \\
170
- [--release-tail-state-root <root>] [--output <path>]`;
13
+ [--expected-contract-root sha256:...] [--allow-dirty] [--output <path>]`;
171
14
  }
172
15
 
173
16
  function parseArgs(argv) {
@@ -178,7 +21,7 @@ function parseArgs(argv) {
178
21
  options.allowDirty = true;
179
22
  continue;
180
23
  }
181
- if (!arg.startsWith("--") || index + 1 >= argv.length)
24
+ if (!arg.startsWith("--") || !argv[index + 1])
182
25
  throw new Error(`invalid argument: ${arg}`);
183
26
  const value = argv[index + 1];
184
27
  index += 1;
@@ -224,9 +67,7 @@ export function checkWorkflowCall(options) {
224
67
  "--untracked-files=no",
225
68
  );
226
69
  if (calleeStatus) {
227
- throw new Error(
228
- "callee checkout is dirty; exact pinned-ref bytes are required",
229
- );
70
+ throw new Error("callee checkout is dirty; exact pinned-ref bytes are required");
230
71
  }
231
72
  const callerSha = git(callerRoot, "rev-parse", "HEAD");
232
73
  const callerTree = git(callerRoot, "rev-parse", "HEAD^{tree}");
@@ -262,28 +103,8 @@ export function checkWorkflowCall(options) {
262
103
 
263
104
  function main(argv = process.argv.slice(2)) {
264
105
  const command = argv.shift();
265
- const options = parseArgs(argv);
266
- if (command === "self-release-parity") {
267
- const root = options.root ? path.resolve(options.root) : process.cwd();
268
- const report = checkSelfReleaseRouteParity({
269
- root,
270
- observed: {
271
- runtimeSha: options.runtimeSha || "",
272
- contractRoot: options.contractRoot || "",
273
- releaseTailDeclarationRoot: options.releaseTailDeclarationRoot || "",
274
- releaseTailTransactionRoot: options.releaseTailTransactionRoot || "",
275
- releaseTailStateRoot: options.releaseTailStateRoot || "",
276
- },
277
- });
278
- if (options.output) {
279
- const output = path.resolve(root, options.output);
280
- fs.mkdirSync(path.dirname(output), { recursive: true });
281
- fs.writeFileSync(output, `${JSON.stringify(report, null, 2)}\n`);
282
- }
283
- process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
284
- return;
285
- }
286
106
  if (command !== "check") throw new Error(usage());
107
+ const options = parseArgs(argv);
287
108
  required(options, [
288
109
  "callerWorkflow",
289
110
  "job",
@@ -1,16 +0,0 @@
1
- {
2
- "schemaVersion": 1,
3
- "contract": "kfd-4-observer-perspective",
4
- "standard": "kfd-4",
5
- "id": "buildchain-release-maintainer-view",
6
- "observer": { "id": "buildchain-release-maintainer", "kind": "human" },
7
- "acceptedFacts": [
8
- { "sourceId": "kungfu-systems/buildchain@{{SOURCE_SHA}}", "sourceKind": "repository" }
9
- ],
10
- "projectionPolicy": {
11
- "policyVersion": "1",
12
- "causalDominance": true,
13
- "tieBreaker": "source-coordinate"
14
- },
15
- "verification": { "result": "pass" }
16
- }
@@ -1,57 +0,0 @@
1
- {
2
- "schemaVersion": 1,
3
- "contract": "kfd-4-perspective-replay",
4
- "standard": "kfd-4",
5
- "replayId": "buildchain-release-product-contrast",
6
- "mode": "contrastive",
7
- "sourceViews": [
8
- {
9
- "id": "maintainer",
10
- "kind": "observer-view",
11
- "coordinate": "git://kungfu-systems/buildchain@{{SOURCE_SHA}}",
12
- "observer": "buildchain-release-maintainer",
13
- "perspective": "release-integrity",
14
- "acceptedFactCut": "git://kungfu-systems/buildchain@{{SOURCE_SHA}}",
15
- "naturalObjects": ["release"],
16
- "consequences": ["published artifact"],
17
- "knownGaps": []
18
- },
19
- {
20
- "id": "consumer",
21
- "kind": "observer-view",
22
- "coordinate": "npm://@kungfu-tech/buildchain@{{SOURCE_SHA}}",
23
- "observer": "buildchain-release-consumer",
24
- "perspective": "artifact-consumption",
25
- "acceptedFactCut": "artifact://published-package",
26
- "naturalObjects": ["installed package"],
27
- "consequences": ["local build execution"],
28
- "knownGaps": ["consumer runtime state"]
29
- }
30
- ],
31
- "replayObserver": {
32
- "id": "buildchain",
33
- "kind": "service",
34
- "purpose": "retain source and artifact fact boundaries"
35
- },
36
- "reconstruction": {
37
- "policyVersion": "1",
38
- "sharedContext": "same source-bound release",
39
- "preservedElements": ["observer", "accepted-fact-cut", "evidence-boundary"],
40
- "declaredLoss": ["consumer runtime state"],
41
- "degradedState": "none"
42
- },
43
- "contrast": {
44
- "dimensions": ["evidence-boundary"],
45
- "mismatches": [
46
- {
47
- "sourceViewIds": ["maintainer", "consumer"],
48
- "observation": "source and installed artifact evidence have different custody",
49
- "primitiveSignal": "inconclusive"
50
- }
51
- ]
52
- },
53
- "verification": {
54
- "result": "pass",
55
- "evidence": ["evidence/projection-fsck.json"]
56
- }
57
- }
@@ -1,47 +0,0 @@
1
- {
2
- "schemaVersion": 1,
3
- "contract": "kungfu-buildchain-next-development-transition/v1",
4
- "idempotencyKey": "sha256:cf805c1933cbc3e571c21af3ae030139bebafb08e2436b3c479c411b2cd2d22c",
5
- "repository": "example/widget",
6
- "completedAlpha": {
7
- "outcome": "succeeded",
8
- "version": "1.4.2-alpha.7",
9
- "exactTag": "v1.4.2-alpha.7",
10
- "releaseSha": "1111111111111111111111111111111111111111",
11
- "treeSha": "2222222222222222222222222222222222222222",
12
- "publicationRoot": "sha256:3333333333333333333333333333333333333333333333333333333333333333",
13
- "completedAt": "2026-08-11T01:00:00.000Z"
14
- },
15
- "completedAlphaRoot": "sha256:18e65c63aba0df789e0b0e68903733825d87e292b82bcb8fd3793ca45dca6266",
16
- "alphaOutcome": "preserved-success",
17
- "model": {
18
- "strategy": "anchored",
19
- "next": "manual"
20
- },
21
- "target": {
22
- "version": null,
23
- "anchor": null
24
- },
25
- "declaredPaths": ["package.json", "release.json"],
26
- "adapter": {
27
- "environmentVariable": "BUILDCHAIN_VERSION",
28
- "sourcePaths": ["package.json"],
29
- "derivedPaths": [],
30
- "allowedChangePaths": ["package.json"],
31
- "readOnlyPaths": ["release.json"],
32
- "derivationStage": null,
33
- "verificationStage": "lifecycle.verify"
34
- },
35
- "effectBounds": {
36
- "allowedPaths": ["package.json"],
37
- "refUpdates": [],
38
- "forbiddenRefNamespaces": ["refs/heads/alpha/", "refs/tags/"]
39
- },
40
- "state": {
41
- "status": "waiting-anchor",
42
- "generation": 1,
43
- "stateRoot": "sha256:4bbca86f960a7c1a10d76d01736422e3129f3f16d3e69e0800a0829201122dd4"
44
- },
45
- "materialization": null,
46
- "transitions": []
47
- }
@@ -1,47 +0,0 @@
1
- {
2
- "schemaVersion": 1,
3
- "contract": "kungfu-buildchain-next-development-transition/v1",
4
- "idempotencyKey": "sha256:37ee52799584a989b059db060b7ce062feb56fbeff452033245046fdf3b21e78",
5
- "repository": "example/widget",
6
- "completedAlpha": {
7
- "outcome": "succeeded",
8
- "version": "1.4.2-alpha.7",
9
- "exactTag": "v1.4.2-alpha.7",
10
- "releaseSha": "1111111111111111111111111111111111111111",
11
- "treeSha": "2222222222222222222222222222222222222222",
12
- "publicationRoot": "sha256:3333333333333333333333333333333333333333333333333333333333333333",
13
- "completedAt": "2026-08-11T01:00:00.000Z"
14
- },
15
- "completedAlphaRoot": "sha256:18e65c63aba0df789e0b0e68903733825d87e292b82bcb8fd3793ca45dca6266",
16
- "alphaOutcome": "preserved-success",
17
- "model": {
18
- "strategy": "semver",
19
- "next": "auto"
20
- },
21
- "target": {
22
- "version": "1.4.2-alpha.8",
23
- "anchor": null
24
- },
25
- "declaredPaths": ["package.json"],
26
- "adapter": {
27
- "environmentVariable": "BUILDCHAIN_VERSION",
28
- "sourcePaths": ["package.json"],
29
- "derivedPaths": [],
30
- "allowedChangePaths": ["package.json"],
31
- "readOnlyPaths": [],
32
- "derivationStage": null,
33
- "verificationStage": "lifecycle.verify"
34
- },
35
- "effectBounds": {
36
- "allowedPaths": ["package.json"],
37
- "refUpdates": [],
38
- "forbiddenRefNamespaces": ["refs/heads/alpha/", "refs/tags/"]
39
- },
40
- "state": {
41
- "status": "planned",
42
- "generation": 1,
43
- "stateRoot": "sha256:4ef8ac1ff07cb14633994625e65a340acb3130ae56bbc88ee81504f09df3fa0f"
44
- },
45
- "materialization": null,
46
- "transitions": []
47
- }
@@ -1,40 +0,0 @@
1
- {
2
- "contract": "kungfu-buildchain-next-development-version-model-fixtures/v1",
3
- "positive": [
4
- {
5
- "name": "semver-auto",
6
- "model": { "strategy": "semver", "next": "auto" }
7
- },
8
- {
9
- "name": "anchored-manual",
10
- "model": { "strategy": "anchored", "next": "manual" }
11
- }
12
- ],
13
- "negative": [
14
- {
15
- "name": "semver-manual",
16
- "model": { "strategy": "semver", "next": "manual" },
17
- "error": "version model must be semver/auto or anchored/manual"
18
- },
19
- {
20
- "name": "anchored-auto",
21
- "model": { "strategy": "anchored", "next": "auto" },
22
- "error": "version model must be semver/auto or anchored/manual"
23
- },
24
- {
25
- "name": "semver-auto-with-anchor",
26
- "model": { "strategy": "semver", "next": "auto" },
27
- "anchor": {
28
- "manifestPath": "release.json",
29
- "manifestRoot": "sha256:4444444444444444444444444444444444444444444444444444444444444444"
30
- },
31
- "error": "semver/auto must not declare an anchor"
32
- },
33
- {
34
- "name": "anchored-manual-target-without-anchor",
35
- "model": { "strategy": "anchored", "next": "manual" },
36
- "targetVersion": "22.1.0",
37
- "error": "anchored/manual targetVersion requires an anchor"
38
- }
39
- ]
40
- }
@@ -1,66 +0,0 @@
1
- {
2
- "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://buildchain.libkungfu.dev/schemas/next-development-request-v1.schema.json",
4
- "title": "Buildchain Next-development Request v1",
5
- "type": "object",
6
- "additionalProperties": false,
7
- "required": ["contract", "repository", "completedAlpha", "recordedAt"],
8
- "properties": {
9
- "contract": {
10
- "const": "kungfu-buildchain-next-development-request/v1"
11
- },
12
- "repository": {
13
- "type": "string",
14
- "pattern": "^[^/\\s]+/[^/\\s]+$"
15
- },
16
- "completedAlpha": { "$ref": "#/$defs/completedAlpha" },
17
- "targetVersion": { "$ref": "#/$defs/semver" },
18
- "anchor": { "$ref": "#/$defs/anchor" },
19
- "recordedAt": { "type": "string", "format": "date-time" }
20
- },
21
- "$defs": {
22
- "gitSha": { "type": "string", "pattern": "^[0-9a-f]{40}$" },
23
- "root": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
24
- "semver": {
25
- "type": "string",
26
- "pattern": "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$"
27
- },
28
- "completedAlpha": {
29
- "type": "object",
30
- "additionalProperties": false,
31
- "required": [
32
- "outcome",
33
- "version",
34
- "exactTag",
35
- "releaseSha",
36
- "treeSha",
37
- "publicationRoot",
38
- "completedAt"
39
- ],
40
- "properties": {
41
- "outcome": { "const": "succeeded" },
42
- "version": {
43
- "type": "string",
44
- "pattern": "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)-alpha\\.(0|[1-9][0-9]*)$"
45
- },
46
- "exactTag": { "type": "string", "minLength": 1 },
47
- "releaseSha": { "$ref": "#/$defs/gitSha" },
48
- "treeSha": { "$ref": "#/$defs/gitSha" },
49
- "publicationRoot": { "$ref": "#/$defs/root" },
50
- "completedAt": { "type": "string", "format": "date-time" }
51
- }
52
- },
53
- "anchor": {
54
- "type": "object",
55
- "additionalProperties": false,
56
- "required": ["manifestPath", "manifestRoot"],
57
- "properties": {
58
- "manifestPath": {
59
- "type": "string",
60
- "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\s]+$"
61
- },
62
- "manifestRoot": { "$ref": "#/$defs/root" }
63
- }
64
- }
65
- }
66
- }