@kungfu-tech/buildchain 4.0.0 → 4.0.1-alpha.10

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 (228) hide show
  1. package/AGENTS.md +13 -5
  2. package/actions/promote-buildchain-ref/README.md +11 -6
  3. package/actions/release-tail/README.md +8 -0
  4. package/architecture/ci-lane-change-budget.json +187 -0
  5. package/architecture/decisions/0002-next-development-transition.md +101 -0
  6. package/architecture/decisions/0003-two-phase-delivery-warrant.md +152 -0
  7. package/architecture/internal-capabilities.json +219 -7
  8. package/architecture/maintainability-policy.json +246 -29
  9. package/architecture/release-tail-contract-inventory.json +5 -2
  10. package/architecture/v3-core-mechanism-inventory.json +91 -0
  11. package/architecture/v4-adopter-delivery-parity.json +32 -5
  12. package/architecture/v4-capability-state-machine-manifest.json +73 -0
  13. package/architecture/v4-compatibility-facts-parity.json +77 -0
  14. package/architecture/v4-delivery-authority-parity.json +250 -0
  15. package/architecture/v4-delivery-warrant-shadow-fixtures.json +41 -9
  16. package/architecture/v4-floating-consumer-policy.json +81 -0
  17. package/architecture/v4-floating-consumer-policy.md +32 -0
  18. package/architecture/v4-next-development-parity.json +192 -0
  19. package/architecture/v4-publication-rehearsal-parity.json +84 -0
  20. package/architecture/v4-release-train-parity.json +1 -0
  21. package/architecture/v4-runtime-ref-resume-authority.json +64 -0
  22. package/architecture/v4-stage-capsule-qualification.json +2 -2
  23. package/architecture/v4-tail-reseal-parity.json +150 -0
  24. package/bin/buildchain.mjs +32 -3
  25. package/bin/internal/adopter-delivery-cli.mjs +70 -0
  26. package/bin/internal/command-registry.mjs +3 -0
  27. package/bin/internal/compatibility-facts-cli.mjs +101 -0
  28. package/bin/internal/trust-release-release-handlers.mjs +5 -0
  29. package/contracts/dev-delivery-authority-v2.schema.json +662 -0
  30. package/contracts/fixtures/next-development-transition-v1/anchored-manual-waiting.json +47 -0
  31. package/contracts/fixtures/next-development-transition-v1/semver-auto-planned.json +47 -0
  32. package/contracts/fixtures/next-development-transition-v1/version-model-cases.json +40 -0
  33. package/contracts/fixtures/v4-adopter-delivery-v1/archive-template.json +19 -0
  34. package/contracts/fixtures/v4-adopter-delivery-v1/bootstrap-positive.json +93 -0
  35. package/contracts/fixtures/v4-adopter-delivery-v1/gate-positive.json +29 -0
  36. package/contracts/fixtures/v4-adopter-delivery-v1/gate-unknown-selector.json +26 -0
  37. package/contracts/fixtures/v4-adopter-delivery-v1/offline-vectors.json +50 -0
  38. package/contracts/fixtures/v4-compatibility-facts-v1/shared.json +1129 -0
  39. package/contracts/fixtures/v4-floating-consumer-policy-v1/cases.json +59 -0
  40. package/contracts/fixtures/v4-publication-rehearsal-v1/candidate/artifacts/product.bin +1 -0
  41. package/contracts/fixtures/v4-publication-rehearsal-v1/candidate/config/buildchain.toml +5 -0
  42. package/contracts/fixtures/v4-publication-rehearsal-v1/candidate/documents/release-activation.json +1 -0
  43. package/contracts/fixtures/v4-publication-rehearsal-v1/candidate/documents/signed-channel.json +1 -0
  44. package/contracts/fixtures/v4-publication-rehearsal-v1/candidate/evidence/qualification.json +1 -0
  45. package/contracts/fixtures/v4-publication-rehearsal-v1/candidate/manifests/candidate.json +5 -0
  46. package/contracts/fixtures/v4-publication-rehearsal-v1/candidate/manifests/release-passport.json +1 -0
  47. package/contracts/fixtures/v4-publication-rehearsal-v1/capsule.json +707 -0
  48. package/contracts/fixtures/v4-publication-rehearsal-v1/offline-vectors.json +27 -0
  49. package/contracts/fixtures/v4-runtime-ref-resume-authority-v1/scenario.json +15 -0
  50. package/contracts/fixtures/v4-tail-reseal-v1/valid.json +229 -0
  51. package/contracts/next-development-request-v1.schema.json +66 -0
  52. package/contracts/next-development-transition-v1.schema.json +292 -0
  53. package/contracts/v4-adopter-delivery-v1.schema.json +81 -0
  54. package/contracts/v4-compatibility-facts-v1.schema.json +230 -0
  55. package/contracts/v4-floating-consumer-policy-receipt-v1.schema.json +107 -0
  56. package/contracts/v4-publication-rehearsal-capsule-v1.schema.json +233 -0
  57. package/contracts/v4-runtime-ref-resume-authority-v1.schema.json +235 -0
  58. package/contracts/v4-tail-reseal-v1.schema.json +276 -0
  59. package/dist/site/agent-index.json +5 -0
  60. package/dist/site/artifact-schemas.json +10 -0
  61. package/dist/site/buildchain-contract.json +1562 -44
  62. package/dist/site/buildchain-site.json +684 -42
  63. package/dist/site/capability-registry.json +17 -14
  64. package/dist/site/cli-registry.json +205 -3
  65. package/dist/site/controller-registry.json +62 -6
  66. package/dist/site/kfd-claims.json +551 -22
  67. package/dist/site/kfd-upstream-aggregate.json +1 -1
  68. package/dist/site/manual-registry.json +55 -9
  69. package/dist/site/node-api-registry.json +15247 -8690
  70. package/dist/site/page-registry.json +647 -29
  71. package/dist/site/public-surface-audit.json +876 -55
  72. package/dist/site/publication-authority-registry.json +44 -8
  73. package/dist/site/publication-registry.json +4 -4
  74. package/dist/site/release-provenance.json +26 -0
  75. package/dist/site/schemas/dev-delivery-authority-v2.schema.json +662 -0
  76. package/dist/site/schemas/release-tail-capabilities-v1.schema.json +199 -0
  77. package/dist/site/schemas/v4-adopter-delivery-v1.schema.json +81 -0
  78. package/dist/site/schemas/v4-compatibility-facts-v1.schema.json +230 -0
  79. package/dist/site/schemas/v4-publication-rehearsal-capsule-v1.schema.json +233 -0
  80. package/dist/site/site-manifest.json +37 -13
  81. package/dist/site/workflow-registry.json +200 -22
  82. package/docs/MAP.md +10 -2
  83. package/docs/cli-reference.md +404 -13
  84. package/docs/cli.md +8 -0
  85. package/docs/dev-alpha-candidate-patrol.md +8 -0
  86. package/docs/dev-delivery-qualification-landing-adr.md +251 -0
  87. package/docs/dev-delivery-warrant.md +361 -30
  88. package/docs/lifecycle-protocol.md +41 -0
  89. package/docs/next-development-transition.md +118 -0
  90. package/docs/node-api-reference.md +748 -322
  91. package/docs/release-tail-provider-plane.md +30 -0
  92. package/docs/reusable-build-surface.md +41 -0
  93. package/docs/runtime-train-validation.md +10 -0
  94. package/docs/v4-adopter-delivery.md +133 -0
  95. package/docs/v4-compatibility-facts.md +91 -0
  96. package/docs/v4-publication-rehearsal.md +130 -0
  97. package/docs/v4-runtime-ref-resume-authority.md +69 -0
  98. package/docs/v4-tail-reseal.md +73 -0
  99. package/docs/versioning.md +4 -2
  100. package/package.json +36 -6
  101. package/packages/core/adopter-delivery-passport.js +259 -0
  102. package/packages/core/adopter-delivery-vectors.js +158 -0
  103. package/packages/core/adopter-delivery-vectors.json +77 -0
  104. package/packages/core/artifact-signing.js +61 -0
  105. package/packages/core/buildchain-agent-manuals.js +3 -0
  106. package/packages/core/buildchain-compatibility-authority.js +336 -0
  107. package/packages/core/buildchain-compatibility-fact.js +394 -0
  108. package/packages/core/buildchain-compatibility-facts.json +217 -0
  109. package/packages/core/buildchain-compatibility-proof.js +566 -0
  110. package/packages/core/buildchain-config.js +150 -1
  111. package/packages/core/buildchain-contract.js +96 -143
  112. package/packages/core/buildchain-delivery-bootstrap.js +240 -0
  113. package/packages/core/buildchain-delivery-infrastructure.js +164 -0
  114. package/packages/core/buildchain-delivery-self-dogfood.js +395 -0
  115. package/packages/core/buildchain-publication-authority.js +1 -0
  116. package/packages/core/channel-candidate.js +8 -0
  117. package/packages/core/channel-promotion-baseline.js +55 -0
  118. package/packages/core/ci-lane-change-budget.js +247 -0
  119. package/packages/core/dev-alpha-candidate-selection.js +10 -2
  120. package/packages/core/dev-delivery-authority-candidate.js +270 -0
  121. package/packages/core/dev-delivery-authority-evidence.js +146 -0
  122. package/packages/core/dev-delivery-authority-landing.js +461 -0
  123. package/packages/core/dev-delivery-authority-observation.js +48 -0
  124. package/packages/core/dev-delivery-authority-qualification.js +591 -0
  125. package/packages/core/dev-delivery-authority-settlement.js +213 -0
  126. package/packages/core/dev-delivery-authority-state.js +583 -0
  127. package/packages/core/dev-delivery-candidate-identity.js +13 -0
  128. package/packages/core/dev-delivery-contract-surface.js +76 -0
  129. package/packages/core/dev-delivery-execution-failure.js +133 -0
  130. package/packages/core/dev-delivery-execution-transfer.js +592 -0
  131. package/packages/core/dev-delivery-landing-admission-core.js +119 -0
  132. package/packages/core/dev-delivery-landing-readback.js +598 -0
  133. package/packages/core/dev-delivery-landing-terminal-evidence.js +271 -0
  134. package/packages/core/dev-delivery-landing-testing-port.js +6 -0
  135. package/packages/core/dev-delivery-native-execution.js +110 -0
  136. package/packages/core/dev-delivery-native-proof.js +562 -0
  137. package/packages/core/dev-delivery-process-boundary.js +563 -0
  138. package/packages/core/dev-delivery-proof.js +37 -3
  139. package/packages/core/dev-delivery-provider-attempt.js +127 -0
  140. package/packages/core/dev-delivery-provider-heartbeat.js +382 -0
  141. package/packages/core/dev-delivery-warrant-cancellation.js +1 -0
  142. package/packages/core/dev-delivery-warrant-qualification.js +145 -0
  143. package/packages/core/dev-delivery-warrant-settlement.js +237 -36
  144. package/packages/core/dev-delivery-warrant-state.js +587 -0
  145. package/packages/core/dev-delivery-warrant.js +328 -370
  146. package/packages/core/github-governance-authority.js +1 -0
  147. package/packages/core/index.js +7 -0
  148. package/packages/core/kungfu-temporal-fact.js +557 -0
  149. package/packages/core/legacy-kfd-adopter-driver.js +167 -0
  150. package/packages/core/next-development-candidate-reservation.js +186 -0
  151. package/packages/core/next-development-controller.js +728 -0
  152. package/packages/core/next-development-projection.js +287 -0
  153. package/packages/core/next-development-transition.js +738 -0
  154. package/packages/core/paper-agent-entry.js +11 -5
  155. package/packages/core/paper.js +16 -5
  156. package/packages/core/publication-authority.js +5 -5
  157. package/packages/core/published-delivery-authority.js +266 -0
  158. package/packages/core/release-candidate-recovery.js +66 -11
  159. package/packages/core/release-candidate.js +79 -19
  160. package/packages/core/release-passport.js +271 -38
  161. package/packages/core/v4-adopter-delivery-parity.js +3 -3
  162. package/packages/core/v4-adopter-delivery.js +359 -0
  163. package/packages/core/v4-canonical-contracts.js +5 -0
  164. package/packages/core/v4-delivery-warrant-read-candidate.js +10 -3
  165. package/packages/core/v4-floating-consumer-evidence.js +338 -0
  166. package/packages/core/v4-floating-consumer-policy.js +569 -0
  167. package/packages/core/v4-floating-consumer-release-passport.js +153 -0
  168. package/packages/core/v4-publication-rehearsal-capsule.js +468 -0
  169. package/packages/core/v4-publication-rehearsal-provider-bindings.js +212 -0
  170. package/packages/core/v4-publication-rehearsal.js +481 -0
  171. package/packages/core/v4-runtime-ref-resume-authority.js +625 -0
  172. package/packages/core/v4-runtime-selector-persistence.js +228 -0
  173. package/packages/core/v4-tail-reseal-contract.js +26 -0
  174. package/packages/core/v4-tail-reseal-github.js +178 -0
  175. package/packages/core/v4-tail-reseal-receipt.js +225 -0
  176. package/packages/core/v4-tail-reseal.js +594 -0
  177. package/packages/core/workflow-yaml-contract.js +72 -2
  178. package/scripts/audit-publication-control-plane.mjs +31 -31
  179. package/scripts/buildchain-cli-help.mjs +41 -2
  180. package/scripts/check-ci-lane-change-budget.mjs +100 -0
  181. package/scripts/check-inventory.mjs +14 -3
  182. package/scripts/check-v4-floating-consumer-policy-contract.mjs +217 -0
  183. package/scripts/check-v4-public-dogfood-contract.mjs +6 -11
  184. package/scripts/dev-alpha-candidate-patrol.mjs +22 -1
  185. package/scripts/dev-delivery-authority-command-adapters.mjs +206 -0
  186. package/scripts/dev-delivery-authority-provider.mjs +28 -0
  187. package/scripts/dev-delivery-authority.mjs +490 -0
  188. package/scripts/dev-delivery-native-run.mjs +177 -0
  189. package/scripts/dev-delivery-process-boundary.mjs +260 -0
  190. package/scripts/dev-delivery-proof.mjs +67 -2
  191. package/scripts/dev-delivery-provider-heartbeat.mjs +215 -0
  192. package/scripts/dev-delivery-source-proof-replay.mjs +153 -0
  193. package/scripts/dev-delivery-source-proof-reuse.mjs +547 -0
  194. package/scripts/dev-delivery-two-phase-resume.mjs +345 -0
  195. package/scripts/dev-delivery-two-phase.mjs +573 -0
  196. package/scripts/dev-delivery-warrant-options.mjs +266 -0
  197. package/scripts/dev-delivery-warrant-store.mjs +231 -0
  198. package/scripts/dev-delivery-warrant.mjs +232 -194
  199. package/scripts/dev-pr-auto-merge.mjs +37 -48
  200. package/scripts/dev-pr-delivery-warrant.mjs +216 -2
  201. package/scripts/dev-pr-prequeue-guard.mjs +399 -0
  202. package/scripts/dev-qualification-patrol.mjs +9 -9
  203. package/scripts/dispatch-artifact-signing-authority.mjs +1 -1
  204. package/scripts/ensure-github-release.mjs +3 -3
  205. package/scripts/generate-channel-build-workflow.mjs +3 -0
  206. package/scripts/generate-channel-promotion-workflow.mjs +114 -14
  207. package/scripts/generate-next-development-guidance.mjs +49 -0
  208. package/scripts/generate-release-candidate-passport.mjs +192 -32
  209. package/scripts/generate-site-bundle.mjs +69 -4
  210. package/scripts/init-repo.mjs +26 -4
  211. package/scripts/inspect-artifact-signing-requests.mjs +6 -0
  212. package/scripts/next-development-self-dogfood-harness.mjs +460 -0
  213. package/scripts/next-development-self-dogfood.mjs +597 -0
  214. package/scripts/next-development-transition.mjs +47 -0
  215. package/scripts/npm-publish-transaction.mjs +103 -91
  216. package/scripts/promotion-channel-router.mjs +4 -4
  217. package/scripts/release-candidate-anchor-provenance.mjs +99 -0
  218. package/scripts/release-tail.mjs +51 -3
  219. package/scripts/release-train-self-dogfood.mjs +94 -92
  220. package/scripts/resume-from-candidate-run.mjs +565 -41
  221. package/scripts/seal-artifact-signing-requests.mjs +6 -0
  222. package/scripts/site-capability-metadata.mjs +43 -0
  223. package/scripts/stable-candidate-qualification.mjs +9 -10
  224. package/scripts/v4-consumer-policy.mjs +231 -0
  225. package/scripts/v4-publication-rehearsal-fixture.mjs +144 -0
  226. package/scripts/v4-tail-reseal-macos-rehearsal.mjs +134 -0
  227. package/scripts/v4-tail-reseal.mjs +416 -0
  228. package/templates/native-dev-delivery.yml +143 -0
