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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/AGENTS.md +39 -0
  2. package/README.md +17 -13
  3. package/actions/promote-buildchain-ref/README.md +0 -10
  4. package/actions/release-tail/README.md +6 -10
  5. package/architecture/internal-capabilities.json +502 -0
  6. package/architecture/maintainability-baseline.json +59 -0
  7. package/architecture/maintainability-policy.json +1384 -0
  8. package/architecture/release-tail-contract-inventory.json +587 -0
  9. package/architecture/v3-core-mechanism-inventory.json +1043 -0
  10. package/architecture/v3-core-mechanism-inventory.md +67 -0
  11. package/architecture/v4-adopter-delivery-parity.json +47 -0
  12. package/architecture/v4-architecture-constitution.md +210 -0
  13. package/architecture/v4-bootstrap-authority.json +56 -0
  14. package/architecture/v4-canonical-contract-fixtures.json +105 -0
  15. package/architecture/v4-capability-state-machine-manifest.json +480 -0
  16. package/architecture/v4-capability-state-machine-manifest.schema.json +202 -0
  17. package/architecture/v4-delivery-warrant-shadow-bootstrap-plan.json +830 -0
  18. package/architecture/v4-delivery-warrant-shadow-bootstrap-plan.md +223 -0
  19. package/architecture/v4-delivery-warrant-shadow-bootstrap-plan.schema.json +318 -0
  20. package/architecture/v4-delivery-warrant-shadow-fixtures.json +227 -0
  21. package/architecture/v4-delivery-warrant-shadow-fixtures.schema.json +67 -0
  22. package/architecture/v4-exception-ledger.json +5 -0
  23. package/architecture/v4-exception-ledger.schema.json +56 -0
  24. package/architecture/v4-partial-mutation-recovery-qualification.json +65 -0
  25. package/architecture/v4-platform-stage-checkpoints.json +97 -0
  26. package/architecture/v4-provider-operation-journal-contract.json +113 -0
  27. package/architecture/v4-release-activation-shadow-domain.json +61 -0
  28. package/architecture/v4-release-train-parity.json +68 -0
  29. package/architecture/v4-rust-libnode-bridge-evaluation.json +107 -0
  30. package/architecture/v4-rust-libnode-bridge-spike.md +85 -0
  31. package/architecture/v4-stable-publication-fence.json +66 -0
  32. package/architecture/v4-stage-capsule-contract.json +90 -0
  33. package/architecture/v4-stage-capsule-qualification.json +99 -0
  34. package/architecture/v4-stage-capsule-resume-planner.json +52 -0
  35. package/architecture/v4-stage-capsule-store-contract.json +72 -0
  36. package/bin/buildchain.mjs +15 -6
  37. package/contracts/auditable-demo-scenario-v1.schema.json +1 -1
  38. package/contracts/buildchain-v2-residuals-v1.json +2 -2
  39. package/contracts/fixtures/v4-delivery-warrant-trace-v1/golden.json +158 -0
  40. package/contracts/fixtures/v4-delivery-warrant-trace-v1/property.json +380 -0
  41. package/contracts/fixtures/v4-delivery-warrant-trace-v1/replay.json +163 -0
  42. package/contracts/fixtures/v4-partial-mutation-recovery-v1/shared.json +155 -0
  43. package/contracts/fixtures/v4-provider-operation-journal-v1/shared.json +457 -0
  44. package/contracts/fixtures/v4-provider-readback-idempotency-v1/shared.json +682 -0
  45. package/contracts/fixtures/v4-release-activation-shadow-v1/shared.json +53 -0
  46. package/contracts/fixtures/v4-stable-publication-fence-v1/shared.json +56 -0
  47. package/contracts/fixtures/v4-stage-capsule-resume-v1/late-platform-failure.json +176 -0
  48. package/contracts/fixtures/v4-stage-capsule-store-v1/shared.json +132 -0
  49. package/contracts/fixtures/v4-stage-capsule-v1/shared.json +111 -0
  50. package/contracts/v4-canonical-contracts-v1.schema.json +182 -0
  51. package/contracts/v4-delivery-warrant-semantic-diff-report-v1.schema.json +284 -0
  52. package/contracts/v4-delivery-warrant-trace-v1.schema.json +215 -0
  53. package/contracts/v4-host-contract-v1.schema.json +135 -0
  54. package/contracts/v4-partial-mutation-recovery-v1.schema.json +168 -0
  55. package/contracts/v4-provider-operation-journal-v1.schema.json +381 -0
  56. package/contracts/v4-release-activation-shadow-v1.schema.json +186 -0
  57. package/contracts/v4-stable-publication-fence-v1.schema.json +125 -0
  58. package/contracts/v4-stage-capsule-resume-v1.schema.json +225 -0
  59. package/contracts/v4-stage-capsule-store-v1.schema.json +154 -0
  60. package/contracts/v4-stage-capsule-v1.schema.json +178 -0
  61. package/crates/buildchain-v4-bridge/Cargo.lock +213 -0
  62. package/crates/buildchain-v4-bridge/Cargo.toml +12 -0
  63. package/crates/buildchain-v4-bridge/src/main.rs +495 -0
  64. package/dist/site/agent-index.json +0 -3
  65. package/dist/site/artifact-schemas.json +0 -6
  66. package/dist/site/buildchain-contract.json +103 -397
  67. package/dist/site/buildchain-site.json +302 -270
  68. package/dist/site/capability-registry.json +9 -11
  69. package/dist/site/cli-registry.json +8 -30
  70. package/dist/site/controller-registry.json +48 -8
  71. package/dist/site/kfd-claims.json +129 -142
  72. package/dist/site/kfd-upstream-aggregate.json +9 -9
  73. package/dist/site/manual-registry.json +18 -49
  74. package/dist/site/node-api-registry.json +1882 -4118
  75. package/dist/site/page-registry.json +278 -230
  76. package/dist/site/public-surface-audit.json +87 -185
  77. package/dist/site/publication-authority-registry.json +11 -1
  78. package/dist/site/publication-registry.json +4 -4
  79. package/dist/site/release-provenance.json +3 -7
  80. package/dist/site/schemas/kfd-support-projection-v1.schema.json +106 -0
  81. package/dist/site/site-manifest.json +22 -38
  82. package/dist/site/workflow-registry.json +80 -35
  83. package/docs/MAP.md +8 -4
  84. package/docs/auditable-demo.md +2 -2
  85. package/docs/aws-us-elastic-runner-burst-plane.md +7 -59
  86. package/docs/cli-reference.md +15 -92
  87. package/docs/cli.md +14 -14
  88. package/docs/dev-alpha-candidate-patrol.md +3 -11
  89. package/docs/dev-delivery-warrant.md +28 -100
  90. package/docs/engineering-housekeeper.md +12 -4
  91. package/docs/getting-started.md +1 -1
  92. package/docs/install.md +5 -5
  93. package/docs/kfd-support.md +2 -7
  94. package/docs/lifecycle-protocol.md +2 -4
  95. package/docs/node-api-reference.md +414 -523
  96. package/docs/release-flow.md +31 -31
  97. package/docs/release-governance.md +16 -28
  98. package/docs/release-passport.md +2 -15
  99. package/docs/release-tail-contract.md +13 -6
  100. package/docs/release-tail-provider-plane.md +13 -19
  101. package/docs/release-train.md +4 -4
  102. package/docs/reusable-build-surface.md +14 -27
  103. package/docs/site-bundle-contract.md +1 -5
  104. package/docs/stable-candidate-patrol.md +7 -7
  105. package/docs/v4-canonical-contracts.md +92 -0
  106. package/docs/v4-delivery-warrant-read-candidate.md +73 -0
  107. package/docs/v4-delivery-warrant-semantic-diff.md +75 -0
  108. package/docs/v4-production-release.md +63 -0
  109. package/docs/v4-stage-capsule.md +193 -0
  110. package/docs/versioning.md +3 -3
  111. package/package.json +19 -17
  112. package/packages/core/adopter-delivery-gate.js +576 -0
  113. package/packages/core/adopter-delivery-json.js +66 -0
  114. package/packages/core/artifact-signing.js +0 -61
  115. package/packages/core/artifact-verification-envelope.js +5 -5
  116. package/packages/core/build-facts.js +12 -4
  117. package/packages/core/buildchain-agent-manuals.js +0 -2
  118. package/packages/core/buildchain-config.js +4 -69
  119. package/packages/core/buildchain-contract.js +232 -46
  120. package/packages/core/buildchain-kfd-claims.js +1 -1
  121. package/packages/core/channel-candidate.js +0 -8
  122. package/packages/core/channel-promotion-baseline.js +0 -52
  123. package/packages/core/controller-evidence.js +3 -4
  124. package/packages/core/dev-alpha-candidate-selection.js +2 -10
  125. package/packages/core/dev-delivery-warrant-cancellation.js +0 -1
  126. package/packages/core/dev-delivery-warrant-settlement.js +1 -5
  127. package/packages/core/dev-delivery-warrant.js +12 -52
  128. package/packages/core/diagnostics.js +3 -8
  129. package/packages/core/github-governance-authority.js +3 -1
  130. package/packages/core/kfd-adopter-category-driver.js +167 -0
  131. package/packages/core/kfd-adopter-manifest.js +47 -46
  132. package/packages/core/kfd-gate.js +15 -45
  133. package/packages/core/paper-agent-entry.js +7 -16
  134. package/packages/core/paper-fleet.js +2 -2
  135. package/packages/core/paper-repository.js +2 -3
  136. package/packages/core/paper-scaffold-content.js +2 -23
  137. package/packages/core/paper.js +11 -43
  138. package/packages/core/publication-reproducibility.js +4 -4
  139. package/packages/core/release-line-bootstrap.js +21 -8
  140. package/packages/core/release-passport-contract.js +5 -5
  141. package/packages/core/release-passport.js +20 -131
  142. package/packages/core/self-dogfood-version.js +48 -35
  143. package/packages/core/spawn-command.js +232 -8
  144. package/packages/core/v4-adopter-delivery-parity.js +219 -0
  145. package/packages/core/v4-canonical-contracts.js +284 -0
  146. package/packages/core/v4-delivery-warrant-fixture-runner.js +371 -0
  147. package/packages/core/v4-delivery-warrant-read-candidate.js +279 -0
  148. package/packages/core/v4-delivery-warrant-semantic-diff-gate.js +352 -0
  149. package/packages/core/v4-delivery-warrant-shadow-adapter.js +447 -0
  150. package/packages/core/v4-partial-mutation-recovery-qualification.js +395 -0
  151. package/packages/core/v4-platform-stage-checkpoints.js +471 -0
  152. package/packages/core/v4-provider-operation-journal.js +531 -0
  153. package/packages/core/v4-provider-readback-idempotency.js +394 -0
  154. package/packages/core/v4-release-activation-shadow.js +519 -0
  155. package/packages/core/v4-stable-publication-fence.js +357 -0
  156. package/packages/core/v4-stage-capsule-local-store.js +426 -0
  157. package/packages/core/v4-stage-capsule-qualification-campaign.js +512 -0
  158. package/packages/core/v4-stage-capsule-qualification.js +456 -0
  159. package/packages/core/v4-stage-capsule-resume-planner.js +397 -0
  160. package/packages/core/v4-stage-capsule-store.js +401 -0
  161. package/packages/core/v4-stage-capsule.js +319 -0
  162. package/scripts/assemble-self-publication-admission.mjs +1 -1
  163. package/scripts/audit-publication-control-plane.mjs +5 -5
  164. package/scripts/auditable-demo-bundle-verification.mjs +3 -2
  165. package/scripts/auditable-demo-platform.mjs +2 -2
  166. package/scripts/auditable-demo-renditions.mjs +1 -1
  167. package/scripts/auditable-demo.mjs +2 -2
  168. package/scripts/aws-macos-jit-controller-core.mjs +13 -346
  169. package/scripts/aws-macos-jit-controller-runtime.mjs +2 -210
  170. package/scripts/aws-macos-jit-controller.mjs +37 -275
  171. package/scripts/aws-macos-jit-core.mjs +3 -41
  172. package/scripts/aws-macos-jit.mjs +0 -12
  173. package/scripts/aws-windows-jit-campaign.mjs +2 -2
  174. package/scripts/aws-windows-jit-controller-core.mjs +1 -1
  175. package/scripts/aws-windows-jit-controller.mjs +3 -3
  176. package/scripts/build-contract-core.mjs +3 -8
  177. package/scripts/build-standalone-binary.mjs +3 -14
  178. package/scripts/buildchain-channel-router.mjs +4 -0
  179. package/scripts/buildchain-cli-help.mjs +7 -13
  180. package/scripts/buildchain-contract-lock.mjs +0 -6
  181. package/scripts/check-action-bundles.mjs +3 -4
  182. package/scripts/check-internal-architecture.mjs +7 -6
  183. package/scripts/check-inventory.mjs +30 -25
  184. package/scripts/check-v4-public-dogfood-contract.mjs +270 -0
  185. package/scripts/create-release-bundle.mjs +8 -4
  186. package/scripts/dev-alpha-candidate-patrol.mjs +1 -22
  187. package/scripts/dev-delivery-proof.mjs +2 -54
  188. package/scripts/dev-delivery-warrant.mjs +59 -77
  189. package/scripts/dev-pr-auto-merge.mjs +4 -30
  190. package/scripts/dev-pr-delivery-warrant.mjs +0 -55
  191. package/scripts/dispatch-artifact-signing-authority.mjs +7 -4
  192. package/scripts/generate-buildchain-kfd-witnesses.mjs +94 -88
  193. package/scripts/generate-channel-build-workflow.mjs +54 -24
  194. package/scripts/generate-channel-promotion-workflow.mjs +15 -6
  195. package/scripts/generate-site-bundle.mjs +5 -21
  196. package/scripts/git-fetch-process-tree.mjs +34 -1
  197. package/scripts/init-repo.mjs +64 -159
  198. package/scripts/inspect-artifact-signing-requests.mjs +0 -6
  199. package/scripts/locked-source-checkout.mjs +3 -4
  200. package/scripts/maintainability-metrics.mjs +8 -2
  201. package/scripts/npm-publish-dry-run.mjs +2 -2
  202. package/scripts/npm-publish-transaction.mjs +2 -2
  203. package/scripts/publication-commit-evidence.mjs +23 -69
  204. package/scripts/release-candidate-resolver.mjs +11 -17
  205. package/scripts/release-tail.mjs +3 -49
  206. package/scripts/resume-from-candidate-run.mjs +9 -123
  207. package/scripts/run-lifecycle-core.mjs +12 -13
  208. package/scripts/seal-artifact-signing-requests.mjs +17 -21
  209. package/scripts/site-capability-metadata.mjs +2 -7
  210. package/scripts/stable-candidate-qualification.mjs +10 -10
  211. package/scripts/v4-architecture.mjs +12 -2
  212. package/scripts/v4-bridge-bootstrap.mjs +141 -0
  213. package/scripts/v4-bridge-evidence.mjs +141 -0
  214. package/scripts/v4-host-adapter.mjs +182 -0
  215. package/scripts/v4-platform-stage-checkpoint-rehearsal.mjs +207 -0
  216. package/scripts/v4-stage-capsule-qualification.mjs +528 -0
  217. package/scripts/v4-stage-capsule-resume-rehearsal.mjs +57 -0
  218. package/scripts/v4-warrant-shadow-plan.mjs +601 -0
  219. package/scripts/verify-golden-path.mjs +5 -5
  220. package/scripts/web-surface-cloudfront-rewrite.mjs +15 -15
  221. package/scripts/web-surface-core.mjs +2 -8
  222. package/scripts/workflow-call-contract.mjs +5 -184
  223. package/contracts/fixtures/kfd-adopter-release-v1/kfd-4-perspective.json +0 -16
  224. package/contracts/fixtures/kfd-adopter-release-v1/kfd-4-replay.json +0 -57
  225. package/contracts/fixtures/next-development-transition-v1/anchored-manual-waiting.json +0 -47
  226. package/contracts/fixtures/next-development-transition-v1/semver-auto-planned.json +0 -47
  227. package/contracts/fixtures/next-development-transition-v1/version-model-cases.json +0 -40
  228. package/contracts/next-development-request-v1.schema.json +0 -66
  229. package/contracts/next-development-transition-v1.schema.json +0 -292
  230. package/contracts/publication-rehearsal-capsule-v1.schema.json +0 -173
  231. package/dist/site/schemas/publication-rehearsal-capsule-v1.schema.json +0 -269
  232. package/dist/site/schemas/release-tail-capabilities-v1.schema.json +0 -353
  233. package/dist/site/schemas/release-tail-provider-bindings-v1.schema.json +0 -94
  234. package/docs/next-development-transition.md +0 -119
  235. package/docs/publication-rehearsal.md +0 -94
  236. package/packages/core/buildchain-compatibility-proof.js +0 -631
  237. package/packages/core/dev-delivery-native-proof.js +0 -333
  238. package/packages/core/dev-delivery-warrant-shadow.js +0 -502
  239. package/packages/core/next-development-candidate-reservation.js +0 -186
  240. package/packages/core/next-development-controller.js +0 -726
  241. package/packages/core/next-development-projection.js +0 -288
  242. package/packages/core/next-development-transition.js +0 -738
  243. package/packages/core/publication-rehearsal-projection.js +0 -173
  244. package/packages/core/publication-rehearsal-runtime.js +0 -921
  245. package/scripts/aws-macos-jit-instance-rehydrate.mjs +0 -260
  246. package/scripts/aws-macos-jit-source-rebind.mjs +0 -724
  247. package/scripts/dev-delivery-native-run.mjs +0 -187
  248. package/scripts/dev-delivery-two-phase.mjs +0 -598
  249. package/scripts/generate-next-development-guidance.mjs +0 -49
  250. package/scripts/materialize-self-release-candidate-version.mjs +0 -137
  251. package/scripts/next-development-self-dogfood-harness.mjs +0 -409
  252. package/scripts/next-development-self-dogfood.mjs +0 -532
  253. package/scripts/next-development-transition.mjs +0 -47
  254. package/scripts/release-candidate-tail-reseal.mjs +0 -426
  255. package/templates/native-dev-delivery.yml +0 -82
