@kungfu-tech/buildchain 4.0.2-alpha.48 → 4.0.2-alpha.49
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/architecture/ci-lane-change-budget.json +18 -0
- package/architecture/maintainability-policy.json +4 -4
- package/architecture/v4-release-topology.json +56 -7
- package/architecture/v4-universal-workflow-bootstrap.json +6 -1
- package/architecture/v4-universal-workflow-train-admission.json +1 -1
- package/architecture/workflow-taxonomy.json +11 -0
- package/dist/site/buildchain-contract.json +4 -4
- package/dist/site/buildchain-site.json +21 -11
- package/dist/site/capability-registry.json +1 -1
- package/dist/site/kfd-claims.json +21 -5
- package/dist/site/kfd-upstream-aggregate.json +1 -1
- package/dist/site/manual-registry.json +1 -1
- package/dist/site/node-api-registry.json +9 -9
- package/dist/site/page-registry.json +16 -6
- package/dist/site/public-surface-audit.json +18 -3
- package/dist/site/publication-authority-registry.json +23 -1
- package/dist/site/publication-registry.json +4 -4
- package/dist/site/site-manifest.json +5 -5
- package/dist/site/workflow-registry.json +39 -5
- package/docs/node-api-reference.md +10 -10
- package/docs/oci-publication.md +75 -1
- package/docs/workflow-catalog.md +1 -0
- package/package.json +1 -1
- package/packages/core/buildchain-publication-authority.js +1 -0
- package/packages/core/oci-compose-qualification.js +140 -0
- package/packages/core/oci-publication-bundle.js +59 -25
- package/packages/core/oci-publication-graph.js +206 -0
- package/scripts/check-v4-release-topology.mjs +12 -0
- package/scripts/generate-v4-universal-workflow-facades.mjs +53 -20
- package/scripts/oci-compose-preview.mjs +250 -0
- package/scripts/publication-candidate-kind.mjs +2 -1
- package/scripts/universal-facade-maintainability.mjs +10 -1
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"status": "passed",
|
|
5
5
|
"summary": {
|
|
6
6
|
"cliCommandCount": 117,
|
|
7
|
-
"workflowCount":
|
|
7
|
+
"workflowCount": 115,
|
|
8
8
|
"actionCount": 8,
|
|
9
9
|
"sitePageCount": 88,
|
|
10
10
|
"docCommandRefCount": 1050,
|
|
@@ -3807,6 +3807,21 @@
|
|
|
3807
3807
|
],
|
|
3808
3808
|
"outputCount": 5
|
|
3809
3809
|
},
|
|
3810
|
+
{
|
|
3811
|
+
"id": "public-release-oci-compose-preview",
|
|
3812
|
+
"path": ".github/workflows/public-release-oci-compose-preview.yml",
|
|
3813
|
+
"reusable": true,
|
|
3814
|
+
"inputs": [
|
|
3815
|
+
"universal-request-json"
|
|
3816
|
+
],
|
|
3817
|
+
"inputCount": 1,
|
|
3818
|
+
"secrets": [
|
|
3819
|
+
"BUILDCHAIN_PROMOTION_TOKEN"
|
|
3820
|
+
],
|
|
3821
|
+
"secretCount": 1,
|
|
3822
|
+
"outputs": [],
|
|
3823
|
+
"outputCount": 0
|
|
3824
|
+
},
|
|
3810
3825
|
{
|
|
3811
3826
|
"id": "public-release-paper-sealed",
|
|
3812
3827
|
"path": ".github/workflows/public-release-paper-sealed.yml",
|
|
@@ -10933,8 +10948,8 @@
|
|
|
10933
10948
|
"workflowRegistryPath": "dist/site/workflow-registry.json",
|
|
10934
10949
|
"pageRegistryPath": "dist/site/page-registry.json",
|
|
10935
10950
|
"cliRegistryDigest": "fbc23073bbae240489a2f826b2c26daadc58e704050c5f8df366509f5c5a1c3e",
|
|
10936
|
-
"workflowRegistryDigest": "
|
|
10937
|
-
"pageRegistryDigest": "
|
|
10951
|
+
"workflowRegistryDigest": "2a7365a6d6a2a418650106289e309e598a77851158abf237d13276a38654178e",
|
|
10952
|
+
"pageRegistryDigest": "0a523efc8b3f009003cb9005636f7c1eb754909610a29d47386afef4e9d94fe3"
|
|
10938
10953
|
},
|
|
10939
10954
|
"comparison": {
|
|
10940
10955
|
"missingCliRegistry": [],
|
|
@@ -752,6 +752,21 @@
|
|
|
752
752
|
"runnerPolicy": "qualified-measured",
|
|
753
753
|
"notes": ""
|
|
754
754
|
},
|
|
755
|
+
{
|
|
756
|
+
"workflowPath": ".github/workflows/public-release-oci-compose-preview.yml",
|
|
757
|
+
"authorityClass": "product-publication",
|
|
758
|
+
"publicationCapable": true,
|
|
759
|
+
"capabilityIds": [
|
|
760
|
+
"oci-compose-preview"
|
|
761
|
+
],
|
|
762
|
+
"credentialMode": "caller-secrets",
|
|
763
|
+
"publisherWorkflowMode": "caller-bound",
|
|
764
|
+
"publisherWorkflowPath": ".github/workflows/public-release-oci-compose-preview.yml",
|
|
765
|
+
"environment": "none",
|
|
766
|
+
"environmentMode": "fixed",
|
|
767
|
+
"runnerPolicy": "qualified-measured",
|
|
768
|
+
"notes": ""
|
|
769
|
+
},
|
|
755
770
|
{
|
|
756
771
|
"workflowPath": ".github/workflows/public-release-paper-sealed.yml",
|
|
757
772
|
"authorityClass": "product-publication",
|
|
@@ -1699,6 +1714,13 @@
|
|
|
1699
1714
|
],
|
|
1700
1715
|
"classified": true
|
|
1701
1716
|
},
|
|
1717
|
+
{
|
|
1718
|
+
"path": ".github/workflows/public-release-oci-compose-preview.yml",
|
|
1719
|
+
"signals": [
|
|
1720
|
+
"write-permission"
|
|
1721
|
+
],
|
|
1722
|
+
"classified": true
|
|
1723
|
+
},
|
|
1702
1724
|
{
|
|
1703
1725
|
"path": ".github/workflows/public-release-paper-sealed.yml",
|
|
1704
1726
|
"signals": [
|
|
@@ -2009,5 +2031,5 @@
|
|
|
2009
2031
|
"classified": true
|
|
2010
2032
|
}
|
|
2011
2033
|
],
|
|
2012
|
-
"registryDigest": "
|
|
2034
|
+
"registryDigest": "e5eb0d7ee3cce4a25674909154f6bd0bf736d5b93df41c1d435c468aad50c32a"
|
|
2013
2035
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"contract": "kungfu-buildchain-publication-release-registry",
|
|
4
|
-
"generatedAt": "2026-09-
|
|
5
|
-
"publishedAt": "2026-09-
|
|
4
|
+
"generatedAt": "2026-09-06T21:59:58.000Z",
|
|
5
|
+
"publishedAt": "2026-09-06T21:59:58.000Z",
|
|
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": "0eb5a97907da10cfc6f69b4f12f492bef351a105",
|
|
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": "4.0.2-alpha.
|
|
35
|
+
"version": "4.0.2-alpha.49",
|
|
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-09-
|
|
5
|
-
"publishedAt": "2026-09-
|
|
4
|
+
"generatedAt": "2026-09-06T21:59:58.000Z",
|
|
5
|
+
"publishedAt": "2026-09-06T21:59:58.000Z",
|
|
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": "0eb5a97907da10cfc6f69b4f12f492bef351a105",
|
|
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": "4.0.2-alpha.
|
|
40
|
+
"version": "4.0.2-alpha.49",
|
|
41
41
|
"versionSource": "package.json#version"
|
|
42
42
|
},
|
|
43
43
|
"entrypoint": "buildchain-site.json",
|
|
@@ -253,7 +253,7 @@
|
|
|
253
253
|
"path": "docs/node-api-reference.md",
|
|
254
254
|
"plane": "use",
|
|
255
255
|
"exists": true,
|
|
256
|
-
"digest": "sha256:
|
|
256
|
+
"digest": "sha256:1a5e35c8cdd891208525085d21ee7caad873dc156fa54db15cc38c1bf17080c0"
|
|
257
257
|
},
|
|
258
258
|
{
|
|
259
259
|
"id": "build-facts",
|
|
@@ -2746,7 +2746,7 @@
|
|
|
2746
2746
|
"status": "preview",
|
|
2747
2747
|
"owner": "buildchain-workflows",
|
|
2748
2748
|
"maturity": "preview",
|
|
2749
|
-
"introducedVersion": "4.0.2-alpha.
|
|
2749
|
+
"introducedVersion": "4.0.2-alpha.49",
|
|
2750
2750
|
"compatibilityPromise": "preserved-through-the-v3-major-line",
|
|
2751
2751
|
"deprecationReplacement": "",
|
|
2752
2752
|
"sunsetCondition": "explicit-breaking-change-review-in-a-future-major-line",
|
|
@@ -3943,7 +3943,7 @@
|
|
|
3943
3943
|
"status": "preview",
|
|
3944
3944
|
"owner": "buildchain-workflows",
|
|
3945
3945
|
"maturity": "preview",
|
|
3946
|
-
"introducedVersion": "4.0.2-alpha.
|
|
3946
|
+
"introducedVersion": "4.0.2-alpha.49",
|
|
3947
3947
|
"compatibilityPromise": "preserved-through-the-v3-major-line",
|
|
3948
3948
|
"deprecationReplacement": "",
|
|
3949
3949
|
"sunsetCondition": "explicit-breaking-change-review-in-a-future-major-line",
|
|
@@ -4484,6 +4484,40 @@
|
|
|
4484
4484
|
"sunsetCondition": "explicit-breaking-change-review-in-a-future-major-line",
|
|
4485
4485
|
"nonDuplicationRationale": "Existing workflow identity retained for caller compatibility and repository orchestration."
|
|
4486
4486
|
},
|
|
4487
|
+
{
|
|
4488
|
+
"id": "public-release-oci-compose-preview",
|
|
4489
|
+
"path": ".github/workflows/public-release-oci-compose-preview.yml",
|
|
4490
|
+
"reusable": true,
|
|
4491
|
+
"inputs": [
|
|
4492
|
+
"universal-request-json"
|
|
4493
|
+
],
|
|
4494
|
+
"inputCount": 1,
|
|
4495
|
+
"secrets": [
|
|
4496
|
+
"BUILDCHAIN_PROMOTION_TOKEN"
|
|
4497
|
+
],
|
|
4498
|
+
"secretCount": 1,
|
|
4499
|
+
"outputs": [],
|
|
4500
|
+
"outputCount": 0,
|
|
4501
|
+
"taxonomy": {
|
|
4502
|
+
"id": "oci-compose-preview",
|
|
4503
|
+
"role": "public",
|
|
4504
|
+
"category": "release",
|
|
4505
|
+
"purpose": "oci-compose-preview",
|
|
4506
|
+
"status": "active",
|
|
4507
|
+
"canonicalPath": ".github/workflows/public-release-oci-compose-preview.yml",
|
|
4508
|
+
"compatibilityAlias": false
|
|
4509
|
+
},
|
|
4510
|
+
"surface": "repository-workflow",
|
|
4511
|
+
"capabilityGroup": "api-cli-reference",
|
|
4512
|
+
"status": "active",
|
|
4513
|
+
"owner": "buildchain-workflows",
|
|
4514
|
+
"maturity": "active",
|
|
4515
|
+
"introducedVersion": "pre-3.0.2-alpha.4",
|
|
4516
|
+
"compatibilityPromise": "preserved-through-the-v3-major-line",
|
|
4517
|
+
"deprecationReplacement": "",
|
|
4518
|
+
"sunsetCondition": "explicit-breaking-change-review-in-a-future-major-line",
|
|
4519
|
+
"nonDuplicationRationale": "Existing workflow identity retained for caller compatibility and repository orchestration."
|
|
4520
|
+
},
|
|
4487
4521
|
{
|
|
4488
4522
|
"id": "public-release-paper-sealed",
|
|
4489
4523
|
"path": ".github/workflows/public-release-paper-sealed.yml",
|
|
@@ -5970,7 +6004,7 @@
|
|
|
5970
6004
|
"status": "preview",
|
|
5971
6005
|
"owner": "buildchain-workflows",
|
|
5972
6006
|
"maturity": "preview",
|
|
5973
|
-
"introducedVersion": "4.0.2-alpha.
|
|
6007
|
+
"introducedVersion": "4.0.2-alpha.49",
|
|
5974
6008
|
"compatibilityPromise": "preserved-through-the-v3-major-line",
|
|
5975
6009
|
"deprecationReplacement": "",
|
|
5976
6010
|
"sunsetCondition": "explicit-breaking-change-review-in-a-future-major-line",
|
|
@@ -6001,7 +6035,7 @@
|
|
|
6001
6035
|
"status": "preview",
|
|
6002
6036
|
"owner": "buildchain-workflows",
|
|
6003
6037
|
"maturity": "preview",
|
|
6004
|
-
"introducedVersion": "4.0.2-alpha.
|
|
6038
|
+
"introducedVersion": "4.0.2-alpha.49",
|
|
6005
6039
|
"compatibilityPromise": "preserved-through-the-v3-major-line",
|
|
6006
6040
|
"deprecationReplacement": "",
|
|
6007
6041
|
"sunsetCondition": "explicit-breaking-change-review-in-a-future-major-line",
|
|
@@ -6032,7 +6066,7 @@
|
|
|
6032
6066
|
"status": "preview",
|
|
6033
6067
|
"owner": "buildchain-workflows",
|
|
6034
6068
|
"maturity": "preview",
|
|
6035
|
-
"introducedVersion": "4.0.2-alpha.
|
|
6069
|
+
"introducedVersion": "4.0.2-alpha.49",
|
|
6036
6070
|
"compatibilityPromise": "preserved-through-the-v3-major-line",
|
|
6037
6071
|
"deprecationReplacement": "",
|
|
6038
6072
|
"sunsetCondition": "explicit-breaking-change-review-in-a-future-major-line",
|
|
@@ -117,7 +117,7 @@ Target: `./packages/core/index.js`. Public symbols: 636.
|
|
|
117
117
|
| `BUILDCHAIN_VERSION_PIN_PATH` | constant: const BUILDCHAIN_VERSION_PIN_PATH | none | value | Import does not declare a throw contract. | none-on-import | `import { BUILDCHAIN_VERSION_PIN_PATH } from "@kungfu-tech/buildchain";` | `packages/core/buildchain-layout.js:5` |
|
|
118
118
|
| `BUILDCHAIN_WORKFLOW_FRICTION_ISSUE_CONTRACT` | constant: const BUILDCHAIN_WORKFLOW_FRICTION_ISSUE_CONTRACT | none | value | Import does not declare a throw contract. | none-on-import | `import { BUILDCHAIN_WORKFLOW_FRICTION_ISSUE_CONTRACT } from "@kungfu-tech/buildchain";` | `packages/core/issue-reporting.js:5` |
|
|
119
119
|
| `buildchainKfdClaims` | constant: const buildchainKfdClaims | none | value | Import does not declare a throw contract. | none-on-import | `import { buildchainKfdClaims } from "@kungfu-tech/buildchain";` | `packages/core/kfd.js:896` |
|
|
120
|
-
| `buildchainPublicationAuthorityDescriptors` | function: function buildchainPublicationAuthorityDescriptors({ root = process.cwd() } = {}) | { root = process.cwd() } = {} | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { buildchainPublicationAuthorityDescriptors } from "@kungfu-tech/buildchain";` | `packages/core/buildchain-publication-authority.js:
|
|
120
|
+
| `buildchainPublicationAuthorityDescriptors` | function: function buildchainPublicationAuthorityDescriptors({ root = process.cwd() } = {}) | { root = process.cwd() } = {} | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { buildchainPublicationAuthorityDescriptors } from "@kungfu-tech/buildchain";` | `packages/core/buildchain-publication-authority.js:66` |
|
|
121
121
|
| `buildConsumerIssueReport` | function: function buildConsumerIssueReport(options = {}) | options = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { buildConsumerIssueReport } from "@kungfu-tech/buildchain";` | `packages/core/issue-reporting.js:104` |
|
|
122
122
|
| `buildFactsDigest` | function: function buildFactsDigest(value) | value | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | local-filesystem-write, subprocess | `import { buildFactsDigest } from "@kungfu-tech/buildchain";` | `packages/core/build-facts.js:45` |
|
|
123
123
|
| `buildWorkflowFrictionIssueReport` | function: function buildWorkflowFrictionIssueReport(options = {}) | options = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { buildWorkflowFrictionIssueReport } from "@kungfu-tech/buildchain";` | `packages/core/issue-reporting.js:199` |
|
|
@@ -188,7 +188,7 @@ Target: `./packages/core/index.js`. Public symbols: 636.
|
|
|
188
188
|
| `createBuildchainKfdSurfaceRegistry` | function: function createBuildchainKfdSurfaceRegistry({ root = process.cwd() } = {}) | { root = process.cwd() } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { createBuildchainKfdSurfaceRegistry } from "@kungfu-tech/buildchain";` | `packages/core/buildchain-kfd-claims.js:411` |
|
|
189
189
|
| `createBuildchainLayoutDiscovery` | function: function createBuildchainLayoutDiscovery({ cwd = process.cwd(), buildchainVersion = "", } = {}) | { cwd = process.cwd(), buildchainVersion = "", } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { createBuildchainLayoutDiscovery } from "@kungfu-tech/buildchain";` | `packages/core/buildchain-layout.js:99` |
|
|
190
190
|
| `createBuildchainLogger` | function: function createBuildchainLogger(options = {}) | options = {} | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | subprocess | `import { createBuildchainLogger } from "@kungfu-tech/buildchain";` | `packages/core/logging.js:300` |
|
|
191
|
-
| `createBuildchainPublicationAuthorityRegistry` | function: function createBuildchainPublicationAuthorityRegistry({ root = process.cwd() } = {}) | { root = process.cwd() } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { createBuildchainPublicationAuthorityRegistry } from "@kungfu-tech/buildchain";` | `packages/core/buildchain-publication-authority.js:
|
|
191
|
+
| `createBuildchainPublicationAuthorityRegistry` | function: function createBuildchainPublicationAuthorityRegistry({ root = process.cwd() } = {}) | { root = process.cwd() } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { createBuildchainPublicationAuthorityRegistry } from "@kungfu-tech/buildchain";` | `packages/core/buildchain-publication-authority.js:105` |
|
|
192
192
|
| `createBuildchainPublicClaimDefinitions` | function: function createBuildchainPublicClaimDefinitions() | none | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { createBuildchainPublicClaimDefinitions } from "@kungfu-tech/buildchain";` | `packages/core/buildchain-kfd-claims.js:226` |
|
|
193
193
|
| `createCacheEvidenceSet` | function: function createCacheEvidenceSet({ repository, sourceCommit, sourceTree = "", runtimeCommit = "", platform, operations = [], } = {}) | { repository, sourceCommit, sourceTree = "", runtimeCommit = "", platform, operations = [], } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { createCacheEvidenceSet } from "@kungfu-tech/buildchain";` | `packages/core/cache-evidence.js:244` |
|
|
194
194
|
| `createCacheOperationReceipt` | function: function createCacheOperationReceipt({ operationId, operation, provider, producer, platform, cacheKey, cacheRoot, outcome, bindings = {}, metrics, evidence, } = {}) | { operationId, operation, provider, producer, platform, cacheKey, cacheRoot, outcome, bindings = {}, metrics, evidence, } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { createCacheOperationReceipt } from "@kungfu-tech/buildchain";` | `packages/core/cache-evidence.js:169` |
|
|
@@ -806,7 +806,7 @@ Target: `./packages/core/index.js`. Public symbols: 636.
|
|
|
806
806
|
| `BUILDCHAIN_VERSION_PIN_PATH` | constant: const BUILDCHAIN_VERSION_PIN_PATH | none | value | Import does not declare a throw contract. | none-on-import | `import { BUILDCHAIN_VERSION_PIN_PATH } from "@kungfu-tech/buildchain/core";` | `packages/core/buildchain-layout.js:5` |
|
|
807
807
|
| `BUILDCHAIN_WORKFLOW_FRICTION_ISSUE_CONTRACT` | constant: const BUILDCHAIN_WORKFLOW_FRICTION_ISSUE_CONTRACT | none | value | Import does not declare a throw contract. | none-on-import | `import { BUILDCHAIN_WORKFLOW_FRICTION_ISSUE_CONTRACT } from "@kungfu-tech/buildchain/core";` | `packages/core/issue-reporting.js:5` |
|
|
808
808
|
| `buildchainKfdClaims` | constant: const buildchainKfdClaims | none | value | Import does not declare a throw contract. | none-on-import | `import { buildchainKfdClaims } from "@kungfu-tech/buildchain/core";` | `packages/core/kfd.js:896` |
|
|
809
|
-
| `buildchainPublicationAuthorityDescriptors` | function: function buildchainPublicationAuthorityDescriptors({ root = process.cwd() } = {}) | { root = process.cwd() } = {} | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { buildchainPublicationAuthorityDescriptors } from "@kungfu-tech/buildchain/core";` | `packages/core/buildchain-publication-authority.js:
|
|
809
|
+
| `buildchainPublicationAuthorityDescriptors` | function: function buildchainPublicationAuthorityDescriptors({ root = process.cwd() } = {}) | { root = process.cwd() } = {} | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { buildchainPublicationAuthorityDescriptors } from "@kungfu-tech/buildchain/core";` | `packages/core/buildchain-publication-authority.js:66` |
|
|
810
810
|
| `buildConsumerIssueReport` | function: function buildConsumerIssueReport(options = {}) | options = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { buildConsumerIssueReport } from "@kungfu-tech/buildchain/core";` | `packages/core/issue-reporting.js:104` |
|
|
811
811
|
| `buildFactsDigest` | function: function buildFactsDigest(value) | value | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | local-filesystem-write, subprocess | `import { buildFactsDigest } from "@kungfu-tech/buildchain/core";` | `packages/core/build-facts.js:45` |
|
|
812
812
|
| `buildWorkflowFrictionIssueReport` | function: function buildWorkflowFrictionIssueReport(options = {}) | options = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { buildWorkflowFrictionIssueReport } from "@kungfu-tech/buildchain/core";` | `packages/core/issue-reporting.js:199` |
|
|
@@ -877,7 +877,7 @@ Target: `./packages/core/index.js`. Public symbols: 636.
|
|
|
877
877
|
| `createBuildchainKfdSurfaceRegistry` | function: function createBuildchainKfdSurfaceRegistry({ root = process.cwd() } = {}) | { root = process.cwd() } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { createBuildchainKfdSurfaceRegistry } from "@kungfu-tech/buildchain/core";` | `packages/core/buildchain-kfd-claims.js:411` |
|
|
878
878
|
| `createBuildchainLayoutDiscovery` | function: function createBuildchainLayoutDiscovery({ cwd = process.cwd(), buildchainVersion = "", } = {}) | { cwd = process.cwd(), buildchainVersion = "", } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { createBuildchainLayoutDiscovery } from "@kungfu-tech/buildchain/core";` | `packages/core/buildchain-layout.js:99` |
|
|
879
879
|
| `createBuildchainLogger` | function: function createBuildchainLogger(options = {}) | options = {} | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | subprocess | `import { createBuildchainLogger } from "@kungfu-tech/buildchain/core";` | `packages/core/logging.js:300` |
|
|
880
|
-
| `createBuildchainPublicationAuthorityRegistry` | function: function createBuildchainPublicationAuthorityRegistry({ root = process.cwd() } = {}) | { root = process.cwd() } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { createBuildchainPublicationAuthorityRegistry } from "@kungfu-tech/buildchain/core";` | `packages/core/buildchain-publication-authority.js:
|
|
880
|
+
| `createBuildchainPublicationAuthorityRegistry` | function: function createBuildchainPublicationAuthorityRegistry({ root = process.cwd() } = {}) | { root = process.cwd() } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { createBuildchainPublicationAuthorityRegistry } from "@kungfu-tech/buildchain/core";` | `packages/core/buildchain-publication-authority.js:105` |
|
|
881
881
|
| `createBuildchainPublicClaimDefinitions` | function: function createBuildchainPublicClaimDefinitions() | none | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { createBuildchainPublicClaimDefinitions } from "@kungfu-tech/buildchain/core";` | `packages/core/buildchain-kfd-claims.js:226` |
|
|
882
882
|
| `createCacheEvidenceSet` | function: function createCacheEvidenceSet({ repository, sourceCommit, sourceTree = "", runtimeCommit = "", platform, operations = [], } = {}) | { repository, sourceCommit, sourceTree = "", runtimeCommit = "", platform, operations = [], } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { createCacheEvidenceSet } from "@kungfu-tech/buildchain/core";` | `packages/core/cache-evidence.js:244` |
|
|
883
883
|
| `createCacheOperationReceipt` | function: function createCacheOperationReceipt({ operationId, operation, provider, producer, platform, cacheKey, cacheRoot, outcome, bindings = {}, metrics, evidence, } = {}) | { operationId, operation, provider, producer, platform, cacheKey, cacheRoot, outcome, bindings = {}, metrics, evidence, } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { createCacheOperationReceipt } from "@kungfu-tech/buildchain/core";` | `packages/core/cache-evidence.js:169` |
|
|
@@ -2422,8 +2422,8 @@ Target: `./packages/core/buildchain-publication-authority.js`. Public symbols: 2
|
|
|
2422
2422
|
|
|
2423
2423
|
| Symbol | Kind and signature | Parameters | Return | Errors | Side effects | Example | Source |
|
|
2424
2424
|
| --- | --- | --- | --- | --- | --- | --- | --- |
|
|
2425
|
-
| `buildchainPublicationAuthorityDescriptors` | function: function buildchainPublicationAuthorityDescriptors({ root = process.cwd() } = {}) | { root = process.cwd() } = {} | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { buildchainPublicationAuthorityDescriptors } from "@kungfu-tech/buildchain/buildchain-publication-authority";` | `packages/core/buildchain-publication-authority.js:
|
|
2426
|
-
| `createBuildchainPublicationAuthorityRegistry` | function: function createBuildchainPublicationAuthorityRegistry({ root = process.cwd() } = {}) | { root = process.cwd() } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { createBuildchainPublicationAuthorityRegistry } from "@kungfu-tech/buildchain/buildchain-publication-authority";` | `packages/core/buildchain-publication-authority.js:
|
|
2425
|
+
| `buildchainPublicationAuthorityDescriptors` | function: function buildchainPublicationAuthorityDescriptors({ root = process.cwd() } = {}) | { root = process.cwd() } = {} | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { buildchainPublicationAuthorityDescriptors } from "@kungfu-tech/buildchain/buildchain-publication-authority";` | `packages/core/buildchain-publication-authority.js:66` |
|
|
2426
|
+
| `createBuildchainPublicationAuthorityRegistry` | function: function createBuildchainPublicationAuthorityRegistry({ root = process.cwd() } = {}) | { root = process.cwd() } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { createBuildchainPublicationAuthorityRegistry } from "@kungfu-tech/buildchain/buildchain-publication-authority";` | `packages/core/buildchain-publication-authority.js:105` |
|
|
2427
2427
|
|
|
2428
2428
|
## `@kungfu-tech/buildchain/github-governance-authority`
|
|
2429
2429
|
|
|
@@ -2839,7 +2839,7 @@ Target: `./packages/core/oci-publication-bundle.js`. Public symbols: 4.
|
|
|
2839
2839
|
|
|
2840
2840
|
| Symbol | Kind and signature | Parameters | Return | Errors | Side effects | Example | Source |
|
|
2841
2841
|
| --- | --- | --- | --- | --- | --- | --- | --- |
|
|
2842
|
-
| `OCI_FAMILY_SCHEMA` | constant: const OCI_FAMILY_SCHEMA | none | value | Import does not declare a throw contract. | none-on-import | `import { OCI_FAMILY_SCHEMA } from "@kungfu-tech/buildchain/oci-publication";` | `packages/core/oci-publication-bundle.js:
|
|
2843
|
-
| `ociBundleFile` | function: function ociBundleFile(root, relative) | root, relative | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { ociBundleFile } from "@kungfu-tech/buildchain/oci-publication";` | `packages/core/oci-publication-bundle.js:
|
|
2844
|
-
| `sealOciPublicationBundle` | function: function sealOciPublicationBundle({ bundleRoot, body }) | { bundleRoot, body } | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { sealOciPublicationBundle } from "@kungfu-tech/buildchain/oci-publication";` | `packages/core/oci-publication-bundle.js:
|
|
2845
|
-
| `verifyOciPublicationBundle` | function: function verifyOciPublicationBundle({ bundleRoot, manifest, repository, sourceSha, version, }) | { bundleRoot, manifest, repository, sourceSha, version, } | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { verifyOciPublicationBundle } from "@kungfu-tech/buildchain/oci-publication";` | `packages/core/oci-publication-bundle.js:
|
|
2842
|
+
| `OCI_FAMILY_SCHEMA` | constant: const OCI_FAMILY_SCHEMA | none | value | Import does not declare a throw contract. | none-on-import | `import { OCI_FAMILY_SCHEMA } from "@kungfu-tech/buildchain/oci-publication";` | `packages/core/oci-publication-bundle.js:10` |
|
|
2843
|
+
| `ociBundleFile` | function: function ociBundleFile(root, relative) | root, relative | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { ociBundleFile } from "@kungfu-tech/buildchain/oci-publication";` | `packages/core/oci-publication-bundle.js:33` |
|
|
2844
|
+
| `sealOciPublicationBundle` | function: function sealOciPublicationBundle({ bundleRoot, body }) | { bundleRoot, body } | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { sealOciPublicationBundle } from "@kungfu-tech/buildchain/oci-publication";` | `packages/core/oci-publication-bundle.js:14` |
|
|
2845
|
+
| `verifyOciPublicationBundle` | function: function verifyOciPublicationBundle({ bundleRoot, manifest, repository, sourceSha, version, }) | { bundleRoot, manifest, repository, sourceSha, version, } | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { verifyOciPublicationBundle } from "@kungfu-tech/buildchain/oci-publication";` | `packages/core/oci-publication-bundle.js:118` |
|
package/docs/oci-publication.md
CHANGED
|
@@ -8,7 +8,7 @@ confidence: high
|
|
|
8
8
|
sensitivity: public
|
|
9
9
|
evidence_grade: B
|
|
10
10
|
review_state: unreviewed
|
|
11
|
-
last_reviewed: 2026-09-
|
|
11
|
+
last_reviewed: 2026-09-07
|
|
12
12
|
ai_provenance:
|
|
13
13
|
model_family: GPT-6
|
|
14
14
|
product: Codex
|
|
@@ -80,3 +80,77 @@ the caller should also include the family and smoke JSON files in
|
|
|
80
80
|
|
|
81
81
|
See [Runtime Train Validation](runtime-train-validation.md) for testing an
|
|
82
82
|
unreleased runtime without persisting a train or exact SHA in the workflow.
|
|
83
|
+
|
|
84
|
+
## Multi-platform images and Compose applications
|
|
85
|
+
|
|
86
|
+
Use `schema: kungfu-buildchain-oci-family/v2` when the family includes an OCI
|
|
87
|
+
index or a Compose application. Existing v1 families keep their published
|
|
88
|
+
single-platform contract.
|
|
89
|
+
|
|
90
|
+
An index entry declares `platform: multi-platform` and the complete `platforms`
|
|
91
|
+
array, for example `["linux/amd64", "linux/arm64"]`. Every runnable child must
|
|
92
|
+
have matching platform and content labels. Descriptor sizes, digests and media
|
|
93
|
+
types are verified recursively; nested manifests are uploaded before their
|
|
94
|
+
parent index. BuildKit attestation manifests must identify a runnable child and
|
|
95
|
+
contain matching in-toto subjects. Missing platforms, duplicate platforms,
|
|
96
|
+
foreign URLs, inline descriptor data and broken blob references fail sealing.
|
|
97
|
+
|
|
98
|
+
A Compose entry declares `kind: compose`, `platform: compose`, and `targetImage`
|
|
99
|
+
pointing to an image in the same family. Its unique family name may differ from
|
|
100
|
+
that image, but its destination repository must match it. The immutable tag is
|
|
101
|
+
`compose-v<version>`; image entries retain `v<version>`.
|
|
102
|
+
|
|
103
|
+
The bounded Compose representation is an OCI 1.1 image manifest with
|
|
104
|
+
`artifactType: application/vnd.docker.compose.project`, an empty JSON config
|
|
105
|
+
and one `application/vnd.docker.compose.file+yaml` layer. That layer contains
|
|
106
|
+
JSON, a YAML subset, so structural verification needs no executable YAML loader.
|
|
107
|
+
Every service image is pinned to a digest and at least one uses the exact
|
|
108
|
+
family image. Environment interpolation inside other fields can remain intact.
|
|
109
|
+
These media types follow the [Docker Compose publisher](https://github.com/docker/compose/blob/v5.1.2/internal/oci/push.go).
|
|
110
|
+
|
|
111
|
+
Candidate smoke evidence describes its actual pre-publication checks. It must
|
|
112
|
+
not claim that an unpublished public Compose reference was installed. Public
|
|
113
|
+
installation qualification occurs after immutable publication and before a
|
|
114
|
+
preview alias moves.
|
|
115
|
+
|
|
116
|
+
## Evidence-gated Compose preview
|
|
117
|
+
|
|
118
|
+
An optional Compose `preview` declaration contains exactly the supported alias
|
|
119
|
+
`compose-preview`, the previously accepted `previousDigest` (or `none`), and
|
|
120
|
+
`qualificationWorkflow`, a repository workflow path. The immutable family seals
|
|
121
|
+
this policy before any publication effect.
|
|
122
|
+
|
|
123
|
+
After v4 publication is complete, dispatch that qualification workflow on the
|
|
124
|
+
exact published alpha tag. It must pull the immutable public image and Compose,
|
|
125
|
+
run fresh installation, restart, account-isolation, runtime-hardening, upgrade
|
|
126
|
+
and rollback checks, and qualify both Linux architectures. The workflow has no
|
|
127
|
+
registry write authority. Upload one artifact named
|
|
128
|
+
`oci-compose-qualification-<run-id>-<run-attempt>` containing `qualification.json`
|
|
129
|
+
and its hash-bound JSON evidence files.
|
|
130
|
+
|
|
131
|
+
The receipt uses `schema: kungfu-buildchain-compose-qualification/v1` and binds
|
|
132
|
+
`repository`, `tag`, published `sourceSha`, sealed `familyRoot`, `runId`,
|
|
133
|
+
`runAttempt`, exact `image` and `application` repository/digest references,
|
|
134
|
+
`previousDigest`, and `passed: true`. Its `checks` object requires all of
|
|
135
|
+
`freshInstall`, `restartPersistence`, `upgradePersistence`, `rollbackPersistence`,
|
|
136
|
+
`accountIsolation`, and `hardenedRuntime` to be true. Its `platforms` object
|
|
137
|
+
requires `linux/amd64` and `linux/arm64` entries with `passed: true`; `evidence`
|
|
138
|
+
contains nonempty `{path, sha256}` bindings to the actual JSON results.
|
|
139
|
+
|
|
140
|
+
A thin consumer workflow listens to completion of that qualification workflow
|
|
141
|
+
and calls `public-release-oci-compose-preview.yml@v4-alpha`, passing
|
|
142
|
+
`BUILDCHAIN_PROMOTION_TOKEN`. The reusable workflow resolves its own exact
|
|
143
|
+
runtime, enforces the dual floating-channel locks, verifies the public v4
|
|
144
|
+
settlement, family and provider readback roots, and checks the live GitHub run's
|
|
145
|
+
repository, source, workflow, event, attempt and successful conclusion. It never
|
|
146
|
+
executes the consumer's artifact files. Only then does it copy the exact Compose
|
|
147
|
+
manifest bytes to the declared alias and verify the public digest.
|
|
148
|
+
|
|
149
|
+
The expected-old digest is checked immediately before mutation. An already
|
|
150
|
+
matching target is an idempotent success; any other drift blocks the move.
|
|
151
|
+
Publishers for this alias share repository-level concurrency. GHCR has no atomic
|
|
152
|
+
tag compare-and-swap, so external writers must also avoid racing this workflow.
|
|
153
|
+
The immutable release retains the appended
|
|
154
|
+
`buildchain-compose-preview-<run-id>-<run-attempt>.json` receipt. A failed
|
|
155
|
+
qualification leaves the existing preview intact, while the immutable alpha
|
|
156
|
+
and its original publication evidence remain available for diagnosis.
|
package/docs/workflow-catalog.md
CHANGED
|
@@ -90,6 +90,7 @@ all related declarations. Run `pnpm run generate:workflows` and
|
|
|
90
90
|
| [public-ops-warrant-cancel.yml](../.github/workflows/public-ops-warrant-cancel.yml) | ops | reusable | active | Dev Delivery Warrant Queued Candidate Cancel | `dev-delivery-warrant-cancel.yml` |
|
|
91
91
|
| [public-ops-warrant-close.yml](../.github/workflows/public-ops-warrant-close.yml) | ops | reusable | active | Dev Delivery Warrant Close | `dev-delivery-warrant-close.yml` |
|
|
92
92
|
| [public-release-artifact-attestation.yml](../.github/workflows/public-release-artifact-attestation.yml) | release | reusable | active | Buildchain GitHub Artifact Attestation | `github-artifact-attestation.yml` |
|
|
93
|
+
| [public-release-oci-compose-preview.yml](../.github/workflows/public-release-oci-compose-preview.yml) | release | reusable | active | Buildchain OCI Compose Preview | — |
|
|
93
94
|
| [public-release-paper-sealed.yml](../.github/workflows/public-release-paper-sealed.yml) | release | reusable | active | Buildchain Sealed Paper Release | `paper-release-sealed.yml` |
|
|
94
95
|
| [public-release-paper.yml](../.github/workflows/public-release-paper.yml) | release | reusable | active | Buildchain Paper Release | `paper-release.yml` |
|
|
95
96
|
| [public-release-promote.yml](../.github/workflows/public-release-promote.yml) | release | reusable | active | Release Candidate Promote | `release-candidate-promote.yml` |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kungfu-tech/buildchain",
|
|
3
|
-
"version": "4.0.2-alpha.
|
|
3
|
+
"version": "4.0.2-alpha.49",
|
|
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",
|
|
@@ -4,6 +4,7 @@ import path from "node:path";
|
|
|
4
4
|
import { createPublicationAuthorityRegistry } from "./publication-authority.js";
|
|
5
5
|
|
|
6
6
|
const DESCRIPTORS = Object.freeze([
|
|
7
|
+
[".github/workflows/public-release-oci-compose-preview.yml", "product-publication", true, ["oci-compose-preview"], "caller-secrets", "none", "fixed", "caller-bound"],
|
|
7
8
|
[".github/workflows/.auditable-demo.yml", "non-publication-oidc"],
|
|
8
9
|
[".github/workflows/.declarative-auditable-demo.yml", "governance-write"],
|
|
9
10
|
[".github/workflows/.build.yml", "non-publication-oidc"],
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { v4ContentRoot } from "./v4-canonical-contracts.js";
|
|
2
|
+
import { releaseTailRoot } from "./release-tail-provider-plane.js";
|
|
3
|
+
import { ociPublicationTag } from "./oci-publication-graph.js";
|
|
4
|
+
|
|
5
|
+
function check(condition, message) {
|
|
6
|
+
if (!condition) throw new Error(`Compose preview: ${message}`);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function verifyComposePublication({
|
|
10
|
+
family,
|
|
11
|
+
readback,
|
|
12
|
+
documents,
|
|
13
|
+
repository,
|
|
14
|
+
tag,
|
|
15
|
+
}) {
|
|
16
|
+
const { root, ...body } = family;
|
|
17
|
+
const version = tag.replace(/^v/u, "");
|
|
18
|
+
const operation = documents.productState.operations.find(
|
|
19
|
+
(entry) => entry.capabilityId === "product.oci.publish",
|
|
20
|
+
);
|
|
21
|
+
check(
|
|
22
|
+
family.schema === "kungfu-buildchain-oci-family/v2" &&
|
|
23
|
+
root === v4ContentRoot("oci-publication-family", body) &&
|
|
24
|
+
family.repository === repository &&
|
|
25
|
+
family.version === version &&
|
|
26
|
+
family.sourceSha === documents.invocation.candidate.commit &&
|
|
27
|
+
readback.familyRoot === root &&
|
|
28
|
+
readback.version === version &&
|
|
29
|
+
readback.candidateSourceSha === family.sourceSha &&
|
|
30
|
+
operation?.receipt.evidenceRoots.includes(releaseTailRoot(readback)),
|
|
31
|
+
"unbound public OCI family",
|
|
32
|
+
);
|
|
33
|
+
const applications = family.images.filter(
|
|
34
|
+
(entry) => entry.kind === "compose" && entry.preview,
|
|
35
|
+
);
|
|
36
|
+
check(applications.length === 1, "expected one declared Compose preview");
|
|
37
|
+
const application = applications[0],
|
|
38
|
+
policy = application.preview;
|
|
39
|
+
check(
|
|
40
|
+
policy.alias === "compose-preview" &&
|
|
41
|
+
/^\.github\/workflows\/[a-z0-9-]+\.yml$/u.test(
|
|
42
|
+
policy.qualificationWorkflow,
|
|
43
|
+
) &&
|
|
44
|
+
/^(none|sha256:[0-9a-f]{64})$/u.test(policy.previousDigest),
|
|
45
|
+
"invalid preview policy",
|
|
46
|
+
);
|
|
47
|
+
const image = family.images.find(
|
|
48
|
+
(entry) =>
|
|
49
|
+
entry.name === application.targetImage && entry.kind !== "compose",
|
|
50
|
+
);
|
|
51
|
+
check(
|
|
52
|
+
image &&
|
|
53
|
+
application.repository === image.repository &&
|
|
54
|
+
image.repository === `ghcr.io/${repository}/${image.name}` &&
|
|
55
|
+
/^[a-z0-9][a-z0-9._-]*$/u.test(image.name),
|
|
56
|
+
"foreign application destination",
|
|
57
|
+
);
|
|
58
|
+
for (const entry of [image, application])
|
|
59
|
+
check(
|
|
60
|
+
readback.images.some(
|
|
61
|
+
(observed) =>
|
|
62
|
+
observed.name === entry.name &&
|
|
63
|
+
observed.repository === entry.repository &&
|
|
64
|
+
observed.digest === entry.digest &&
|
|
65
|
+
observed.ref === ociPublicationTag(entry, version) &&
|
|
66
|
+
observed.anonymous === true,
|
|
67
|
+
),
|
|
68
|
+
"missing public artifact readback",
|
|
69
|
+
);
|
|
70
|
+
return {
|
|
71
|
+
application,
|
|
72
|
+
image,
|
|
73
|
+
policy,
|
|
74
|
+
familyRoot: root,
|
|
75
|
+
repository,
|
|
76
|
+
tag,
|
|
77
|
+
sourceSha: documents.product.publication.releaseSha,
|
|
78
|
+
publicationReceiptRoot: documents.receipt.receiptRoot,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function verifyComposeQualification(context, run, receipt) {
|
|
83
|
+
const { application, image, policy, repository, tag, sourceSha, familyRoot } =
|
|
84
|
+
context;
|
|
85
|
+
check(
|
|
86
|
+
run.repository?.full_name === repository &&
|
|
87
|
+
run.head_repository?.full_name === repository &&
|
|
88
|
+
run.event === "workflow_dispatch" &&
|
|
89
|
+
run.status === "completed" &&
|
|
90
|
+
run.conclusion === "success" &&
|
|
91
|
+
run.head_sha === sourceSha &&
|
|
92
|
+
run.path.split("@")[0] === policy.qualificationWorkflow,
|
|
93
|
+
"qualification run is not the exact published source",
|
|
94
|
+
);
|
|
95
|
+
if (!receipt) return;
|
|
96
|
+
check(
|
|
97
|
+
receipt.schema === "kungfu-buildchain-compose-qualification/v1" &&
|
|
98
|
+
receipt.repository === repository &&
|
|
99
|
+
receipt.tag === tag &&
|
|
100
|
+
receipt.sourceSha === sourceSha &&
|
|
101
|
+
receipt.familyRoot === familyRoot &&
|
|
102
|
+
String(receipt.runId) === String(run.id) &&
|
|
103
|
+
Number(receipt.runAttempt) === run.run_attempt &&
|
|
104
|
+
receipt.image === `${image.repository}@${image.digest}` &&
|
|
105
|
+
receipt.application ===
|
|
106
|
+
`${application.repository}@${application.digest}` &&
|
|
107
|
+
receipt.previousDigest === policy.previousDigest &&
|
|
108
|
+
receipt.passed === true,
|
|
109
|
+
"qualification receipt identity mismatch",
|
|
110
|
+
);
|
|
111
|
+
for (const name of [
|
|
112
|
+
"freshInstall",
|
|
113
|
+
"restartPersistence",
|
|
114
|
+
"upgradePersistence",
|
|
115
|
+
"rollbackPersistence",
|
|
116
|
+
"accountIsolation",
|
|
117
|
+
"hardenedRuntime",
|
|
118
|
+
])
|
|
119
|
+
check(receipt.checks?.[name] === true, `qualification lacks ${name}`);
|
|
120
|
+
check(
|
|
121
|
+
Array.isArray(image.platforms) &&
|
|
122
|
+
image.platforms.length === 2 &&
|
|
123
|
+
JSON.stringify([...image.platforms].sort()) ===
|
|
124
|
+
JSON.stringify(["linux/amd64", "linux/arm64"]) &&
|
|
125
|
+
image.platforms.every(
|
|
126
|
+
(platform) => receipt.platforms?.[platform]?.passed === true,
|
|
127
|
+
),
|
|
128
|
+
"qualification lacks both platforms",
|
|
129
|
+
);
|
|
130
|
+
check(
|
|
131
|
+
Array.isArray(receipt.evidence) &&
|
|
132
|
+
receipt.evidence.length > 0 &&
|
|
133
|
+
receipt.evidence.every(
|
|
134
|
+
(entry) =>
|
|
135
|
+
/^[a-zA-Z0-9][a-zA-Z0-9._-]*\.json$/u.test(entry.path) &&
|
|
136
|
+
/^sha256:[0-9a-f]{64}$/u.test(entry.sha256),
|
|
137
|
+
),
|
|
138
|
+
"missing qualification evidence bindings",
|
|
139
|
+
);
|
|
140
|
+
}
|