@kungfu-tech/buildchain 4.0.2-alpha.9 → 4.0.3-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 (281) hide show
  1. package/AGENTS.md +14 -5
  2. package/CONTRIBUTING.md +58 -0
  3. package/README.md +3 -3
  4. package/actions/promote-buildchain-ref/README.md +1 -1
  5. package/actions/release-candidate-promote/README.md +31 -0
  6. package/architecture/agent-change-map.md +190 -126
  7. package/architecture/{v4-architecture-constitution.md → architecture-constitution.md} +33 -30
  8. package/architecture/{v3-core-mechanism-inventory.md → baseline-core-mechanism-inventory.md} +1 -1
  9. package/architecture/{v4-bootstrap-authority.json → bootstrap-authority.json} +3 -3
  10. package/architecture/{v3-v4-capability-closure.md → capability-parity-closure.md} +3 -3
  11. package/architecture/{v3-v4-live-capability-inventory.json → capability-parity-live-capability-inventory.json} +4 -4
  12. package/architecture/{v4-capability-state-machine-manifest.json → capability-state-machine-manifest.json} +2 -2
  13. package/architecture/{v4-capability-state-machine-manifest.schema.json → capability-state-machine-manifest.schema.json} +2 -2
  14. package/architecture/ci-lane-change-budget.json +384 -0
  15. package/architecture/{v4-cross-platform-adopter-qualification.json → cross-platform-adopter-qualification.json} +4 -4
  16. package/architecture/{v4-delivery-authority-parity.json → delivery-authority-parity.json} +17 -17
  17. package/architecture/{v4-delivery-warrant-shadow-bootstrap-plan.json → delivery-warrant-shadow-bootstrap-plan.json} +4 -4
  18. package/architecture/{v4-delivery-warrant-shadow-bootstrap-plan.md → delivery-warrant-shadow-bootstrap-plan.md} +7 -7
  19. package/architecture/{v4-floating-consumer-policy.json → floating-consumer-policy.json} +2 -2
  20. package/architecture/{v4-floating-consumer-policy.md → floating-consumer-policy.md} +1 -1
  21. package/architecture/implementation-naming.json +1273 -0
  22. package/architecture/internal-capabilities.json +201 -154
  23. package/architecture/maintainability-debt.json +205 -146
  24. package/architecture/maintainability-policy.json +37 -33
  25. package/architecture/{v4-next-development-parity.json → next-development-parity.json} +12 -12
  26. package/architecture/{v4-partial-mutation-recovery-qualification.json → partial-mutation-recovery-qualification.json} +8 -5
  27. package/architecture/{v4-platform-stage-checkpoints.json → platform-stage-checkpoints.json} +3 -3
  28. package/architecture/{v4-provider-operation-journal-contract.json → provider-operation-journal-contract.json} +10 -7
  29. package/architecture/publication-facade-patches.json +64 -0
  30. package/architecture/{v4-publication-rehearsal-parity.json → publication-rehearsal-parity.json} +4 -4
  31. package/architecture/{v4-release-activation-shadow-domain.json → release-activation-shadow-domain.json} +9 -6
  32. package/architecture/release-tail-contract-inventory.json +6 -6
  33. package/architecture/{v4-release-topology.json → release-topology.json} +163 -72
  34. package/architecture/{v4-release-train-parity.json → release-train-parity.json} +2 -2
  35. package/architecture/{v4-runtime-ref-resume-authority.json → runtime-ref-resume-authority.json} +1 -1
  36. package/architecture/{v4-runtime-semantic-closure.json → runtime-semantic-closure.json} +2 -2
  37. package/architecture/{v4-rust-libnode-bridge-evaluation.json → rust-libnode-bridge-evaluation.json} +3 -3
  38. package/architecture/{v4-rust-libnode-bridge-spike.md → rust-libnode-bridge-spike.md} +6 -6
  39. package/architecture/rust-wasm-production-authority.json +58 -0
  40. package/architecture/{v4-stable-publication-fence.json → stable-publication-fence.json} +7 -4
  41. package/architecture/{v4-stage-capsule-contract.json → stage-capsule-contract.json} +1 -1
  42. package/architecture/{v4-stage-capsule-qualification.json → stage-capsule-qualification.json} +8 -8
  43. package/architecture/{v4-stage-capsule-resume-planner.json → stage-capsule-resume-planner.json} +2 -2
  44. package/architecture/{v4-stage-capsule-store-contract.json → stage-capsule-store-contract.json} +4 -4
  45. package/architecture/{v4-tail-reseal-parity.json → tail-reseal-parity.json} +35 -33
  46. package/architecture/universal-workflow-bootstrap.json +176 -0
  47. package/architecture/universal-workflow-fault-campaign.json +72 -0
  48. package/architecture/universal-workflow-train-admission.json +40 -0
  49. package/architecture/workflow-taxonomy.json +1462 -0
  50. package/bin/buildchain.mjs +10 -10
  51. package/bin/internal/adopter-delivery-cli.mjs +9 -9
  52. package/contracts/buildchain-v2-residuals-v1.json +57 -48
  53. package/contracts/dev-delivery-authority-v2.schema.json +16 -2
  54. package/contracts/fixtures/v4-tail-reseal-v1/valid.json +1 -1
  55. package/contracts/v4-canonical-contracts-v1.schema.json +1 -0
  56. package/crates/{buildchain-v4-bridge → buildchain-host-bridge}/Cargo.lock +1 -1
  57. package/crates/{buildchain-v4-bridge → buildchain-host-bridge}/Cargo.toml +1 -1
  58. package/crates/{buildchain-v4-bridge → buildchain-host-bridge}/src/main.rs +3 -3
  59. package/dist/site/buildchain-contract.json +98 -53
  60. package/dist/site/buildchain-site.json +351 -102
  61. package/dist/site/capability-registry.json +7 -7
  62. package/dist/site/controller-registry.json +50 -13
  63. package/dist/site/kfd-claims.json +2773 -1052
  64. package/dist/site/kfd-upstream-aggregate.json +1 -1
  65. package/dist/site/manual-registry.json +14 -14
  66. package/dist/site/node-api-registry.json +13176 -10733
  67. package/dist/site/page-registry.json +332 -83
  68. package/dist/site/public-surface-audit.json +3227 -1222
  69. package/dist/site/publication-authority-registry.json +1135 -363
  70. package/dist/site/publication-registry.json +4 -4
  71. package/dist/site/release-provenance.json +18 -9
  72. package/dist/site/schemas/dev-delivery-authority-v2.schema.json +16 -2
  73. package/dist/site/site-manifest.json +18 -18
  74. package/dist/site/workflow-registry.json +5367 -1931
  75. package/docs/MAP.md +5 -3
  76. package/docs/auditable-demo.md +1 -1
  77. package/docs/cli.md +21 -8
  78. package/docs/dev-delivery-warrant.md +1 -1
  79. package/docs/engineering-housekeeper.md +3 -3
  80. package/docs/kfd-support.md +26 -2
  81. package/docs/next-development-transition.md +26 -3
  82. package/docs/node-api-reference.md +618 -358
  83. package/docs/oci-publication.md +173 -0
  84. package/docs/publication-authority.md +2 -2
  85. package/docs/publish-transaction.md +36 -3
  86. package/docs/release-candidate.md +3 -3
  87. package/docs/release-flow.md +67 -19
  88. package/docs/release-governance.md +8 -8
  89. package/docs/release-passport.md +27 -2
  90. package/docs/reusable-build-surface.md +17 -1
  91. package/docs/v4-adopter-delivery.md +4 -4
  92. package/docs/v4-canonical-contracts.md +7 -7
  93. package/docs/v4-delivery-warrant-read-candidate.md +3 -3
  94. package/docs/v4-delivery-warrant-semantic-diff.md +3 -3
  95. package/docs/v4-production-release.md +77 -8
  96. package/docs/v4-publication-rehearsal.md +3 -3
  97. package/docs/v4-runtime-ref-resume-authority.md +2 -2
  98. package/docs/v4-rust-wasm-production-authority.md +58 -0
  99. package/docs/v4-stage-capsule.md +9 -9
  100. package/docs/v4-tail-reseal.md +2 -2
  101. package/docs/workflow-catalog.md +155 -0
  102. package/docs/workflow-path-migration.md +109 -0
  103. package/package.json +39 -24
  104. package/packages/compatibility/adopter-delivery.js +16 -0
  105. package/packages/compatibility/cross-platform-adopter-qualification.js +12 -0
  106. package/packages/compatibility/floating-consumer-policy.js +14 -0
  107. package/packages/compatibility/publication-qualification.js +11 -0
  108. package/packages/compatibility/publication-rehearsal.js +18 -0
  109. package/packages/compatibility/runtime-ref-resume-authority.js +13 -0
  110. package/packages/compatibility/tail-reseal-receipt.js +7 -0
  111. package/packages/compatibility/tail-reseal.js +11 -0
  112. package/packages/core/{v4-adopter-delivery-parity.js → adopter-delivery-parity.js} +12 -12
  113. package/packages/core/{v4-adopter-delivery.js → adopter-delivery.js} +24 -24
  114. package/packages/core/artifact-verification-envelope.js +5 -5
  115. package/packages/core/buildchain-contract.js +6 -6
  116. package/packages/core/buildchain-domain.wasm +0 -0
  117. package/packages/core/buildchain-kfd-claims.js +2 -2
  118. package/packages/core/buildchain-publication-authority.js +43 -26
  119. package/packages/core/{v4-canonical-contracts.js → canonical-contracts.js} +39 -103
  120. package/packages/core/ci-lane-change-budget.js +14 -1
  121. package/packages/core/controller-evidence.js +4 -1
  122. package/packages/core/{v4-cross-platform-adopter-qualification.js → cross-platform-adopter-qualification.js} +19 -19
  123. package/packages/core/{v4-delivery-warrant-fixture-runner.js → delivery-warrant-fixture-runner.js} +36 -32
  124. package/packages/core/{v4-delivery-warrant-read-candidate.js → delivery-warrant-read-candidate.js} +40 -40
  125. package/packages/core/{v4-delivery-warrant-semantic-diff-gate.js → delivery-warrant-semantic-diff-gate.js} +58 -59
  126. package/packages/core/{v4-delivery-warrant-shadow-adapter.js → delivery-warrant-shadow-adapter.js} +15 -15
  127. package/packages/core/dev-delivery-candidate-identity.js +40 -6
  128. package/packages/core/dev-delivery-execution-transfer.js +6 -6
  129. package/packages/core/dev-delivery-native-proof.js +12 -8
  130. package/packages/core/dev-delivery-warrant-legacy-recovery.js +1 -1
  131. package/packages/core/dev-delivery-warrant-native-compatibility.js +4 -4
  132. package/packages/core/dev-delivery-warrant-state.js +14 -15
  133. package/packages/core/dev-delivery-warrant.js +15 -5
  134. package/packages/core/domain-wasm-artifact.js +7 -0
  135. package/packages/core/domain-wasm.js +216 -0
  136. package/packages/core/{v4-floating-consumer-evidence.js → floating-consumer-evidence.js} +14 -14
  137. package/packages/core/{v4-floating-consumer-policy.js → floating-consumer-policy.js} +28 -30
  138. package/packages/core/{v4-floating-consumer-release-passport.js → floating-consumer-release-passport.js} +25 -25
  139. package/packages/core/github-governance-authority.js +4 -4
  140. package/packages/core/index.js +4 -8
  141. package/packages/core/kfd-adopter-manifest.js +46 -47
  142. package/packages/core/next-development-projection.js +26 -3
  143. package/packages/core/next-development-transition.js +5 -6
  144. package/packages/core/oci-compose-qualification.js +143 -0
  145. package/packages/core/oci-publication-bundle.js +281 -0
  146. package/packages/core/oci-publication-graph.js +206 -0
  147. package/packages/core/paper-agent-entry.js +30 -4
  148. package/packages/core/paper-fleet.js +1 -1
  149. package/packages/core/paper-runtime-channels.js +348 -0
  150. package/packages/core/paper-scaffold-content.js +10 -0
  151. package/packages/core/paper.js +37 -71
  152. package/packages/core/partial-mutation-recovery-qualification.js +18 -0
  153. package/packages/core/{v4-platform-stage-checkpoints.js → platform-stage-checkpoints.js} +37 -37
  154. package/packages/core/product-publication.js +59 -0
  155. package/packages/core/{v4-protected-publication-source.js → protected-publication-source.js} +22 -24
  156. package/packages/core/provider-operation-journal.js +62 -0
  157. package/packages/core/{v4-provider-readback-idempotency.js → provider-readback-idempotency.js} +40 -125
  158. package/packages/core/public-export-compatibility.js +33 -0
  159. package/packages/core/publication-development.js +72 -0
  160. package/packages/core/{v4-publication-qualification.js → publication-qualification.js} +17 -17
  161. package/packages/core/{v4-publication-rehearsal-capsule.js → publication-rehearsal-capsule.js} +23 -23
  162. package/packages/core/publication-rehearsal-projection.js +2 -2
  163. package/packages/core/{v4-publication-rehearsal-provider-bindings.js → publication-rehearsal-provider-bindings.js} +4 -4
  164. package/packages/core/publication-rehearsal-runtime.js +21 -21
  165. package/packages/core/{v4-publication-rehearsal.js → publication-rehearsal.js} +33 -33
  166. package/packages/core/publication-sealed-bundle.js +78 -13
  167. package/packages/core/release-activation-shadow.js +32 -0
  168. package/packages/core/release-candidate.js +6 -6
  169. package/packages/core/release-invocation.js +64 -0
  170. package/packages/core/release-line-dry-run.js +1 -1
  171. package/packages/core/release-passport-contract.js +5 -5
  172. package/packages/core/release-passport.js +41 -40
  173. package/packages/core/release-tail-product-capabilities.js +9 -0
  174. package/packages/core/release-tail-provider-plane.js +68 -1048
  175. package/packages/core/{v4-runtime-ref-resume-authority.js → runtime-ref-resume-authority.js} +36 -40
  176. package/packages/core/{v4-runtime-selector-persistence.js → runtime-selector-persistence.js} +7 -7
  177. package/packages/core/stable-publication-fence.js +28 -0
  178. package/packages/core/{v4-stage-capsule-local-store.js → stage-capsule-local-store.js} +56 -54
  179. package/packages/core/{v4-stage-capsule-qualification-campaign.js → stage-capsule-qualification-campaign.js} +37 -38
  180. package/packages/core/{v4-stage-capsule-qualification.js → stage-capsule-qualification.js} +28 -29
  181. package/packages/core/{v4-stage-capsule-resume-planner.js → stage-capsule-resume-planner.js} +29 -29
  182. package/packages/core/{v4-stage-capsule-store.js → stage-capsule-store.js} +59 -56
  183. package/packages/core/{v4-stage-capsule.js → stage-capsule.js} +45 -45
  184. package/packages/core/{v4-tail-reseal-contract.js → tail-reseal-contract.js} +6 -6
  185. package/packages/core/{v4-tail-reseal-github.js → tail-reseal-github.js} +12 -12
  186. package/packages/core/{v4-tail-reseal-receipt.js → tail-reseal-receipt.js} +22 -22
  187. package/packages/core/{v4-tail-reseal.js → tail-reseal.js} +29 -29
  188. package/packages/core/universal-workflow-bootstrap.js +586 -0
  189. package/scripts/{v4-architecture.mjs → architecture.mjs} +6 -6
  190. package/scripts/binary-publication-evidence.mjs +135 -0
  191. package/scripts/{v4-bridge-bootstrap.mjs → bridge-bootstrap.mjs} +14 -18
  192. package/scripts/{v4-bridge-evidence.mjs → bridge-evidence.mjs} +8 -8
  193. package/scripts/build-contract-core.mjs +1 -14
  194. package/scripts/build-domain-wasm.mjs +177 -0
  195. package/scripts/{v3-v4-capability-catalog.mjs → capability-parity-catalog.mjs} +19 -19
  196. package/scripts/check-action-bundles.mjs +12 -2
  197. package/scripts/{check-v3-v4-capability-inventory.mjs → check-capability-parity-inventory.mjs} +42 -42
  198. package/scripts/check-ci-lane-change-budget.mjs +4 -1
  199. package/scripts/check-core-mechanism-inventory.mjs +8 -4
  200. package/scripts/{check-v4-floating-consumer-policy-contract.mjs → check-floating-consumer-policy-contract.mjs} +10 -10
  201. package/scripts/check-implementation-naming.mjs +135 -0
  202. package/scripts/check-inventory.mjs +39 -47
  203. package/scripts/check-maintainability.mjs +25 -115
  204. package/scripts/{check-v4-public-dogfood-contract.mjs → check-public-dogfood-contract.mjs} +37 -24
  205. package/scripts/{check-v4-release-topology.mjs → check-release-topology.mjs} +131 -52
  206. package/scripts/{check-v4-runtime-semantic-closure.mjs → check-runtime-semantic-closure.mjs} +23 -17
  207. package/scripts/check-universal-workflow-bootstrap.mjs +266 -0
  208. package/scripts/check-workflow-taxonomy.mjs +6 -0
  209. package/scripts/{v4-consumer-policy.mjs → consumer-policy.mjs} +15 -15
  210. package/scripts/copy-domain-wasm.mjs +14 -0
  211. package/scripts/{v4-cross-platform-adopter-qualification.mjs → cross-platform-adopter-qualification.mjs} +9 -9
  212. package/scripts/{v4-declarative-promotion-admission.mjs → declarative-promotion-admission.mjs} +4 -4
  213. package/scripts/dev-delivery-authority-command-adapters.mjs +1 -1
  214. package/scripts/dev-delivery-authority.mjs +8 -8
  215. package/scripts/dev-delivery-source-proof-reuse.mjs +2 -1
  216. package/scripts/dev-delivery-warrant-options.mjs +15 -10
  217. package/scripts/dev-delivery-warrant-store.mjs +98 -13
  218. package/scripts/dev-delivery-warrant-transition.mjs +109 -0
  219. package/scripts/dev-delivery-warrant.mjs +80 -103
  220. package/scripts/dev-pr-auto-merge.mjs +15 -15
  221. package/scripts/dev-pr-delivery-warrant.mjs +1 -1
  222. package/scripts/generate-channel-build-workflow.mjs +7 -2
  223. package/scripts/generate-channel-promotion-workflow.mjs +19 -34
  224. package/scripts/generate-release-candidate-passport.mjs +23 -23
  225. package/scripts/generate-site-bundle.mjs +28 -28
  226. package/scripts/generate-universal-workflow-facades.mjs +498 -0
  227. package/scripts/generate-workflow-taxonomy.mjs +25 -0
  228. package/scripts/github-output.mjs +31 -0
  229. package/scripts/{v4-host-adapter.mjs → host-adapter.mjs} +1 -1
  230. package/scripts/implementation-references.mjs +25 -0
  231. package/scripts/init-repo.mjs +1 -1
  232. package/scripts/maintainability-metrics.mjs +16 -5
  233. package/scripts/maintainability-public-surface.mjs +115 -0
  234. package/scripts/next-development-review.mjs +313 -0
  235. package/scripts/oci-compose-preview.mjs +261 -0
  236. package/scripts/paper-work-fleet-cli.mjs +2 -0
  237. package/scripts/{v4-platform-stage-checkpoint-rehearsal.mjs → platform-stage-checkpoint-rehearsal.mjs} +17 -17
  238. package/scripts/{v4-product-publication-intent.mjs → product-publication-intent.mjs} +28 -13
  239. package/scripts/publication-candidate-kind.mjs +93 -0
  240. package/scripts/publication-candidate-sealer.mjs +16 -1
  241. package/scripts/{v4-publication-rehearsal-fixture.mjs → publication-rehearsal-fixture.mjs} +5 -5
  242. package/scripts/publication-settlement.mjs +211 -0
  243. package/scripts/release-asset-client.mjs +91 -0
  244. package/scripts/{v4-release-candidate-adapter.mjs → release-candidate-adapter.mjs} +4 -4
  245. package/scripts/release-candidate-resolver.mjs +24 -35
  246. package/scripts/release-tail.mjs +5 -5
  247. package/scripts/resume-from-candidate-run.mjs +35 -42
  248. package/scripts/site-capability-metadata.mjs +9 -0
  249. package/scripts/source-verification-evidence.mjs +344 -0
  250. package/scripts/stable-candidate-qualification.mjs +1 -1
  251. package/scripts/{v4-stage-capsule-qualification.mjs → stage-capsule-qualification.mjs} +62 -62
  252. package/scripts/{v4-stage-capsule-resume-rehearsal.mjs → stage-capsule-resume-rehearsal.mjs} +6 -6
  253. package/scripts/{v4-tail-reseal-macos-rehearsal.mjs → tail-reseal-macos-rehearsal.mjs} +9 -9
  254. package/scripts/{v4-tail-reseal.mjs → tail-reseal.mjs} +19 -19
  255. package/scripts/universal-facade-maintainability.mjs +91 -0
  256. package/scripts/universal-workflow-backflow.mjs +212 -0
  257. package/scripts/universal-workflow-engine.mjs +620 -0
  258. package/scripts/universal-workflow-self-dogfood.mjs +205 -0
  259. package/scripts/verify-version-state-delta.mjs +175 -0
  260. package/scripts/{v4-warrant-shadow-plan.mjs → warrant-shadow-plan.mjs} +6 -6
  261. package/scripts/workflow-taxonomy.mjs +507 -0
  262. package/templates/native-dev-delivery.yml +4 -7
  263. package/templates/universal-buildchain-bootstrap-recovery.yml +282 -0
  264. package/templates/universal-buildchain-bootstrap.yml +28 -0
  265. package/actions/v4-release-candidate-promote/README.md +0 -3
  266. package/packages/core/v4-partial-mutation-recovery-qualification.js +0 -395
  267. package/packages/core/v4-product-publication.js +0 -387
  268. package/packages/core/v4-provider-operation-journal.js +0 -531
  269. package/packages/core/v4-release-activation-shadow.js +0 -519
  270. package/packages/core/v4-release-invocation.js +0 -425
  271. package/packages/core/v4-stable-publication-fence.js +0 -357
  272. /package/architecture/{v4-adopter-delivery-parity.json → adopter-delivery-parity.json} +0 -0
  273. /package/architecture/{v3-core-mechanism-inventory.json → baseline-core-mechanism-inventory.json} +0 -0
  274. /package/architecture/{v4-canonical-contract-fixtures.json → canonical-contract-fixtures.json} +0 -0
  275. /package/architecture/{v4-compatibility-facts-parity.json → compatibility-facts-parity.json} +0 -0
  276. /package/architecture/{v4-delivery-warrant-shadow-bootstrap-plan.schema.json → delivery-warrant-shadow-bootstrap-plan.schema.json} +0 -0
  277. /package/architecture/{v4-delivery-warrant-shadow-fixtures.json → delivery-warrant-shadow-fixtures.json} +0 -0
  278. /package/architecture/{v4-delivery-warrant-shadow-fixtures.schema.json → delivery-warrant-shadow-fixtures.schema.json} +0 -0
  279. /package/architecture/{v4-exception-ledger.json → exception-ledger.json} +0 -0
  280. /package/architecture/{v4-exception-ledger.schema.json → exception-ledger.schema.json} +0 -0
  281. /package/architecture/{v4-release-invocation-fixtures.json → release-invocation-fixtures.json} +0 -0