@@ -46,16 +46,6 @@ import {
46
46
  scaffoldReadme,
47
47
  } from "./paper-scaffold-content.js";
48
48
  import { executePaperNpmBootstrap as executePaperNpmBootstrapOperation } from "./paper-npm-bootstrap.js";
49
- import {
50
- appendPublicationRehearsalToml,
51
- projectPublicationRehearsalToml,
52
- publicationRehearsalWorkflow,
53
- } from "./publication-rehearsal-projection.js";
54
- import {
55
- appendNextDevelopmentToml,
56
- nextDevelopmentWorkflowHeader,
57
- projectNextDevelopmentToml,
58
- } from "./next-development-projection.js";
59
49
 
60
50
  export { PAPER_PATHS, resolvePaperRepository } from "./paper-repository.js";
61
51
  export {
@@ -124,7 +114,6 @@ const PAPER_SCAFFOLD_PATHS = Object.freeze([
124
114
  PAPER_PATHS.buildWorkflow,
125
115
  PAPER_PATHS.verifyWorkflow,
126
116
  PAPER_PATHS.releaseWorkflow,
127
- PAPER_PATHS.rehearsalWorkflow,
128
117
  PAPER_PATHS.pnpmWorkspace,
129
118
  PAPER_PATHS.provisioningAuthority,
130
119
  "Makefile",
@@ -361,7 +350,7 @@ immutable_base_url = ${tomlString(joinUrl(siteBaseUrl, "archive").replace(/\/$/,
361
350
  registry_path = ".buildchain/publication/publication-registry.json"
362
351
  `
363
352
  : "";
364
- return appendNextDevelopmentToml(appendPublicationRehearsalToml(`schema = 1
353
+ return `schema = 1
365
354
 
366
355
  [project]
367
356
  type = "publication-artifact"
@@ -395,14 +384,14 @@ command = "make pdf"
395
384
 
396
385
  [lifecycle.verify]
397
386
  command = "make check"
398
- `));
387
+ `;
399
388
  }
400
389
 
401
390
  function scaffoldBuildWorkflow(
402
391
  buildchainSha,
403
392
  { artifactName = "paper-publication" } = {},
404
393
  ) {
405
- return `${nextDevelopmentWorkflowHeader()}name: Build
394
+ return `name: Build
406
395
 
407
396
  on:
408
397
  workflow_dispatch:
@@ -430,7 +419,7 @@ jobs:
430
419
  }
431
420
 
432
421
  function scaffoldVerifyWorkflow(buildchainSha) {
433
- return `${nextDevelopmentWorkflowHeader()}name: Verify
422
+ return `name: Verify
434
423
 
435
424
  on:
436
425
  pull_request:
@@ -461,7 +450,7 @@ function scaffoldReleaseWorkflow(
461
450
  const passportInput = releasePassportProductName
462
451
  ? ` release-passport-product-name: ${JSON.stringify(releasePassportProductName)}\n`
463
452
  : "";
464
- return `${nextDevelopmentWorkflowHeader()}name: Paper Release
453
+ return `name: Paper Release
465
454
 
466
455
  on:
467
456
  workflow_dispatch:
@@ -536,7 +525,6 @@ export function createPaperProvisioningAuthority({
536
525
  buildWorkflow,
537
526
  verifyWorkflow,
538
527
  releaseWorkflow,
539
- rehearsalWorkflow,
540
528
  agentEntry,
541
529
  agentInstructions,
542
530
  environment = "",
@@ -576,12 +564,6 @@ export function createPaperProvisioningAuthority({
576
564
  reusablePath: ".github/workflows/paper-release-sealed.yml",
577
565
  reusableRef: buildchainSha,
578
566
  },
579
- rehearsal: {
580
- path: PAPER_PATHS.rehearsalWorkflow,
581
- sourceDigest: sha256Text(rehearsalWorkflow),
582
- reusablePath: ".github/workflows/release-tail.yml",
583
- reusableRef: buildchainSha,
584
- },
585
567
  },
586
568
  agentEntry: {
587
569
  contract: PAPER_AGENT_ENTRY_CONTRACT,
@@ -648,7 +630,6 @@ function scaffoldFiles({
648
630
  releasePassportProductName: title,
649
631
  });
650
632
  const verifyWorkflow = scaffoldVerifyWorkflow(buildchainSha);
651
- const rehearsalWorkflow = publicationRehearsalWorkflow(buildchainSha);
652
633
  const agentEntry = paperAgentEntryFiles({
653
634
  cwd,
654
635
  buildchainVersion,
@@ -666,7 +647,6 @@ function scaffoldFiles({
666
647
  buildWorkflow,
667
648
  verifyWorkflow,
668
649
  releaseWorkflow,
669
- rehearsalWorkflow,
670
650
  agentEntry: agentEntry.get(PAPER_PATHS.agentEntry),
671
651
  agentInstructions: agentEntry.get(PAPER_PATHS.agentInstructions),
672
652
  });
@@ -687,7 +667,6 @@ function scaffoldFiles({
687
667
  [PAPER_PATHS.buildWorkflow, buildWorkflow],
688
668
  [PAPER_PATHS.verifyWorkflow, verifyWorkflow],
689
669
  [PAPER_PATHS.releaseWorkflow, releaseWorkflow],
690
- [PAPER_PATHS.rehearsalWorkflow, rehearsalWorkflow],
691
670
  [PAPER_PATHS.pnpmWorkspace, paperPnpmWorkspace("", buildchainVersion)],
692
671
  [PAPER_PATHS.provisioningAuthority, jsonText(provisioningAuthority)],
693
672
  ...agentEntry,
@@ -985,7 +964,6 @@ function migrationFiles({
985
964
  releasePassportProductName: config.publication.title,
986
965
  });
987
966
  const verifyWorkflow = scaffoldVerifyWorkflow(runtimeSha);
988
- const rehearsalWorkflow = publicationRehearsalWorkflow(runtimeSha);
989
967
  const agentEntry = paperAgentEntryFiles({
990
968
  cwd,
991
969
  buildchainVersion: runtimeIdentity.version,
@@ -1000,7 +978,6 @@ function migrationFiles({
1000
978
  buildWorkflow,
1001
979
  verifyWorkflow,
1002
980
  releaseWorkflow,
1003
- rehearsalWorkflow,
1004
981
  agentEntry: agentEntry.get(PAPER_PATHS.agentEntry),
1005
982
  agentInstructions: agentEntry.get(PAPER_PATHS.agentInstructions),
1006
983
  });
@@ -1020,20 +997,11 @@ function migrationFiles({
1020
997
  runtimeIdentity.version,
1021
998
  );
1022
999
  const files = new Map([
1023
- [
1024
- PAPER_PATHS.config,
1025
- projectNextDevelopmentToml(
1026
- projectPublicationRehearsalToml(
1027
- fs.readFileSync(path.resolve(cwd, PAPER_PATHS.config), "utf8"),
1028
- ),
1029
- ),
1030
- ],
1031
1000
  [PAPER_PATHS.contractLock, contractLockText],
1032
1001
  [PAPER_PATHS.versionPin, `${runtimeIdentity.version}\n`],
1033
1002
  [PAPER_PATHS.buildWorkflow, buildWorkflow],
1034
1003
  [PAPER_PATHS.verifyWorkflow, verifyWorkflow],
1035
1004
  [PAPER_PATHS.releaseWorkflow, releaseWorkflow],
1036
- [PAPER_PATHS.rehearsalWorkflow, rehearsalWorkflow],
1037
1005
  [PAPER_PATHS.pnpmWorkspace, pnpmWorkspace],
1038
1006
  [PAPER_PATHS.provisioningAuthority, jsonText(provisioningAuthority)],
1039
1007
  ...agentEntry,
@@ -1053,10 +1021,11 @@ export function planPaperMigration({
1053
1021
  "rev-parse",
1054
1022
  "--show-toplevel",
1055
1023
  ]);
1056
- if (
1057
- !repositoryRoot ||
1058
- fs.realpathSync(repositoryRoot) !== fs.realpathSync(resolvedCwd)
1059
- ) {
1024
+ const repositoryPrefix = gitValue(resolvedCwd, [
1025
+ "rev-parse",
1026
+ "--show-prefix",
1027
+ ]).replace(/\/+$/u, "");
1028
+ if (!repositoryRoot || repositoryPrefix) {
1060
1029
  throw new Error("paper migration must target the exact repository root");
1061
1030
  }
1062
1031
  const source = {
@@ -1147,7 +1116,7 @@ export function planPaperMigration({
1147
1116
  id: "refresh-pnpm-lock",
1148
1117
  command: "pnpm install --lockfile-only",
1149
1118
  description:
1150
- "Bind the exact Buildchain v3 dependency into pnpm-lock.yaml after the reviewed package update.",
1119
+ "Bind the exact Buildchain semantic dependency into pnpm-lock.yaml after the reviewed package update.",
1151
1120
  },
1152
1121
  ],
1153
1122
  };
@@ -1787,7 +1756,6 @@ function validatePaperProvisioningAuthority(cwd) {
1787
1756
  value.workflows?.build,
1788
1757
  value.workflows?.verify,
1789
1758
  value.workflows?.release,
1790
- value.workflows?.rehearsal,
1791
1759
  ]) {
1792
1760
  if (!workflow?.path || !workflow?.sourceDigest) {
1793
1761
  errors.push("paper workflow authority is incomplete");
@@ -1,5 +1,4 @@
1
1
  import crypto from "node:crypto";
2
- import { spawnSync } from "node:child_process";
3
2
  import fs from "node:fs";
4
3
  import os from "node:os";
5
4
  import path from "node:path";
@@ -8,6 +7,7 @@ import zlib from "node:zlib";
8
7
  import { loadBuildchainConfig } from "./buildchain-config.js";
9
8
  import { writePublicationArtifact } from "./publication-artifact.js";
10
9
  import { preparePublicationNpmPackage } from "./publication-package.js";
10
+ import { spawnSyncCommand } from "./spawn-command.js";
11
11
 
12
12
  export const PUBLICATION_REPRODUCIBILITY_RECEIPT_CONTRACT =
13
13
  "kungfu-buildchain-publication-reproducibility-receipt";
@@ -62,7 +62,7 @@ function run(
62
62
  args,
63
63
  { cwd, env = process.env, label = [command, ...args].join(" ") } = {},
64
64
  ) {
65
- const result = spawnSync(command, args, {
65
+ const result = spawnSyncCommand(command, args, {
66
66
  cwd,
67
67
  env,
68
68
  encoding: "utf8",
@@ -286,8 +286,8 @@ function sourceFacts(cwd, requestedSha = "") {
286
286
  const repositoryRoot = fs.realpathSync(
287
287
  git(canonicalCwd, ["rev-parse", "--show-toplevel"]),
288
288
  );
289
- const projectPath =
290
- toPosix(path.relative(repositoryRoot, canonicalCwd)) || ".";
289
+ const projectPath = toPosix(git(canonicalCwd, ["rev-parse", "--show-prefix"]))
290
+ .replace(/\/+$/u, "") || ".";
291
291
  const head = git(repositoryRoot, ["rev-parse", "HEAD"]);
292
292
  const sha = git(repositoryRoot, [
293
293
  "rev-parse",
@@ -65,6 +65,26 @@ function writeJson(value) {
65
65
  return `${JSON.stringify(value, null, 2)}\n`;
66
66
  }
67
67
 
68
+ function relineBuildchainSummary(value, line) {
69
+ return String(value || "").replace(/^Buildchain v\d+\.\d+(?=\s)/u, `Buildchain ${line}`);
70
+ }
71
+
72
+ function updateReleaseImpactForLine(current, plan) {
73
+ return {
74
+ ...current,
75
+ release: {
76
+ ...(current.release && typeof current.release === "object" ? current.release : {}),
77
+ version: plan.initialVersion,
78
+ line: plan.line,
79
+ },
80
+ versionImpact: {
81
+ ...(current.versionImpact && typeof current.versionImpact === "object" ? current.versionImpact : {}),
82
+ rationale: relineBuildchainSummary(current.versionImpact?.rationale, plan.line),
83
+ },
84
+ summary: relineBuildchainSummary(current.summary, plan.line),
85
+ };
86
+ }
87
+
68
88
  function updateReleaseImpactVersionState(cwd, plan) {
69
89
  const filePath = path.join(cwd, ".buildchain", "release-impact.json");
70
90
  if (!fs.existsSync(filePath)) {
@@ -74,14 +94,7 @@ function updateReleaseImpactVersionState(cwd, plan) {
74
94
  if (!current || typeof current !== "object" || Array.isArray(current)) {
75
95
  throw new Error(".buildchain/release-impact.json must be a JSON object");
76
96
  }
77
- const next = {
78
- ...current,
79
- release: {
80
- ...(current.release && typeof current.release === "object" ? current.release : {}),
81
- version: plan.initialVersion,
82
- line: plan.line,
83
- },
84
- };
97
+ const next = updateReleaseImpactForLine(current, plan);
85
98
  const content = writeJson(next);
86
99
  if (content !== writeJson(current)) {
87
100
  fs.writeFileSync(filePath, content);
@@ -405,7 +405,7 @@ export function prepareReleasePassportKfdSections({ kfd1, kfd2Claims, kfd3, kfdA
405
405
  };
406
406
  }
407
407
 
408
- export function collectKfdAdopterReleaseEvidence({ manifest, gateResults = [], comparisonMatrix, expectedAdopterId = "kungfu-systems/buildchain", expectedSourceRepository = "", sourceSha = "", checkedAt } = {}) {
408
+ export function collectKfdAdopterReleaseEvidence({ manifest, gateResults = [], comparisonMatrix, sourceSha = "", checkedAt } = {}) {
409
409
  if (!manifest) {
410
410
  if (comparisonMatrix || gateResults.length > 0) {
411
411
  throw new Error("KFD support and product-gate inputs require --kfd-adopter-manifest-json; --kfd-support-matrix-json is comparison-only");
@@ -414,7 +414,7 @@ export function collectKfdAdopterReleaseEvidence({ manifest, gateResults = [], c
414
414
  }
415
415
  const manifestGate = createKfdAdopterManifestGate({
416
416
  manifest, packageArtifactRoot: installedKfdPackageArtifactRoot(), gateResults,
417
- authorityPath: "kfd-adopter-manifest.json", expectedAdopterId, expectedSourceRepository, expectedSourceSha: sourceSha, checkedAt,
417
+ expectedSourceSha: sourceSha, checkedAt,
418
418
  });
419
419
  const legacyProjection = createKfdLegacySupportMatrixProjection({ manifest, manifestGate });
420
420
  if (comparisonMatrix) {
@@ -425,18 +425,18 @@ export function collectKfdAdopterReleaseEvidence({ manifest, gateResults = [], c
425
425
  }
426
426
  return {
427
427
  manifest, manifestGate, legacyProjection,
428
- binding: createKfdAdopterReleaseBinding({ manifest, manifestGate, legacyProjection, expectedAdopterId, expectedSourceRepository, expectedSourceSha: sourceSha }),
428
+ binding: createKfdAdopterReleaseBinding({ manifest, manifestGate, legacyProjection, expectedSourceSha: sourceSha }),
429
429
  };
430
430
  }
431
431
 
432
- export function validateKfdAdopterReleaseEvidence({ binding, artifactBinding, manifest, manifestGate, legacyProjection, passportLegacyProjection, expectedAdopterId = "kungfu-systems/buildchain", expectedSourceRepository = "", expectedSourceSha = "" } = {}) {
432
+ export function validateKfdAdopterReleaseEvidence({ binding, artifactBinding, manifest, manifestGate, legacyProjection, passportLegacyProjection, expectedSourceSha = "" } = {}) {
433
433
  if (!binding) {
434
434
  return passportLegacyProjection
435
435
  ? [{ code: "kfdSupport.authority", message: "legacy KFD support projection requires the standard adopter manifest binding" }]
436
436
  : [];
437
437
  }
438
438
  const issues = validateKfdAdopterReleaseBinding(binding, {
439
- manifest, manifestGate, legacyProjection, expectedAdopterId, expectedSourceRepository, expectedSourceSha,
439
+ manifest, manifestGate, legacyProjection, expectedSourceSha,
440
440
  }).issues.map((entry) => ({ code: `kfdAdopter.${entry.path || entry.code}`, message: entry.message, details: entry }));
441
441
  if (!artifactBinding || passportStableJson(artifactBinding) !== passportStableJson(binding)) {
442
442
  issues.push({ code: "kfdAdopter.artifactEvidence", message: "release passport and artifact evidence must bind the same exact KFD adopter closure" });
@@ -154,15 +154,6 @@ function invariantSemanticPreimage(passport) {
154
154
  return value;
155
155
  }
156
156
 
157
- function hasCompleteInvariantCoverage(value) {
158
- const coverage = value?.coverage;
159
- return Number.isInteger(coverage?.required)
160
- && coverage.required > 0
161
- && coverage.verified === coverage.required
162
- && [coverage.missing, coverage.falsified, coverage.unqualified]
163
- .every((items) => Array.isArray(items) && items.length === 0);
164
- }
165
-
166
157
  function normalizeInvariantPassport(meta, index = 0) {
167
158
  const value = meta?.value;
168
159
  const label = `invariantPassportJsons[${index}]`;
@@ -182,18 +173,11 @@ function normalizeInvariantPassport(meta, index = 0) {
182
173
  if (value.passportRoot !== expectedRoot) {
183
174
  throw new Error(`${label}.passportRoot mismatch: expected ${expectedRoot}, got ${value.passportRoot}`);
184
175
  }
185
- const verifiedPassport = value.verdict === "verified" && value.coverage?.complete === true;
186
- const scopedUnqualifiedClaim = value.verdict === "unqualified"
187
- && value.coverage?.complete === false
188
- && hasCompleteInvariantCoverage(value)
189
- && value.releaseClaims?.verdict === "unqualified"
190
- && /^sha256:[0-9a-f]{64}$/.test(optionalString(value.releaseClaims?.claimRoot))
191
- && Array.isArray(value.releaseClaims?.diagnostics)
192
- && value.releaseClaims.diagnostics.length > 0
193
- && Array.isArray(value.diagnostics)
194
- && value.diagnostics.length === 0;
195
- if (!verifiedPassport && !scopedUnqualifiedClaim) {
196
- throw new Error(`${label}.verdict must be verified, or unqualified only for complete invariant coverage with one explicit unqualified releaseClaims section`);
176
+ if (value.verdict !== "verified") {
177
+ throw new Error(`${label}.verdict must be verified, got ${value.verdict}`);
178
+ }
179
+ if (value.coverage?.complete !== true) {
180
+ throw new Error(`${label}.coverage.complete must be true`);
197
181
  }
198
182
  if (value.source?.dirty !== false) {
199
183
  throw new Error(`${label}.source.dirty must be false`);
@@ -206,9 +190,6 @@ function normalizeInvariantPassport(meta, index = 0) {
206
190
  : [];
207
191
  if (platforms.length === 0) throw new Error(`${label}.coverage.platforms must be non-empty`);
208
192
  if (!Array.isArray(value.residualRisk)) throw new Error(`${label}.residualRisk must be an array`);
209
- const releaseClaimRisks = scopedUnqualifiedClaim
210
- ? value.releaseClaims.diagnostics.map((entry) => `Exit/provider claim ${optionalString(entry?.code) || "unqualified"}: ${optionalString(entry?.message) || "consumer claim remains unqualified"}`)
211
- : [];
212
193
  return {
213
194
  path: optionalString(meta.path),
214
195
  sha256: optionalString(meta.sha256),
@@ -221,15 +202,7 @@ function normalizeInvariantPassport(meta, index = 0) {
221
202
  source: structuredClone(value.source),
222
203
  coverage: structuredClone(value.coverage),
223
204
  platforms,
224
- admission: {
225
- scope: "consumer-invariant-coverage",
226
- result: "passed",
227
- consumerVerdict: value.verdict,
228
- releaseClaimsVerdict: optionalString(value.releaseClaims?.verdict),
229
- },
230
- releaseClaims: value.releaseClaims ? structuredClone(value.releaseClaims) : undefined,
231
- diagnostics: Array.isArray(value.diagnostics) ? structuredClone(value.diagnostics) : [],
232
- residualRisk: [...new Set([...value.residualRisk, ...releaseClaimRisks])].sort(),
205
+ residualRisk: structuredClone(value.residualRisk),
233
206
  };
234
207
  }
235
208
 
@@ -490,12 +463,7 @@ function mergeAuthoritativeImpactBase(impact, basePassport = undefined) {
490
463
  return merged;
491
464
  }
492
465
 
493
- function parseJsonCommandOutput({
494
- command = "",
495
- cwd = process.cwd(),
496
- label = "command",
497
- acceptNonzeroJson = undefined,
498
- } = {}) {
466
+ function parseJsonCommandOutput({ command = "", cwd = process.cwd(), label = "command" } = {}) {
499
467
  const normalized = String(command || "").trim();
500
468
  if (!normalized) {
501
469
  return { value: undefined, path: "", sha256: "" };
@@ -509,7 +477,7 @@ function parseJsonCommandOutput({
509
477
  if (result.error) {
510
478
  throw new Error(`${label} failed to start: ${result.error.message}`);
511
479
  }
512
- if (result.status !== 0 && typeof acceptNonzeroJson !== "function") {
480
+ if (result.status !== 0) {
513
481
  const stderr = String(result.stderr || "").trim();
514
482
  throw new Error(`${label} exited with ${result.status}${stderr ? `: ${stderr.slice(-1000)}` : ""}`);
515
483
  }
@@ -523,15 +491,10 @@ function parseJsonCommandOutput({
523
491
  } catch (error) {
524
492
  throw new Error(`${label} output must be valid JSON: ${error.message}`, { cause: error });
525
493
  }
526
- if (result.status !== 0 && !acceptNonzeroJson({ status: result.status, value: parsed })) {
527
- const stderr = String(result.stderr || "").trim();
528
- throw new Error(`${label} exited with ${result.status}${stderr ? `: ${stderr.slice(-1000)}` : ""}`);
529
- }
530
494
  return {
531
495
  value: parsed,
532
496
  path: "",
533
497
  sha256: sha256Text(stableJson(parsed)),
534
- status: result.status,
535
498
  };
536
499
  }
537
500
 
@@ -846,41 +809,6 @@ function arrayOrSingleton(value) {
846
809
  return value && typeof value === "object" ? [value] : [];
847
810
  }
848
811
 
849
- const KFD2_RESIDUAL_RISK_SCHEMA = "https://kfd.libkungfu.dev/schemas/kfd-2/trust-taxonomy.schema.json#/$defs/residualRisk";
850
-
851
- function normalizeKfd2ResidualRisk(entry, { claim = {}, claimIndex = 0, riskIndex = 0 } = {}) {
852
- if (entry && typeof entry === "object" && !Array.isArray(entry)) {
853
- return entry;
854
- }
855
- const reason = optionalString(entry).trim();
856
- if (!reason) {
857
- return entry;
858
- }
859
- const claimId = optionalString(claim.id || `claim-${claimIndex + 1}`)
860
- .toLowerCase()
861
- .replace(/[^a-z0-9]+/g, "-")
862
- .replace(/^-+|-+$/g, "") || `claim-${claimIndex + 1}`;
863
- const responsibility = claim.responsibility && typeof claim.responsibility === "object" && !Array.isArray(claim.responsibility)
864
- ? claim.responsibility
865
- : {};
866
- return {
867
- id: `${claimId}-residual-risk-${riskIndex + 1}`,
868
- definedBy: KFD2_RESIDUAL_RISK_SCHEMA,
869
- riskType: "manual-review-risk",
870
- trustImpact: "downgrade-warning",
871
- machineProvability: "not-machine-verifiable",
872
- agentAction: "request-maintainer-review",
873
- reason,
874
- owner: optionalString(
875
- responsibility.releaseDecisionOwner
876
- || responsibility.owner
877
- || responsibility.sourceOwner
878
- || responsibility.sourceContractOwner
879
- || "release maintainer",
880
- ),
881
- };
882
- }
883
-
884
812
  function normalizeKfd2Claim(raw = {}, index = 0) {
885
813
  const claim = raw && typeof raw === "object" && !Array.isArray(raw) ? raw : {};
886
814
  const sourceBindings = arrayOrEmpty(claim.sourceBindings || claim.source_bindings || claim.sources || claim.declaredSources);
@@ -894,13 +822,10 @@ function normalizeKfd2Claim(raw = {}, index = 0) {
894
822
  ? claim.audit_boundary
895
823
  : {};
896
824
  const responsibility = claim.responsibility && typeof claim.responsibility === "object" && !Array.isArray(claim.responsibility) ? claim.responsibility : {};
897
- const residualRisk = arrayOrSingleton(claim.residualRisk || claim.residual_risk).map((entry, riskIndex) => validateKfd2TrustTaxonomyEntry(
898
- normalizeKfd2ResidualRisk(entry, { claim, claimIndex: index, riskIndex }),
899
- {
900
- kind: "residualRisk",
901
- label: `kfd-2.claims[${index}].residualRisk[${riskIndex}]`,
902
- },
903
- ));
825
+ const residualRisk = arrayOrSingleton(claim.residualRisk || claim.residual_risk).map((entry, riskIndex) => validateKfd2TrustTaxonomyEntry(entry, {
826
+ kind: "residualRisk",
827
+ label: `kfd-2.claims[${index}].residualRisk[${riskIndex}]`,
828
+ }));
904
829
  const downgradeReasons = arrayOrSingleton(claim.downgradeReasons || claim.downgrade_reasons || claim.downgradeReason || claim.downgrade_reason)
905
830
  .map((entry, reasonIndex) => validateKfd2TrustTaxonomyEntry(entry, {
906
831
  kind: "downgradeReason",
@@ -1465,7 +1390,7 @@ export function createReleasePassport({
1465
1390
  };
1466
1391
  }
1467
1392
 
1468
- function collectKfdAdopterReleaseInputs({ cwd, manifestJson, supportMatrixJson, productGateJsons, repository, sourceSha, checkedAt }) {
1393
+ function collectKfdAdopterReleaseInputs({ cwd, manifestJson, supportMatrixJson, productGateJsons, sourceSha, checkedAt }) {
1469
1394
  const manifestMeta = parseJsonInputWithMeta(manifestJson, undefined, { cwd, label: "kfdAdopterManifestJson" });
1470
1395
  const supportMatrixMeta = parseJsonInputWithMeta(supportMatrixJson, undefined, { cwd, label: "kfdSupportMatrixJson" });
1471
1396
  const productGateMetas = (productGateJsons || [])
@@ -1476,7 +1401,7 @@ function collectKfdAdopterReleaseInputs({ cwd, manifestJson, supportMatrixJson,
1476
1401
  manifest: manifestMeta.value,
1477
1402
  gateResults: productGateMetas.map((meta) => meta.value),
1478
1403
  comparisonMatrix: supportMatrixMeta.value,
1479
- expectedAdopterId: repository || "kungfu-systems/buildchain", expectedSourceRepository: repository, sourceSha,
1404
+ sourceSha,
1480
1405
  checkedAt,
1481
1406
  });
1482
1407
  }
@@ -1505,7 +1430,6 @@ export function collectGitHubReleasePassport({
1505
1430
  outputDir = ".buildchain/release-passport",
1506
1431
  assetsJson = "",
1507
1432
  assetsDir = "",
1508
- kfdArtifactSearchRoots = [],
1509
1433
  releaseJson = "",
1510
1434
  productName = "Buildchain",
1511
1435
  packageName = "@kungfu-tech/buildchain",
@@ -1581,12 +1505,12 @@ export function collectGitHubReleasePassport({
1581
1505
  .filter(Boolean)
1582
1506
  .map((witnessJson) => parseJsonInputWithMeta(witnessJson, undefined, { cwd, label: "kfd3ArtifactWitnessJsons entry" }))
1583
1507
  .filter((meta) => meta.value);
1508
+ const basePassportMeta = parseJsonInputWithMeta(basePassportJson, undefined, { cwd, label: "basePassportJson" });
1584
1509
  const kfd3ArtifactCommandMeta = parseJsonCommandOutput({
1585
1510
  command: kfd3ArtifactVerifyCommand,
1586
1511
  cwd,
1587
1512
  label: "KFD-3 artifact verify command",
1588
1513
  });
1589
- const basePassportMeta = parseJsonInputWithMeta(basePassportJson, undefined, { cwd, label: "basePassportJson" });
1590
1514
  const invariantPassportMetas = (invariantPassportJsons || [])
1591
1515
  .filter(Boolean)
1592
1516
  .map((passportJson) => parseJsonInputWithMeta(passportJson, undefined, { cwd, label: "invariantPassportJsons entry" }))
@@ -1595,22 +1519,6 @@ export function collectGitHubReleasePassport({
1595
1519
  command: invariantPassportCommand,
1596
1520
  cwd,
1597
1521
  label: "invariant passport command",
1598
- acceptNonzeroJson: ({ status, value }) => {
1599
- if (status !== 2) return false;
1600
- try {
1601
- const normalized = normalizeInvariantPassport(
1602
- { value, path: "", sha256: sha256Text(stableJson(value)) },
1603
- invariantPassportMetas.length,
1604
- );
1605
- return normalized.verdict === "unqualified"
1606
- && normalized.coverage?.complete === false
1607
- && normalized.releaseClaims?.verdict === "unqualified"
1608
- && normalized.admission?.scope === "consumer-invariant-coverage"
1609
- && normalized.admission?.result === "passed";
1610
- } catch {
1611
- return false;
1612
- }
1613
- },
1614
1522
  });
1615
1523
  if (invariantPassportCommandMeta.value) invariantPassportMetas.push(invariantPassportCommandMeta);
1616
1524
  const invariantPassports = createInvariantPassportGate(invariantPassportMetas);
@@ -1662,7 +1570,7 @@ export function collectGitHubReleasePassport({
1662
1570
  const productMechanism = defaultProductMechanism({ repository, productName });
1663
1571
  const kfdAdopterEvidence = collectKfdAdopterReleaseInputs({
1664
1572
  cwd, manifestJson: kfdAdopterManifestJson, supportMatrixJson: kfdSupportMatrixJson,
1665
- productGateJsons: kfdProductGateJsons, repository, sourceSha, checkedAt: resolvedCheckedAt,
1573
+ productGateJsons: kfdProductGateJsons, sourceSha, checkedAt: resolvedCheckedAt,
1666
1574
  });
1667
1575
  const {
1668
1576
  manifest: kfdAdopterManifest,
@@ -1687,7 +1595,6 @@ export function collectGitHubReleasePassport({
1687
1595
  const kfd1 = createKfd1ReleaseGateEvidence({
1688
1596
  cwd,
1689
1597
  artifactRoot: assetsDir ? path.resolve(cwd, assetsDir) : "",
1690
- artifactSearchRoots: kfdArtifactSearchRoots.map((root) => path.resolve(cwd, root)),
1691
1598
  artifacts: assets,
1692
1599
  witnesses: kfd1WitnessMetas.map((meta) => meta.value),
1693
1600
  });
@@ -2101,8 +2008,7 @@ function validateReleaseEvidenceContracts({
2101
2008
  manifestGate: kfdAdopterManifestGate,
2102
2009
  legacyProjection: kfdSupportEvidence,
2103
2010
  passportLegacyProjection: passport?.kfdSupport,
2104
- expectedAdopterId: optionalString(passport?.product?.repository) || "kungfu-systems/buildchain",
2105
- expectedSourceRepository: optionalString(passport?.product?.repository), expectedSourceSha: optionalString(passport?.release?.sourceSha),
2011
+ expectedSourceSha: optionalString(passport?.release?.sourceSha),
2106
2012
  })) {
2107
2013
  issues.push(issue("error", entry.code, entry.message, entry.details));
2108
2014
  }
@@ -2113,17 +2019,7 @@ function validateReleaseEvidenceContracts({
2113
2019
  for (const [index, value] of (passport?.githubArtifactAttestations || []).entries()) {
2114
2020
  try {
2115
2021
  const policy = normalizeGitHubArtifactAttestationPolicy(value);
2116
- const release = passport?.release || {};
2117
- const acceptedSourceShas = new Set([String(release.sourceSha || "").toLowerCase()]);
2118
- if (
2119
- release.treeEquivalent === true
2120
- && release.builtSourceTreeSha
2121
- && release.builtSourceTreeSha === release.promotionChannelTreeSha
2122
- && release.builtSourceSha
2123
- ) {
2124
- acceptedSourceShas.add(String(release.builtSourceSha).toLowerCase());
2125
- }
2126
- if (!acceptedSourceShas.has(policy.caller.sourceSha)) {
2022
+ if (policy.caller.sourceSha !== String(passport?.release?.sourceSha || "").toLowerCase()) {
2127
2023
  issues.push(issue(
2128
2024
  "error",
2129
2025
  `githubArtifactAttestations[${index}].caller.sourceSha`,
@@ -2521,15 +2417,8 @@ function validatePassportTrustSections({ passport, issues }) {
2521
2417
  ].filter(Boolean));
2522
2418
  for (const [index, entry] of (section.passports || []).entries()) {
2523
2419
  const prefix = `invariantPassports.passports[${index}]`;
2524
- if (entry.admission?.scope !== "consumer-invariant-coverage" || entry.admission?.result !== "passed") {
2525
- issues.push(issue("error", `${prefix}.admission`, `${prefix}.admission must record passed consumer invariant coverage`));
2526
- }
2527
- if (entry.verdict !== "verified" && !(entry.verdict === "unqualified" && entry.releaseClaims?.verdict === "unqualified")) {
2528
- issues.push(issue("error", `${prefix}.verdict`, `${prefix}.verdict must be verified or preserve one explicit unqualified releaseClaims verdict`));
2529
- }
2530
- if (entry.coverage?.complete !== true && !hasCompleteInvariantCoverage(entry)) {
2531
- issues.push(issue("error", `${prefix}.coverage`, `${prefix}.coverage must be complete or prove every required invariant coordinate verified`));
2532
- }
2420
+ if (entry.verdict !== "verified") issues.push(issue("error", `${prefix}.verdict`, `${prefix}.verdict must be verified`));
2421
+ if (entry.coverage?.complete !== true) issues.push(issue("error", `${prefix}.coverage`, `${prefix}.coverage.complete must be true`));
2533
2422
  if (entry.source?.dirty !== false) issues.push(issue("error", `${prefix}.source.dirty`, `${prefix}.source.dirty must be false`));
2534
2423
  if (acceptedSourceShas.size > 0 && !acceptedSourceShas.has(entry.source?.revision)) {
2535
2424
  issues.push(issue("error", `${prefix}.source.revision`, `${prefix}.source.revision must match a release source identity`));