@@ -6,7 +6,11 @@ import fs from "node:fs";
6
6
  import {
7
7
  closeDevDeliveryWarrant,
8
8
  createDevDeliveryQueue,
9
+ createNativeCommandContract,
10
+ createNativeProofReuseDecision,
11
+ createNativeQualificationProof,
9
12
  createReleaseBlockerPriorityClaim,
13
+ qualifyDevDeliveryWarrant,
10
14
  selectDevDeliveryWarrant,
11
15
  submitDevDeliveryCandidate,
12
16
  } from "../packages/core/dev-delivery-warrant.js";
@@ -81,9 +85,12 @@ function branch(value, label) {
81
85
  return normalized;
82
86
  }
83
87
 
84
- function at(recordedAt, seconds) {
85
- return new Date(Date.parse(recordedAt) + seconds * 1000).toISOString();
86
- }
88
+ const at = (recordedAt, seconds) => new Date(Date.parse(recordedAt) + seconds * 1000).toISOString();
89
+
90
+ const normalizeFields = (input, fields, normalizer, prefix = "") =>
91
+ Object.fromEntries(fields.map((field) => [field, normalizer(input?.[field], `${prefix}${field}`)]));
92
+
93
+ const requireEvidence = (condition, message) => { if (!condition) throw new Error(message); };
87
94
 
