@kungfu-tech/buildchain 3.0.9-alpha.9 → 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 (262) 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 -10
  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 -4
  65. package/dist/site/artifact-schemas.json +0 -8
  66. package/dist/site/buildchain-contract.json +103 -397
  67. package/dist/site/buildchain-site.json +302 -386
  68. package/dist/site/capability-registry.json +9 -11
  69. package/dist/site/cli-registry.json +8 -53
  70. package/dist/site/controller-registry.json +48 -8
  71. package/dist/site/kfd-claims.json +129 -167
  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 +4345 -7345
  75. package/dist/site/page-registry.json +278 -346
  76. package/dist/site/public-surface-audit.json +85 -404
  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 -9
  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 +78 -35
  83. package/docs/MAP.md +8 -5
  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 -213
  87. package/docs/cli.md +14 -14
  88. package/docs/dev-alpha-candidate-patrol.md +3 -11
  89. package/docs/dev-delivery-warrant.md +29 -194
  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 -554
  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 -5
  111. package/package.json +19 -19
  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-channel-identity.js +3 -2
  119. package/packages/core/buildchain-config.js +4 -69
  120. package/packages/core/buildchain-contract.js +232 -46
  121. package/packages/core/buildchain-kfd-claims.js +1 -1
  122. package/packages/core/channel-candidate.js +0 -8
  123. package/packages/core/channel-promotion-baseline.js +0 -52
  124. package/packages/core/controller-evidence.js +3 -4
  125. package/packages/core/dev-alpha-candidate-selection.js +2 -10
  126. package/packages/core/dev-delivery-warrant-cancellation.js +0 -1
  127. package/packages/core/dev-delivery-warrant-settlement.js +20 -67
  128. package/packages/core/dev-delivery-warrant.js +50 -138
  129. package/packages/core/diagnostics.js +3 -8
  130. package/packages/core/github-governance-authority.js +3 -1
  131. package/packages/core/kfd-adopter-category-driver.js +167 -0
  132. package/packages/core/kfd-adopter-manifest.js +47 -46
  133. package/packages/core/kfd-gate.js +15 -45
  134. package/packages/core/paper-agent-entry.js +7 -16
  135. package/packages/core/paper-fleet.js +2 -2
  136. package/packages/core/paper-repository.js +2 -3
  137. package/packages/core/paper-scaffold-content.js +2 -23
  138. package/packages/core/paper.js +11 -43
  139. package/packages/core/publication-reproducibility.js +4 -4
  140. package/packages/core/release-line-bootstrap.js +21 -8
  141. package/packages/core/release-passport-contract.js +5 -5
  142. package/packages/core/release-passport.js +20 -131
  143. package/packages/core/self-dogfood-version.js +48 -35
  144. package/packages/core/spawn-command.js +232 -8
  145. package/packages/core/v4-adopter-delivery-parity.js +219 -0
  146. package/packages/core/v4-canonical-contracts.js +284 -0
  147. package/packages/core/v4-delivery-warrant-fixture-runner.js +371 -0
  148. package/packages/core/v4-delivery-warrant-read-candidate.js +279 -0
  149. package/packages/core/v4-delivery-warrant-semantic-diff-gate.js +352 -0
  150. package/packages/core/v4-delivery-warrant-shadow-adapter.js +447 -0
  151. package/packages/core/v4-partial-mutation-recovery-qualification.js +395 -0
  152. package/packages/core/v4-platform-stage-checkpoints.js +471 -0
  153. package/packages/core/v4-provider-operation-journal.js +531 -0
  154. package/packages/core/v4-provider-readback-idempotency.js +394 -0
  155. package/packages/core/v4-release-activation-shadow.js +519 -0
  156. package/packages/core/v4-stable-publication-fence.js +357 -0
  157. package/packages/core/v4-stage-capsule-local-store.js +426 -0
  158. package/packages/core/v4-stage-capsule-qualification-campaign.js +512 -0
  159. package/packages/core/v4-stage-capsule-qualification.js +456 -0
  160. package/packages/core/v4-stage-capsule-resume-planner.js +397 -0
  161. package/packages/core/v4-stage-capsule-store.js +401 -0
  162. package/packages/core/v4-stage-capsule.js +319 -0
  163. package/scripts/assemble-self-publication-admission.mjs +1 -1
  164. package/scripts/audit-publication-control-plane.mjs +5 -5
  165. package/scripts/auditable-demo-bundle-verification.mjs +3 -2
  166. package/scripts/auditable-demo-platform.mjs +2 -2
  167. package/scripts/auditable-demo-renditions.mjs +1 -1
  168. package/scripts/auditable-demo.mjs +2 -2
  169. package/scripts/aws-macos-jit-controller-core.mjs +13 -346
  170. package/scripts/aws-macos-jit-controller-runtime.mjs +2 -210
  171. package/scripts/aws-macos-jit-controller.mjs +37 -275
  172. package/scripts/aws-macos-jit-core.mjs +3 -41
  173. package/scripts/aws-macos-jit.mjs +0 -12
  174. package/scripts/aws-windows-jit-campaign.mjs +2 -2
  175. package/scripts/aws-windows-jit-controller-core.mjs +1 -1
  176. package/scripts/aws-windows-jit-controller.mjs +3 -3
  177. package/scripts/build-contract-core.mjs +3 -8
  178. package/scripts/build-standalone-binary.mjs +3 -14
  179. package/scripts/buildchain-channel-router.mjs +4 -0
  180. package/scripts/buildchain-cli-help.mjs +7 -16
  181. package/scripts/buildchain-contract-lock.mjs +0 -6
  182. package/scripts/check-action-bundles.mjs +3 -4
  183. package/scripts/check-internal-architecture.mjs +7 -6
  184. package/scripts/check-inventory.mjs +30 -25
  185. package/scripts/check-v4-public-dogfood-contract.mjs +270 -0
  186. package/scripts/create-release-bundle.mjs +8 -4
  187. package/scripts/dev-alpha-candidate-patrol.mjs +1 -22
  188. package/scripts/dev-delivery-proof.mjs +2 -64
  189. package/scripts/dev-delivery-warrant.mjs +61 -86
  190. package/scripts/dev-pr-auto-merge.mjs +4 -30
  191. package/scripts/dev-pr-delivery-warrant.mjs +0 -55
  192. package/scripts/dispatch-artifact-signing-authority.mjs +7 -4
  193. package/scripts/generate-buildchain-kfd-witnesses.mjs +94 -88
  194. package/scripts/generate-channel-build-workflow.mjs +54 -24
  195. package/scripts/generate-channel-promotion-workflow.mjs +15 -6
  196. package/scripts/generate-site-bundle.mjs +8 -27
  197. package/scripts/git-fetch-process-tree.mjs +34 -1
  198. package/scripts/init-repo.mjs +64 -159
  199. package/scripts/inspect-artifact-signing-requests.mjs +0 -6
  200. package/scripts/locked-source-checkout.mjs +3 -4
  201. package/scripts/maintainability-metrics.mjs +8 -2
  202. package/scripts/npm-publish-dry-run.mjs +2 -2
  203. package/scripts/npm-publish-transaction.mjs +2 -2
  204. package/scripts/publication-commit-evidence.mjs +23 -69
  205. package/scripts/release-candidate-resolver.mjs +11 -17
  206. package/scripts/release-tail.mjs +3 -49
  207. package/scripts/resume-from-candidate-run.mjs +9 -123
  208. package/scripts/run-lifecycle-core.mjs +12 -13
  209. package/scripts/seal-artifact-signing-requests.mjs +17 -21
  210. package/scripts/site-capability-metadata.mjs +3 -20
  211. package/scripts/stable-candidate-qualification.mjs +10 -10
  212. package/scripts/v4-architecture.mjs +12 -2
  213. package/scripts/v4-bridge-bootstrap.mjs +141 -0
  214. package/scripts/v4-bridge-evidence.mjs +141 -0
  215. package/scripts/v4-host-adapter.mjs +182 -0
  216. package/scripts/v4-platform-stage-checkpoint-rehearsal.mjs +207 -0
  217. package/scripts/v4-stage-capsule-qualification.mjs +528 -0
  218. package/scripts/v4-stage-capsule-resume-rehearsal.mjs +57 -0
  219. package/scripts/v4-warrant-shadow-plan.mjs +601 -0
  220. package/scripts/verify-golden-path.mjs +5 -5
  221. package/scripts/web-surface-cloudfront-rewrite.mjs +15 -15
  222. package/scripts/web-surface-core.mjs +2 -8
  223. package/scripts/workflow-call-contract.mjs +5 -184
  224. package/contracts/dev-delivery-authority-v2.schema.json +0 -253
  225. package/contracts/fixtures/kfd-adopter-release-v1/kfd-4-perspective.json +0 -16
  226. package/contracts/fixtures/kfd-adopter-release-v1/kfd-4-replay.json +0 -57
  227. package/contracts/fixtures/next-development-transition-v1/anchored-manual-waiting.json +0 -47
  228. package/contracts/fixtures/next-development-transition-v1/semver-auto-planned.json +0 -47
  229. package/contracts/fixtures/next-development-transition-v1/version-model-cases.json +0 -40
  230. package/contracts/next-development-request-v1.schema.json +0 -66
  231. package/contracts/next-development-transition-v1.schema.json +0 -292
  232. package/contracts/publication-rehearsal-capsule-v1.schema.json +0 -173
  233. package/dist/site/schemas/dev-delivery-authority-v2.schema.json +0 -442
  234. package/dist/site/schemas/publication-rehearsal-capsule-v1.schema.json +0 -269
  235. package/dist/site/schemas/release-tail-capabilities-v1.schema.json +0 -353
  236. package/dist/site/schemas/release-tail-provider-bindings-v1.schema.json +0 -94
  237. package/docs/dev-delivery-qualification-landing-adr.md +0 -137
  238. package/docs/next-development-transition.md +0 -119
  239. package/docs/publication-rehearsal.md +0 -94
  240. package/packages/core/buildchain-compatibility-proof.js +0 -631
  241. package/packages/core/dev-delivery-authority.js +0 -996
  242. package/packages/core/dev-delivery-native-proof.js +0 -418
  243. package/packages/core/dev-delivery-warrant-shadow.js +0 -502
  244. package/packages/core/next-development-candidate-reservation.js +0 -186
  245. package/packages/core/next-development-controller.js +0 -726
  246. package/packages/core/next-development-projection.js +0 -288
  247. package/packages/core/next-development-transition.js +0 -738
  248. package/packages/core/publication-rehearsal-projection.js +0 -173
  249. package/packages/core/publication-rehearsal-runtime.js +0 -921
  250. package/scripts/aws-macos-jit-instance-rehydrate.mjs +0 -260
  251. package/scripts/aws-macos-jit-source-rebind.mjs +0 -724
  252. package/scripts/dev-delivery-authority.mjs +0 -368
  253. package/scripts/dev-delivery-native-run.mjs +0 -235
  254. package/scripts/dev-delivery-two-phase-resume.mjs +0 -90
  255. package/scripts/dev-delivery-two-phase.mjs +0 -577
  256. package/scripts/generate-next-development-guidance.mjs +0 -49
  257. package/scripts/materialize-self-release-candidate-version.mjs +0 -137
  258. package/scripts/next-development-self-dogfood-harness.mjs +0 -409
  259. package/scripts/next-development-self-dogfood.mjs +0 -532
  260. package/scripts/next-development-transition.mjs +0 -47
  261. package/scripts/release-candidate-tail-reseal.mjs +0 -426
  262. package/templates/native-dev-delivery.yml +0 -86
