@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,8 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import fs from "node:fs";
4
+ import { writeWorkflowSource } from "./workflow-taxonomy.mjs";
4
5
  import path from "node:path";
5
6
  import { fileURLToPath } from "node:url";
7
+ import { migrateUniversalWorkflowFacade } from "./generate-universal-workflow-facades.mjs";
6
8
 
7
9
  const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
8
10
  const sourcePath = path.join(root, ".github/workflows/.release-candidate-promote.yml");
@@ -208,29 +210,29 @@ function consumerAdmissionJob() {
208
210
  with:
209
211
  repository: \${{ inputs.buildchain-repository }}
210
212
  ref: \${{ needs.resolve-promotion.outputs.router-sha }}
211
- path: .buildchain/v4-policy-runtime
213
+ path: .buildchain/policy-runtime
212
214
  persist-credentials: false
213
215
  - name: Enforce v4 floating consumer policy
214
216
  id: policy
215
217
  env:
216
218
  BUILDCHAIN_CONSUMER_ROOT: .buildchain/consumer
217
- BUILDCHAIN_INVOCATION_SOURCE_PATH: \${{ inputs.publication-publisher-workflow-path == '.github/workflows/buildchain-ref-promotion-recovery.yml' && '.github/workflows/release-candidate-promote.yml' || inputs.publication-publisher-workflow-path }}
219
+ BUILDCHAIN_INVOCATION_SOURCE_PATH: \${{ inputs.publication-publisher-workflow-path == '.github/workflows/self-ops-promotion-recovery.yml' && '.github/workflows/release-candidate-promote.yml' || inputs.publication-publisher-workflow-path }}
218
220
  BUILDCHAIN_EXPECTED_INVOCATION_CHANNEL: \${{ needs.resolve-promotion.outputs.channel }}
219
- BUILDCHAIN_INVOKED_WORKFLOW: \${{ inputs.publication-publisher-workflow-path == '.github/workflows/buildchain-ref-promotion-recovery.yml' && '.github/workflows/.release-candidate-promote.yml' || '.github/workflows/release-candidate-promote.yml' }}
221
+ BUILDCHAIN_INVOKED_WORKFLOW: \${{ inputs.publication-publisher-workflow-path == '.github/workflows/self-ops-promotion-recovery.yml' && '.github/workflows/.release-candidate-promote.yml' || '.github/workflows/release-candidate-promote.yml' }}
220
222
  BUILDCHAIN_WORKFLOW_SHA: \${{ needs.resolve-promotion.outputs.router-sha }}
221
223
  BUILDCHAIN_RUNTIME_SHA: \${{ needs.resolve-promotion.outputs.router-sha }}
222
224
  BUILDCHAIN_STABLE_CONTRACT_LOCK_PATH: \${{ inputs.buildchain-stable-contract-lock-path }}
223
225
  BUILDCHAIN_ALPHA_CONTRACT_LOCK_PATH: \${{ inputs.buildchain-alpha-contract-lock-path }}
224
- BUILDCHAIN_V4_POLICY_RECEIPT_PATH: .buildchain/evidence/v4-consumer-policy-receipt.json
226
+ BUILDCHAIN_V4_POLICY_RECEIPT_PATH: .buildchain/evidence/consumer-policy-receipt.json
225
227
  run: >-
226
- node .buildchain/v4-policy-runtime/scripts/v4-consumer-policy.mjs scan
228
+ node .buildchain/policy-runtime/scripts/consumer-policy.mjs scan
227
229
  --source-sha "\${{ inputs.target-sha || github.sha }}"
228
230
 
229
231
  - name: Upload rooted consumer admission receipt
230
232
  uses: actions/upload-artifact@v7.0.1
231
233
  with:
232
234
  name: v4-consumer-policy-release-candidate-promote-\${{ github.sha }}
233
- path: .buildchain/consumer/.buildchain/evidence/v4-consumer-policy-receipt.json
235
+ path: .buildchain/consumer/.buildchain/evidence/consumer-policy-receipt.json
234
236
  if-no-files-found: error
235
237
 
236
238
  - name: Authorize transient v4 runtime selection
@@ -238,18 +240,18 @@ function consumerAdmissionJob() {
238
240
  if: \${{ needs.resolve-promotion.outputs.override-used == 'true' }}
239
241
  uses: actions/github-script@v8
240
242
  env:
241
- BUILDCHAIN_RUNTIME_AUTHORIZATION_PATH: .buildchain/consumer/.buildchain/evidence/v4-runtime-authorization.json
243
+ BUILDCHAIN_RUNTIME_AUTHORIZATION_PATH: .buildchain/consumer/.buildchain/evidence/runtime-authorization.json
242
244
  with:
243
245
  script: |
244
- const script = require(process.env.GITHUB_WORKSPACE + "/.buildchain/v4-policy-runtime/scripts/authorize-promotion-runtime-override.cjs");
246
+ const script = require(process.env.GITHUB_WORKSPACE + "/.buildchain/policy-runtime/scripts/authorize-promotion-runtime-override.cjs");
245
247
  const result = await script.authorizePromotionRuntimeOverride({
246
248
  github,
247
249
  context,
248
250
  request: {
249
251
  consumerRoot: process.env.GITHUB_WORKSPACE + "/.buildchain/consumer",
250
- runtimeModulePath: process.env.GITHUB_WORKSPACE + "/.buildchain/v4-policy-runtime/packages/core/v4-runtime-ref-resume-authority.js",
252
+ runtimeModulePath: process.env.GITHUB_WORKSPACE + "/.buildchain/policy-runtime/packages/core/runtime-ref-resume-authority.js",
251
253
  runtimeRepository: "\${{ inputs.buildchain-repository }}",
252
- consumerPolicyReceiptPath: process.env.GITHUB_WORKSPACE + "/.buildchain/consumer/.buildchain/evidence/v4-consumer-policy-receipt.json",
254
+ consumerPolicyReceiptPath: process.env.GITHUB_WORKSPACE + "/.buildchain/consumer/.buildchain/evidence/consumer-policy-receipt.json",
253
255
  consumerPolicyReceiptRoot: "\${{ steps.policy.outputs.v4-consumer-policy-receipt-root }}",
254
256
  sourceSha: "\${{ inputs.target-sha || github.sha }}",
255
257
  requestedRef: "\${{ needs.resolve-promotion.outputs.runtime-ref }}",
@@ -270,7 +272,7 @@ function consumerAdmissionJob() {
270
272
  uses: actions/upload-artifact@v7.0.1
271
273
  with:
272
274
  name: v4-runtime-authorization-release-candidate-promote-\${{ github.run_id }}
273
- path: .buildchain/consumer/.buildchain/evidence/v4-runtime-authorization.json
275
+ path: .buildchain/consumer/.buildchain/evidence/runtime-authorization.json
274
276
  if-no-files-found: error
275
277
  `;
276
278
  }
@@ -302,7 +304,7 @@ export function generateChannelPromotionWorkflow(source, { major = 2, shellRouti
302
304
  if (!inputNames.includes(required)) throw new Error(`advanced promotion workflow missing input: ${required}`);
303
305
  }
304
306
  const invokeForwarded = routedInputs(inputNames, alphaRoute, major);
305
- return `# Generated by scripts/generate-channel-promotion-workflow.mjs. Do not edit directly.
307
+ return migrateUniversalWorkflowFacade(`# Generated by scripts/generate-channel-promotion-workflow.mjs. Do not edit directly.
306
308
  name: Release Candidate Promote
307
309
 
308
310
  on:
@@ -314,16 +316,7 @@ ${secrets.trimEnd()}
314
316
  outputs:
315
317
  ${publicOutputs(outputs)}
316
318
 
317
- permissions:
318
- actions: write
319
- artifact-metadata: write
320
- attestations: write
321
- checks: write
322
- contents: write
323
- id-token: write
324
- issues: write
325
- pull-requests: write
326
-
319
+ # Provider authority is inherited from the explicit caller envelope.
327
320
  jobs:
328
321
  resolve-promotion:
329
322
  name: Resolve promotion workflow shell and runtime
@@ -358,7 +351,7 @@ jobs:
358
351
  run: |
359
352
  set -euo pipefail
360
353
  repository="\${BUILDCHAIN_ROUTER_REPOSITORY}"
361
- ref="\${BUILDCHAIN_ROUTER_REF}"
354
+ ref="\${BUILDCHAIN_ROUTER_REF:-${alphaRoute.logicalRef}}"
362
355
  ref="\${ref#refs/heads/}"
363
356
  ref="\${ref#refs/tags/}"
364
357
  if [[ ! "\${repository}" =~ ^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$ || -z "\${ref}" || "\${ref}" = /* || "\${ref}" = *..* ]]; then
@@ -501,19 +494,11 @@ ${consumerAdmissionJob()}
501
494
  name: Invoke the single v4 publisher adapter
502
495
  needs: [resolve-promotion, consumer-admission]
503
496
  uses: kungfu-systems/buildchain/${alphaRoute.workflowPath}@${alphaRoute.callRef}
504
- permissions:
505
- actions: write
506
- artifact-metadata: write
507
- attestations: write
508
- checks: write
509
- contents: write
510
- id-token: write
511
- issues: write
512
- pull-requests: write
497
+ # Provider authority is inherited from the explicit caller envelope.
513
498
  with:
514
499
  ${invokeForwarded}
515
500
  secrets: inherit
516
- `;
501
+ `, ".github/workflows/release-candidate-promote.yml");
517
502
  }
518
503
 
519
504
  function main() {
@@ -531,7 +516,7 @@ function main() {
531
516
  }
532
517
  return;
533
518
  }
534
- fs.writeFileSync(targetPath, generated);
519
+ writeWorkflowSource(root, path.relative(root, targetPath), generated);
535
520
  }
536
521
 
537
522
  const isMain = process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url);
@@ -4,11 +4,11 @@ import path from "node:path";
4
4
  import { execFileSync } from "node:child_process";
5
5
  import { pathToFileURL } from "node:url";
6
6
  import { createReleaseCandidatePassport, validateReleaseCandidatePassport } from "../packages/core/release-candidate.js";
7
- import { scanV4FloatingConsumerPolicy, v4ConsumerPolicyScannerRoot } from "../packages/core/v4-floating-consumer-policy.js";
8
- import { v4ContentRoot } from "../packages/core/v4-canonical-contracts.js";
9
- import { V4_STAGE_CAPSULE_CONTRACT, V4_STAGE_CAPSULE_IDENTITY_CONTRACT, v4StageCapsuleIdentityRoot, v4StageCapsuleRoot, validateV4StageCapsule } from "../packages/core/v4-stage-capsule.js";
10
- import { v4RuntimeResumeDocumentRoot } from "../packages/core/v4-runtime-ref-resume-authority.js";
11
- import { createV4PublicationQualificationReceipt } from "../packages/core/v4-publication-qualification.js";
7
+ import { scanFloatingConsumerPolicy, consumerPolicyScannerRoot } from "../packages/core/floating-consumer-policy.js";
8
+ import { domainContentRoot } from "../packages/core/canonical-contracts.js";
9
+ import { STAGE_CAPSULE_CONTRACT, STAGE_CAPSULE_IDENTITY_CONTRACT, stageCapsuleIdentityRoot, stageCapsuleRoot, validateStageCapsule } from "../packages/core/stage-capsule.js";
10
+ import { runtimeResumeDocumentRoot } from "../packages/core/runtime-ref-resume-authority.js";
11
+ import { createDomainPublicationQualificationReceipt } from "../packages/core/publication-qualification.js";
12
12
  import { writeGitHubOutputs } from "./build-contract-core.mjs";
13
13
 
14
14
  const env = (name, fallback = "") => process.env[name] || fallback;
@@ -37,12 +37,12 @@ export function createReleaseCandidateStageCapsules({
37
37
  const coordinate = coordinateByPlatform.get(platform.platformId);
38
38
  if (!coordinate || coordinate.name !== platform.artifactName) throw new Error(`Stage Capsule coordinate missing for ${platform.platformId}`);
39
39
  const manifest = readJsonFile(platform.manifestPath);
40
- return { role: platform.artifactName, platform: platform.platformId, artifactRoot: coordinate.digest, manifestRoot: v4ContentRoot("stage-capsule-artifact-manifest", manifest) };
40
+ return { role: platform.artifactName, platform: platform.platformId, artifactRoot: coordinate.digest, manifestRoot: domainContentRoot("stage-capsule-artifact-manifest", manifest) };
41
41
  });
42
42
  const qualificationExpiresAt = coordinates.artifacts.map((entry) => entry.expiresAt).sort((left, right) => Date.parse(left) - Date.parse(right))[0];
43
- const qualificationReceipt = createV4PublicationQualificationReceipt({
43
+ const qualificationReceipt = createDomainPublicationQualificationReceipt({
44
44
  repository: passport.repository, candidateRoot: `sha256:${passport.candidateHash}`,
45
- sourceSha: passport.source.headSha, sourceRoot: v4ContentRoot("candidate-identity", passport.source),
45
+ sourceSha: passport.source.headSha, sourceRoot: domainContentRoot("candidate-identity", passport.source),
46
46
  policyDigest: passport.consumerPolicy.receiptRoot, artifacts: qualificationArtifacts,
47
47
  issuedAt: passport.createdAt || new Date(Date.parse(qualificationExpiresAt) - 86_400_000).toISOString(), expiresAt: qualificationExpiresAt,
48
48
  });
@@ -57,13 +57,13 @@ export function createReleaseCandidateStageCapsules({
57
57
  }
58
58
  const manifest = readJsonFile(platform.manifestPath);
59
59
  const identity = {
60
- schema: V4_STAGE_CAPSULE_IDENTITY_CONTRACT,
61
- sourceRoot: v4ContentRoot("candidate-identity", passport.source),
60
+ schema: STAGE_CAPSULE_IDENTITY_CONTRACT,
61
+ sourceRoot: domainContentRoot("candidate-identity", passport.source),
62
62
  platform: platform.platformId,
63
- platformRoot: v4ContentRoot("candidate-identity", manifest.platform),
63
+ platformRoot: domainContentRoot("candidate-identity", manifest.platform),
64
64
  stage: "verify",
65
65
  toolchainRoots: [],
66
- runtimeRoot: v4ContentRoot("candidate-identity", {
66
+ runtimeRoot: domainContentRoot("candidate-identity", {
67
67
  sha: passport.buildchain.sha,
68
68
  }),
69
69
  policyRoot: passport.consumerPolicy.receiptRoot,
@@ -73,11 +73,11 @@ export function createReleaseCandidateStageCapsules({
73
73
  root: `sha256:${passport.candidateHash}`,
74
74
  },
75
75
  ],
76
- transformationRoot: v4ContentRoot("candidate-identity", {
76
+ transformationRoot: domainContentRoot("candidate-identity", {
77
77
  lifecycle: manifest.lifecycle,
78
78
  summary: platform.summary,
79
79
  }),
80
- outputManifestRoot: v4ContentRoot(
80
+ outputManifestRoot: domainContentRoot(
81
81
  "stage-capsule-artifact-manifest",
82
82
  { artifact: coordinate, manifest },
83
83
  ),
@@ -85,24 +85,24 @@ export function createReleaseCandidateStageCapsules({
85
85
  observationRoots: [
86
86
  {
87
87
  name: "provider-coordinate",
88
- root: v4ContentRoot("provider-readback-sample", coordinate),
88
+ root: domainContentRoot("provider-readback-sample", coordinate),
89
89
  },
90
90
  ],
91
91
  };
92
92
  const capsule = {
93
- schema: V4_STAGE_CAPSULE_CONTRACT,
93
+ schema: STAGE_CAPSULE_CONTRACT,
94
94
  writerAuthority: "typescript-v3",
95
95
  rustAuthority: "validation-only",
96
96
  identity,
97
- identityRoot: v4StageCapsuleIdentityRoot(identity),
97
+ identityRoot: stageCapsuleIdentityRoot(identity),
98
98
  retentionPromise: {
99
99
  class: "github-artifact",
100
100
  retainUntil: coordinate.expiresAt,
101
101
  },
102
102
  capsuleRoot: `sha256:${"0".repeat(64)}`,
103
103
  };
104
- capsule.capsuleRoot = v4StageCapsuleRoot(capsule);
105
- validateV4StageCapsule(capsule);
104
+ capsule.capsuleRoot = stageCapsuleRoot(capsule);
105
+ validateStageCapsule(capsule);
106
106
  return {
107
107
  platform: platform.platformId,
108
108
  artifactName: coordinate.name,
@@ -133,7 +133,7 @@ export function createReleaseCandidateStageCapsules({
133
133
  publicationQualificationReceipt: qualificationReceipt,
134
134
  capsules: entries,
135
135
  };
136
- return { ...body, root: v4RuntimeResumeDocumentRoot(body) };
136
+ return { ...body, root: runtimeResumeDocumentRoot(body) };
137
137
  }
138
138
 
139
139
  function writeReleaseCandidateStageCapsules({
@@ -188,12 +188,12 @@ export function resolveLegacyConsumerPolicyReceipt(options = {}) {
188
188
  if (!/^[0-9a-f]{40}$/u.test(options.runtimeRef || "") || options.runtimeRef !== options.runtimeSha || options.sourceTreeHash !== options.runtimeTreeHash()) return undefined;
189
189
  const root = path.resolve(options.root || ".buildchain/runtime");
190
190
  const alphaLock = readJsonFile(path.join(root, ".buildchain/alpha-contract-lock.json"));
191
- const result = scanV4FloatingConsumerPolicy({
191
+ const result = scanFloatingConsumerPolicy({
192
192
  root, repository: options.repository, sourceSha: options.sourceSha,
193
193
  invokedWorkflow: options.invokedWorkflow || ".github/workflows/build.yml", invocationSourcePath: options.invocationSourcePath,
194
194
  expectedInvocationChannel: "alpha", resolvedWorkflowSha: alphaLock.buildchain?.resolvedSha,
195
- resolvedRuntimeSha: options.runtimeSha, scannerRoot: v4ConsumerPolicyScannerRoot(),
196
- policy: readJsonFile(path.resolve(import.meta.dirname, "../architecture/v4-floating-consumer-policy.json")),
195
+ resolvedRuntimeSha: options.runtimeSha, scannerRoot: consumerPolicyScannerRoot(),
196
+ policy: readJsonFile(path.resolve(import.meta.dirname, "../architecture/floating-consumer-policy.json")),
197
197
  });
198
198
  if (!result.ok) throw new Error(`legacy floating-shell policy receipt invalid: ${result.failures.map(({ code }) => code).join(", ")}`);
199
199
  return { receipt: result.receipt, receiptRoot: result.receiptRoot };
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+ import { readWorkflowTaxonomy, workflowPath } from "./workflow-taxonomy.mjs";
2
3
  import fs from "node:fs";
3
4
  import path from "node:path";
4
5
  import crypto from "node:crypto";
@@ -50,31 +51,31 @@ const DEV_DELIVERY_AUTHORITY_SCHEMA =
50
51
  "schemas/dev-delivery-authority-v2.schema.json";
51
52
  const DEV_DELIVERY_AUTHORITY_SCHEMA_SOURCE =
52
53
  "contracts/dev-delivery-authority-v2.schema.json";
53
- const V4_COMPATIBILITY_FACTS_SCHEMA =
54
+ const COMPATIBILITY_FACTS_SCHEMA =
54
55
  "schemas/v4-compatibility-facts-v1.schema.json";
55
- const V4_COMPATIBILITY_FACTS_SCHEMA_SOURCE =
56
+ const COMPATIBILITY_FACTS_SCHEMA_SOURCE =
56
57
  "contracts/v4-compatibility-facts-v1.schema.json";
57
- const V4_PUBLICATION_REHEARSAL_SCHEMA =
58
+ const PUBLICATION_REHEARSAL_SCHEMA =
58
59
  "schemas/v4-publication-rehearsal-capsule-v1.schema.json";
59
- const V4_PUBLICATION_REHEARSAL_SCHEMA_SOURCE =
60
+ const PUBLICATION_REHEARSAL_SCHEMA_SOURCE =
60
61
  "contracts/v4-publication-rehearsal-capsule-v1.schema.json";
61
- const V4_ADOPTER_DELIVERY_SCHEMA =
62
+ const ADOPTER_DELIVERY_SCHEMA =
62
63
  "schemas/v4-adopter-delivery-v1.schema.json";
63
- const V4_ADOPTER_DELIVERY_SCHEMA_SOURCE =
64
+ const ADOPTER_DELIVERY_SCHEMA_SOURCE =
64
65
  "contracts/v4-adopter-delivery-v1.schema.json";
65
66
  const RELEASE_TAIL_CAPABILITIES_SCHEMA =
66
67
  "schemas/release-tail-capabilities-v1.schema.json";
67
68
  const RELEASE_TAIL_CAPABILITIES_SCHEMA_SOURCE =
68
69
  "contracts/release-tail-capabilities-v1.schema.json";
69
- const V4_PUBLICATION_QUALIFICATION_SCHEMA =
70
+ const PUBLICATION_QUALIFICATION_SCHEMA =
70
71
  "schemas/v4-publication-qualification-v1.schema.json";
71
- const V4_PUBLICATION_QUALIFICATION_SCHEMA_SOURCE =
72
+ const PUBLICATION_QUALIFICATION_SCHEMA_SOURCE =
72
73
  "contracts/v4-publication-qualification-v1.schema.json";
73
74
  const PUBLICATION_REHEARSAL_SITE_SCHEMAS = [
74
- V4_PUBLICATION_REHEARSAL_SCHEMA,
75
- V4_ADOPTER_DELIVERY_SCHEMA,
75
+ PUBLICATION_REHEARSAL_SCHEMA,
76
+ ADOPTER_DELIVERY_SCHEMA,
76
77
  RELEASE_TAIL_CAPABILITIES_SCHEMA,
77
- V4_PUBLICATION_QUALIFICATION_SCHEMA,
78
+ PUBLICATION_QUALIFICATION_SCHEMA,
78
79
  ];
79
80
  const root = path.resolve(import.meta.dirname, "..");
80
81
  const outputDir = path.join(root, "dist", "site");
@@ -105,10 +106,10 @@ function stableJson(value) {
105
106
 
106
107
  function siteFileBytes(name, value) {
107
108
  if (name === DEV_DELIVERY_AUTHORITY_SCHEMA) return readText(DEV_DELIVERY_AUTHORITY_SCHEMA_SOURCE);
108
- if (name === V4_COMPATIBILITY_FACTS_SCHEMA) return readText(V4_COMPATIBILITY_FACTS_SCHEMA_SOURCE);
109
- if (name === V4_PUBLICATION_REHEARSAL_SCHEMA) return readText(V4_PUBLICATION_REHEARSAL_SCHEMA_SOURCE);
110
- if (name === V4_PUBLICATION_QUALIFICATION_SCHEMA) return readText(V4_PUBLICATION_QUALIFICATION_SCHEMA_SOURCE);
111
- if (name === V4_ADOPTER_DELIVERY_SCHEMA) return readText(V4_ADOPTER_DELIVERY_SCHEMA_SOURCE);
109
+ if (name === COMPATIBILITY_FACTS_SCHEMA) return readText(COMPATIBILITY_FACTS_SCHEMA_SOURCE);
110
+ if (name === PUBLICATION_REHEARSAL_SCHEMA) return readText(PUBLICATION_REHEARSAL_SCHEMA_SOURCE);
111
+ if (name === PUBLICATION_QUALIFICATION_SCHEMA) return readText(PUBLICATION_QUALIFICATION_SCHEMA_SOURCE);
112
+ if (name === ADOPTER_DELIVERY_SCHEMA) return readText(ADOPTER_DELIVERY_SCHEMA_SOURCE);
112
113
  if (name === RELEASE_TAIL_CAPABILITIES_SCHEMA) return readText(RELEASE_TAIL_CAPABILITIES_SCHEMA_SOURCE);
113
114
  return stableJson(value);
114
115
  }
@@ -755,9 +756,7 @@ function buildSiteBundle() {
755
756
  timestampFieldsParticipateInArtifactDigest: true,
756
757
  artifactDigestScope: "npm package dist/site JSON files",
757
758
  });
758
-
759
759
  const cliRegistry = createCliRegistry(packageJson);
760
-
761
760
  const manualRegistry = {
762
761
  schemaVersion: 1,
763
762
  contract: "kungfu-buildchain-agent-manual-registry",
@@ -805,7 +804,6 @@ function buildSiteBundle() {
805
804
  ],
806
805
  guidance: "Agent consumers should use this registry to find packaged Buildchain manuals before inferring behavior from workflow snippets or release notes.",
807
806
  };
808
-
809
807
  const pageRegistry = {
810
808
  schemaVersion: 1,
811
809
  contract: "kungfu-buildchain-site-page-registry",
@@ -821,14 +819,15 @@ function buildSiteBundle() {
821
819
  capabilityGroups: CAPABILITY_GROUPS.map((group) => group.id),
822
820
  pages,
823
821
  };
824
-
825
822
  const nodeApiRegistry = createSiteNodeApiRegistry({ root, packageJson, nodeApiMeta, sha256File, publicSurfaceLifecycle });
826
-
823
+ const taxonomy = readWorkflowTaxonomy(root);
827
824
  const workflowRegistry = {
828
825
  schemaVersion: 1,
829
826
  contract: "kungfu-buildchain-workflow-registry",
830
827
  workflowSource: ".github/workflows reverse input enumeration",
831
828
  workflows: enumerateWorkflowInputs({ root }).map((entry) => {
829
+ const classification = taxonomy?.entries.find((item) => workflowPath(item) === entry.path || item.compatibility?.path === entry.path);
830
+ const semanticId = classification?.id || entry.id;
832
831
  const surfaceById = new Map([
833
832
  ["build", "channel-build-router"],
834
833
  [".build", "reusable-build"],
@@ -878,18 +877,19 @@ function buildSiteBundle() {
878
877
  ["engineering-housekeeper-monthly", "preview"],
879
878
  ["self-hosted-runner-smoke", "compatibility-fixture"],
880
879
  ]);
881
- const engineeringHousekeeper = entry.id.startsWith("engineering-housekeeper");
880
+ const engineeringHousekeeper = semanticId.startsWith("engineering-housekeeper");
882
881
  return {
883
882
  ...entry,
884
- surface: surfaceById.get(entry.id) || (entry.path.includes("/.") ? "reusable-workflow" : "repository-workflow"),
883
+ ...(classification ? { taxonomy: { id: classification.id, role: classification.role, category: classification.category, purpose: classification.purpose, status: classification.status, canonicalPath: workflowPath(classification), ...(classification.role === "self" && classification.migration ? { contractPath: classification.migration.previousPath } : {}), compatibilityAlias: entry.path !== workflowPath(classification) } } : {}),
884
+ surface: surfaceById.get(semanticId) || (entry.path.includes("/.") ? "reusable-workflow" : "repository-workflow"),
885
885
  capabilityGroup: workflowCapabilityGroup({
886
- ...entry,
887
- status: statusById.get(entry.id) || "active",
886
+ ...entry, id: semanticId,
887
+ status: statusById.get(semanticId) || "active",
888
888
  }),
889
- status: statusById.get(entry.id) || "active",
889
+ status: statusById.get(semanticId) || "active",
890
890
  ...publicSurfaceLifecycle({
891
891
  owner: "buildchain-workflows",
892
- maturity: statusById.get(entry.id) || "active",
892
+ maturity: statusById.get(semanticId) || "active",
893
893
  introducedVersion: engineeringHousekeeper ? packageJson.version : undefined,
894
894
  nonDuplicationRationale: engineeringHousekeeper
895
895
  ? "One reusable policy and evidence boundary owns Engineering Housekeeper execution; scheduled callers contain cadence values only."
@@ -1331,8 +1331,8 @@ function buildSiteBundle() {
1331
1331
  [DEV_DELIVERY_AUTHORITY_SCHEMA]: readJson(
1332
1332
  DEV_DELIVERY_AUTHORITY_SCHEMA_SOURCE,
1333
1333
  ),
1334
- [V4_COMPATIBILITY_FACTS_SCHEMA]: readJson(
1335
- V4_COMPATIBILITY_FACTS_SCHEMA_SOURCE,
1334
+ [COMPATIBILITY_FACTS_SCHEMA]: readJson(
1335
+ COMPATIBILITY_FACTS_SCHEMA_SOURCE,
1336
1336
  ),
1337
1337
  ...Object.fromEntries(
1338
1338
  PUBLICATION_REHEARSAL_SITE_SCHEMAS.map((name) => [