@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.
- package/AGENTS.md +39 -0
- package/README.md +17 -13
- package/actions/promote-buildchain-ref/README.md +0 -10
- package/actions/release-tail/README.md +6 -10
- package/architecture/internal-capabilities.json +502 -0
- package/architecture/maintainability-baseline.json +59 -0
- package/architecture/maintainability-policy.json +1384 -0
- package/architecture/release-tail-contract-inventory.json +587 -0
- package/architecture/v3-core-mechanism-inventory.json +1043 -0
- package/architecture/v3-core-mechanism-inventory.md +67 -0
- package/architecture/v4-adopter-delivery-parity.json +47 -0
- package/architecture/v4-architecture-constitution.md +210 -0
- package/architecture/v4-bootstrap-authority.json +56 -0
- package/architecture/v4-canonical-contract-fixtures.json +105 -0
- package/architecture/v4-capability-state-machine-manifest.json +480 -0
- package/architecture/v4-capability-state-machine-manifest.schema.json +202 -0
- package/architecture/v4-delivery-warrant-shadow-bootstrap-plan.json +830 -0
- package/architecture/v4-delivery-warrant-shadow-bootstrap-plan.md +223 -0
- package/architecture/v4-delivery-warrant-shadow-bootstrap-plan.schema.json +318 -0
- package/architecture/v4-delivery-warrant-shadow-fixtures.json +227 -0
- package/architecture/v4-delivery-warrant-shadow-fixtures.schema.json +67 -0
- package/architecture/v4-exception-ledger.json +5 -0
- package/architecture/v4-exception-ledger.schema.json +56 -0
- package/architecture/v4-partial-mutation-recovery-qualification.json +65 -0
- package/architecture/v4-platform-stage-checkpoints.json +97 -0
- package/architecture/v4-provider-operation-journal-contract.json +113 -0
- package/architecture/v4-release-activation-shadow-domain.json +61 -0
- package/architecture/v4-release-train-parity.json +68 -0
- package/architecture/v4-rust-libnode-bridge-evaluation.json +107 -0
- package/architecture/v4-rust-libnode-bridge-spike.md +85 -0
- package/architecture/v4-stable-publication-fence.json +66 -0
- package/architecture/v4-stage-capsule-contract.json +90 -0
- package/architecture/v4-stage-capsule-qualification.json +99 -0
- package/architecture/v4-stage-capsule-resume-planner.json +52 -0
- package/architecture/v4-stage-capsule-store-contract.json +72 -0
- package/bin/buildchain.mjs +15 -10
- package/contracts/auditable-demo-scenario-v1.schema.json +1 -1
- package/contracts/buildchain-v2-residuals-v1.json +2 -2
- package/contracts/fixtures/v4-delivery-warrant-trace-v1/golden.json +158 -0
- package/contracts/fixtures/v4-delivery-warrant-trace-v1/property.json +380 -0
- package/contracts/fixtures/v4-delivery-warrant-trace-v1/replay.json +163 -0
- package/contracts/fixtures/v4-partial-mutation-recovery-v1/shared.json +155 -0
- package/contracts/fixtures/v4-provider-operation-journal-v1/shared.json +457 -0
- package/contracts/fixtures/v4-provider-readback-idempotency-v1/shared.json +682 -0
- package/contracts/fixtures/v4-release-activation-shadow-v1/shared.json +53 -0
- package/contracts/fixtures/v4-stable-publication-fence-v1/shared.json +56 -0
- package/contracts/fixtures/v4-stage-capsule-resume-v1/late-platform-failure.json +176 -0
- package/contracts/fixtures/v4-stage-capsule-store-v1/shared.json +132 -0
- package/contracts/fixtures/v4-stage-capsule-v1/shared.json +111 -0
- package/contracts/v4-canonical-contracts-v1.schema.json +182 -0
- package/contracts/v4-delivery-warrant-semantic-diff-report-v1.schema.json +284 -0
- package/contracts/v4-delivery-warrant-trace-v1.schema.json +215 -0
- package/contracts/v4-host-contract-v1.schema.json +135 -0
- package/contracts/v4-partial-mutation-recovery-v1.schema.json +168 -0
- package/contracts/v4-provider-operation-journal-v1.schema.json +381 -0
- package/contracts/v4-release-activation-shadow-v1.schema.json +186 -0
- package/contracts/v4-stable-publication-fence-v1.schema.json +125 -0
- package/contracts/v4-stage-capsule-resume-v1.schema.json +225 -0
- package/contracts/v4-stage-capsule-store-v1.schema.json +154 -0
- package/contracts/v4-stage-capsule-v1.schema.json +178 -0
- package/crates/buildchain-v4-bridge/Cargo.lock +213 -0
- package/crates/buildchain-v4-bridge/Cargo.toml +12 -0
- package/crates/buildchain-v4-bridge/src/main.rs +495 -0
- package/dist/site/agent-index.json +0 -4
- package/dist/site/artifact-schemas.json +0 -8
- package/dist/site/buildchain-contract.json +103 -397
- package/dist/site/buildchain-site.json +302 -386
- package/dist/site/capability-registry.json +9 -11
- package/dist/site/cli-registry.json +8 -53
- package/dist/site/controller-registry.json +48 -8
- package/dist/site/kfd-claims.json +129 -167
- package/dist/site/kfd-upstream-aggregate.json +9 -9
- package/dist/site/manual-registry.json +18 -49
- package/dist/site/node-api-registry.json +4345 -7345
- package/dist/site/page-registry.json +278 -346
- package/dist/site/public-surface-audit.json +85 -404
- package/dist/site/publication-authority-registry.json +11 -1
- package/dist/site/publication-registry.json +4 -4
- package/dist/site/release-provenance.json +3 -9
- package/dist/site/schemas/kfd-support-projection-v1.schema.json +106 -0
- package/dist/site/site-manifest.json +22 -38
- package/dist/site/workflow-registry.json +78 -35
- package/docs/MAP.md +8 -5
- package/docs/auditable-demo.md +2 -2
- package/docs/aws-us-elastic-runner-burst-plane.md +7 -59
- package/docs/cli-reference.md +15 -213
- package/docs/cli.md +14 -14
- package/docs/dev-alpha-candidate-patrol.md +3 -11
- package/docs/dev-delivery-warrant.md +29 -194
- package/docs/engineering-housekeeper.md +12 -4
- package/docs/getting-started.md +1 -1
- package/docs/install.md +5 -5
- package/docs/kfd-support.md +2 -7
- package/docs/lifecycle-protocol.md +2 -4
- package/docs/node-api-reference.md +414 -554
- package/docs/release-flow.md +31 -31
- package/docs/release-governance.md +16 -28
- package/docs/release-passport.md +2 -15
- package/docs/release-tail-contract.md +13 -6
- package/docs/release-tail-provider-plane.md +13 -19
- package/docs/release-train.md +4 -4
- package/docs/reusable-build-surface.md +14 -27
- package/docs/site-bundle-contract.md +1 -5
- package/docs/stable-candidate-patrol.md +7 -7
- package/docs/v4-canonical-contracts.md +92 -0
- package/docs/v4-delivery-warrant-read-candidate.md +73 -0
- package/docs/v4-delivery-warrant-semantic-diff.md +75 -0
- package/docs/v4-production-release.md +63 -0
- package/docs/v4-stage-capsule.md +193 -0
- package/docs/versioning.md +3 -5
- package/package.json +19 -19
- package/packages/core/adopter-delivery-gate.js +576 -0
- package/packages/core/adopter-delivery-json.js +66 -0
- package/packages/core/artifact-signing.js +0 -61
- package/packages/core/artifact-verification-envelope.js +5 -5
- package/packages/core/build-facts.js +12 -4
- package/packages/core/buildchain-agent-manuals.js +0 -2
- package/packages/core/buildchain-channel-identity.js +3 -2
- package/packages/core/buildchain-config.js +4 -69
- package/packages/core/buildchain-contract.js +232 -46
- package/packages/core/buildchain-kfd-claims.js +1 -1
- package/packages/core/channel-candidate.js +0 -8
- package/packages/core/channel-promotion-baseline.js +0 -52
- package/packages/core/controller-evidence.js +3 -4
- package/packages/core/dev-alpha-candidate-selection.js +2 -10
- package/packages/core/dev-delivery-warrant-cancellation.js +0 -1
- package/packages/core/dev-delivery-warrant-settlement.js +20 -67
- package/packages/core/dev-delivery-warrant.js +50 -138
- package/packages/core/diagnostics.js +3 -8
- package/packages/core/github-governance-authority.js +3 -1
- package/packages/core/kfd-adopter-category-driver.js +167 -0
- package/packages/core/kfd-adopter-manifest.js +47 -46
- package/packages/core/kfd-gate.js +15 -45
- package/packages/core/paper-agent-entry.js +7 -16
- package/packages/core/paper-fleet.js +2 -2
- package/packages/core/paper-repository.js +2 -3
- package/packages/core/paper-scaffold-content.js +2 -23
- package/packages/core/paper.js +11 -43
- package/packages/core/publication-reproducibility.js +4 -4
- package/packages/core/release-line-bootstrap.js +21 -8
- package/packages/core/release-passport-contract.js +5 -5
- package/packages/core/release-passport.js +20 -131
- package/packages/core/self-dogfood-version.js +48 -35
- package/packages/core/spawn-command.js +232 -8
- package/packages/core/v4-adopter-delivery-parity.js +219 -0
- package/packages/core/v4-canonical-contracts.js +284 -0
- package/packages/core/v4-delivery-warrant-fixture-runner.js +371 -0
- package/packages/core/v4-delivery-warrant-read-candidate.js +279 -0
- package/packages/core/v4-delivery-warrant-semantic-diff-gate.js +352 -0
- package/packages/core/v4-delivery-warrant-shadow-adapter.js +447 -0
- package/packages/core/v4-partial-mutation-recovery-qualification.js +395 -0
- package/packages/core/v4-platform-stage-checkpoints.js +471 -0
- package/packages/core/v4-provider-operation-journal.js +531 -0
- package/packages/core/v4-provider-readback-idempotency.js +394 -0
- package/packages/core/v4-release-activation-shadow.js +519 -0
- package/packages/core/v4-stable-publication-fence.js +357 -0
- package/packages/core/v4-stage-capsule-local-store.js +426 -0
- package/packages/core/v4-stage-capsule-qualification-campaign.js +512 -0
- package/packages/core/v4-stage-capsule-qualification.js +456 -0
- package/packages/core/v4-stage-capsule-resume-planner.js +397 -0
- package/packages/core/v4-stage-capsule-store.js +401 -0
- package/packages/core/v4-stage-capsule.js +319 -0
- package/scripts/assemble-self-publication-admission.mjs +1 -1
- package/scripts/audit-publication-control-plane.mjs +5 -5
- package/scripts/auditable-demo-bundle-verification.mjs +3 -2
- package/scripts/auditable-demo-platform.mjs +2 -2
- package/scripts/auditable-demo-renditions.mjs +1 -1
- package/scripts/auditable-demo.mjs +2 -2
- package/scripts/aws-macos-jit-controller-core.mjs +13 -346
- package/scripts/aws-macos-jit-controller-runtime.mjs +2 -210
- package/scripts/aws-macos-jit-controller.mjs +37 -275
- package/scripts/aws-macos-jit-core.mjs +3 -41
- package/scripts/aws-macos-jit.mjs +0 -12
- package/scripts/aws-windows-jit-campaign.mjs +2 -2
- package/scripts/aws-windows-jit-controller-core.mjs +1 -1
- package/scripts/aws-windows-jit-controller.mjs +3 -3
- package/scripts/build-contract-core.mjs +3 -8
- package/scripts/build-standalone-binary.mjs +3 -14
- package/scripts/buildchain-channel-router.mjs +4 -0
- package/scripts/buildchain-cli-help.mjs +7 -16
- package/scripts/buildchain-contract-lock.mjs +0 -6
- package/scripts/check-action-bundles.mjs +3 -4
- package/scripts/check-internal-architecture.mjs +7 -6
- package/scripts/check-inventory.mjs +30 -25
- package/scripts/check-v4-public-dogfood-contract.mjs +270 -0
- package/scripts/create-release-bundle.mjs +8 -4
- package/scripts/dev-alpha-candidate-patrol.mjs +1 -22
- package/scripts/dev-delivery-proof.mjs +2 -64
- package/scripts/dev-delivery-warrant.mjs +61 -86
- package/scripts/dev-pr-auto-merge.mjs +4 -30
- package/scripts/dev-pr-delivery-warrant.mjs +0 -55
- package/scripts/dispatch-artifact-signing-authority.mjs +7 -4
- package/scripts/generate-buildchain-kfd-witnesses.mjs +94 -88
- package/scripts/generate-channel-build-workflow.mjs +54 -24
- package/scripts/generate-channel-promotion-workflow.mjs +15 -6
- package/scripts/generate-site-bundle.mjs +8 -27
- package/scripts/git-fetch-process-tree.mjs +34 -1
- package/scripts/init-repo.mjs +64 -159
- package/scripts/inspect-artifact-signing-requests.mjs +0 -6
- package/scripts/locked-source-checkout.mjs +3 -4
- package/scripts/maintainability-metrics.mjs +8 -2
- package/scripts/npm-publish-dry-run.mjs +2 -2
- package/scripts/npm-publish-transaction.mjs +2 -2
- package/scripts/publication-commit-evidence.mjs +23 -69
- package/scripts/release-candidate-resolver.mjs +11 -17
- package/scripts/release-tail.mjs +3 -49
- package/scripts/resume-from-candidate-run.mjs +9 -123
- package/scripts/run-lifecycle-core.mjs +12 -13
- package/scripts/seal-artifact-signing-requests.mjs +17 -21
- package/scripts/site-capability-metadata.mjs +3 -20
- package/scripts/stable-candidate-qualification.mjs +10 -10
- package/scripts/v4-architecture.mjs +12 -2
- package/scripts/v4-bridge-bootstrap.mjs +141 -0
- package/scripts/v4-bridge-evidence.mjs +141 -0
- package/scripts/v4-host-adapter.mjs +182 -0
- package/scripts/v4-platform-stage-checkpoint-rehearsal.mjs +207 -0
- package/scripts/v4-stage-capsule-qualification.mjs +528 -0
- package/scripts/v4-stage-capsule-resume-rehearsal.mjs +57 -0
- package/scripts/v4-warrant-shadow-plan.mjs +601 -0
- package/scripts/verify-golden-path.mjs +5 -5
- package/scripts/web-surface-cloudfront-rewrite.mjs +15 -15
- package/scripts/web-surface-core.mjs +2 -8
- package/scripts/workflow-call-contract.mjs +5 -184
- package/contracts/dev-delivery-authority-v2.schema.json +0 -253
- package/contracts/fixtures/kfd-adopter-release-v1/kfd-4-perspective.json +0 -16
- package/contracts/fixtures/kfd-adopter-release-v1/kfd-4-replay.json +0 -57
- package/contracts/fixtures/next-development-transition-v1/anchored-manual-waiting.json +0 -47
- package/contracts/fixtures/next-development-transition-v1/semver-auto-planned.json +0 -47
- package/contracts/fixtures/next-development-transition-v1/version-model-cases.json +0 -40
- package/contracts/next-development-request-v1.schema.json +0 -66
- package/contracts/next-development-transition-v1.schema.json +0 -292
- package/contracts/publication-rehearsal-capsule-v1.schema.json +0 -173
- package/dist/site/schemas/dev-delivery-authority-v2.schema.json +0 -442
- package/dist/site/schemas/publication-rehearsal-capsule-v1.schema.json +0 -269
- package/dist/site/schemas/release-tail-capabilities-v1.schema.json +0 -353
- package/dist/site/schemas/release-tail-provider-bindings-v1.schema.json +0 -94
- package/docs/dev-delivery-qualification-landing-adr.md +0 -137
- package/docs/next-development-transition.md +0 -119
- package/docs/publication-rehearsal.md +0 -94
- package/packages/core/buildchain-compatibility-proof.js +0 -631
- package/packages/core/dev-delivery-authority.js +0 -996
- package/packages/core/dev-delivery-native-proof.js +0 -418
- package/packages/core/dev-delivery-warrant-shadow.js +0 -502
- package/packages/core/next-development-candidate-reservation.js +0 -186
- package/packages/core/next-development-controller.js +0 -726
- package/packages/core/next-development-projection.js +0 -288
- package/packages/core/next-development-transition.js +0 -738
- package/packages/core/publication-rehearsal-projection.js +0 -173
- package/packages/core/publication-rehearsal-runtime.js +0 -921
- package/scripts/aws-macos-jit-instance-rehydrate.mjs +0 -260
- package/scripts/aws-macos-jit-source-rebind.mjs +0 -724
- package/scripts/dev-delivery-authority.mjs +0 -368
- package/scripts/dev-delivery-native-run.mjs +0 -235
- package/scripts/dev-delivery-two-phase-resume.mjs +0 -90
- package/scripts/dev-delivery-two-phase.mjs +0 -577
- package/scripts/generate-next-development-guidance.mjs +0 -49
- package/scripts/materialize-self-release-candidate-version.mjs +0 -137
- package/scripts/next-development-self-dogfood-harness.mjs +0 -409
- package/scripts/next-development-self-dogfood.mjs +0 -532
- package/scripts/next-development-transition.mjs +0 -47
- package/scripts/release-candidate-tail-reseal.mjs +0 -426
- 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
|
-
...
|
|
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", "
|
|
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((
|
|
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
|
);
|
|
@@ -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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
}
|