@@ -138,7 +138,7 @@ function immediateReadmes(root, dir) {
138
138
 
139
139
  function publicDocumentationFiles(root) {
140
140
  return uniquePaths([
141
- ...(readJson(root, "dist/site/manual-registry.json").manuals || BUILDCHAIN_AGENT_MANUALS).map((entry) => entry.path),
141
+ ...BUILDCHAIN_AGENT_MANUALS.map((entry) => entry.path),
142
142
  "README.md",
143
143
  "packages/core/README.md",
144
144
  ...immediateReadmes(root, "actions"),
@@ -97,14 +97,6 @@ export function decideChannelCandidate(input) {
97
97
  const sourceSha = sha(input.sourceSha, "sourceSha");
98
98
  const targetSha = sha(input.targetSha, "targetSha");
99
99
  const selection = normalizeChannelCandidateSelection(input.selection);
100
- if (
101
- selection?.versionReservation &&
102
- selection.versionReservation.candidateSha !== sourceSha
103
- ) {
104
- throw new Error(
105
- "selection version reservation must bind the selected source SHA",
106
- );
107
- }
108
100
  const now = required(input.now || new Date().toISOString(), "now");
109
101
  const maxAgeSeconds = Number(input.maxAgeSeconds ?? 7 * 24 * 60 * 60);
110
102
  if (!Number.isSafeInteger(maxAgeSeconds) || maxAgeSeconds <= 0) {
@@ -1,10 +1,5 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
 
3
- import {
4
- nextDevelopmentPatrolContext,
5
- normalizeNextDevelopmentVersionReservation,
6
- } from "./next-development-candidate-reservation.js";
7
-
8
3
  const SHA = /^[0-9a-f]{40}$/;
9
4
 
10
5
  function text(value = "") {
@@ -64,18 +59,6 @@ export function normalizeChannelCandidateSelection(input) {
64
59
  ),
65
60
  }
66
61
  : {}),
67
- ...(input.versionReservation
68
- ? {
69
- versionReservation: normalizeNextDevelopmentVersionReservation(
70
- input.versionReservation,
71
- {
72
- reservationSha: input.versionReservation.reservationSha,
73
- candidateSha: input.versionReservation.candidateSha,
74
- targetVersion: input.versionReservation.targetVersion,
75
- },
76
- ),
77
- }
78
- : {}),
79
62
  };
80
63
  }
81
64
 
@@ -134,7 +117,6 @@ export async function resolvePatrolSourceInputs({
134
117
  let comparison = headComparison;
135
118
  let workflowEvidence = [];
136
119
  let skippedNewerCommitCount = 0;
137
- let versionReservation;
138
120
  let qualificationError;
139
121
  if (
140
122
  headComparison.status === "ahead" &&
@@ -148,8 +130,6 @@ export async function resolvePatrolSourceInputs({
148
130
  ),
149
131
  ]);
150
132
  try {
151
- const { preparations, ignoredSourceShas } =
152
- nextDevelopmentPatrolContext(sourceHistory);
153
133
  const selected = selectQualifiedSource({
154
134
  sourceHistory,
155
135
  workflowRunsByPath: new Map(
@@ -161,39 +141,8 @@ export async function resolvePatrolSourceInputs({
161
141
  requiredWorkflowPaths,
162
142
  now: options.now,
163
143
  maxAgeSeconds: options.maxAgeSeconds,
164
- ignoredSourceShas,
165
144
  });
166
145
  ({ sourceSha, skippedNewerCommitCount, workflowEvidence } = selected);
167
- const selectedIndex = sourceHistory.findIndex((entry) =>
168
- (typeof entry === "string" ? entry : entry?.sha) === sourceSha,
169
- );
170
- const reservation = preparations.find(
171
- ({ index }) => index > selectedIndex,
172
- )?.preparation;
173
- if (reservation) {
174
- if (typeof client.readNextDevelopmentVersionReservation !== "function") {
175
- throw new Error(
176
- "candidate follows next-development preparation but reservation readback is unavailable",
177
- );
178
- }
179
- versionReservation = normalizeNextDevelopmentVersionReservation(
180
- await client.readNextDevelopmentVersionReservation({
181
- reservationSha: reservation.sha,
182
- candidateSha: sourceSha,
183
- targetVersion: reservation.targetVersion,
184
- }),
185
- {
186
- reservationSha: reservation.sha,
187
- candidateSha: sourceSha,
188
- targetVersion: reservation.targetVersion,
189
- },
190
- );
191
- if (versionReservation.status !== "current") {
192
- throw new Error(
193
- `next-development version reservation is ${versionReservation.status} for candidate ${sourceSha}`,
194
- );
195
- }
196
- }
197
146
  if (sourceSha !== observedSourceHeadSha)
198
147
  comparison = await client.compare(boundarySha, sourceSha);
199
148
  } catch (error) {
@@ -209,7 +158,6 @@ export async function resolvePatrolSourceInputs({
209
158
  comparison,
210
159
  workflowEvidence,
211
160
  skippedNewerCommitCount,
212
- versionReservation,
213
161
  qualificationError,
214
162
  };
215
163
  }
@@ -34,14 +34,13 @@ const CONTROLLER_SPECS = [
34
34
  "resolve-runtime",
35
35
  "resolve-source",
36
36
  "anchored-release-preflight",
37
- "pre-build-contracts",
38
37
  "build",
39
38
  "signing-finalization",
40
39
  "credential-island",
41
40
  "verify",
42
41
  "aggregate",
43
42
  ],
44
- optionalStages: ["anchored-release-preflight", "pre-build-contracts", "credential-island"],
43
+ optionalStages: ["anchored-release-preflight", "credential-island"],
45
44
  evidence: [
46
45
  "platform-manifests",
47
46
  "build-summary",
@@ -53,8 +52,8 @@ const CONTROLLER_SPECS = [
53
52
  workflowId: "build",
54
53
  version: 1,
55
54
  capabilities: ["channel-selection", "runtime-selection", "build-delegation"],
56
- stages: ["resolve-channel", "alpha", "stable", "aggregate"],
57
- optionalStages: ["alpha", "stable"],
55
+ stages: ["resolve-channel", "override", "alpha", "stable", "aggregate"],
56
+ optionalStages: ["override", "alpha", "stable"],
58
57
  evidence: ["nested-controller-receipt", "controller-receipt"],
59
58
  },
60
59
  {
@@ -82,9 +82,7 @@ export function selectLatestQualifiedSource({
82
82
  requiredWorkflowPaths,
83
83
  now,
84
84
  maxAgeSeconds,
85
- ignoredSourceShas = [],
86
85
  }) {
87
- const ignored = new Set(ignoredSourceShas);
88
86
  const latestByPath = new Map(
89
87
  requiredWorkflowPaths.map((workflow) => [
90
88
  workflow,
@@ -92,11 +90,7 @@ export function selectLatestQualifiedSource({
92
90
  ]),
93
91
  );
94
92
  for (let index = 0; index < sourceHistory.length; index += 1) {
95
- const sourceSha =
96
- typeof sourceHistory[index] === "string"
97
- ? sourceHistory[index]
98
- : sourceHistory[index]?.sha;
99
- if (ignored.has(sourceSha)) continue;
93
+ const sourceSha = sourceHistory[index];
100
94
  const rows = requiredWorkflowPaths.map((workflow) =>
101
95
  latestByPath.get(workflow).get(sourceSha),
102
96
  );
@@ -121,9 +115,7 @@ export function selectLatestQualifiedSource({
121
115
  };
122
116
  }
123
117
  }
124
- const staleSuccessfulPair = sourceHistory.some((entry) => {
125
- const sourceSha = typeof entry === "string" ? entry : entry?.sha;
126
- if (ignored.has(sourceSha)) return false;
118
+ const staleSuccessfulPair = sourceHistory.some((sourceSha) => {
127
119
  const rows = requiredWorkflowPaths.map((workflow) =>
128
120
  latestByPath.get(workflow).get(sourceSha),
129
121
  );
@@ -6,7 +6,6 @@ const TERMINAL_STATES = new Set(["merged", "terminal-failure", "dequeued", "canc
6
6
  const QUEUED_CANCELLATION_EVENTS = new Map([
7
7
  ["closed", "cancelled"],
8
8
  ["cancelled", "cancelled"],
9
- ["synchronize", "cancelled"],
10
9
  ["dequeued", "dequeued"],
11
10
  ]);
12
11
 
@@ -2,7 +2,7 @@ import { devDeliveryContentRoot, devDeliveryExactRoot as exactRoot, devDeliveryE
2
2
 
3
3
  export const DEV_DELIVERY_SETTLEMENT_RECEIPT_SCHEMA = "kungfu.buildchain.dev-delivery-settlement-receipt/v1";
4
4
 
5
- function noopReceipt(queue, identity, candidate, action, details = {}) {
5
+ function noopReceipt(queue, identity, candidate, action) {
6
6
  return {
7
7
  schema: DEV_DELIVERY_SETTLEMENT_RECEIPT_SCHEMA,
8
8
  action,
@@ -17,36 +17,9 @@ function noopReceipt(queue, identity, candidate, action, details = {}) {
17
17
  expectedOldStateRoot: queue.stateRoot,
18
18
  nextStateRoot: queue.stateRoot,
19
19
  nextAction: "No fenced delivery state remains for this terminal event.",
20
- ...details,
21
20
  };
22
21
  }
23
22
 
24
- function settleTerminalCandidate(queue, identity, candidate) {
25
- if (candidate.status !== identity.outcome) {
26
- if (identity.outcome !== "dequeued") throw new Error("terminal candidate outcome does not match the terminal event");
27
- const receipt = noopReceipt(queue, identity, candidate, "stale-transient-dequeue-noop", {
28
- terminalClass: "transient-dequeue",
29
- authoritativeOutcome: candidate.status,
30
- nextAction: "Retain the authoritative terminal settlement; the stale dequeue cannot rewrite it.",
31
- });
32
- return { queue, receipt, receiptRoot: devDeliveryContentRoot(receipt) };
33
- }
34
- const receipt = noopReceipt(queue, identity, candidate, "duplicate-terminal-event-noop");
35
- return { queue, receipt, receiptRoot: devDeliveryContentRoot(receipt) };
36
- }
37
-
38
- function retainDequeuedWarrant(queue, identity, candidate, fencingToken, leaseGeneration, now) {
39
- const leaseFresh = Date.parse(queue.activeWarrant.expiresAt) > Date.parse(now);
40
- const receipt = noopReceipt(queue, identity, candidate, leaseFresh ? "transient-dequeue-retained-active-warrant" : "expired-active-warrant-awaits-fenced-settlement", {
41
- terminalClass: "transient-dequeue",
42
- fencingToken,
43
- leaseGeneration,
44
- warrantExpiresAt: queue.activeWarrant.expiresAt,
45
- nextAction: leaseFresh ? "Continue the exact active native execution and heartbeat; later candidates remain queued." : "Prove the stale native worker stopped, then close this exact fenced generation before selecting a successor.",
46
- });
47
- return { queue, receipt, receiptRoot: devDeliveryContentRoot(receipt) };
48
- }
49
-
50
23
  export function createDevDeliveryTerminalSettler({ normalizeQueue, closeWarrant, cancelQueued, terminalStates }) {
51
24
  return function settleDevDeliveryTerminalEvent(queueInput, input, { now = new Date().toISOString() } = {}) {
52
25
  const queue = normalizeQueue(queueInput);
@@ -60,39 +33,23 @@ export function createDevDeliveryTerminalSettler({ normalizeQueue, closeWarrant,
60
33
  };
61
34
  if (!terminalStates.has(identity.outcome)) throw new Error(`outcome must be one of ${[...terminalStates].join(", ")}`);
62
35
  const samePullRequest = queue.candidates.filter((entry) => entry.pullRequestNumber === identity.pullRequestNumber);
63
- const matchingHead = samePullRequest.filter((entry) => entry.sourceHead === identity.sourceHead);
64
- const activeCandidate = queue.activeWarrant ? matchingHead.find((entry) => entry.candidateId === queue.activeWarrant.candidateId) : null;
65
- const candidate = activeCandidate || matchingHead.at(-1) || null;
36
+ const candidate = samePullRequest.find((entry) => entry.sourceHead === identity.sourceHead) || null;
66
37
  if (!candidate && samePullRequest.length > 0) throw new Error("terminal event sourceHead does not match the recorded candidate");
67
38
 
68
39
  if (candidate && terminalStates.has(candidate.status)) {
69
- return settleTerminalCandidate(queue, identity, candidate);
40
+ if (candidate.status !== identity.outcome) throw new Error("terminal candidate outcome does not match the terminal event");
41
+ const receipt = noopReceipt(queue, identity, candidate, "duplicate-terminal-event-noop");
42
+ return { queue, receipt, receiptRoot: devDeliveryContentRoot(receipt) };
70
43
  }
71
44
 
72
45
  if (queue.activeWarrant) {
73
46
  if (!candidate || queue.activeWarrant.candidateId !== candidate.candidateId) throw new Error("terminal event does not match the active Delivery Warrant");
74
47
  if (!identity.evidenceRoot) throw new Error("active terminal settlement requires evidenceRoot");
75
- const fencingToken = exactRoot(input?.fencingToken, "fencingToken");
76
- const leaseGeneration = positiveInteger(input?.leaseGeneration, "leaseGeneration");
77
- if (fencingToken !== queue.activeWarrant.fencingToken) throw new Error("stale fencing token");
78
- if (leaseGeneration !== queue.activeWarrant.generation) throw new Error("stale lease generation");
79
- if (identity.outcome === "dequeued") {
80
- return retainDequeuedWarrant(queue, identity, candidate, fencingToken, leaseGeneration, now);
81
- }
82
- return closeWarrant(
83
- queue,
84
- {
85
- candidateId: candidate.candidateId,
86
- fencingToken,
87
- generation: leaseGeneration,
88
- },
89
- {
90
- outcome: identity.outcome,
91
- evidenceRoot: identity.evidenceRoot,
92
- reason: identity.reason,
93
- now,
94
- },
95
- );
48
+ return closeWarrant(queue, {
49
+ candidateId: candidate.candidateId,
50
+ fencingToken: exactRoot(input?.fencingToken, "fencingToken"),
51
+ generation: positiveInteger(input?.leaseGeneration, "leaseGeneration"),
52
+ }, { outcome: identity.outcome, evidenceRoot: identity.evidenceRoot, reason: identity.reason, now });
96
53
  }
97
54
 
98
55
  if (!candidate) {
@@ -102,19 +59,15 @@ export function createDevDeliveryTerminalSettler({ normalizeQueue, closeWarrant,
102
59
  if (candidate.status !== "queued") throw new Error(`candidate status ${candidate.status} requires an active Delivery Warrant`);
103
60
  if (!["cancelled", "dequeued"].includes(identity.outcome)) throw new Error("queued candidate cannot settle as merged or terminal-failure");
104
61
  if (!identity.evidenceRoot) throw new Error("queued terminal settlement requires evidenceRoot");
105
- return cancelQueued(
106
- queue,
107
- {
108
- candidateId: candidate.candidateId,
109
- pullRequestNumber: identity.pullRequestNumber,
110
- expectedSourceHead: identity.sourceHead,
111
- observedSourceHead: identity.sourceHead,
112
- eventAction: identity.eventAction || (identity.outcome === "dequeued" ? "dequeued" : "closed"),
113
- outcome: identity.outcome,
114
- evidenceRoot: identity.evidenceRoot,
115
- reason: identity.reason,
116
- },
117
- { now },
118
- );
62
+ return cancelQueued(queue, {
63
+ candidateId: candidate.candidateId,
64
+ pullRequestNumber: identity.pullRequestNumber,
65
+ expectedSourceHead: identity.sourceHead,
66
+ observedSourceHead: identity.sourceHead,
67
+ eventAction: identity.eventAction || (identity.outcome === "dequeued" ? "dequeued" : "closed"),
68
+ outcome: identity.outcome,
69
+ evidenceRoot: identity.evidenceRoot,
70
+ reason: identity.reason,
71
+ }, { now });
119
72
  };
120
73
  }