@@ -3,6 +3,8 @@
3
3
  import assert from "node:assert/strict";
4
4
  import crypto from "node:crypto";
5
5
  import fs from "node:fs";
6
+ import ts from "typescript";
7
+ import { workflowCompatibilityIdentity } from "./workflow-taxonomy.mjs";
6
8
  import path from "node:path";
7
9
  import { fileURLToPath, pathToFileURL } from "node:url";
8
10
 
@@ -12,7 +14,7 @@ import {
12
14
  } from "../packages/core/workflow-yaml-contract.js";
13
15
 
14
16
  const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
15
- const ledgerPath = path.join(root, "architecture/v4-release-topology.json");
17
+ const ledgerPath = path.join(root, "architecture/release-topology.json");
16
18
 
17
19
  function read(relative) {
18
20
  return fs.readFileSync(path.join(root, relative), "utf8");
@@ -20,14 +22,37 @@ function read(relative) {
20
22
 
21
23
  const LOCAL_MODULE_EXTENSIONS = ["", ".js", ".mjs", ".cjs"];
22
24
  const PRIVILEGED_ENTRYPOINTS = [
23
- "actions/v4-release-candidate-promote/index.js",
25
+ "actions/release-candidate-promote/index.js",
26
+ "scripts/binary-publication-evidence.mjs",
27
+ "scripts/next-development-review.mjs",
28
+ "scripts/oci-compose-preview.mjs",
29
+ "scripts/publication-settlement.mjs",
24
30
  ];
25
31
 
26
- function localModuleSpecifiers(source) {
32
+ export function localModuleSpecifiers(source) {
27
33
  const specifiers = [];
28
- const expression =
29
- /(?:\bfrom\s+|\bimport\s*\(\s*|\bimport\s+)["'](\.[^"']+)["']/gu;
30
- for (const match of source.matchAll(expression)) specifiers.push(match[1]);
34
+ const visit = (node) => {
35
+ let value;
36
+ if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node))
37
+ value = node.moduleSpecifier;
38
+ else if (
39
+ ts.isCallExpression(node) &&
40
+ node.expression.kind === ts.SyntaxKind.ImportKeyword
41
+ )
42
+ value = node.arguments[0];
43
+ if (value && ts.isStringLiteral(value) && value.text.startsWith("."))
44
+ specifiers.push(value.text);
45
+ ts.forEachChild(node, visit);
46
+ };
47
+ visit(
48
+ ts.createSourceFile(
49
+ "module.mjs",
50
+ source,
51
+ ts.ScriptTarget.Latest,
52
+ true,
53
+ ts.ScriptKind.JS,
54
+ ),
55
+ );
31
56
  return [...new Set(specifiers)].sort();
32
57
  }
33
58
 
@@ -83,6 +108,13 @@ function rootedPathSet(paths) {
83
108
  .digest("hex")}`;
84
109
  }
85
110
 
111
+ function fileSha256(relative) {
112
+ return `sha256:${crypto
113
+ .createHash("sha256")
114
+ .update(fs.readFileSync(path.join(root, relative)))
115
+ .digest("hex")}`;
116
+ }
117
+
86
118
  function productionFiles(relative, extensions) {
87
119
  const absolute = path.join(root, relative);
88
120
  if (!fs.existsSync(absolute)) return [];
@@ -106,12 +138,12 @@ function productionFiles(relative, extensions) {
106
138
  function matchingProductionFiles(roots, extensions, pattern) {
107
139
  return roots
108
140
  .flatMap((relative) => productionFiles(relative, extensions))
109
- .filter((relative) => relative !== "scripts/check-v4-release-topology.mjs")
141
+ .filter((relative) => relative !== "scripts/check-release-topology.mjs")
110
142
  .filter((relative) => pattern.test(read(relative)))
111
143
  .sort();
112
144
  }
113
145
 
114
- export function discoverV4ReleaseAuthorityClosure() {
146
+ export function discoverReleaseAuthorityClosure() {
115
147
  const providerPlane = matchingProductionFiles(
116
148
  ["actions", "packages/core"],
117
149
  [".js", ".mjs", ".cjs"],
@@ -120,14 +152,20 @@ export function discoverV4ReleaseAuthorityClosure() {
120
152
  const runtimeSelectors = matchingProductionFiles(
121
153
  [".github/workflows", "scripts", "packages/core"],
122
154
  [".yml", ".yaml", ".js", ".mjs", ".cjs"],
123
- /(?:promotion-runtime-sha|resume-buildchain-runtime-sha|BUILDCHAIN_(?:CURRENT_RUNTIME_SHA|RUNTIME_REF|RESUME_CANDIDATE_RUN_ID)|authorizeV4RuntimeSelection|scanV4RuntimeSelectorPersistence|v4-release-candidate-adapter)/u,
155
+ /(?:promotion-runtime-sha|resume-buildchain-runtime-sha|BUILDCHAIN_(?:CURRENT_RUNTIME_SHA|RUNTIME_REF|RESUME_CANDIDATE_RUN_ID)|authorizeRuntimeSelection|scanRuntimeSelectorPersistence|release-candidate-adapter)/u,
124
156
  );
125
157
  const terminalProjections = matchingProductionFiles(
126
158
  [".github/workflows", "actions", "packages/core", "scripts"],
127
159
  [".yml", ".yaml", ".js", ".mjs", ".cjs"],
128
- /(?:createV4ReleaseReceipt|release-receipt\.json|V4_RELEASE_RECEIPT_CONTRACT)/u,
160
+ /(?:createReleaseReceipt|release-receipt\.json|RELEASE_RECEIPT_CONTRACT)/u,
129
161
  );
130
162
  const privilegedModules = discoverStaticModuleClosure(PRIVILEGED_ENTRYPOINTS);
163
+ const rustWasmArtifact = "packages/core/buildchain-domain.wasm";
164
+ const rustWasmDistributions = [
165
+ "actions/promote-buildchain-ref/dist/buildchain-domain.wasm",
166
+ "actions/release-tail/dist/buildchain-domain.wasm",
167
+ "actions/release-candidate-promote/dist/buildchain-domain.wasm",
168
+ ];
131
169
  const legacyEngineModules = productionFiles(
132
170
  "actions/promote-buildchain-ref",
133
171
  [".js", ".mjs", ".cjs"],
@@ -146,13 +184,24 @@ export function discoverV4ReleaseAuthorityClosure() {
146
184
  ]),
147
185
  ].sort(),
148
186
  runtimeSelectors,
149
- runtimeEngines: ["actions/v4-release-candidate-promote/index.js"],
187
+ runtimeEngines: ["actions/release-candidate-promote/index.js"],
150
188
  terminalProjections,
151
189
  privilegedExecutableClosure: {
152
190
  entrypoints: PRIVILEGED_ENTRYPOINTS,
153
191
  modules: privilegedModules,
154
192
  root: rootedPathSet(privilegedModules),
155
193
  },
194
+ rustWasmAuthority: {
195
+ loader: "packages/core/domain-wasm.js",
196
+ metadata: "packages/core/domain-wasm-artifact.js",
197
+ artifact: rustWasmArtifact,
198
+ artifactRoot: fileSha256(rustWasmArtifact),
199
+ distributedArtifacts: rustWasmDistributions,
200
+ byteIdenticalDistributions: rustWasmDistributions.every(
201
+ (relative) => fileSha256(relative) === fileSha256(rustWasmArtifact),
202
+ ),
203
+ fallbackWriterCount: 0,
204
+ },
156
205
  legacyEngineModules,
157
206
  };
158
207
  }
@@ -180,33 +229,46 @@ function permission(block, name) {
180
229
  function workflowSnapshot(relative) {
181
230
  const source = read(relative);
182
231
  const document = parseWorkflowDocument(source);
183
- const jobs = document.jobs.map((job) => {
184
- const block = jobBlock(source, job.id);
185
- const uses = job.uses || null;
186
- return {
187
- id: job.id,
188
- kind: uses ? "reusable-call" : "runner",
189
- uses,
190
- permissions: {
191
- contents: permission(block, "contents"),
192
- idToken: permission(block, "id-token"),
193
- },
194
- carriers: {
195
- artifactDownload: /uses:\s+actions\/download-artifact@/u.test(block),
196
- artifactUpload: /uses:\s+actions\/upload-artifact@/u.test(block),
197
- jobOutput: /GITHUB_OUTPUT/u.test(block),
198
- },
199
- mutationSignals: [
200
- /contents:\s*write/u.test(block) && "contents-write",
201
- /id-token:\s*write/u.test(block) && "oidc-write",
202
- /(?:promote-buildchain-ref|v4-release-candidate-promote)/u.test(
203
- block,
204
- ) && "promotion-runtime",
205
- /(?:git push|npm publish|gh release (?:create|upload))/u.test(block) &&
206
- "direct-publication-command",
207
- ].filter(Boolean),
208
- };
209
- });
232
+ const jobs = document.jobs
233
+ .filter((job) => job.id !== "universal-bootstrap")
234
+ .map((job) => {
235
+ const block = jobBlock(source, job.id);
236
+ const uses = job.uses || null;
237
+ // A built-in publisher still requires mutation authority when the caller supplies its envelope.
238
+ const inheritedPublisher =
239
+ !/^ permissions:/mu.test(block) &&
240
+ /uses:.*actions\/release-candidate-promote/u.test(block);
241
+ return {
242
+ id: job.id,
243
+ kind: uses ? "reusable-call" : "runner",
244
+ uses,
245
+ permissions: {
246
+ contents:
247
+ permission(block, "contents") ||
248
+ (inheritedPublisher ? "inherited" : null),
249
+ idToken:
250
+ permission(block, "id-token") ||
251
+ (inheritedPublisher ? "inherited" : null),
252
+ },
253
+ carriers: {
254
+ artifactDownload: /uses:\s+actions\/download-artifact@/u.test(block),
255
+ artifactUpload: /uses:\s+actions\/upload-artifact@/u.test(block),
256
+ jobOutput: /GITHUB_OUTPUT/u.test(block),
257
+ },
258
+ mutationSignals: [
259
+ (/contents:\s*write/u.test(block) || inheritedPublisher) &&
260
+ "contents-write",
261
+ (/id-token:\s*write/u.test(block) || inheritedPublisher) &&
262
+ "oidc-write",
263
+ /(?:promote-buildchain-ref|actions\/release-candidate-promote)/u.test(
264
+ block,
265
+ ) && "promotion-runtime",
266
+ /(?:git push|npm publish|gh release (?:create|upload))/u.test(
267
+ block,
268
+ ) && "direct-publication-command",
269
+ ].filter(Boolean),
270
+ };
271
+ });
210
272
  return {
211
273
  path: relative,
212
274
  triggers: document.triggers,
@@ -214,11 +276,12 @@ function workflowSnapshot(relative) {
214
276
  reusableEdges: parseYamlUses(source)
215
277
  .map(({ value }) => value)
216
278
  .filter((value) => /\.github\/workflows\//u.test(value))
279
+ .filter((value) => !/\/bootstrap\.yml(?:@v4)?$/u.test(value))
217
280
  .sort(),
218
281
  };
219
282
  }
220
283
 
221
- export function discoverV4ReleaseTopology(
284
+ export function discoverReleaseTopology(
222
285
  workflowPaths,
223
286
  semanticWorkflowPaths = workflowPaths,
224
287
  ) {
@@ -303,7 +366,7 @@ export function discoverV4ReleaseTopology(
303
366
  };
304
367
  }
305
368
 
306
- export function findUnknownV4ReleaseTopology(
369
+ export function findUnknownReleaseTopology(
307
370
  workflowPaths,
308
371
  allWorkflowPaths = fs
309
372
  .readdirSync(path.join(root, ".github/workflows"))
@@ -313,11 +376,16 @@ export function findUnknownV4ReleaseTopology(
313
376
  ) {
314
377
  const declared = new Set(workflowPaths);
315
378
  return allWorkflowPaths
316
- .filter((relative) => !declared.has(relative))
379
+ .filter(
380
+ (relative) =>
381
+ !declared.has(
382
+ workflowCompatibilityIdentity(root, relative, readWorkflow(relative)),
383
+ ),
384
+ )
317
385
  .filter((relative) => {
318
386
  const source = readWorkflow(relative);
319
387
  const usesReleaseAuthority = parseYamlUses(source).some(({ value }) =>
320
- /(?:release-candidate-promote|promote-buildchain-ref|v4-release-candidate-promote|release-tail)/u.test(
388
+ /(?:release-candidate-promote|promote-buildchain-ref|release-tail)/u.test(
321
389
  value,
322
390
  ),
323
391
  );
@@ -338,7 +406,7 @@ export function findUnknownV4ReleaseTopology(
338
406
  }
339
407
 
340
408
  function assertClosedWorld(workflowPaths) {
341
- const unknown = findUnknownV4ReleaseTopology(workflowPaths);
409
+ const unknown = findUnknownReleaseTopology(workflowPaths);
342
410
  assert.deepEqual(
343
411
  unknown,
344
412
  [],
@@ -369,7 +437,7 @@ function assertAuthorityClosure(ledger) {
369
437
  `authority closure path is not a file: ${relative}`,
370
438
  );
371
439
  }
372
- const discovered = discoverV4ReleaseAuthorityClosure();
440
+ const discovered = discoverReleaseAuthorityClosure();
373
441
  for (const className of Object.keys(discovered))
374
442
  assert.deepEqual(
375
443
  closure[className],
@@ -395,7 +463,7 @@ function assertAuthorityClosure(ledger) {
395
463
  `legacy release engines remain reachable from APPLY: ${reachableLegacyEngines.join(", ")}`,
396
464
  );
397
465
  assert.deepEqual(closure.runtimeEngines, [
398
- "actions/v4-release-candidate-promote/index.js",
466
+ "actions/release-candidate-promote/index.js",
399
467
  ]);
400
468
  assert.equal(
401
469
  closure.freshEntry,
@@ -403,7 +471,7 @@ function assertAuthorityClosure(ledger) {
403
471
  );
404
472
  assert.equal(
405
473
  closure.recoveryEntry,
406
- ".github/workflows/buildchain-ref-promotion-recovery.yml",
474
+ ".github/workflows/self-ops-promotion-recovery.yml",
407
475
  );
408
476
  const engineSurface = [
409
477
  ".github/workflows/.release-candidate-promote.yml",
@@ -422,7 +490,7 @@ function assertAuthorityClosure(ledger) {
422
490
  );
423
491
  assert.match(
424
492
  canonicalWorkflow,
425
- /scripts\/v4-release-candidate-adapter\.mjs/u,
493
+ /scripts\/release-candidate-adapter\.mjs/u,
426
494
  );
427
495
  assert.match(
428
496
  canonicalWorkflow,
@@ -430,12 +498,23 @@ function assertAuthorityClosure(ledger) {
430
498
  );
431
499
  }
432
500
 
433
- export function checkV4ReleaseTopology() {
501
+ export function checkReleaseTopology() {
434
502
  const ledger = JSON.parse(fs.readFileSync(ledgerPath, "utf8"));
435
503
  assert.equal(ledger.contract, "kungfu-buildchain-v4-release-topology/v1");
436
504
  assertClosedWorld(ledger.closedWorld.workflowPaths);
437
505
  assertAuthorityClosure(ledger);
438
- const actual = discoverV4ReleaseTopology(
506
+ const preview = ledger.postPublicationScope;
507
+ assert.deepEqual(preview.workflowPaths, [
508
+ ".github/workflows/public-release-oci-compose-preview.yml",
509
+ ]);
510
+ const previewTopology = discoverReleaseTopology(
511
+ preview.workflowPaths,
512
+ preview.workflowPaths,
513
+ );
514
+ assert.equal(previewTopology.semanticMetrics.contentsWriteJobCount, 1);
515
+ assert.equal(previewTopology.semanticMetrics.oidcWriteJobCount, 0);
516
+ assert.deepEqual(preview.observedTopology, previewTopology);
517
+ const actual = discoverReleaseTopology(
439
518
  ledger.closedWorld.workflowPaths,
440
519
  ledger.semanticScope.workflowPaths,
441
520
  );
@@ -469,13 +548,13 @@ if (
469
548
  ) {
470
549
  if (process.argv.includes("--print-closure")) {
471
550
  process.stdout.write(
472
- `${JSON.stringify(discoverV4ReleaseAuthorityClosure(), null, 2)}\n`,
551
+ `${JSON.stringify(discoverReleaseAuthorityClosure(), null, 2)}\n`,
473
552
  );
474
553
  } else if (process.argv.includes("--print")) {
475
554
  const ledger = JSON.parse(fs.readFileSync(ledgerPath, "utf8"));
476
555
  process.stdout.write(
477
556
  `${JSON.stringify(
478
- discoverV4ReleaseTopology(
557
+ discoverReleaseTopology(
479
558
  ledger.closedWorld.workflowPaths,
480
559
  ledger.semanticScope.workflowPaths,
481
560
  ),
@@ -484,7 +563,7 @@ if (
484
563
  )}\n`,
485
564
  );
486
565
  } else {
487
- checkV4ReleaseTopology();
566
+ checkReleaseTopology();
488
567
  process.stdout.write("v4 release topology: ok\n");
489
568
  }
490
569
  }
@@ -4,10 +4,10 @@ import fs from "node:fs";
4
4
  import path from "node:path";
5
5
  import { pathToFileURL } from "node:url";
6
6
 
7
- export const V4_RUNTIME_SEMANTIC_CLOSURE_CONTRACT =
7
+ export const RUNTIME_SEMANTIC_CLOSURE_CONTRACT =
8
8
  "kungfu-buildchain-v4-runtime-semantic-closure";
9
- export const V4_RUNTIME_SEMANTIC_CLOSURE_PATH =
10
- "architecture/v4-runtime-semantic-closure.json";
9
+ export const RUNTIME_SEMANTIC_CLOSURE_PATH =
10
+ "architecture/runtime-semantic-closure.json";
11
11
  export const REQUIRED_RUNTIME_EVIDENCE = Object.freeze([
12
12
  "positive",
13
13
  "negative",
@@ -35,7 +35,10 @@ function publicSurfaceIds(root) {
35
35
  return new Set([
36
36
  ...Object.keys(packageJson.exports || {}).map((id) => `export:${id}`),
37
37
  ...(cli.commands || []).map((entry) => `cli:${entry.id}`),
38
- ...(workflows.workflows || []).map((entry) => `workflow:${entry.id}`),
38
+ ...(workflows.workflows || []).flatMap((entry) => [
39
+ `workflow:${entry.id}`,
40
+ ...(entry.taxonomy ? [`workflow:${entry.taxonomy.id}`] : []),
41
+ ]),
39
42
  ...(workflows.actions || []).map((entry) => `action:${entry.id}`),
40
43
  ]);
41
44
  }
@@ -156,17 +159,20 @@ function validateAuthority(capability, stateMachine, issues) {
156
159
 
157
160
  export function validateRuntimeSemanticClosure({
158
161
  root = process.cwd(),
159
- manifest = loadJson(root, V4_RUNTIME_SEMANTIC_CLOSURE_PATH),
160
- v3Inventory = loadJson(root, "architecture/v3-core-mechanism-inventory.json"),
161
- v4Manifest = loadJson(
162
+ manifest = loadJson(root, RUNTIME_SEMANTIC_CLOSURE_PATH),
163
+ v3Inventory: baselineInventory = loadJson(
162
164
  root,
163
- "architecture/v4-capability-state-machine-manifest.json",
165
+ "architecture/baseline-core-mechanism-inventory.json",
166
+ ),
167
+ v4Manifest: domainManifest = loadJson(
168
+ root,
169
+ "architecture/capability-state-machine-manifest.json",
164
170
  ),
165
171
  } = {}) {
166
172
  const issues = [];
167
173
  if (
168
174
  manifest?.schemaVersion !== 1 ||
169
- manifest?.contract !== V4_RUNTIME_SEMANTIC_CLOSURE_CONTRACT
175
+ manifest?.contract !== RUNTIME_SEMANTIC_CLOSURE_CONTRACT
170
176
  )
171
177
  issues.push(
172
178
  "runtime semantic closure contract or schemaVersion is invalid",
@@ -175,13 +181,13 @@ export function validateRuntimeSemanticClosure({
175
181
  issues.push("runtime semantic closure evidence dimensions drifted");
176
182
 
177
183
  const mechanisms = new Map(
178
- (v3Inventory.mechanisms || []).map((entry) => [entry.id, entry]),
184
+ (baselineInventory.mechanisms || []).map((entry) => [entry.id, entry]),
179
185
  );
180
- const v4Capabilities = new Map(
181
- (v4Manifest.capabilities || []).map((entry) => [entry.id, entry]),
186
+ const domainCapabilities = new Map(
187
+ (domainManifest.capabilities || []).map((entry) => [entry.id, entry]),
182
188
  );
183
189
  const stateMachines = new Map(
184
- (v4Manifest.stateMachines || []).map((entry) => [entry.id, entry]),
190
+ (domainManifest.stateMachines || []).map((entry) => [entry.id, entry]),
185
191
  );
186
192
  const capabilities = Array.isArray(manifest?.capabilities)
187
193
  ? manifest.capabilities
@@ -198,7 +204,7 @@ export function validateRuntimeSemanticClosure({
198
204
  if (
199
205
  !sameMembers(
200
206
  capabilities.map((entry) => entry.id),
201
- v4Capabilities.keys(),
207
+ domainCapabilities.keys(),
202
208
  )
203
209
  )
204
210
  issues.push(
@@ -216,15 +222,15 @@ export function validateRuntimeSemanticClosure({
216
222
  }
217
223
  ids.add(capability.id);
218
224
  const mechanism = mechanisms.get(capability.id);
219
- const v4Capability = v4Capabilities.get(capability.id);
220
- if (!mechanism || !v4Capability) continue;
225
+ const domainCapability = domainCapabilities.get(capability.id);
226
+ if (!mechanism || !domainCapability) continue;
221
227
  if (capability.sourceMechanismId !== capability.id)
222
228
  issues.push(`${capability.id}: source mechanism identity drifted`);
223
229
  validateImplementation(root, mechanism, capability, issues);
224
230
  validateResidualClosure(mechanism, capability, issues);
225
231
  validateEvidence(root, mechanism, capability, issues);
226
232
  validateAuthority(capability, stateMachines.get(capability.id), issues);
227
- for (const surface of v4Capability.surfaces || []) {
233
+ for (const surface of domainCapability.surfaces || []) {
228
234
  if (!surfaces.has(surface))
229
235
  issues.push(
230
236
  `${capability.id}: executable v4 surface is absent: ${surface}`,