@kungfu-tech/buildchain 3.0.6-alpha.3 → 3.0.6-alpha.4
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/contracts/release-candidate-recovery-v1.schema.json +3 -2
- package/dist/site/buildchain-contract.json +4 -4
- package/dist/site/buildchain-site.json +7 -7
- package/dist/site/kfd-claims.json +2 -2
- package/dist/site/kfd-upstream-aggregate.json +1 -1
- package/dist/site/manual-registry.json +1 -1
- package/dist/site/node-api-registry.json +6 -6
- package/dist/site/page-registry.json +2 -2
- package/dist/site/public-surface-audit.json +1 -1
- package/dist/site/publication-registry.json +4 -4
- package/dist/site/site-manifest.json +5 -5
- package/docs/node-api-reference.md +6 -6
- package/package.json +1 -1
- package/packages/core/release-candidate-recovery.js +33 -13
- package/scripts/check-inventory.mjs +1 -1
- package/scripts/resume-from-candidate-run.mjs +49 -20
|
@@ -7604,7 +7604,7 @@
|
|
|
7604
7604
|
"pageRegistryPath": "dist/site/page-registry.json",
|
|
7605
7605
|
"cliRegistryDigest": "2e7804e1fa8ef08bbe59fcf58908e47daef4dc145675fc9a989862671e40f993",
|
|
7606
7606
|
"workflowRegistryDigest": "1ab8b8d32f2ceb8dffad69d1f877f6ad6b37355dbe62c6ef5c0e6b9f4f197acb",
|
|
7607
|
-
"pageRegistryDigest": "
|
|
7607
|
+
"pageRegistryDigest": "ce8922a853a4784781b708b0572cb3035ec08058847900b1eff2580130ba6d28"
|
|
7608
7608
|
},
|
|
7609
7609
|
"comparison": {
|
|
7610
7610
|
"missingCliRegistry": [],
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"contract": "kungfu-buildchain-publication-release-registry",
|
|
4
|
-
"generatedAt": "2026-08-
|
|
5
|
-
"publishedAt": "2026-08-
|
|
4
|
+
"generatedAt": "2026-08-06T04:18:30.646Z",
|
|
5
|
+
"publishedAt": "2026-08-06T04:18:30.646Z",
|
|
6
6
|
"reproducible": true,
|
|
7
7
|
"timestampPolicy": "ci-injected",
|
|
8
8
|
"deterministicInputs": [
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"declared Buildchain surface manifest contract"
|
|
20
20
|
],
|
|
21
21
|
"sourceDateEpoch": "0",
|
|
22
|
-
"sourceRevision": "
|
|
22
|
+
"sourceRevision": "0adfa4b1f1784f8d43ac056991822a32cf5e8e7f",
|
|
23
23
|
"timestampPolicyDetails": {
|
|
24
24
|
"contract": "kungfu-buildchain-surface-timestamp-policy",
|
|
25
25
|
"timestampFields": [
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
},
|
|
33
33
|
"package": {
|
|
34
34
|
"name": "@kungfu-tech/buildchain",
|
|
35
|
-
"version": "3.0.6-alpha.
|
|
35
|
+
"version": "3.0.6-alpha.4",
|
|
36
36
|
"versionSource": "package.json#version"
|
|
37
37
|
},
|
|
38
38
|
"sourceKind": "package-site-bundle",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"contract": "kungfu-buildchain-site-manifest",
|
|
4
|
-
"generatedAt": "2026-08-
|
|
5
|
-
"publishedAt": "2026-08-
|
|
4
|
+
"generatedAt": "2026-08-06T04:18:30.646Z",
|
|
5
|
+
"publishedAt": "2026-08-06T04:18:30.646Z",
|
|
6
6
|
"reproducible": true,
|
|
7
7
|
"timestampPolicy": "ci-injected",
|
|
8
8
|
"deterministicInputs": [
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"declared Buildchain surface manifest contract"
|
|
20
20
|
],
|
|
21
21
|
"sourceDateEpoch": "0",
|
|
22
|
-
"sourceRevision": "
|
|
22
|
+
"sourceRevision": "0adfa4b1f1784f8d43ac056991822a32cf5e8e7f",
|
|
23
23
|
"timestampPolicyDetails": {
|
|
24
24
|
"contract": "kungfu-buildchain-surface-timestamp-policy",
|
|
25
25
|
"timestampFields": [
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
},
|
|
38
38
|
"package": {
|
|
39
39
|
"name": "@kungfu-tech/buildchain",
|
|
40
|
-
"version": "3.0.6-alpha.
|
|
40
|
+
"version": "3.0.6-alpha.4",
|
|
41
41
|
"versionSource": "package.json#version"
|
|
42
42
|
},
|
|
43
43
|
"entrypoint": "buildchain-site.json",
|
|
@@ -237,7 +237,7 @@
|
|
|
237
237
|
"path": "docs/node-api-reference.md",
|
|
238
238
|
"plane": "use",
|
|
239
239
|
"exists": true,
|
|
240
|
-
"digest": "sha256:
|
|
240
|
+
"digest": "sha256:18da0179c3dbfee4fa393d46111122ef16b9da1130092b6d88d820e4277e87c2"
|
|
241
241
|
},
|
|
242
242
|
{
|
|
243
243
|
"id": "build-facts",
|
|
@@ -447,7 +447,7 @@ Target: `./packages/core/index.js`. Public symbols: 562.
|
|
|
447
447
|
| `readReleaseTransaction` | function: function readReleaseTransaction(filePath) | filePath | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { readReleaseTransaction } from "@kungfu-tech/buildchain";` | `packages/core/publish-transaction.js:367` |
|
|
448
448
|
| `recordReleaseActivationPhase` | function: function recordReleaseActivationPhase(transaction, phaseId, { receiptRoots = [], failure = "" } = {}) | transaction, phaseId, { receiptRoots = [], failure = "" } = {} | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | may-write-or-invoke-external-actions | `import { recordReleaseActivationPhase } from "@kungfu-tech/buildchain";` | `packages/core/release-activation-transaction.js:217` |
|
|
449
449
|
| `recordReleasePropagationStage` | function: function recordReleasePropagationStage({ work, expectedWorkRoot, receipt } = {}) | { work, expectedWorkRoot, receipt } = {} | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | may-write-or-invoke-external-actions | `import { recordReleasePropagationStage } from "@kungfu-tech/buildchain";` | `packages/core/release-propagation-work-transitions.js:45` |
|
|
450
|
-
| `recoveryFailure` | function: function recoveryFailure(error) | error | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { recoveryFailure } from "@kungfu-tech/buildchain";` | `packages/core/release-candidate-recovery.js:
|
|
450
|
+
| `recoveryFailure` | function: function recoveryFailure(error) | error | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { recoveryFailure } from "@kungfu-tech/buildchain";` | `packages/core/release-candidate-recovery.js:396` |
|
|
451
451
|
| `redactBuildchainLogAttributes` | function: function redactBuildchainLogAttributes(attributes = {}) | attributes = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { redactBuildchainLogAttributes } from "@kungfu-tech/buildchain";` | `packages/core/logging.js:33` |
|
|
452
452
|
| `redactDiagnosticsValue` | function: function redactDiagnosticsValue(key, value, pattern = DEFAULT_SECRET_KEY_PATTERN) | key, value, pattern = DEFAULT_SECRET_KEY_PATTERN | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { redactDiagnosticsValue } from "@kungfu-tech/buildchain";` | `packages/core/diagnostics.js:953` |
|
|
453
453
|
| `redactIssueText` | function: function redactIssueText(value) | value | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { redactIssueText } from "@kungfu-tech/buildchain";` | `packages/core/issue-reporting.js:51` |
|
|
@@ -571,7 +571,7 @@ Target: `./packages/core/index.js`. Public symbols: 562.
|
|
|
571
571
|
| `verifyPublicationQualificationReceipt` | function: function verifyPublicationQualificationReceipt({ receipt, capability, gateAggregate, expected = {}, usedNonces = [], now = new Date(), } = {}) | { receipt, capability, gateAggregate, expected = {}, usedNonces = [], now = new Date(), } = {} | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { verifyPublicationQualificationReceipt } from "@kungfu-tech/buildchain";` | `packages/core/publication-authority.js:1096` |
|
|
572
572
|
| `verifyPublicationReproducibility` | function: function verifyPublicationReproducibility({ cwd = process.cwd(), sourceSha = "", output = DEFAULT_OUTPUT, promote = false, keepWorkspaces = false, pullToolchain = true, packageName = "", allowUnpinnedToolchain = false, overlayPaths = [DEFAULT_REGISTRY_INPUT_DIR, DEFAULT_REGISTRY_HYDRATION], } = {}) | { cwd = process.cwd(), sourceSha = "", output = DEFAULT_OUTPUT, promote = false, keepWorkspaces = false, pullToolchain = true, packageName = "", allowUnpinnedToolchain = false, overlayPaths = [DEFAULT_REGISTRY_INPUT_DIR, DEFAULT_REGISTRY_HYDRATION], } = {} | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | local-filesystem-write | `import { verifyPublicationReproducibility } from "@kungfu-tech/buildchain";` | `packages/core/publication-reproducibility.js:869` |
|
|
573
573
|
| `verifyPublicationSealedBundle` | function: function verifyPublicationSealedBundle({ bundleRoot, manifest } = {}) | { bundleRoot, manifest } = {} | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { verifyPublicationSealedBundle } from "@kungfu-tech/buildchain";` | `packages/core/publication-sealed-bundle.js:124` |
|
|
574
|
-
| `verifyReleaseCandidateRecovery` | function: function verifyReleaseCandidateRecovery({ candidateRepository, targetRepository, expectedRunId, expectedWorkflowFile, expectedWorkflowName, channel, targetRef, targetSha, targetTree, expectedSourceTree = "", expectedCandidateRoot = "", expectedRuntimeSha, expectedTransactionId = "", existingTransaction = undefined, run, workflow, pullRequest, ancestry, passport, buildSummary, controllerReceipts = [], platformManifests = [], productPayloadManifests = [], artifacts = [], currentToolingSha, recoveryRunId = "", createdAt = new Date().toISOString(), } = {}) | { candidateRepository, targetRepository, expectedRunId, expectedWorkflowFile, expectedWorkflowName, channel, targetRef, targetSha, targetTree, expectedSourceTree = "", expectedCandidateRoot = "", expectedRuntimeSha, expectedTransactionId = "", existingTransaction = undefined, run, workflow, pullRequest, ancestry, passport, buildSummary, controllerReceipts = [], platformManifests = [], productPayloadManifests = [], artifacts = [], currentToolingSha, recoveryRunId = "", createdAt = new Date().toISOString(), } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { verifyReleaseCandidateRecovery } from "@kungfu-tech/buildchain";` | `packages/core/release-candidate-recovery.js:
|
|
574
|
+
| `verifyReleaseCandidateRecovery` | function: function verifyReleaseCandidateRecovery({ candidateRepository, targetRepository, expectedRunId, expectedWorkflowFile, expectedWorkflowName, channel, targetRef, targetSha, targetTree, expectedSourceTree = "", expectedCandidateRoot = "", expectedRuntimeSha, expectedTransactionId = "", existingTransaction = undefined, run, workflow, pullRequest, ancestry, passport, buildSummary, controllerReceipts = [], platformManifests = [], platformManifestEvidence = [], productPayloadManifests = [], artifacts = [], publicationVersion = "", currentToolingSha, recoveryRunId = "", createdAt = new Date().toISOString(), } = {}) | { candidateRepository, targetRepository, expectedRunId, expectedWorkflowFile, expectedWorkflowName, channel, targetRef, targetSha, targetTree, expectedSourceTree = "", expectedCandidateRoot = "", expectedRuntimeSha, expectedTransactionId = "", existingTransaction = undefined, run, workflow, pullRequest, ancestry, passport, buildSummary, controllerReceipts = [], platformManifests = [], platformManifestEvidence = [], productPayloadManifests = [], artifacts = [], publicationVersion = "", currentToolingSha, recoveryRunId = "", createdAt = new Date().toISOString(), } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { verifyReleaseCandidateRecovery } from "@kungfu-tech/buildchain";` | `packages/core/release-candidate-recovery.js:273` |
|
|
575
575
|
| `verifyReleasePassport` | function: async function verifyReleasePassport({ passportLocation, artifactEvidenceLocation = "", publishEvidenceLocation = "", impactLocation = "", agentIndexLocation = "", productMechanismLocation = "", kfdAgentHubEvidenceLocation = "", kfdSupportEvidenceLocation = "", checkedAt = nowIso(), } = {}) | { passportLocation, artifactEvidenceLocation = "", publishEvidenceLocation = "", impactLocation = "", agentIndexLocation = "", productMechanismLocation = "", kfdAgentHubEvidenceLocation = "", kfdSupportEvidenceLocation = "", checkedAt = nowIso(), } = {} | Promise<unknown> | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { verifyReleasePassport } from "@kungfu-tech/buildchain";` | `packages/core/release-passport.js:2743` |
|
|
576
576
|
| `verifyReleasePropagationWork` | function: function verifyReleasePropagationWork(input) | input | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { verifyReleasePropagationWork } from "@kungfu-tech/buildchain";` | `packages/core/release-propagation-work.js:486` |
|
|
577
577
|
| `WEB_SURFACE_PRODUCTION_DECISION_CONTRACT` | constant: const WEB_SURFACE_PRODUCTION_DECISION_CONTRACT | none | value | Import does not declare a throw contract. | none-on-import | `import { WEB_SURFACE_PRODUCTION_DECISION_CONTRACT } from "@kungfu-tech/buildchain";` | `packages/core/web-surface-publication-candidate.js:7` |
|
|
@@ -1062,7 +1062,7 @@ Target: `./packages/core/index.js`. Public symbols: 562.
|
|
|
1062
1062
|
| `readReleaseTransaction` | function: function readReleaseTransaction(filePath) | filePath | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { readReleaseTransaction } from "@kungfu-tech/buildchain/core";` | `packages/core/publish-transaction.js:367` |
|
|
1063
1063
|
| `recordReleaseActivationPhase` | function: function recordReleaseActivationPhase(transaction, phaseId, { receiptRoots = [], failure = "" } = {}) | transaction, phaseId, { receiptRoots = [], failure = "" } = {} | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | may-write-or-invoke-external-actions | `import { recordReleaseActivationPhase } from "@kungfu-tech/buildchain/core";` | `packages/core/release-activation-transaction.js:217` |
|
|
1064
1064
|
| `recordReleasePropagationStage` | function: function recordReleasePropagationStage({ work, expectedWorkRoot, receipt } = {}) | { work, expectedWorkRoot, receipt } = {} | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | may-write-or-invoke-external-actions | `import { recordReleasePropagationStage } from "@kungfu-tech/buildchain/core";` | `packages/core/release-propagation-work-transitions.js:45` |
|
|
1065
|
-
| `recoveryFailure` | function: function recoveryFailure(error) | error | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { recoveryFailure } from "@kungfu-tech/buildchain/core";` | `packages/core/release-candidate-recovery.js:
|
|
1065
|
+
| `recoveryFailure` | function: function recoveryFailure(error) | error | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { recoveryFailure } from "@kungfu-tech/buildchain/core";` | `packages/core/release-candidate-recovery.js:396` |
|
|
1066
1066
|
| `redactBuildchainLogAttributes` | function: function redactBuildchainLogAttributes(attributes = {}) | attributes = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { redactBuildchainLogAttributes } from "@kungfu-tech/buildchain/core";` | `packages/core/logging.js:33` |
|
|
1067
1067
|
| `redactDiagnosticsValue` | function: function redactDiagnosticsValue(key, value, pattern = DEFAULT_SECRET_KEY_PATTERN) | key, value, pattern = DEFAULT_SECRET_KEY_PATTERN | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { redactDiagnosticsValue } from "@kungfu-tech/buildchain/core";` | `packages/core/diagnostics.js:953` |
|
|
1068
1068
|
| `redactIssueText` | function: function redactIssueText(value) | value | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { redactIssueText } from "@kungfu-tech/buildchain/core";` | `packages/core/issue-reporting.js:51` |
|
|
@@ -1186,7 +1186,7 @@ Target: `./packages/core/index.js`. Public symbols: 562.
|
|
|
1186
1186
|
| `verifyPublicationQualificationReceipt` | function: function verifyPublicationQualificationReceipt({ receipt, capability, gateAggregate, expected = {}, usedNonces = [], now = new Date(), } = {}) | { receipt, capability, gateAggregate, expected = {}, usedNonces = [], now = new Date(), } = {} | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { verifyPublicationQualificationReceipt } from "@kungfu-tech/buildchain/core";` | `packages/core/publication-authority.js:1096` |
|
|
1187
1187
|
| `verifyPublicationReproducibility` | function: function verifyPublicationReproducibility({ cwd = process.cwd(), sourceSha = "", output = DEFAULT_OUTPUT, promote = false, keepWorkspaces = false, pullToolchain = true, packageName = "", allowUnpinnedToolchain = false, overlayPaths = [DEFAULT_REGISTRY_INPUT_DIR, DEFAULT_REGISTRY_HYDRATION], } = {}) | { cwd = process.cwd(), sourceSha = "", output = DEFAULT_OUTPUT, promote = false, keepWorkspaces = false, pullToolchain = true, packageName = "", allowUnpinnedToolchain = false, overlayPaths = [DEFAULT_REGISTRY_INPUT_DIR, DEFAULT_REGISTRY_HYDRATION], } = {} | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | local-filesystem-write | `import { verifyPublicationReproducibility } from "@kungfu-tech/buildchain/core";` | `packages/core/publication-reproducibility.js:869` |
|
|
1188
1188
|
| `verifyPublicationSealedBundle` | function: function verifyPublicationSealedBundle({ bundleRoot, manifest } = {}) | { bundleRoot, manifest } = {} | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { verifyPublicationSealedBundle } from "@kungfu-tech/buildchain/core";` | `packages/core/publication-sealed-bundle.js:124` |
|
|
1189
|
-
| `verifyReleaseCandidateRecovery` | function: function verifyReleaseCandidateRecovery({ candidateRepository, targetRepository, expectedRunId, expectedWorkflowFile, expectedWorkflowName, channel, targetRef, targetSha, targetTree, expectedSourceTree = "", expectedCandidateRoot = "", expectedRuntimeSha, expectedTransactionId = "", existingTransaction = undefined, run, workflow, pullRequest, ancestry, passport, buildSummary, controllerReceipts = [], platformManifests = [], productPayloadManifests = [], artifacts = [], currentToolingSha, recoveryRunId = "", createdAt = new Date().toISOString(), } = {}) | { candidateRepository, targetRepository, expectedRunId, expectedWorkflowFile, expectedWorkflowName, channel, targetRef, targetSha, targetTree, expectedSourceTree = "", expectedCandidateRoot = "", expectedRuntimeSha, expectedTransactionId = "", existingTransaction = undefined, run, workflow, pullRequest, ancestry, passport, buildSummary, controllerReceipts = [], platformManifests = [], productPayloadManifests = [], artifacts = [], currentToolingSha, recoveryRunId = "", createdAt = new Date().toISOString(), } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { verifyReleaseCandidateRecovery } from "@kungfu-tech/buildchain/core";` | `packages/core/release-candidate-recovery.js:
|
|
1189
|
+
| `verifyReleaseCandidateRecovery` | function: function verifyReleaseCandidateRecovery({ candidateRepository, targetRepository, expectedRunId, expectedWorkflowFile, expectedWorkflowName, channel, targetRef, targetSha, targetTree, expectedSourceTree = "", expectedCandidateRoot = "", expectedRuntimeSha, expectedTransactionId = "", existingTransaction = undefined, run, workflow, pullRequest, ancestry, passport, buildSummary, controllerReceipts = [], platformManifests = [], platformManifestEvidence = [], productPayloadManifests = [], artifacts = [], publicationVersion = "", currentToolingSha, recoveryRunId = "", createdAt = new Date().toISOString(), } = {}) | { candidateRepository, targetRepository, expectedRunId, expectedWorkflowFile, expectedWorkflowName, channel, targetRef, targetSha, targetTree, expectedSourceTree = "", expectedCandidateRoot = "", expectedRuntimeSha, expectedTransactionId = "", existingTransaction = undefined, run, workflow, pullRequest, ancestry, passport, buildSummary, controllerReceipts = [], platformManifests = [], platformManifestEvidence = [], productPayloadManifests = [], artifacts = [], publicationVersion = "", currentToolingSha, recoveryRunId = "", createdAt = new Date().toISOString(), } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { verifyReleaseCandidateRecovery } from "@kungfu-tech/buildchain/core";` | `packages/core/release-candidate-recovery.js:273` |
|
|
1190
1190
|
| `verifyReleasePassport` | function: async function verifyReleasePassport({ passportLocation, artifactEvidenceLocation = "", publishEvidenceLocation = "", impactLocation = "", agentIndexLocation = "", productMechanismLocation = "", kfdAgentHubEvidenceLocation = "", kfdSupportEvidenceLocation = "", checkedAt = nowIso(), } = {}) | { passportLocation, artifactEvidenceLocation = "", publishEvidenceLocation = "", impactLocation = "", agentIndexLocation = "", productMechanismLocation = "", kfdAgentHubEvidenceLocation = "", kfdSupportEvidenceLocation = "", checkedAt = nowIso(), } = {} | Promise<unknown> | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { verifyReleasePassport } from "@kungfu-tech/buildchain/core";` | `packages/core/release-passport.js:2743` |
|
|
1191
1191
|
| `verifyReleasePropagationWork` | function: function verifyReleasePropagationWork(input) | input | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { verifyReleasePropagationWork } from "@kungfu-tech/buildchain/core";` | `packages/core/release-propagation-work.js:486` |
|
|
1192
1192
|
| `WEB_SURFACE_PRODUCTION_DECISION_CONTRACT` | constant: const WEB_SURFACE_PRODUCTION_DECISION_CONTRACT | none | value | Import does not declare a throw contract. | none-on-import | `import { WEB_SURFACE_PRODUCTION_DECISION_CONTRACT } from "@kungfu-tech/buildchain/core";` | `packages/core/web-surface-publication-candidate.js:7` |
|
|
@@ -1910,10 +1910,10 @@ Target: `./packages/core/release-candidate-recovery.js`. Public symbols: 4.
|
|
|
1910
1910
|
|
|
1911
1911
|
| Symbol | Kind and signature | Parameters | Return | Errors | Side effects | Example | Source |
|
|
1912
1912
|
| --- | --- | --- | --- | --- | --- | --- | --- |
|
|
1913
|
-
| `recoveryFailure` | function: function recoveryFailure(error) | error | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { recoveryFailure } from "@kungfu-tech/buildchain/release-candidate-recovery";` | `packages/core/release-candidate-recovery.js:
|
|
1913
|
+
| `recoveryFailure` | function: function recoveryFailure(error) | error | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { recoveryFailure } from "@kungfu-tech/buildchain/release-candidate-recovery";` | `packages/core/release-candidate-recovery.js:396` |
|
|
1914
1914
|
| `RELEASE_CANDIDATE_RECOVERY_CONTRACT` | constant: const RELEASE_CANDIDATE_RECOVERY_CONTRACT | none | value | Import does not declare a throw contract. | none-on-import | `import { RELEASE_CANDIDATE_RECOVERY_CONTRACT } from "@kungfu-tech/buildchain/release-candidate-recovery";` | `packages/core/release-candidate-recovery.js:11` |
|
|
1915
1915
|
| `ReleaseCandidateRecoveryError` | class: class ReleaseCandidateRecoveryError | none | ReleaseCandidateRecoveryError | Construction and method errors follow the linked source implementation. | class-dependent | `import { ReleaseCandidateRecoveryError } from "@kungfu-tech/buildchain/release-candidate-recovery";` | `packages/core/release-candidate-recovery.js:18` |
|
|
1916
|
-
| `verifyReleaseCandidateRecovery` | function: function verifyReleaseCandidateRecovery({ candidateRepository, targetRepository, expectedRunId, expectedWorkflowFile, expectedWorkflowName, channel, targetRef, targetSha, targetTree, expectedSourceTree = "", expectedCandidateRoot = "", expectedRuntimeSha, expectedTransactionId = "", existingTransaction = undefined, run, workflow, pullRequest, ancestry, passport, buildSummary, controllerReceipts = [], platformManifests = [], productPayloadManifests = [], artifacts = [], currentToolingSha, recoveryRunId = "", createdAt = new Date().toISOString(), } = {}) | { candidateRepository, targetRepository, expectedRunId, expectedWorkflowFile, expectedWorkflowName, channel, targetRef, targetSha, targetTree, expectedSourceTree = "", expectedCandidateRoot = "", expectedRuntimeSha, expectedTransactionId = "", existingTransaction = undefined, run, workflow, pullRequest, ancestry, passport, buildSummary, controllerReceipts = [], platformManifests = [], productPayloadManifests = [], artifacts = [], currentToolingSha, recoveryRunId = "", createdAt = new Date().toISOString(), } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { verifyReleaseCandidateRecovery } from "@kungfu-tech/buildchain/release-candidate-recovery";` | `packages/core/release-candidate-recovery.js:
|
|
1916
|
+
| `verifyReleaseCandidateRecovery` | function: function verifyReleaseCandidateRecovery({ candidateRepository, targetRepository, expectedRunId, expectedWorkflowFile, expectedWorkflowName, channel, targetRef, targetSha, targetTree, expectedSourceTree = "", expectedCandidateRoot = "", expectedRuntimeSha, expectedTransactionId = "", existingTransaction = undefined, run, workflow, pullRequest, ancestry, passport, buildSummary, controllerReceipts = [], platformManifests = [], platformManifestEvidence = [], productPayloadManifests = [], artifacts = [], publicationVersion = "", currentToolingSha, recoveryRunId = "", createdAt = new Date().toISOString(), } = {}) | { candidateRepository, targetRepository, expectedRunId, expectedWorkflowFile, expectedWorkflowName, channel, targetRef, targetSha, targetTree, expectedSourceTree = "", expectedCandidateRoot = "", expectedRuntimeSha, expectedTransactionId = "", existingTransaction = undefined, run, workflow, pullRequest, ancestry, passport, buildSummary, controllerReceipts = [], platformManifests = [], platformManifestEvidence = [], productPayloadManifests = [], artifacts = [], publicationVersion = "", currentToolingSha, recoveryRunId = "", createdAt = new Date().toISOString(), } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { verifyReleaseCandidateRecovery } from "@kungfu-tech/buildchain/release-candidate-recovery";` | `packages/core/release-candidate-recovery.js:273` |
|
|
1917
1917
|
|
|
1918
1918
|
## `@kungfu-tech/buildchain/stable-candidate-ledger`
|
|
1919
1919
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kungfu-tech/buildchain",
|
|
3
|
-
"version": "3.0.6-alpha.
|
|
3
|
+
"version": "3.0.6-alpha.4",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Buildchain Release Passport, release governance, CLI toolkit, and site facts.",
|
|
6
6
|
"repository": "https://github.com/kungfu-systems/buildchain",
|
|
@@ -93,13 +93,14 @@ function normalizedRef(value) {
|
|
|
93
93
|
return String(value || "").replace(/^refs\/heads\//, "").trim();
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
function
|
|
97
|
-
return
|
|
96
|
+
function sameArtifactFile(left, right) {
|
|
97
|
+
return Boolean(left && right && left.size === right.size && left.sha256 === right.sha256);
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
function validatePlatformPayloads(passport, artifacts, platformManifests) {
|
|
100
|
+
function validatePlatformPayloads(passport, artifacts, platformManifests, platformManifestEvidence) {
|
|
101
101
|
const byName = new Map(artifacts.map((artifact) => [artifact.name, artifact]));
|
|
102
102
|
const manifestsByArtifact = new Map((platformManifests || []).map((manifest) => [manifest.artifactName, manifest]));
|
|
103
|
+
const evidenceByArtifact = new Map((platformManifestEvidence || []).map((evidence) => [evidence.artifactName, evidence]));
|
|
103
104
|
if (manifestsByArtifact.size !== (passport.platformMatrix || []).length) {
|
|
104
105
|
fail("platform-matrix-mismatch", "platform manifest count differs from the Passport platform matrix", "Restore every exact platform manifest from the candidate run.");
|
|
105
106
|
}
|
|
@@ -122,10 +123,26 @@ function validatePlatformPayloads(passport, artifacts, platformManifests) {
|
|
|
122
123
|
size: Number(file.size ?? file.bytes),
|
|
123
124
|
sha256: `sha256:${String(file.sha256 || "").replace(/^sha256:/, "")}`,
|
|
124
125
|
})).sort((left, right) => left.path.localeCompare(right.path));
|
|
125
|
-
const
|
|
126
|
-
const
|
|
127
|
-
|
|
128
|
-
|
|
126
|
+
const platformId = required(platform.platformId, `${platform.artifactName}.platformId`);
|
|
127
|
+
const buildchainEvidencePrefix = `.buildchain/artifacts/${platformId}/`;
|
|
128
|
+
const manifestByPath = new Map(manifestFiles.map((file) => [file.path, file]));
|
|
129
|
+
const evidenceFiles = new Map((evidenceByArtifact.get(platform.artifactName)?.files || []).map((file) => [file.path, file]));
|
|
130
|
+
const payloadPaths = new Set(payload.files.map((file) => file.path));
|
|
131
|
+
for (const manifestFile of manifestFiles) {
|
|
132
|
+
if (!payloadPaths.has(manifestFile.path)) {
|
|
133
|
+
fail("artifact-manifest-mismatch", `platform payload omits a manifest-declared file: ${platform.artifactName}/${manifestFile.path}`, "Do not publish; preserve the mismatched manifest and payload evidence.");
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
for (const payloadFile of payload.files) {
|
|
137
|
+
const manifestFile = manifestByPath.get(payloadFile.path);
|
|
138
|
+
if (sameArtifactFile(payloadFile, manifestFile)) continue;
|
|
139
|
+
const evidencePath = payloadFile.path.startsWith(buildchainEvidencePrefix)
|
|
140
|
+
? payloadFile.path.slice(buildchainEvidencePrefix.length)
|
|
141
|
+
: "";
|
|
142
|
+
const evidenceFile = evidencePath ? evidenceFiles.get(evidencePath) : undefined;
|
|
143
|
+
if (!sameArtifactFile(payloadFile, evidenceFile)) {
|
|
144
|
+
fail("artifact-manifest-mismatch", `platform payload contains unbound bytes or evidence drift: ${platform.artifactName}/${payloadFile.path}`, "Do not publish; preserve the platform payload, manifest, and independently uploaded evidence.");
|
|
145
|
+
}
|
|
129
146
|
}
|
|
130
147
|
if (passportFiles.length > 0 && JSON.stringify(manifestFiles) !== JSON.stringify(passportFiles)) {
|
|
131
148
|
fail("artifact-manifest-mismatch", `platform manifest differs from Passport inventory: ${platform.artifactName}`, "Do not publish; preserve the mismatched manifest and Passport evidence.");
|
|
@@ -236,17 +253,17 @@ function validateCandidateIdentity({
|
|
|
236
253
|
return { sha, tree, runtimeSha, toolingSha };
|
|
237
254
|
}
|
|
238
255
|
|
|
239
|
-
function validateRecoveryTransaction({ existingTransaction, expectedTransactionId, repository, passport, sha, targetRef, candidateRoot }) {
|
|
256
|
+
function validateRecoveryTransaction({ existingTransaction, expectedTransactionId, repository, version, passport, sha, targetRef, candidateRoot }) {
|
|
240
257
|
const actualTransactionId = String(existingTransaction?.id || "");
|
|
241
258
|
if (expectedTransactionId && !actualTransactionId) fail("transaction-identity-conflict", `expected transaction ${expectedTransactionId} does not exist`, "Remove the stale transaction identity only if no durable transaction was ever sealed; otherwise preserve evidence and enter repair_required.");
|
|
242
259
|
if (expectedTransactionId && expectedTransactionId !== actualTransactionId) fail("transaction-identity-conflict", `existing transaction ${actualTransactionId} conflicts with expected ${expectedTransactionId}`, "Enter repair_required and inspect the durable transaction before any retry.");
|
|
243
260
|
if (existingTransaction) {
|
|
244
|
-
const expectedIdentity = releaseTransactionId({ repository, version
|
|
261
|
+
const expectedIdentity = releaseTransactionId({ repository, version, sourceSha: sha, targetRef: normalizedRef(targetRef) });
|
|
245
262
|
assertEqual(existingTransaction.id, expectedIdentity, "transaction-identity-conflict", "durable transaction identity", "Enter repair_required; the durable transaction does not belong to this exact publication target.");
|
|
246
263
|
assertEqual(existingTransaction.repository, repository, "transaction-identity-conflict", "durable transaction repository", "Enter repair_required; never cross repository transaction boundaries.");
|
|
247
264
|
assertEqual(normalizedRef(existingTransaction.target_ref), normalizedRef(targetRef), "transaction-identity-conflict", "durable transaction target ref", "Enter repair_required; never retarget a sealed transaction.");
|
|
248
265
|
assertEqual(existingTransaction.source_sha, sha, "transaction-identity-conflict", "durable transaction source SHA", "Resume with the transaction's exact promotion SHA or enter repair_required.");
|
|
249
|
-
assertEqual(existingTransaction.version,
|
|
266
|
+
assertEqual(existingTransaction.version, version, "transaction-identity-conflict", "durable transaction version", "Enter repair_required; never change a sealed publication version.");
|
|
250
267
|
assertEqual(existingTransaction.channel, passport.target.channel, "transaction-identity-conflict", "durable transaction channel", "Enter repair_required; never move a transaction between channels.");
|
|
251
268
|
}
|
|
252
269
|
if (existingTransaction?.candidateRoot && existingTransaction.candidateRoot !== candidateRoot) fail("transaction-identity-conflict", "existing transaction is sealed to a different candidate root", "Enter repair_required; never reuse the conflicting transaction.");
|
|
@@ -276,8 +293,10 @@ export function verifyReleaseCandidateRecovery({
|
|
|
276
293
|
buildSummary,
|
|
277
294
|
controllerReceipts = [],
|
|
278
295
|
platformManifests = [],
|
|
296
|
+
platformManifestEvidence = [],
|
|
279
297
|
productPayloadManifests = [],
|
|
280
298
|
artifacts = [],
|
|
299
|
+
publicationVersion = "",
|
|
281
300
|
currentToolingSha,
|
|
282
301
|
recoveryRunId = "",
|
|
283
302
|
createdAt = new Date().toISOString(),
|
|
@@ -296,7 +315,7 @@ export function verifyReleaseCandidateRecovery({
|
|
|
296
315
|
if (new Set(recoveredArtifacts.map((artifact) => artifact.name)).size !== recoveredArtifacts.length) {
|
|
297
316
|
fail("artifact-count-mismatch", "candidate artifact names are not unique", "Inspect the candidate run and remove ambiguity by creating a new candidate.");
|
|
298
317
|
}
|
|
299
|
-
validatePlatformPayloads(passport, recoveredArtifacts, platformManifests);
|
|
318
|
+
validatePlatformPayloads(passport, recoveredArtifacts, platformManifests, platformManifestEvidence);
|
|
300
319
|
|
|
301
320
|
const references = new Map((passport.controllerReceipts || []).map((reference) => [reference.controllerId, reference]));
|
|
302
321
|
for (const receipt of controllerReceipts) {
|
|
@@ -331,8 +350,9 @@ export function verifyReleaseCandidateRecovery({
|
|
|
331
350
|
runtimeSha,
|
|
332
351
|
});
|
|
333
352
|
|
|
353
|
+
const version = required(publicationVersion || passport.target?.version, "publicationVersion");
|
|
334
354
|
const actualTransactionId = validateRecoveryTransaction({
|
|
335
|
-
existingTransaction, expectedTransactionId, repository, passport, sha, targetRef, candidateRoot,
|
|
355
|
+
existingTransaction, expectedTransactionId, repository, version, passport, sha, targetRef, candidateRoot,
|
|
336
356
|
});
|
|
337
357
|
|
|
338
358
|
const receipt = {
|
|
@@ -351,7 +371,7 @@ export function verifyReleaseCandidateRecovery({
|
|
|
351
371
|
mergeSha: String(pullRequest.mergeSha || ""),
|
|
352
372
|
tree: passport.source.treeHash,
|
|
353
373
|
},
|
|
354
|
-
target: { channel: passport.target.channel, ref: normalizedRef(targetRef), sha, tree },
|
|
374
|
+
target: { channel: passport.target.channel, ref: normalizedRef(targetRef), sha, tree, version },
|
|
355
375
|
recovered: {
|
|
356
376
|
candidateRoot,
|
|
357
377
|
buildSummaryRoot: `sha256:${passport.diagnostics.buildSummaryHash}`,
|
|
@@ -992,7 +992,7 @@ for (const requiredSnippet of [
|
|
|
992
992
|
"resume-buildchain-runtime-sha:",
|
|
993
993
|
"github-release: true",
|
|
994
994
|
"release-passport-buildchain-self-kfd: true",
|
|
995
|
-
|
|
995
|
+
'artifact-patterns: "buildchain-package-*"',
|
|
996
996
|
"release-passport-impact-json: .buildchain/release-impact.json",
|
|
997
997
|
]) {
|
|
998
998
|
if (!buildchainRefPromotionWorkflow.includes(requiredSnippet)) {
|
|
@@ -148,7 +148,11 @@ function candidateArtifactNames({ passport, selected, artifacts, artifactPattern
|
|
|
148
148
|
if (!reference.artifact) throw new Error(`Passport controller receipt ${reference.controllerId} has no artifact identity`);
|
|
149
149
|
names.add(reference.artifact);
|
|
150
150
|
}
|
|
151
|
-
for (const platform of passport.platformMatrix || [])
|
|
151
|
+
for (const platform of passport.platformMatrix || []) {
|
|
152
|
+
names.add(platform.artifactName);
|
|
153
|
+
const diagnosticsArtifactName = `${selected.prefix}-diagnostics-${platform.platformId}-${selected.sourceSha}`;
|
|
154
|
+
if (artifacts.some((artifact) => artifact.name === diagnosticsArtifactName)) names.add(diagnosticsArtifactName);
|
|
155
|
+
}
|
|
152
156
|
const manifestPattern = new RegExp(`^${selected.prefix.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}-manifest-.+-${selected.sourceSha}$`);
|
|
153
157
|
for (const artifact of artifacts) {
|
|
154
158
|
if (manifestPattern.test(String(artifact.name || ""))) names.add(artifact.name);
|
|
@@ -162,18 +166,42 @@ function candidateArtifactNames({ passport, selected, artifacts, artifactPattern
|
|
|
162
166
|
|
|
163
167
|
function normalizePlatformManifests(downloads, passport) {
|
|
164
168
|
const manifests = [];
|
|
169
|
+
const evidenceByArtifact = new Map();
|
|
170
|
+
function addEvidence(artifactName, files) {
|
|
171
|
+
if (!artifactName) return;
|
|
172
|
+
const evidenceFiles = evidenceByArtifact.get(artifactName) || new Map();
|
|
173
|
+
for (const file of files) {
|
|
174
|
+
const existing = evidenceFiles.get(file.path);
|
|
175
|
+
if (existing && (existing.size !== file.size || existing.sha256 !== file.sha256)) {
|
|
176
|
+
throw new Error(`platform evidence disagrees for ${artifactName}/${file.path}`);
|
|
177
|
+
}
|
|
178
|
+
evidenceFiles.set(file.path, file);
|
|
179
|
+
}
|
|
180
|
+
evidenceByArtifact.set(artifactName, evidenceFiles);
|
|
181
|
+
}
|
|
165
182
|
for (const download of downloads) {
|
|
166
|
-
if (
|
|
167
|
-
for (const file of download.files.filter((entry) => path.basename(entry.path) === "manifest.json")) {
|
|
183
|
+
if (String(download.artifact.name).includes("-manifest-")) for (const file of download.files.filter((entry) => path.basename(entry.path) === "manifest.json")) {
|
|
168
184
|
const manifest = JSON.parse(fs.readFileSync(file.absolutePath, "utf8"));
|
|
169
185
|
if (!manifest.artifactName) {
|
|
170
186
|
const platformId = String(manifest.platform?.id || manifest.platformId || "");
|
|
171
187
|
manifest.artifactName = (passport.platformMatrix || []).find((entry) => entry.platformId === platformId)?.artifactName || "";
|
|
172
188
|
}
|
|
173
189
|
manifests.push(manifest);
|
|
190
|
+
addEvidence(manifest.artifactName, download.record.files);
|
|
191
|
+
}
|
|
192
|
+
if (String(download.artifact.name).includes("-diagnostics-")) {
|
|
193
|
+
const diagnosticsFiles = download.files.filter((entry) => path.basename(entry.path) === "diagnostics.json");
|
|
194
|
+
if (diagnosticsFiles.length === 1) {
|
|
195
|
+
const diagnostics = JSON.parse(fs.readFileSync(diagnosticsFiles[0].absolutePath, "utf8"));
|
|
196
|
+
addEvidence(String(diagnostics.links?.artifactName || ""), download.record.files);
|
|
197
|
+
}
|
|
174
198
|
}
|
|
175
199
|
}
|
|
176
|
-
|
|
200
|
+
const evidence = [...evidenceByArtifact].map(([artifactName, files]) => ({
|
|
201
|
+
artifactName,
|
|
202
|
+
files: [...files.values()].sort((left, right) => left.path.localeCompare(right.path)),
|
|
203
|
+
}));
|
|
204
|
+
return { manifests, evidence };
|
|
177
205
|
}
|
|
178
206
|
|
|
179
207
|
function normalizeControllerReceipts(downloads, passport) {
|
|
@@ -258,9 +286,6 @@ async function recoverCandidateEvidence({
|
|
|
258
286
|
for (const artifact of [selected.passport, selected.summary]) initialDownloads.push(await downloadArtifact({ artifact, repoInfo, apiUrl, token, archiveDir, bundleRoot, fetchImpl }));
|
|
259
287
|
const passport = readOnlyJson(initialDownloads[0].files.filter((file) => path.basename(file.path) === "release-candidate-passport.json"), "release-candidate-passport.json");
|
|
260
288
|
const buildSummary = readOnlyJson(initialDownloads[1].files.filter((file) => path.basename(file.path) === "build-summary.json"), "build-summary.json");
|
|
261
|
-
const candidateVersion = String(passport.target?.version || "").trim();
|
|
262
|
-
if (!candidateVersion) throw new Error("Release Candidate Passport has no exact target version");
|
|
263
|
-
const existingTransaction = await readExistingTransaction({ repoInfo, apiUrl, token, fetchImpl, version: candidateVersion });
|
|
264
289
|
const requiredNames = candidateArtifactNames({ passport, selected, artifacts, artifactPatterns });
|
|
265
290
|
const chosen = artifacts.filter((artifact) => requiredNames.has(artifact.name));
|
|
266
291
|
if (chosen.length !== requiredNames.size) {
|
|
@@ -272,7 +297,7 @@ async function recoverCandidateEvidence({
|
|
|
272
297
|
for (const artifact of chosen.filter((entry) => ![selected.passport.id, selected.summary.id].includes(entry.id))) downloads.push(await downloadArtifact({ artifact, repoInfo, apiUrl, token, archiveDir, bundleRoot, fetchImpl }));
|
|
273
298
|
return {
|
|
274
299
|
run, workflow, selected, resolvedOutput, bundleRoot, initialDownloads,
|
|
275
|
-
passport, buildSummary,
|
|
300
|
+
passport, buildSummary, chosen, downloads,
|
|
276
301
|
};
|
|
277
302
|
}
|
|
278
303
|
|
|
@@ -311,7 +336,7 @@ export async function resumeFromCandidateRun({
|
|
|
311
336
|
try {
|
|
312
337
|
const {
|
|
313
338
|
run, workflow, selected, resolvedOutput, bundleRoot, initialDownloads,
|
|
314
|
-
passport, buildSummary,
|
|
339
|
+
passport, buildSummary, chosen, downloads,
|
|
315
340
|
} = await recoverCandidateEvidence({
|
|
316
341
|
repoInfo, runId, artifactName, artifactPatterns, requiredArtifactCount,
|
|
317
342
|
outputDir, apiUrl, token, fetchImpl, archiveDir,
|
|
@@ -323,9 +348,20 @@ export async function resumeFromCandidateRun({
|
|
|
323
348
|
const targetRefState = await githubJson({ apiUrl, token, fetchImpl, path: `/repos/${repoInfo.owner}/${repoInfo.repo}/git/ref/heads/${targetRef.replace(/^refs\/heads\//, "")}` });
|
|
324
349
|
if (targetRefState.object?.sha !== targetSha) throw new Error(`target ref ${targetRef} no longer points at ${targetSha}`);
|
|
325
350
|
const compare = await githubJson({ apiUrl, token, fetchImpl, path: `/repos/${repoInfo.owner}/${repoInfo.repo}/compare/${pullRequest.merge_commit_sha}...${targetSha}` });
|
|
326
|
-
const
|
|
351
|
+
const platformManifestEvidence = normalizePlatformManifests(downloads, passport);
|
|
327
352
|
const controllerReceipts = normalizeControllerReceipts(downloads, passport);
|
|
328
353
|
const productPayloadManifests = normalizeProductPayloadManifests(downloads);
|
|
354
|
+
const sealed = createSealedBundle({
|
|
355
|
+
downloads,
|
|
356
|
+
bundleRoot,
|
|
357
|
+
repository: repoInfo.fullName,
|
|
358
|
+
passport,
|
|
359
|
+
runtimeSha,
|
|
360
|
+
publishPackageMain,
|
|
361
|
+
releasePatterns,
|
|
362
|
+
});
|
|
363
|
+
const candidateVersion = sealed.manifest.npm.version;
|
|
364
|
+
const existingTransaction = await readExistingTransaction({ repoInfo, apiUrl, token, fetchImpl, version: candidateVersion });
|
|
329
365
|
const recovery = verifyReleaseCandidateRecovery({
|
|
330
366
|
candidateRepository: repoInfo.fullName,
|
|
331
367
|
targetRepository,
|
|
@@ -369,21 +405,14 @@ export async function resumeFromCandidateRun({
|
|
|
369
405
|
passport,
|
|
370
406
|
buildSummary,
|
|
371
407
|
controllerReceipts,
|
|
372
|
-
platformManifests,
|
|
408
|
+
platformManifests: platformManifestEvidence.manifests,
|
|
409
|
+
platformManifestEvidence: platformManifestEvidence.evidence,
|
|
373
410
|
productPayloadManifests,
|
|
374
411
|
artifacts: downloads.map((download) => download.record),
|
|
412
|
+
publicationVersion: candidateVersion,
|
|
375
413
|
currentToolingSha: runtimeSha,
|
|
376
414
|
recoveryRunId,
|
|
377
415
|
});
|
|
378
|
-
const sealed = createSealedBundle({
|
|
379
|
-
downloads,
|
|
380
|
-
bundleRoot,
|
|
381
|
-
repository: repoInfo.fullName,
|
|
382
|
-
passport,
|
|
383
|
-
runtimeSha,
|
|
384
|
-
publishPackageMain,
|
|
385
|
-
releasePatterns,
|
|
386
|
-
});
|
|
387
416
|
const recoveryReceiptPath = path.join(resolvedOutput, "recovery-receipt.json");
|
|
388
417
|
const sealedManifestPath = path.join(resolvedOutput, "sealed-bundle.json");
|
|
389
418
|
const requiredArtifactsPath = path.join(resolvedOutput, "publish-required-artifacts.json");
|