88
95
  function normalizeDelivery(input, expected) {
89
96
  const delivery = {
@@ -92,59 +99,44 @@ function normalizeDelivery(input, expected) {
92
99
  "delivery.pullRequestNumber",
93
100
  ),
94
101
  baseBranch: branch(input?.baseBranch, "delivery.baseBranch"),
95
- headSha: sha(input?.headSha, "delivery.headSha"),
96
- headTreeSha: sha(input?.headTreeSha, "delivery.headTreeSha"),
97
- state: text(input?.state, "delivery.state"),
98
- reviewState: text(input?.reviewState, "delivery.reviewState"),
99
- reviewHeadSha: sha(input?.reviewHeadSha, "delivery.reviewHeadSha"),
100
- mergeSha: sha(input?.mergeSha, "delivery.mergeSha"),
101
- mergeTreeSha: sha(input?.mergeTreeSha, "delivery.mergeTreeSha"),
102
- ciHeadSha: sha(input?.ciHeadSha, "delivery.ciHeadSha"),
103
- ciConclusion: text(input?.ciConclusion, "delivery.ciConclusion"),
104
- reviewRoot: root(input?.reviewRoot, "delivery.reviewRoot"),
105
- ciRoot: root(input?.ciRoot, "delivery.ciRoot"),
106
- mergeRoot: root(input?.mergeRoot, "delivery.mergeRoot"),
107
- artifactRoot: root(input?.artifactRoot, "delivery.artifactRoot"),
108
- installedProductRoot: root(
109
- input?.installedProductRoot,
110
- "delivery.installedProductRoot",
102
+ ...normalizeFields(
103
+ input,
104
+ ["headSha", "headTreeSha", "reviewHeadSha", "mergeSha", "mergeTreeSha", "ciHeadSha"],
105
+ sha,
106
+ "delivery.",
107
+ ),
108
+ ...normalizeFields(input, ["state", "reviewState", "ciConclusion"], text, "delivery."),
109
+ ...normalizeFields(
110
+ input,
111
+ ["reviewRoot", "ciRoot", "mergeRoot", "artifactRoot", "installedProductRoot"],
112
+ root,
113
+ "delivery.",
111
114
  ),
112
115
  };
113
- if (delivery.baseBranch !== expected.sourceBranch) {
114
- throw new Error(
115
- "protected delivery base does not match the Release Cut source branch",
116
- );
117
- }
118
- if (
119
- delivery.state !== "MERGED" ||
120
- delivery.reviewState !== "APPROVED" ||
121
- delivery.ciConclusion !== "success"
122
- ) {
123
- throw new Error(
124
- "protected delivery is not merged, approved, and CI-successful",
125
- );
126
- }
127
- if (
128
- delivery.headSha !== expected.devLandingSha ||
129
- delivery.reviewHeadSha !== delivery.headSha
130
- ) {
131
- throw new Error(
132
- "protected delivery review does not bind the exact repaired head",
133
- );
134
- }
135
- if (
136
- delivery.headTreeSha !== expected.cutCandidateTreeSha ||
137
- delivery.mergeTreeSha !== delivery.headTreeSha
138
- ) {
139
- throw new Error(
140
- "protected delivery merge tree does not equal the repaired candidate tree",
141
- );
142
- }
143
- if (delivery.ciHeadSha !== delivery.mergeSha) {
144
- throw new Error(
145
- "protected delivery CI does not bind the merge-group result",
146
- );
147
- }
116
+ requireEvidence(
117
+ delivery.baseBranch === expected.sourceBranch,
118
+ "protected delivery base does not match the Release Cut source branch",
119
+ );
120
+ requireEvidence(
121
+ delivery.state === "MERGED" &&
122
+ delivery.reviewState === "APPROVED" &&
123
+ delivery.ciConclusion === "success",
124
+ "protected delivery is not merged, approved, and CI-successful",
125
+ );
126
+ requireEvidence(
127
+ delivery.headSha === expected.devLandingSha &&
128
+ delivery.reviewHeadSha === delivery.headSha,
129
+ "protected delivery review does not bind the exact repaired head",
130
+ );
131
+ requireEvidence(
132
+ delivery.headTreeSha === expected.cutCandidateTreeSha &&
133
+ delivery.mergeTreeSha === delivery.headTreeSha,
134
+ "protected delivery merge tree does not equal the repaired candidate tree",
135
+ );
136
+ requireEvidence(
137
+ delivery.ciHeadSha === delivery.mergeSha,
138
+ "protected delivery CI does not bind the merge-group result",
139
+ );
148
140
  return delivery;
149
141
  }
150
142
 
@@ -153,50 +145,32 @@ function normalizeInput(input = {}) {
153
145
  repository: repository(input.repository),
154
146
  sourceBranch: branch(input.sourceBranch, "sourceBranch"),
155
147
  targetBranch: branch(input.targetBranch, "targetBranch"),
156
- assignmentRoot: root(input.assignmentRoot, "assignmentRoot"),
157
- initiativeRoot: root(input.initiativeRoot, "initiativeRoot"),
158
- dependencyProofRoot: root(input.dependencyProofRoot, "dependencyProofRoot"),
159
- originDevSha: sha(input.originDevSha, "originDevSha"),
160
- candidateSha: sha(input.candidateSha, "candidateSha"),
161
- candidateTreeSha: sha(input.candidateTreeSha, "candidateTreeSha"),
162
- alphaBaseSha: sha(input.alphaBaseSha, "alphaBaseSha"),
163
- buildchainRuntimeSha: sha(
164
- input.buildchainRuntimeSha,
165
- "buildchainRuntimeSha",
166
- ),
167
- observedDevSha: sha(input.observedDevSha, "observedDevSha"),
168
- blockerRoot: root(input.blockerRoot, "blockerRoot"),
169
- patchRoot: root(input.patchRoot, "patchRoot"),
170
- cutCandidateSha: sha(input.cutCandidateSha, "cutCandidateSha"),
171
- cutCandidateTreeSha: sha(input.cutCandidateTreeSha, "cutCandidateTreeSha"),
172
- cutLandingEvidenceRoot: root(
173
- input.cutLandingEvidenceRoot,
174
- "cutLandingEvidenceRoot",
148
+ ...normalizeFields(
149
+ input,
150
+ ["assignmentRoot", "initiativeRoot", "dependencyProofRoot", "environmentRoot", "blockerRoot", "patchRoot", "cutLandingEvidenceRoot", "devConflictEvidenceRoot", "devLandingEvidenceRoot"],
151
+ root,
175
152
  ),
176
- devBaseSha: sha(input.devBaseSha, "devBaseSha"),
177
- devLandingSha: sha(input.devLandingSha, "devLandingSha"),
178
- devConflictEvidenceRoot: root(
179
- input.devConflictEvidenceRoot,
180
- "devConflictEvidenceRoot",
181
- ),
182
- devLandingEvidenceRoot: root(
183
- input.devLandingEvidenceRoot,
184
- "devLandingEvidenceRoot",
153
+ ...normalizeFields(
154
+ input,
155
+ ["originDevSha", "candidateSha", "candidateTreeSha", "alphaBaseSha", "buildchainRuntimeSha", "observedDevSha", "cutCandidateSha", "cutCandidateTreeSha", "devBaseSha", "devLandingSha"],
156
+ sha,
185
157
  ),
158
+ nativeCommand: text(input.nativeCommand, "nativeCommand"),
159
+ nativeExecutionReceipt: structuredClone(input.nativeExecutionReceipt || {}),
186
160
  ordinaryPullRequestNumber: positiveInteger(
187
161
  input.ordinaryPullRequestNumber,
188
162
  "ordinaryPullRequestNumber",
189
163
  ),
190
164
  recordedAt: timestamp(input.recordedAt, "recordedAt"),
191
165
  };
192
- if (normalized.observedDevSha === normalized.originDevSha) {
193
- throw new Error(
194
- "self-dogfood requires dev to advance beyond the frozen origin",
195
- );
196
- }
197
- if (normalized.cutCandidateSha === normalized.candidateSha) {
198
- throw new Error("self-dogfood requires a successor repair candidate");
199
- }
166
+ requireEvidence(
167
+ normalized.observedDevSha !== normalized.originDevSha,
168
+ "self-dogfood requires dev to advance beyond the frozen origin",
169
+ );
170
+ requireEvidence(
171
+ normalized.cutCandidateSha !== normalized.candidateSha,
172
+ "self-dogfood requires a successor repair candidate",
173
+ );
200
174
  normalized.delivery = normalizeDelivery(input.delivery, normalized);
201
175
  return normalized;
202
176
  }
@@ -214,6 +188,10 @@ function deliveryCandidate(input, deliveryClass = "release") {
214
188
  closureRoot: input.closureRoot,
215
189
  dependencyRoot: input.dependencyRoot,
216
190
  toolchainRoot: input.toolchainRoot,
191
+ ...(input.environmentRoot ? { environmentRoot: input.environmentRoot } : {}),
192
+ ...(input.nativeCommand
193
+ ? { nativeCommandContract: createNativeCommandContract(input.nativeCommand) }
194
+ : {}),
217
195
  deliveryClass,
218
196
  priority: "ordinary",
219
197
  ...(input.releaseBlockerPriority
@@ -366,7 +344,7 @@ function runQueueCampaign(value, repaired, priorityClaim) {
366
344
  dependencyRoot: value.dependencyProofRoot,
367
345
  toolchainRoot: value.dependencyProofRoot,
368
346
  },
369
- "native-proof-required",
347
+ "non-native-fast",
370
348
  );
371
349
  queue = submitDevDeliveryCandidate(queue, ordinary, {
372
350
  now: at(value.recordedAt, 6),
@@ -388,6 +366,8 @@ function runQueueCampaign(value, repaired, priorityClaim) {
388
366
  closureRoot: value.delivery.mergeRoot,
389
367
  dependencyRoot: value.dependencyProofRoot,
390
368
  toolchainRoot: value.delivery.installedProductRoot,
369
+ environmentRoot: value.environmentRoot,
370
+ nativeCommand: value.nativeCommand,
391
371
  releaseBlockerPriority: priorityClaim,
392
372
  });
393
373
  const submitted = submitDevDeliveryCandidate(queue, blocker, {
@@ -426,7 +406,29 @@ function runQueueCampaign(value, repaired, priorityClaim) {
426
406
  "eligible release blocker did not receive bounded priority",
427
407
  );
428
408
  }
429
- const closed = closeDevDeliveryWarrant(selected.queue, selected.warrant, {
409
+ const nativeCommandRoot = createNativeCommandContract(value.nativeCommand).commandRoot;
410
+ const proof = createNativeQualificationProof({
411
+ ...selected.warrant,
412
+ repository: value.repository,
413
+ protectedBase: value.sourceBranch,
414
+ qualifiedBase: value.devBaseSha,
415
+ nativeCommandRoot,
416
+ nativeExecutionReceipt: value.nativeExecutionReceipt,
417
+ affectedPaths: [], shardEvidenceRoots: [],
418
+ qualifiedAt: at(value.recordedAt, 12),
419
+ });
420
+ const current = {
421
+ ...selected.warrant,
422
+ nativeCommandRoot,
423
+ currentBase: value.devBaseSha,
424
+ graphKnown: true, attributionComplete: true,
425
+ changedPaths: [], renames: [],
426
+ };
427
+ const reuseDecision = createNativeProofReuseDecision({ proof, current });
428
+ const qualified = qualifyDevDeliveryWarrant(selected.queue, selected.warrant, {
429
+ nativeProof: proof, reuseDecision, current, now: at(value.recordedAt, 12),
430
+ });
431
+ const closed = closeDevDeliveryWarrant(qualified.queue, qualified.warrant, {
430
432
  outcome: "merged",
431
433
  evidenceRoot: value.delivery.mergeRoot,
432
434
  now: at(value.recordedAt, 13),