@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
@@ -0,0 +1,266 @@
1
+ import assert from "node:assert/strict";
2
+ import { currentWorkflowPath, projectWorkflowIdentities } from "./workflow-taxonomy.mjs";
3
+ import crypto from "node:crypto";
4
+ import fs from "node:fs";
5
+ import path from "node:path";
6
+ import { execFileSync } from "node:child_process";
7
+ import { fileURLToPath } from "node:url";
8
+
9
+ const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
10
+ const contract = JSON.parse(
11
+ fs.readFileSync(path.join(root, "architecture/universal-workflow-bootstrap.json"), "utf8"),
12
+ );
13
+ const admissionPolicy = JSON.parse(
14
+ fs.readFileSync(path.join(root, "architecture/universal-workflow-train-admission.json"), "utf8"),
15
+ );
16
+ const admissionObservedAt = Date.now();
17
+ assert.ok(
18
+ admissionObservedAt >= Date.parse(admissionPolicy.validFrom) &&
19
+ admissionObservedAt < Date.parse(admissionPolicy.expiresAt),
20
+ `release admission policy is outside its validity window (${admissionPolicy.validFrom} to ${admissionPolicy.expiresAt}); renew it through protected review before publishing`,
21
+ );
22
+ const fileRoot = (relative) =>
23
+ `sha256:${crypto
24
+ .createHash("sha256")
25
+ .update(fs.readFileSync(path.join(root, relative)))
26
+ .digest("hex")}`;
27
+
28
+ const workflowRoot = path.join(root, ".github/workflows");
29
+ const discovered = projectWorkflowIdentities(root, fs.readdirSync(workflowRoot)
30
+ .filter((name) => /\.ya?ml$/u.test(name))
31
+ .map((name) => ({ path: `.github/workflows/${name}`, text: fs.readFileSync(path.join(workflowRoot, name), "utf8") })))
32
+ .filter((entry) => /(?:^|\n)\s*workflow_call:\s*(?:\n|$)/u.test(entry.text))
33
+ .map((entry) => entry.path).sort();
34
+
35
+ assert.equal(
36
+ contract.schema,
37
+ "kungfu-buildchain-v4-universal-workflow-bootstrap/v1",
38
+ );
39
+ assert.deepEqual(
40
+ contract.inventoryWorkflows,
41
+ [...new Set(contract.inventoryWorkflows)].sort(),
42
+ "inventoried public workflows must be sorted and duplicate-free",
43
+ );
44
+ assert.deepEqual(
45
+ contract.inventoryWorkflows,
46
+ discovered,
47
+ "every active public workflow_call surface must be inventoried",
48
+ );
49
+ for (const relative of contract.inventoryWorkflows)
50
+ assert.ok(
51
+ fs.statSync(path.join(root, currentWorkflowPath(root, relative))).isFile(),
52
+ `inventoried workflow is unavailable: ${relative}`,
53
+ );
54
+ assert.deepEqual(
55
+ contract.bootstrapGovernedWorkflows,
56
+ [...new Set(contract.bootstrapGovernedWorkflows)].sort(),
57
+ "Bootstrap-governed workflows must be sorted and duplicate-free",
58
+ );
59
+ assert.deepEqual(
60
+ contract.retiredWorkflowSurfaces,
61
+ [...new Set(contract.retiredWorkflowSurfaces)].sort(),
62
+ "retired workflow surfaces must be sorted and duplicate-free",
63
+ );
64
+ for (const relative of contract.retiredWorkflowSurfaces) {
65
+ assert.ok(
66
+ contract.inventoryWorkflows.includes(relative),
67
+ `retired workflow is outside the inventory: ${relative}`,
68
+ );
69
+ assert.match(
70
+ fs.readFileSync(path.join(root, relative), "utf8"),
71
+ /retired/u,
72
+ `retired workflow does not fail closed explicitly: ${relative}`,
73
+ );
74
+ }
75
+ const activeWorkflows = contract.inventoryWorkflows.filter(
76
+ (relative) =>
77
+ !contract.retiredWorkflowSurfaces.includes(relative) &&
78
+ relative !== contract.bootstrap.consumerRecoveryWorkflow,
79
+ );
80
+ assert.deepEqual(
81
+ contract.bootstrapGovernedWorkflows,
82
+ activeWorkflows,
83
+ "every active public reusable workflow must be Bootstrap-governed",
84
+ );
85
+ for (const relative of contract.bootstrapGovernedWorkflows) {
86
+ assert.ok(
87
+ contract.inventoryWorkflows.includes(relative),
88
+ `Bootstrap-governed workflow is outside the inventory: ${relative}`,
89
+ );
90
+ const source = fs.readFileSync(path.join(root, currentWorkflowPath(root, relative)), "utf8");
91
+ assert.ok(
92
+ relative === contract.bootstrap.publicWorkflow ||
93
+ /uses:\s+(?:\.\/)?\.github\/workflows\/bootstrap\.yml/u.test(source) ||
94
+ /uses:\s+kungfu-systems\/buildchain\/\.github\/workflows\/bootstrap\.yml@/u.test(
95
+ source,
96
+ ),
97
+ `workflow is declared governed without a Bootstrap edge: ${relative}`,
98
+ );
99
+ }
100
+
101
+ assert.deepEqual(contract.complexityBudget, {
102
+ bootstrapAbis: 1,
103
+ requestEnvelopes: 1,
104
+ candidateResolvers: 1,
105
+ candidateEngines: 1,
106
+ terminalReceiptAuthorities: 1,
107
+ perWorkflowBootstrapImplementations: 0,
108
+ buildchainOnlySelfReleasePaths: 0,
109
+ perIncidentConsumerEdits: 0,
110
+ });
111
+ assert.equal(contract.bootstrap.discoveryRefExecutionAuthority, false);
112
+ assert.equal(contract.bootstrap.exactShaExecutionAuthority, true);
113
+ assert.equal(contract.bootstrap.consumerSourceMutationPerIncident, false);
114
+ assert.equal(contract.bootstrap.buildchainReleasePromotionPerIncident, false);
115
+ assert.equal(contract.bootstrap.selfDogfoodUsesPublicContract, true);
116
+ assert.equal(contract.bootstrap.recoveryDependsOnPublishedBuildchain, false);
117
+ assert.equal(
118
+ contract.bootstrap.reviewRuntimeBinding,
119
+ "reviewed-head-or-protected-alpha-merge-to-exact-runtime",
120
+ );
121
+ assert.deepEqual(
122
+ contract.capabilityAdapters.map(({ id }) => id).sort(),
123
+ [...admissionPolicy.allowedCapabilities].sort(),
124
+ "every admitted capability must have one real candidate adapter",
125
+ );
126
+ for (const adapter of contract.capabilityAdapters) {
127
+ assert.match(adapter.execution, /^exact-candidate-/u);
128
+ assert.ok(adapter.payloadSchema.endsWith("/v1"));
129
+ }
130
+ assert.ok(!admissionPolicy.allowedCapabilities.includes("workflow-contract"));
131
+ assert.deepEqual(
132
+ admissionPolicy.contractRoots,
133
+ [
134
+ fileRoot("architecture/universal-workflow-bootstrap.json"),
135
+ fileRoot(contract.bootstrap.faultCampaign),
136
+ fileRoot("packages/core/universal-workflow-bootstrap.js"),
137
+ fileRoot("scripts/universal-workflow-backflow.mjs"),
138
+ fileRoot("scripts/universal-workflow-engine.mjs"),
139
+ fileRoot("scripts/universal-workflow-self-dogfood.mjs"),
140
+ fileRoot(contract.bootstrap.publicWorkflow),
141
+ ].sort(),
142
+ );
143
+ assert.doesNotMatch(
144
+ fs.readFileSync(
145
+ path.join(root, contract.bootstrap.candidateEnginePath),
146
+ "utf8",
147
+ ),
148
+ /request\.capability\.id\s*===\s*["']workflow-contract["']/u,
149
+ "contract-only validation must not be admitted as successful execution",
150
+ );
151
+ const bootstrapSource = fs.readFileSync(
152
+ path.join(root, contract.bootstrap.publicWorkflow),
153
+ "utf8",
154
+ );
155
+ assert.doesNotMatch(
156
+ bootstrapSource,
157
+ /admission-policy-json:/u,
158
+ "callers must not supply their own admission authority",
159
+ );
160
+ execFileSync(
161
+ process.execPath,
162
+ [path.join(root, contract.migration.compatibilityFacadeGenerator), "--check"],
163
+ { stdio: "inherit" },
164
+ );
165
+ assert.doesNotMatch(bootstrapSource, /^ permissions:/mu);
166
+ assert.match(
167
+ bootstrapSource,
168
+ /execute:[\s\S]*BUILDCHAIN_PROMOTION_TOKEN: \$\{\{ secrets\.BUILDCHAIN_PROMOTION_TOKEN \}\}[\s\S]*GH_TOKEN: \$\{\{ github\.token \}\}/u,
169
+ "the privileged candidate executor must receive the protected-ref mutation token",
170
+ );
171
+ assert.match(bootstrapSource, /settle:[\s\S]*needs: \[admit, execute\]/u);
172
+ assert.match(
173
+ bootstrapSource,
174
+ /ascii_downcase\) == "kungfu-origin"[\s\S]*\.name == "check"[\s\S]*map\(select\(\.status == "completed" and \(\.conclusion \/\/ ""\) != ""\)\)[\s\S]*candidate\/architecture\/universal-workflow-train-admission\.json/u,
175
+ );
176
+ assert.match(
177
+ bootstrapSource,
178
+ /CANDIDATE_MODE:[\s\S]*\.merged == true[\s\S]*\.merge_commit_sha == \$expected[\s\S]*\.base\.ref == "alpha\/v4\/v4\.0"[\s\S]*commitSha: \$expected[\s\S]*runtimeBinding:/u,
179
+ );
180
+ const consumerTemplate = fs.readFileSync(
181
+ path.join(root, contract.bootstrap.consumerTemplate),
182
+ "utf8",
183
+ );
184
+ const consumerRecoveryTemplate = fs.readFileSync(
185
+ path.join(root, contract.bootstrap.consumerRecoveryTemplate),
186
+ "utf8",
187
+ );
188
+ const consumerRecoveryWorkflow = fs.readFileSync(
189
+ path.join(root, contract.bootstrap.consumerRecoveryWorkflow),
190
+ "utf8",
191
+ );
192
+ const selfDogfood = fs.readFileSync(
193
+ path.join(root, contract.bootstrap.selfDogfoodWorkflow),
194
+ "utf8",
195
+ );
196
+ assert.match(
197
+ consumerTemplate,
198
+ /uses:\s+kungfu-systems\/buildchain\/\.github\/workflows\/bootstrap\.yml@v4/u,
199
+ );
200
+ assert.match(
201
+ consumerRecoveryTemplate,
202
+ /recovery-admit:[\s\S]*recovery-execute:/u,
203
+ );
204
+ assert.match(
205
+ consumerRecoveryTemplate,
206
+ /Parse exact recovery coordinates without Buildchain code[\s\S]*Prove exact independent review before candidate code runs[\s\S]*ascii_downcase\) == "kungfu-origin"[\s\S]*\.name == "check"[\s\S]*Admit candidate policy and exact-head checks[\s\S]*map\(select\(\.status == "completed" and \(\.conclusion \/\/ ""\) != ""\)\)/u,
207
+ );
208
+ assert.match(
209
+ consumerRecoveryTemplate,
210
+ /recovery-execute:[\s\S]*needs: recovery-admit[\s\S]*contents: write/u,
211
+ );
212
+ assert.doesNotMatch(
213
+ consumerRecoveryTemplate,
214
+ /uses:\s+kungfu-systems\/buildchain\/\.github\/workflows\//u,
215
+ "consumer recovery must not parse any published Buildchain workflow",
216
+ );
217
+ assert.equal(
218
+ consumerRecoveryWorkflow,
219
+ consumerRecoveryTemplate,
220
+ "the Buildchain self-consumer must exercise the exact distributable recovery shell",
221
+ );
222
+ assert.match(
223
+ selfDogfood,
224
+ /uses:\s+kungfu-systems\/buildchain\/\.github\/workflows\/bootstrap\.yml@train\/v4\/v4\.0\/universal-reusable-workflow-bootstrap/u,
225
+ );
226
+ assert.match(
227
+ selfDogfood,
228
+ /uses:\s+\.\/\.github\/workflows\/universal-bootstrap-recovery\.yml/u,
229
+ );
230
+ assert.doesNotMatch(
231
+ selfDogfood,
232
+ /\.github\/workflows\/bootstrap\.yml@(?:v4|v4-alpha)(?:\s|$)/u,
233
+ "Train self-dogfood must not depend on an alpha or stable Bootstrap tag",
234
+ );
235
+ for (const channel of ["conformance", "alpha", "stable"]) {
236
+ assert.match(selfDogfood, new RegExp(`primary-${channel}:`, "u"));
237
+ assert.match(selfDogfood, new RegExp(`recovery-${channel}:`, "u"));
238
+ }
239
+ assert.match(
240
+ selfDogfood,
241
+ /\.state == "APPROVED"[\s\S]*ascii_downcase\) == "kungfu-origin"[\s\S]*\.name == "check"[\s\S]*\.conclusion == "success"/u,
242
+ );
243
+ assert.match(
244
+ consumerRecoveryTemplate,
245
+ /result-json:[\s\S]*value:\s*\$\{\{ jobs\.recovery-execute\.outputs\.result-json \}\}/u,
246
+ );
247
+
248
+ console.log(
249
+ JSON.stringify({
250
+ ok: true,
251
+ schema: contract.schema,
252
+ publicWorkflowCount: discovered.length,
253
+ activePublicWorkflowCount: activeWorkflows.length,
254
+ retiredWorkflowCount: contract.retiredWorkflowSurfaces.length,
255
+ inventoriedWorkflowCount: contract.inventoryWorkflows.length,
256
+ inventoryCoveragePercent: 100,
257
+ governedWorkflowCount: contract.bootstrapGovernedWorkflows.length,
258
+ governedCoveragePercent: Number(
259
+ (
260
+ (contract.bootstrapGovernedWorkflows.length / activeWorkflows.length) *
261
+ 100
262
+ ).toFixed(2),
263
+ ),
264
+ migration: contract.migration,
265
+ }),
266
+ );
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ import { checkWorkflowTaxonomy } from "./workflow-taxonomy.mjs";
3
+
4
+ const result = checkWorkflowTaxonomy(process.cwd());
5
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
6
+ if (!result.ok) process.exitCode = 1;
@@ -3,11 +3,11 @@ import fs from "node:fs";
3
3
  import path from "node:path";
