@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
@@ -1,387 +0,0 @@
1
- import { v4ContentRoot, validateV4Root } from "./v4-canonical-contracts.js";
2
- import {
3
- RELEASE_TAIL_DECLARATION_CONTRACT,
4
- RELEASE_TAIL_EFFECT_SCHEMA,
5
- RELEASE_TAIL_OBSERVATION_SCHEMA,
6
- RELEASE_TAIL_RECEIPT_SCHEMA,
7
- RELEASE_TAIL_TRANSACTION_POLICY,
8
- } from "./release-tail-provider-plane.js";
9
- import { RELEASE_TAIL_PRODUCT_CAPABILITIES } from "./release-tail-product-capabilities.js";
10
-
11
- export const V4_PRODUCT_PUBLICATION_INTENT_CONTRACT =
12
- "kungfu-buildchain-v4-product-publication-intent/v1";
13
- export const V4_PRODUCT_PUBLICATION_PLAN_CONTRACT =
14
- "kungfu-buildchain-v4-product-publication-plan/v1";
15
-
16
- const VERSION = /^(\d+)\.(\d+)\.(\d+)(?:-alpha\.(\d+))?$/u;
17
- const SHA = /^[0-9a-f]{40}$/u;
18
- const ROOT = /^sha256:[0-9a-f]{64}$/u;
19
- const REPOSITORY = /^[^/\s]+\/[^/\s]+$/u;
20
-
21
- function fail(message) {
22
- throw new Error(`invalid v4 product publication: ${message}`);
23
- }
24
-
25
- function parseVersion(value, label) {
26
- const normalized = String(value || "").trim();
27
- const match = normalized.match(VERSION);
28
- if (!match) fail(`${label} must be an exact stable or alpha version`);
29
- return {
30
- value: normalized,
31
- major: Number(match[1]),
32
- minor: Number(match[2]),
33
- patch: Number(match[3]),
34
- alpha: match[4] === undefined ? null : Number(match[4]),
35
- };
36
- }
37
-
38
- function channelName(value) {
39
- if (value === "alpha") return "alpha";
40
- if (["release", "stable", "major"].includes(value)) return "stable";
41
- fail(`unsupported channel '${value}'`);
42
- }
43
-
44
- function assertLane({ channel, targetRef, version }) {
45
- const expression =
46
- channel === "alpha"
47
- ? /^alpha\/v(\d+)\/v(\d+)\.(\d+)$/u
48
- : /^release\/v(\d+)\/v(\d+)\.(\d+)$/u;
49
- const match = String(targetRef || "").match(expression);
50
- if (!match) fail(`target ref '${targetRef}' is not a ${channel} lane`);
51
- if (
52
- Number(match[1]) !== version.major ||
53
- Number(match[2]) !== version.major ||
54
- Number(match[3]) !== version.minor
55
- )
56
- fail("target ref does not match the publication version line");
57
- }
58
-
59
- function observedAlphaNumber(version, expected) {
60
- const parsed = parseVersion(version, "observed version");
61
- return parsed.major === expected.major &&
62
- parsed.minor === expected.minor &&
63
- parsed.patch === expected.patch
64
- ? parsed.alpha
65
- : null;
66
- }
67
-
68
- function requiredString(value, label) {
69
- const normalized = String(value || "").trim();
70
- if (!normalized) fail(`${label} must be a non-empty string`);
71
- return normalized;
72
- }
73
-
74
- function requiredRoot(value, label) {
75
- const normalized = requiredString(value, label).toLowerCase();
76
- if (!ROOT.test(normalized)) fail(`${label} must be a sha256 content root`);
77
- return normalized;
78
- }
79
-
80
- export function selectV4ProductPublicationIntent({
81
- channel,
82
- targetRef,
83
- sourceSha,
84
- sourceTimestamp,
85
- repository,
86
- packageName,
87
- distTag,
88
- sealedBundleRoot,
89
- requiredArtifactsRoot,
90
- candidateVersion,
91
- recoveredVersion = "",
92
- observedVersions = [],
93
- }) {
94
- const normalizedChannel = channelName(channel);
95
- if (!SHA.test(String(sourceSha || "")))
96
- fail("sourceSha must be an exact Git SHA");
97
- if (!REPOSITORY.test(String(repository || "")))
98
- fail("repository must be owner/repo");
99
- const normalizedTimestamp = requiredString(
100
- sourceTimestamp,
101
- "sourceTimestamp",
102
- );
103
- if (Number.isNaN(Date.parse(normalizedTimestamp)))
104
- fail("sourceTimestamp must be an ISO timestamp");
105
- const normalizedPackageName = requiredString(packageName, "packageName");
106
- const normalizedDistTag = requiredString(distTag, "distTag");
107
- if (!/^[a-z0-9][a-z0-9._-]*$/u.test(normalizedDistTag))
108
- fail("distTag must be an npm dist-tag");
109
- if (!Array.isArray(observedVersions))
110
- fail("observedVersions must be an array");
111
- const candidate = parseVersion(candidateVersion, "candidateVersion");
112
- assertLane({ channel: normalizedChannel, targetRef, version: candidate });
113
- const observed = [...new Set(observedVersions.map(String))].sort();
114
- let version;
115
- let mode = "fresh";
116
- if (String(recoveredVersion || "").trim()) {
117
- const recovered = parseVersion(recoveredVersion, "recoveredVersion");
118
- if (
119
- recovered.major !== candidate.major ||
120
- recovered.minor !== candidate.minor ||
121
- recovered.patch !== candidate.patch ||
122
- (normalizedChannel === "alpha" && recovered.alpha === null) ||
123
- (normalizedChannel === "stable" && recovered.alpha !== null)
124
- )
125
- fail("recoveredVersion is incompatible with the candidate release line");
126
- version = recovered.value;
127
- mode = "resume";
128
- } else if (normalizedChannel === "alpha") {
129
- if (candidate.alpha === null)
130
- fail("fresh alpha publication requires an alpha candidate version");
131
- const highest = observed.reduce(
132
- (current, entry) =>
133
- Math.max(current, observedAlphaNumber(entry, candidate) ?? -1),
134
- candidate.alpha,
135
- );
136
- version = `${candidate.major}.${candidate.minor}.${candidate.patch}-alpha.${highest + 1}`;
137
- } else {
138
- version = `${candidate.major}.${candidate.minor}.${candidate.patch}`;
139
- }
140
- const intent = {
141
- schema: V4_PRODUCT_PUBLICATION_INTENT_CONTRACT,
142
- mode,
143
- channel: normalizedChannel,
144
- targetRef,
145
- sourceSha,
146
- sourceTimestamp: new Date(normalizedTimestamp).toISOString(),
147
- repository,
148
- packageName: normalizedPackageName,
149
- distTag: normalizedDistTag,
150
- sealedBundleRoot: requiredRoot(sealedBundleRoot, "sealedBundleRoot"),
151
- requiredArtifactsRoot: requiredRoot(
152
- requiredArtifactsRoot,
153
- "requiredArtifactsRoot",
154
- ),
155
- candidateVersion: candidate.value,
156
- version,
157
- exactTag: `v${version}`,
158
- observedVersions: observed,
159
- };
160
- return {
161
- ...intent,
162
- intentRoot: v4ContentRoot("v4-product-publication-intent", intent),
163
- };
164
- }
165
-
166
- function alphaReferences(intent, version) {
167
- const line = `v${version.major}.${version.minor}`;
168
- return [
169
- { ref: `refs/tags/${intent.exactTag}`, target: "source" },
170
- { ref: `refs/heads/${intent.targetRef}`, target: "version-state" },
171
- {
172
- ref: `refs/heads/dev/v${version.major}/${line}`,
173
- target: "version-state",
174
- },
175
- { ref: `refs/tags/${line}-alpha`, target: "version-state" },
176
- { ref: `refs/tags/v${version.major}-alpha`, target: "version-state" },
177
- ];
178
- }
179
-
180
- function stableReferences(intent, version) {
181
- return [
182
- { ref: `refs/tags/${intent.exactTag}`, target: "source" },
183
- { ref: `refs/heads/${intent.targetRef}`, target: "version-state" },
184
- {
185
- ref: `refs/tags/v${version.major}.${version.minor}`,
186
- target: "version-state",
187
- },
188
- { ref: `refs/tags/v${version.major}`, target: "version-state" },
189
- ];
190
- }
191
-
192
- export function createV4ProductPublicationPlan({
193
- intent,
194
- invocationRoot,
195
- transactionRoot,
196
- }) {
197
- validateV4Root(invocationRoot, "$/productPlan/invocationRoot");
198
- validateV4Root(transactionRoot, "$/productPlan/transactionRoot");
199
- const selected = selectV4ProductPublicationIntent({
200
- channel: intent.channel,
201
- targetRef: intent.targetRef,
202
- sourceSha: intent.sourceSha,
203
- sourceTimestamp: intent.sourceTimestamp,
204
- repository: intent.repository,
205
- packageName: intent.packageName,
206
- distTag: intent.distTag,
207
- sealedBundleRoot: intent.sealedBundleRoot,
208
- requiredArtifactsRoot: intent.requiredArtifactsRoot,
209
- candidateVersion: intent.candidateVersion,
210
- recoveredVersion: intent.mode === "resume" ? intent.version : "",
211
- observedVersions: intent.observedVersions,
212
- });
213
- if (selected.intentRoot !== intent.intentRoot)
214
- fail("intentRoot does not match the canonical publication intent");
215
- const parsed = parseVersion(intent.version, "intent.version");
216
- const references =
217
- intent.channel === "alpha"
218
- ? alphaReferences(intent, parsed)
219
- : stableReferences(intent, parsed);
220
- const stateRef = `refs/heads/buildchain/v4-product-state/${intent.sourceSha}-${intent.version.replaceAll(".", "-")}`;
221
- const operations = [
222
- {
223
- id: "product.version-state.materialize",
224
- adapter: "github-version-state",
225
- authority: "contents-write",
226
- target: {
227
- repository: intent.repository,
228
- version: intent.version,
229
- sourceSha: intent.sourceSha,
230
- sourceTimestamp: intent.sourceTimestamp,
231
- stateRef,
232
- },
233
- },
234
- {
235
- id: "product.package.publish",
236
- adapter: "npm-trusted-publishing",
237
- authority: "oidc-provider-mutation",
238
- target: {
239
- packageName: intent.packageName,
240
- version: intent.version,
241
- distTag: intent.distTag,
242
- sealedBundleRoot: intent.sealedBundleRoot,
243
- requiredArtifactsRoot: intent.requiredArtifactsRoot,
244
- },
245
- },
246
- {
247
- id: "product.release-refs.converge",
248
- adapter: "github-release-refs",
249
- authority: "contents-write",
250
- target: {
251
- repository: intent.repository,
252
- sourceSha: intent.sourceSha,
253
- stateRef,
254
- references,
255
- },
256
- },
257
- ].map((operation) => ({
258
- ...operation,
259
- operationRoot: v4ContentRoot("v4-product-publication-operation", operation),
260
- }));
261
- const plan = {
262
- schema: V4_PRODUCT_PUBLICATION_PLAN_CONTRACT,
263
- intentRoot: intent.intentRoot,
264
- invocationRoot,
265
- transactionRoot,
266
- operationOrder: operations.map(({ id }) => id),
267
- operations,
268
- };
269
- return {
270
- ...plan,
271
- planRoot: v4ContentRoot("v4-product-publication-plan", plan),
272
- };
273
- }
274
-
275
- const PRODUCT_CAPABILITIES = Object.fromEntries(
276
- RELEASE_TAIL_PRODUCT_CAPABILITIES.map((capability) => [
277
- capability.id,
278
- {
279
- ...capability,
280
- destinationKind:
281
- capability.id === "product.package.publish"
282
- ? "npm-package"
283
- : capability.adapter,
284
- },
285
- ]),
286
- );
287
-
288
- function exactTagPattern(tag) {
289
- return `^${tag.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&")}$`;
290
- }
291
-
292
- export function createV4ProductPublicationDeclaration({ intent, plan }) {
293
- const rebuilt = createV4ProductPublicationPlan({
294
- intent,
295
- invocationRoot: plan.invocationRoot,
296
- transactionRoot: plan.transactionRoot,
297
- });
298
- if (rebuilt.planRoot !== plan.planRoot)
299
- fail("planRoot does not match the canonical publication plan");
300
- const operationById = new Map(
301
- plan.operations.map((operation) => [operation.id, operation]),
302
- );
303
- return {
304
- contract: RELEASE_TAIL_DECLARATION_CONTRACT,
305
- schemaVersion: 1,
306
- transactionPolicy: RELEASE_TAIL_TRANSACTION_POLICY,
307
- subject: {
308
- repository: intent.repository,
309
- sourceSha: intent.sourceSha,
310
- version: intent.version,
311
- tag: intent.exactTag,
312
- channel: intent.channel,
313
- },
314
- capabilities: plan.operationOrder.map((id) => {
315
- const operation = operationById.get(id);
316
- const descriptor = PRODUCT_CAPABILITIES[id];
317
- if (!operation || !descriptor)
318
- fail(`unsupported product publication operation '${id}'`);
319
- return {
320
- id,
321
- executor: "provider-adapter",
322
- adapter: operation.adapter,
323
- artifactRoles: [
324
- { role: "publication-intent", root: intent.intentRoot },
325
- ...(id === "product.package.publish"
326
- ? [
327
- { role: "sealed-bundle", root: intent.sealedBundleRoot },
328
- {
329
- role: "required-artifacts",
330
- root: intent.requiredArtifactsRoot,
331
- },
332
- ]
333
- : []),
334
- ],
335
- destination: {
336
- kind: descriptor.destinationKind,
337
- locator: `${operation.adapter}:${operation.operationRoot}`,
338
- },
339
- channelPolicy: {
340
- channel: intent.channel,
341
- tagPattern: exactTagPattern(intent.exactTag),
342
- authorityMove:
343
- id === "product.package.publish" ? "none" : "verified-ref",
344
- },
345
- activationPolicy: { mode: "none", environment: "none" },
346
- readbackPredicates: [
347
- {
348
- id: `${id}.target-root`,
349
- kind: "exact-root",
350
- expected: operation.operationRoot,
351
- },
352
- ],
353
- effect: {
354
- schema: RELEASE_TAIL_EFFECT_SCHEMA,
355
- kind: descriptor.effectKind,
356
- },
357
- observation: {
358
- schema: RELEASE_TAIL_OBSERVATION_SCHEMA,
359
- kind: descriptor.observationKind,
360
- },
361
- receipt: {
362
- schema: RELEASE_TAIL_RECEIPT_SCHEMA,
363
- kind: descriptor.receiptKind,
364
- },
365
- operationIdentity: {
366
- transactionRoot: plan.transactionRoot,
367
- capabilityId: id,
368
- subjectRoot: intent.intentRoot,
369
- targetRoot: operation.operationRoot,
370
- attemptKey: `${plan.planRoot}:${id}`,
371
- },
372
- idempotency: {
373
- scope: "subject-target",
374
- duplicate: "readback-before-retry",
375
- },
376
- retry: {
377
- class: "provider-transient",
378
- localAttempts: 1,
379
- exhausted: "blocked",
380
- },
381
- evidenceRequirements: [
382
- "provider readback must match the rooted publication operation",
383
- ],
384
- };
385
- }),
386
- };
387
- }