4
4
  import { pathToFileURL } from "node:url";
5
5
  import {
6
- certifyV4FloatingConsumerPolicyReceipt,
7
- resolveV4FloatingConsumerPolicyAuthority,
8
- scanV4FloatingConsumerPolicy,
9
- v4ConsumerPolicyScannerRoot,
10
- } from "../packages/core/v4-floating-consumer-policy.js";
6
+ certifyFloatingConsumerPolicyReceipt,
7
+ resolveFloatingConsumerPolicyAuthority,
8
+ scanFloatingConsumerPolicy,
9
+ consumerPolicyScannerRoot,
10
+ } from "../packages/core/floating-consumer-policy.js";
11
11
  import { writeGitHubOutputs } from "./build-contract-core.mjs";
12
12
  const RUNTIME_ROOT = path.resolve(import.meta.dirname, "..");
13
13
  function parseArgs(argv) {
@@ -36,7 +36,7 @@ function writeJson(file, value) {
36
36
  fs.mkdirSync(path.dirname(file), { recursive: true });
37
37
  fs.writeFileSync(file, `${JSON.stringify(value, null, 2)}\n`);
38
38
  }
39
- export { v4ConsumerPolicyScannerRoot };
39
+ export { consumerPolicyScannerRoot };
40
40
  export function scanCommand(options = {}) {
41
41
  const root = path.resolve(
42
42
  options.root || env("BUILDCHAIN_CONSUMER_ROOT", process.cwd()),
@@ -49,13 +49,13 @@ export function scanCommand(options = {}) {
49
49
  options.output ||
50
50
  env(
51
51
  "BUILDCHAIN_V4_POLICY_RECEIPT_PATH",
52
- ".buildchain/evidence/v4-consumer-policy-receipt.json",
52
+ ".buildchain/evidence/consumer-policy-receipt.json",
53
53
  ),
54
54
  );
55
55
  const policy = readJson(
56
- path.join(RUNTIME_ROOT, "architecture/v4-floating-consumer-policy.json"),
56
+ path.join(RUNTIME_ROOT, "architecture/floating-consumer-policy.json"),
57
57
  );
58
- const result = scanV4FloatingConsumerPolicy({
58
+ const result = scanFloatingConsumerPolicy({
59
59
  root,
60
60
  invocationRoot,
61
61
  repository: options.repository || env("GITHUB_REPOSITORY"),
@@ -86,7 +86,7 @@ export function scanCommand(options = {}) {
86
86
  ".buildchain/alpha-contract-lock.json",
87
87
  ),
88
88
  policy,
89
- scannerRoot: v4ConsumerPolicyScannerRoot(),
89
+ scannerRoot: consumerPolicyScannerRoot(),
90
90
  });
91
91
  writeJson(output, result);
92
92
  writeGitHubOutputs({
@@ -137,13 +137,13 @@ export function certifyCommand(options = {}) {
137
137
  receipt?.invocation?.workflow;
138
138
  const resolvedRuntimeSha =
139
139
  options.resolvedRuntimeSha || env("BUILDCHAIN_EXPECTED_RUNTIME_SHA");
140
- const authority = resolveV4FloatingConsumerPolicyAuthority({
140
+ const authority = resolveFloatingConsumerPolicyAuthority({
141
141
  runtimeRoot: RUNTIME_ROOT,
142
142
  callerRoot,
143
143
  stableLockPath,
144
144
  alphaLockPath,
145
145
  });
146
- const authorityScan = scanV4FloatingConsumerPolicy({
146
+ const authorityScan = scanFloatingConsumerPolicy({
147
147
  root: callerRoot,
148
148
  repository,
149
149
  sourceSha,
@@ -163,7 +163,7 @@ export function certifyCommand(options = {}) {
163
163
  scannerRoot: authority.scannerRoot,
164
164
  contractLocks: authority.contractLocks,
165
165
  };
166
- const result = certifyV4FloatingConsumerPolicyReceipt({
166
+ const result = certifyFloatingConsumerPolicyReceipt({
167
167
  receipt,
168
168
  receiptRoot,
169
169
  expectedReceiptRoot: authorityScan.receiptRoot,
@@ -183,7 +183,7 @@ export function certifyCommand(options = {}) {
183
183
  options.output ||
184
184
  env(
185
185
  "BUILDCHAIN_V4_POLICY_CERTIFICATION_PATH",
186
- ".buildchain/evidence/v4-consumer-policy-certification.json",
186
+ ".buildchain/evidence/consumer-policy-certification.json",
187
187
  ),
188
188
  );
189
189
  const documentWithAuthority = {
@@ -211,7 +211,7 @@ function main(argv = process.argv.slice(2)) {
211
211
  ? certifyCommand(options)
212
212
  : (() => {
213
213
  throw new Error(
214
- "usage: v4-consumer-policy.mjs <scan|certify> [--option value]",
214
+ "usage: consumer-policy.mjs <scan|certify> [--option value]",
215
215
  );
216
216
  })();
217
217
  process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
@@ -0,0 +1,14 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
6
+ const destination = path.resolve(process.argv[2] || "");
7
+ if (!process.argv[2] || path.basename(destination) !== "dist") {
8
+ throw new Error("usage: copy-domain-wasm.mjs ACTION_DIST_DIRECTORY");
9
+ }
10
+ fs.mkdirSync(destination, { recursive: true });
11
+ fs.copyFileSync(
12
+ path.join(root, "packages", "core", "buildchain-domain.wasm"),
13
+ path.join(destination, "buildchain-domain.wasm"),
14
+ );
@@ -5,10 +5,10 @@ import fs from "node:fs";
5
5
  import path from "node:path";
6
6
 
7
7
  import {
8
- createV4CrossPlatformAdopterReport,
9
- qualifyV4CrossPlatformAdopters,
10
- summarizeV3V4CapabilityInventory,
11
- } from "../packages/core/v4-cross-platform-adopter-qualification.js";
8
+ createCrossPlatformAdopterReport,
9
+ qualifyCrossPlatformAdopters,
10
+ summarizeBaselineCapabilityInventory,
11
+ } from "../packages/core/cross-platform-adopter-qualification.js";
12
12
 
13
13
  function flag(name, fallback = "") {
14
14
  const index = process.argv.indexOf(`--${name}`);
@@ -74,9 +74,9 @@ function runPlatform() {
74
74
  });
75
75
 
76
76
  const inventory = readJson(
77
- path.join(runtimeRoot, "architecture/v3-v4-live-capability-inventory.json"),
77
+ path.join(runtimeRoot, "architecture/capability-parity-live-capability-inventory.json"),
78
78
  );
79
- const inventoryEvidence = summarizeV3V4CapabilityInventory(inventory);
79
+ const inventoryEvidence = summarizeBaselineCapabilityInventory(inventory);
80
80
  fs.mkdirSync(workRoot, { recursive: true });
81
81
  const initialPath = path.join(workRoot, "initial-readback.json");
82
82
  const retryPath = path.join(workRoot, "retry-readback.json");
@@ -135,7 +135,7 @@ function runPlatform() {
135
135
  );
136
136
  expectPass(neutralDriver, "independent protocol-neutral driver");
137
137
 
138
- const report = createV4CrossPlatformAdopterReport({
138
+ const report = createCrossPlatformAdopterReport({
139
139
  platform: required("platform"),
140
140
  consumer: required("consumer"),
141
141
  sourceBinding: {
@@ -210,7 +210,7 @@ function collectReports(root) {
210
210
 
211
211
  function aggregate() {
212
212
  const reportsRoot = path.resolve(required("reports-root"));
213
- const qualification = qualifyV4CrossPlatformAdopters({
213
+ const qualification = qualifyCrossPlatformAdopters({
214
214
  reports: collectReports(reportsRoot),
215
215
  consumers: repeated("consumer"),
216
216
  });
@@ -224,5 +224,5 @@ if (mode === "run") runPlatform();
224
224
  else if (mode === "aggregate") aggregate();
225
225
  else
226
226
  throw new Error(
227
- "usage: v4-cross-platform-adopter-qualification.mjs <run|aggregate> ...",
227
+ "usage: cross-platform-adopter-qualification.mjs <run|aggregate> ...",
228
228
  );
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { pathToFileURL } from "node:url";
3
3
 
4
- import { assertV4DeclarativePromotionInputs } from "../packages/core/v4-publication-qualification.js";
4
+ import { assertDeclarativePromotionInputs } from "../packages/core/publication-qualification.js";
5
5
 
6
- export function admitV4DeclarativePromotion({
6
+ export function admitDeclarativePromotion({
7
7
  inputs,
8
8
  runtimeRef,
9
9
  declarative,
@@ -21,7 +21,7 @@ export function admitV4DeclarativePromotion({
21
21
  error.code = "v4-declarative-release-tail-required";
22
22
  throw error;
23
23
  }
24
- assertV4DeclarativePromotionInputs(inputs);
24
+ assertDeclarativePromotionInputs(inputs);
25
25
  return Object.freeze({ mode: "v4-declarative", admitted: true });
26
26
  }
27
27
 
@@ -30,7 +30,7 @@ if (
30
30
  import.meta.url === pathToFileURL(process.argv[1]).href
31
31
  ) {
32
32
  try {
33
- const result = admitV4DeclarativePromotion({
33
+ const result = admitDeclarativePromotion({
34
34
  inputs: JSON.parse(process.env.BUILDCHAIN_PROMOTION_INPUTS_JSON || "{}"),
35
35
  runtimeRef: process.env.BUILDCHAIN_RUNTIME_REF,
36
36
  declarative: process.env.BUILDCHAIN_DECLARATIVE_RELEASE_TAIL === "true",
@@ -1,4 +1,3 @@
1
- import fs from "node:fs";
2
1
  import path from "node:path";
3
2
  import {
4
3
  acquireDevDeliveryLandingWarrant,
@@ -66,6 +65,7 @@ function submitCandidate(state, options) {
66
65
  {
67
66
  pullRequestNumber: options.pullRequestNumber,
68
67
  sourceHead: options.sourceHead,
68
+ sourceRoot: options.sourceRoot,
69
69
  assignmentRoot: options.assignmentRoot,
70
70
  initiativeRoot: options.initiativeRoot,
71
71
  sourceIdentityRoot: options.sourceIdentityRoot,
@@ -276,16 +276,16 @@ export function devDeliveryAuthorityCliOptions(
276
276
  "source-head",
277
277
  environment.BUILDCHAIN_DEV_DELIVERY_SOURCE_HEAD,
278
278
  ),
279
- assignmentRoot: flag(
279
+ sourceRoot: flag(
280
280
  rest,
281
- "assignment-root",
282
- environment.BUILDCHAIN_DEV_DELIVERY_ASSIGNMENT_ROOT,
283
- ),
284
- initiativeRoot: flag(
285
- rest,
286
- "initiative-root",
287
- environment.BUILDCHAIN_DEV_DELIVERY_INITIATIVE_ROOT,
281
+ "source-root",
282
+ environment.BUILDCHAIN_WORK_SOURCE_ROOT ||
283
+ environment.BUILDCHAIN_DEV_DELIVERY_SOURCE_ROOT,
288
284
  ),
285
+ // Retired roots remain readable in persisted historical candidates.
286
+ // New authority submissions accept only the Work sourceRoot above.
287
+ // Retired CLI flags are intentionally ignored by this parser.
288
+ // This prevents producers from reconstructing obsolete identities.
289
289
  sourceIdentityRoot: flag(
290
290
  rest,
291
291
  "source-identity-root",
@@ -479,6 +479,7 @@ function cliInput(args) {
479
479
  export function sourceProofReuseCli(args = process.argv.slice(2)) {
480
480
  const [command = "", ...rest] = args;
481
481
  const input = cliInput(rest);
482
+ if (command === "predicates") return sourceQualificationPredicates(input);
482
483
  if (command === "seal") {
483
484
  const proof = sealSourceQualificationProof(input);
484
485
  writeJson(input.outputPath, proof);
@@ -527,7 +528,7 @@ export function sourceProofReuseCli(args = process.argv.slice(2)) {
527
528
  return decision;
528
529
  }
529
530
  throw new Error(
530
- "usage: dev-delivery-source-proof-reuse.mjs <seal|verify> [options]",
531
+ "usage: dev-delivery-source-proof-reuse.mjs <predicates|seal|verify> [options]",
531
532
  );
532
533
  }
533
534
 
@@ -1,8 +1,8 @@
1
+ import fs from "node:fs";
1
2
  export function flag(args, name, fallback = "") {
2
3
  const index = args.indexOf(`--${name}`);
3
4
  return index === -1 ? fallback : args[index + 1] || "";
4
5
  }
5
-
6
6
  export function hasFlag(args, name) {
7
7
  return args.includes(`--${name}`);
8
8
  }
@@ -79,16 +79,16 @@ export function devDeliveryCliOptions(args = [], environment = process.env) {
79
79
  "source-head",
80
80
  environment.BUILDCHAIN_DEV_DELIVERY_SOURCE_HEAD,
81
81
  ),
82
- expectedSourceHead: flag(
83
- rest,
84
- "expected-source-head",
85
- environment.BUILDCHAIN_DEV_DELIVERY_EXPECTED_SOURCE_HEAD,
86
- ),
87
- observedSourceHead: flag(
82
+ sourceRoot: flag(
88
83
  rest,
89
- "observed-source-head",
90
- environment.BUILDCHAIN_DEV_DELIVERY_OBSERVED_SOURCE_HEAD,
84
+ "source-root",
85
+ environment.BUILDCHAIN_WORK_SOURCE_ROOT ||
86
+ environment.BUILDCHAIN_DEV_DELIVERY_SOURCE_ROOT ||
87
+ sourceRootFromGitHubEvent(environment),
91
88
  ),
89
+ // prettier-ignore
90
+ ...{ expectedSourceHead: flag(rest, "expected-source-head", environment.BUILDCHAIN_DEV_DELIVERY_EXPECTED_SOURCE_HEAD), observedSourceHead: flag(rest, "observed-source-head", environment.BUILDCHAIN_DEV_DELIVERY_OBSERVED_SOURCE_HEAD) },
91
+
92
92
  assignmentRoot: flag(
93
93
  rest,
94
94
  "assignment-root",
@@ -278,7 +278,7 @@ export function devDeliveryCliOptions(args = [], environment = process.env) {
278
278
  rest,
279
279
  "read-evidence-output",
280
280
  environment.BUILDCHAIN_V4_WARRANT_READ_EVIDENCE ||
281
- ".buildchain/dev-delivery/v4-read-evidence.json",
281
+ ".buildchain/dev-delivery/read-evidence.json",
282
282
  ),
283
283
  now: flag(rest, "now", environment.BUILDCHAIN_DEV_DELIVERY_NOW),
284
284
  outputPath: flag(
@@ -291,3 +291,8 @@ export function devDeliveryCliOptions(args = [], environment = process.env) {
291
291
  json: hasFlag(rest, "json"),
292
292
  };
293
293
  }
294
+
295
+ // prettier-ignore
296
+ function sourceRootFromGitHubEvent(environment) {
297
+ try { const event = JSON.parse(fs.readFileSync(environment.GITHUB_EVENT_PATH, "utf8")); return event.client_payload?.candidate?.sourceRoot || JSON.parse(event.inputs?.["native-roots-json"] || "{}").sourceRoot || ""; } catch { return ""; }
298
+ }