@kungfu-tech/buildchain 2.12.6 → 2.12.7-alpha.1
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/actions/promote-buildchain-ref/README.md +7 -3
- package/bin/buildchain.mjs +78 -0
- package/dist/site/agent-index.json +1 -0
- package/dist/site/artifact-schemas.json +1 -0
- package/dist/site/buildchain-contract.json +137 -37
- package/dist/site/buildchain-site.json +68 -12
- package/dist/site/capability-registry.json +6 -5
- package/dist/site/cli-registry.json +36 -0
- package/dist/site/controller-registry.json +104 -13
- package/dist/site/kfd-claims.json +251 -15
- package/dist/site/kfd-upstream-aggregate.json +1 -1
- package/dist/site/manual-registry.json +15 -1
- package/dist/site/node-api-registry.json +43 -4
- package/dist/site/page-registry.json +54 -7
- package/dist/site/public-surface-audit.json +150 -17
- package/dist/site/publication-authority-registry.json +754 -0
- package/dist/site/publication-registry.json +4 -4
- package/dist/site/release-provenance.json +4 -0
- package/dist/site/site-manifest.json +14 -5
- package/dist/site/workflow-registry.json +108 -10
- package/docs/MAP.md +2 -1
- package/docs/publication-artifacts.md +12 -10
- package/docs/publication-authority.md +204 -0
- package/package.json +5 -1
- package/packages/core/buildchain-kfd-claims.js +5 -0
- package/packages/core/buildchain-publication-authority.js +79 -0
- package/packages/core/controller-evidence.js +7 -7
- package/packages/core/index.js +28 -0
- package/packages/core/publication-authority.js +725 -0
- package/packages/core/publication-control-plane-audit.js +133 -0
- package/scripts/assemble-self-publication-admission.mjs +182 -0
- package/scripts/audit-publication-control-plane.mjs +406 -0
- package/scripts/check-inventory.mjs +20 -2
- package/scripts/generate-site-bundle.mjs +16 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"contract": "kungfu-buildchain-publication-release-registry",
|
|
4
|
-
"generatedAt": "2026-07-
|
|
5
|
-
"publishedAt": "2026-07-
|
|
4
|
+
"generatedAt": "2026-07-14T16:13:01.149Z",
|
|
5
|
+
"publishedAt": "2026-07-14T16:13:01.149Z",
|
|
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": "3412ff280be0e1160a0e33b11b461adde02b57e4",
|
|
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": "2.12.
|
|
35
|
+
"version": "2.12.7-alpha.1",
|
|
36
36
|
"versionSource": "package.json#version"
|
|
37
37
|
},
|
|
38
38
|
"sourceKind": "package-site-bundle",
|
|
@@ -26,6 +26,9 @@
|
|
|
26
26
|
"./logging": "./packages/core/logging.js",
|
|
27
27
|
"./publication-artifact": "./packages/core/publication-artifact.js",
|
|
28
28
|
"./publication-package": "./packages/core/publication-package.js",
|
|
29
|
+
"./publication-authority": "./packages/core/publication-authority.js",
|
|
30
|
+
"./publication-control-plane-audit": "./packages/core/publication-control-plane-audit.js",
|
|
31
|
+
"./buildchain-publication-authority": "./packages/core/buildchain-publication-authority.js",
|
|
29
32
|
"./kfd-gate": "./packages/core/kfd-gate.js",
|
|
30
33
|
"./release-candidate": "./packages/core/release-candidate.js",
|
|
31
34
|
"./stable-candidate-ledger": "./packages/core/stable-candidate-ledger.js",
|
|
@@ -44,6 +47,7 @@
|
|
|
44
47
|
"./site/kfd-claims.json": "./dist/site/kfd-claims.json",
|
|
45
48
|
"./site/workflow-registry.json": "./dist/site/workflow-registry.json",
|
|
46
49
|
"./site/controller-registry.json": "./dist/site/controller-registry.json",
|
|
50
|
+
"./site/publication-authority-registry.json": "./dist/site/publication-authority-registry.json",
|
|
47
51
|
"./site/public-surface-audit.json": "./dist/site/public-surface-audit.json",
|
|
48
52
|
"./site/kfd-upstream-aggregate.json": "./dist/site/kfd-upstream-aggregate.json",
|
|
49
53
|
"./site/release-model.json": "./dist/site/release-model.json",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"contract": "kungfu-buildchain-site-manifest",
|
|
4
|
-
"generatedAt": "2026-07-
|
|
5
|
-
"publishedAt": "2026-07-
|
|
4
|
+
"generatedAt": "2026-07-14T16:13:01.149Z",
|
|
5
|
+
"publishedAt": "2026-07-14T16:13:01.149Z",
|
|
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": "3412ff280be0e1160a0e33b11b461adde02b57e4",
|
|
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": "2.12.
|
|
40
|
+
"version": "2.12.7-alpha.1",
|
|
41
41
|
"versionSource": "package.json#version"
|
|
42
42
|
},
|
|
43
43
|
"entrypoint": "buildchain-site.json",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"path": "docs/MAP.md",
|
|
54
54
|
"plane": "use",
|
|
55
55
|
"exists": true,
|
|
56
|
-
"digest": "sha256:
|
|
56
|
+
"digest": "sha256:91dc800bafc31bc149680c86272827936c94e0f025d547bbabc10d58fe5f128e"
|
|
57
57
|
},
|
|
58
58
|
{
|
|
59
59
|
"id": "install",
|
|
@@ -79,6 +79,14 @@
|
|
|
79
79
|
"exists": true,
|
|
80
80
|
"digest": "sha256:442e1b72e3977af56a8ae5e081ffd89c2f3ebcd9cfd50f07af730344bdf9fb0e"
|
|
81
81
|
},
|
|
82
|
+
{
|
|
83
|
+
"id": "publication-authority",
|
|
84
|
+
"title": "Sealed publication authority",
|
|
85
|
+
"path": "docs/publication-authority.md",
|
|
86
|
+
"plane": "verify",
|
|
87
|
+
"exists": true,
|
|
88
|
+
"digest": "sha256:fc08e6657a1b586b6b8b5618ca4f49dfaa85955687f5bba8e2e69e7513fe6c71"
|
|
89
|
+
},
|
|
82
90
|
{
|
|
83
91
|
"id": "release-candidate",
|
|
84
92
|
"title": "Release Candidate Passport",
|
|
@@ -272,6 +280,7 @@
|
|
|
272
280
|
"node-api-registry.json",
|
|
273
281
|
"workflow-registry.json",
|
|
274
282
|
"controller-registry.json",
|
|
283
|
+
"publication-authority-registry.json",
|
|
275
284
|
"public-surface-audit.json",
|
|
276
285
|
"release-model.json",
|
|
277
286
|
"artifact-schemas.json",
|
|
@@ -3,6 +3,30 @@
|
|
|
3
3
|
"contract": "kungfu-buildchain-workflow-registry",
|
|
4
4
|
"workflowSource": ".github/workflows reverse input enumeration",
|
|
5
5
|
"workflows": [
|
|
6
|
+
{
|
|
7
|
+
"id": ".binary-release-assets",
|
|
8
|
+
"path": ".github/workflows/.binary-release-assets.yml",
|
|
9
|
+
"reusable": true,
|
|
10
|
+
"inputs": [
|
|
11
|
+
"buildchain-ref",
|
|
12
|
+
"buildchain-repository",
|
|
13
|
+
"evidence-run-id",
|
|
14
|
+
"publication-admission-json",
|
|
15
|
+
"publication-control-plane-audit-json",
|
|
16
|
+
"publication-expected-json",
|
|
17
|
+
"publication-runner-provenance-json",
|
|
18
|
+
"publication-used-nonces-json",
|
|
19
|
+
"release-tag"
|
|
20
|
+
],
|
|
21
|
+
"inputCount": 9,
|
|
22
|
+
"secrets": [],
|
|
23
|
+
"secretCount": 0,
|
|
24
|
+
"outputs": [],
|
|
25
|
+
"outputCount": 0,
|
|
26
|
+
"surface": "reusable-workflow",
|
|
27
|
+
"capabilityGroup": "api-cli-reference",
|
|
28
|
+
"status": "active"
|
|
29
|
+
},
|
|
6
30
|
{
|
|
7
31
|
"id": ".build",
|
|
8
32
|
"path": ".github/workflows/.build.yml",
|
|
@@ -185,6 +209,47 @@
|
|
|
185
209
|
"capabilityGroup": "api-cli-reference",
|
|
186
210
|
"status": "active"
|
|
187
211
|
},
|
|
212
|
+
{
|
|
213
|
+
"id": ".publication-authority",
|
|
214
|
+
"path": ".github/workflows/.publication-authority.yml",
|
|
215
|
+
"reusable": true,
|
|
216
|
+
"inputs": [
|
|
217
|
+
"admission-json",
|
|
218
|
+
"auto-admission",
|
|
219
|
+
"buildchain-ref",
|
|
220
|
+
"buildchain-repository",
|
|
221
|
+
"control-plane-audit-json",
|
|
222
|
+
"dry-run",
|
|
223
|
+
"evidence-manifest-pattern",
|
|
224
|
+
"evidence-passport-artifact",
|
|
225
|
+
"evidence-payload-pattern",
|
|
226
|
+
"evidence-repository",
|
|
227
|
+
"evidence-run-id",
|
|
228
|
+
"evidence-summary-artifact",
|
|
229
|
+
"expected-json",
|
|
230
|
+
"gate-aggregate-json",
|
|
231
|
+
"package-name",
|
|
232
|
+
"product",
|
|
233
|
+
"publication-target",
|
|
234
|
+
"publisher-workflow-path",
|
|
235
|
+
"runner-provenance-json",
|
|
236
|
+
"source-sha",
|
|
237
|
+
"target-ref",
|
|
238
|
+
"used-nonces-json"
|
|
239
|
+
],
|
|
240
|
+
"inputCount": 22,
|
|
241
|
+
"secrets": [],
|
|
242
|
+
"secretCount": 0,
|
|
243
|
+
"outputs": [
|
|
244
|
+
"capability-artifact",
|
|
245
|
+
"capability-digest",
|
|
246
|
+
"capability-json"
|
|
247
|
+
],
|
|
248
|
+
"outputCount": 3,
|
|
249
|
+
"surface": "reusable-workflow",
|
|
250
|
+
"capabilityGroup": "api-cli-reference",
|
|
251
|
+
"status": "active"
|
|
252
|
+
},
|
|
188
253
|
{
|
|
189
254
|
"id": ".release-docker",
|
|
190
255
|
"path": ".github/workflows/.release-docker.yml",
|
|
@@ -474,6 +539,11 @@
|
|
|
474
539
|
"production-release-on-main",
|
|
475
540
|
"production-release-pr-mode",
|
|
476
541
|
"production-release-pr-token",
|
|
542
|
+
"publication-admission-json",
|
|
543
|
+
"publication-control-plane-audit-json",
|
|
544
|
+
"publication-expected-json",
|
|
545
|
+
"publication-runner-provenance-json",
|
|
546
|
+
"publication-used-nonces-json",
|
|
477
547
|
"release-feedback-actor-privacy",
|
|
478
548
|
"staging-apply",
|
|
479
549
|
"staging-aws-role-arn",
|
|
@@ -481,7 +551,7 @@
|
|
|
481
551
|
"verify-command",
|
|
482
552
|
"working-directory"
|
|
483
553
|
],
|
|
484
|
-
"inputCount":
|
|
554
|
+
"inputCount": 38,
|
|
485
555
|
"secrets": [
|
|
486
556
|
"production-release-app-private-key"
|
|
487
557
|
],
|
|
@@ -575,6 +645,20 @@
|
|
|
575
645
|
"capabilityGroup": "api-cli-reference",
|
|
576
646
|
"status": "active"
|
|
577
647
|
},
|
|
648
|
+
{
|
|
649
|
+
"id": "binary-release-assets",
|
|
650
|
+
"path": ".github/workflows/binary-release-assets.yml",
|
|
651
|
+
"reusable": false,
|
|
652
|
+
"inputs": [],
|
|
653
|
+
"inputCount": 0,
|
|
654
|
+
"secrets": [],
|
|
655
|
+
"secretCount": 0,
|
|
656
|
+
"outputs": [],
|
|
657
|
+
"outputCount": 0,
|
|
658
|
+
"surface": "repository-workflow",
|
|
659
|
+
"capabilityGroup": "api-cli-reference",
|
|
660
|
+
"status": "active"
|
|
661
|
+
},
|
|
578
662
|
{
|
|
579
663
|
"id": "build-surface-fixture",
|
|
580
664
|
"path": ".github/workflows/build-surface-fixture.yml",
|
|
@@ -962,6 +1046,11 @@
|
|
|
962
1046
|
"github-release-title",
|
|
963
1047
|
"node-version",
|
|
964
1048
|
"package-name",
|
|
1049
|
+
"publication-admission-json",
|
|
1050
|
+
"publication-control-plane-audit-json",
|
|
1051
|
+
"publication-expected-json",
|
|
1052
|
+
"publication-runner-provenance-json",
|
|
1053
|
+
"publication-used-nonces-json",
|
|
965
1054
|
"publish-dist-tag",
|
|
966
1055
|
"publish-package-set-order",
|
|
967
1056
|
"release-passport-impact-json",
|
|
@@ -978,11 +1067,9 @@
|
|
|
978
1067
|
"verify-command",
|
|
979
1068
|
"working-directory"
|
|
980
1069
|
],
|
|
981
|
-
"inputCount":
|
|
982
|
-
"secrets": [
|
|
983
|
-
|
|
984
|
-
],
|
|
985
|
-
"secretCount": 1,
|
|
1070
|
+
"inputCount": 37,
|
|
1071
|
+
"secrets": [],
|
|
1072
|
+
"secretCount": 0,
|
|
986
1073
|
"outputs": [
|
|
987
1074
|
"controller-plan-artifact",
|
|
988
1075
|
"controller-plan-digest",
|
|
@@ -1158,6 +1245,17 @@
|
|
|
1158
1245
|
"github-release-notes",
|
|
1159
1246
|
"github-release-title",
|
|
1160
1247
|
"package-manager",
|
|
1248
|
+
"publication-admission-json",
|
|
1249
|
+
"publication-auto-admission",
|
|
1250
|
+
"publication-control-plane-audit-json",
|
|
1251
|
+
"publication-expected-json",
|
|
1252
|
+
"publication-gate-aggregate-json",
|
|
1253
|
+
"publication-package-name",
|
|
1254
|
+
"publication-product",
|
|
1255
|
+
"publication-publisher-workflow-path",
|
|
1256
|
+
"publication-runner-provenance-json",
|
|
1257
|
+
"publication-target",
|
|
1258
|
+
"publication-used-nonces-json",
|
|
1161
1259
|
"publish-artifact-kind",
|
|
1162
1260
|
"publish-command",
|
|
1163
1261
|
"publish-dist-tag",
|
|
@@ -1186,17 +1284,16 @@
|
|
|
1186
1284
|
"target-sha",
|
|
1187
1285
|
"trusted-publishing"
|
|
1188
1286
|
],
|
|
1189
|
-
"inputCount":
|
|
1287
|
+
"inputCount": 55,
|
|
1190
1288
|
"secrets": [
|
|
1191
1289
|
"BUILDCHAIN_ISSUE_APP_ID",
|
|
1192
1290
|
"BUILDCHAIN_ISSUE_APP_PRIVATE_KEY",
|
|
1193
1291
|
"BUILDCHAIN_ISSUE_TOKEN",
|
|
1194
|
-
"BUILDCHAIN_PROMOTION_TOKEN",
|
|
1195
1292
|
"buildchain-issue-app-id",
|
|
1196
1293
|
"buildchain-issue-app-private-key",
|
|
1197
1294
|
"buildchain-issue-token"
|
|
1198
1295
|
],
|
|
1199
|
-
"secretCount":
|
|
1296
|
+
"secretCount": 6,
|
|
1200
1297
|
"outputs": [
|
|
1201
1298
|
"built-source-sha",
|
|
1202
1299
|
"controller-plan-artifact",
|
|
@@ -1207,9 +1304,10 @@
|
|
|
1207
1304
|
"controller-receipt-json",
|
|
1208
1305
|
"controller-receipt-status",
|
|
1209
1306
|
"promoted-sha",
|
|
1307
|
+
"publication-capability-digest",
|
|
1210
1308
|
"release-candidate-artifact"
|
|
1211
1309
|
],
|
|
1212
|
-
"outputCount":
|
|
1310
|
+
"outputCount": 11,
|
|
1213
1311
|
"surface": "release-governance",
|
|
1214
1312
|
"capabilityGroup": "reusable-build",
|
|
1215
1313
|
"status": "active"
|
package/docs/MAP.md
CHANGED
|
@@ -27,7 +27,7 @@ workflow, action, and Node API export also carries a `capabilityGroup`,
|
|
|
27
27
|
| Capability group | Primary facts | Primary manuals |
|
|
28
28
|
| --- | --- | --- |
|
|
29
29
|
| Getting Started | `capability-registry.json`, `product-mechanism.json` | [`install.md`](install.md), [`product-mechanism.md`](product-mechanism.md), [`cli.md`](cli.md) |
|
|
30
|
-
| Release Passport and Trust | `release-model.json`, `artifact-schemas.json`, `kfd-claims.json` | [`release-passport.md`](release-passport.md), [`release-candidate.md`](release-candidate.md), [`publish-transaction.md`](publish-transaction.md), [`binary-distribution.md`](binary-distribution.md) |
|
|
30
|
+
| Release Passport and Trust | `release-model.json`, `artifact-schemas.json`, `publication-authority-registry.json`, `kfd-claims.json` | [`release-passport.md`](release-passport.md), [`publication-authority.md`](publication-authority.md), [`release-candidate.md`](release-candidate.md), [`publish-transaction.md`](publish-transaction.md), [`binary-distribution.md`](binary-distribution.md) |
|
|
31
31
|
| Reusable Build and Lifecycle | `workflow-registry.json`, `controller-registry.json`, `release-model.json` | [`reusable-build-surface.md`](reusable-build-surface.md), [`controller-evidence.md`](controller-evidence.md), [`shifu-gate-profiles.md`](shifu-gate-profiles.md), [`lifecycle-protocol.md`](lifecycle-protocol.md) |
|
|
32
32
|
| KFD Trust and Surface Closure | `kfd-claims.json`, `public-surface-audit.json`, `cli-registry.json`, `node-api-registry.json` | [`kfd-support.md`](kfd-support.md), [`release-passport.md`](release-passport.md) |
|
|
33
33
|
| Site Bundle, Web Surfaces, and Propagation | `buildchain-site.json`, `site-manifest.json`, `page-registry.json`, `release-model.json` | [`site-bundle-contract.md`](site-bundle-contract.md), [`web-surface-deployments.md`](web-surface-deployments.md), [`release-propagation.md`](release-propagation.md) |
|
|
@@ -81,6 +81,7 @@ replace them.
|
|
|
81
81
|
| How does publish evidence, recovery, and finalization work? | [`publish-transaction.md`](publish-transaction.md) | verify | stable |
|
|
82
82
|
| How do I collect and verify module/product build facts from Git source, version files, and outputs? | [`build-facts.md`](build-facts.md) + [`cli.md`](cli.md) | use/verify | stable |
|
|
83
83
|
| How do I publish or verify release passport artifacts? | [`release-passport.md`](release-passport.md) | use | stable |
|
|
84
|
+
| How is product publication authority sealed to an exact workflow, runner, control plane, nonce, and artifact? | [`publication-authority.md`](publication-authority.md) | verify | preview |
|
|
84
85
|
| How do I gate release artifacts with KFD-1 contract-world witnesses? | [`release-passport.md`](release-passport.md#kfd-1-contract-world-release-gate) | verify/use | stable |
|
|
85
86
|
| How do I declare, render, and audit product KFD-2 release trust claims? | [`kfd-support.md`](kfd-support.md#kfd-2) + [`release-passport.md`](release-passport.md#kfd-2-release-trust-passport-audit) + [`cli.md`](cli.md) | verify/use | stable |
|
|
86
87
|
| How do I gate KFD-3 collaboration-interface releases? | [`release-passport.md`](release-passport.md#kfd-3-collaboration-interface-release-gate) + [`cli.md`](cli.md) | verify/use | stable |
|
|
@@ -188,23 +188,25 @@ jobs:
|
|
|
188
188
|
contents: write
|
|
189
189
|
id-token: write
|
|
190
190
|
issues: write
|
|
191
|
-
secrets:
|
|
192
|
-
BUILDCHAIN_PROMOTION_TOKEN: ${{ secrets.RELEASE_AUTHORITY_TOKEN }}
|
|
193
191
|
with:
|
|
194
192
|
buildchain-ref: ${{ inputs.buildchain-ref || '' }}
|
|
193
|
+
publication-admission-json: ${{ needs.authority.outputs.admission-json }}
|
|
194
|
+
publication-runner-provenance-json: ${{ needs.authority.outputs.runner-provenance-json }}
|
|
195
|
+
publication-control-plane-audit-json: ${{ needs.authority.outputs.control-plane-audit-json }}
|
|
196
|
+
publication-expected-json: ${{ needs.authority.outputs.expected-json }}
|
|
195
197
|
toolchain-type: config
|
|
196
198
|
verify-command: make check
|
|
197
199
|
buildchain-contract-lock-path: .buildchain/contract-lock.json
|
|
198
200
|
```
|
|
199
201
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
202
|
+
The publication job does not accept a long-lived promotion token. The caller
|
|
203
|
+
must first produce a fresh sealed admission, runner provenance, external
|
|
204
|
+
control-plane audit, and exact expected bindings. The credential-free verifier
|
|
205
|
+
job checks those receipts; only then can the publication job use its short-lived
|
|
206
|
+
`github.token` and caller-bound OIDC trusted publisher identity. npm binds that
|
|
207
|
+
identity to the consumer workflow filename; an npm Environment restriction is
|
|
208
|
+
optional and must be represented explicitly when configured. The workflow fails
|
|
209
|
+
before the publication build when the target branch protection cannot be read.
|
|
208
210
|
|
|
209
211
|
The preset:
|
|
210
212
|
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: draft
|
|
3
|
+
period: ongoing
|
|
4
|
+
theme: sealed-publication-authority
|
|
5
|
+
doc_type: protocol
|
|
6
|
+
source_level: local-files
|
|
7
|
+
confidence: high
|
|
8
|
+
sensitivity: public
|
|
9
|
+
evidence_grade: B
|
|
10
|
+
review_state: unreviewed
|
|
11
|
+
last_reviewed: 2026-07-14
|
|
12
|
+
ai_provenance:
|
|
13
|
+
model_family: GPT-5
|
|
14
|
+
product: Codex
|
|
15
|
+
generated_at: 2026-07-14
|
|
16
|
+
limits: Live provider configuration must be re-audited; no credential values are represented.
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# Sealed Publication Authority
|
|
20
|
+
|
|
21
|
+
Buildchain publication authority is a closed-world, fail-closed protocol. It does
|
|
22
|
+
not mint registry or cloud credentials. It independently verifies whether an
|
|
23
|
+
already protected publication job is allowed to request a short-lived provider
|
|
24
|
+
credential for one exact product, target, version, channel, and artifact digest.
|
|
25
|
+
|
|
26
|
+
The machine-readable authority inventory is
|
|
27
|
+
`dist/site/publication-authority-registry.json`. Any workflow with a write,
|
|
28
|
+
environment, OIDC, cloud credential, registry publish, release, or Git push
|
|
29
|
+
signal must have an explicit descriptor. A new authority-bearing workflow that
|
|
30
|
+
is absent from the inventory fails site generation. Unknown workflows and every
|
|
31
|
+
descriptor not marked `product-publication` are denied product publication.
|
|
32
|
+
|
|
33
|
+
## Evidence chain
|
|
34
|
+
|
|
35
|
+
A qualifying admission binds exact source and runtime SHAs; contract, consumer
|
|
36
|
+
policy, qualifying controller receipt, Shifu/Gate aggregate, artifact, runner,
|
|
37
|
+
and control-plane digests; repository, authority workflow, provider publisher
|
|
38
|
+
workflow, Environment policy,
|
|
39
|
+
product, target, version, and channel; plus a unique nonce and a lifetime of no
|
|
40
|
+
more than 15 minutes. Every expected binding is mandatory at verification time;
|
|
41
|
+
an omitted expected field is not a wildcard.
|
|
42
|
+
|
|
43
|
+
The independent verifier recomputes every digest and ignores a producer's own
|
|
44
|
+
allow/deny conclusion. It fetches the exact evidence run, validates the actual
|
|
45
|
+
release-candidate passport and referenced qualifying controller receipt,
|
|
46
|
+
recomputes the Shifu Gate aggregate or explicit consumer-owned no-Gate policy,
|
|
47
|
+
recomputes the downloaded artifact manifests, and hashes every declared product
|
|
48
|
+
payload file against those manifests. The `.buildchain/` diagnostics envelope is
|
|
49
|
+
bound by the manifest digest but excluded from the product-byte set because it can
|
|
50
|
+
be finalized after the lifecycle scan. The verifier also compares the PR evidence tree to the
|
|
51
|
+
admitted post-merge source commit tree. It rejects an unknown
|
|
52
|
+
workflow, stale or replayed nonce, runner downgrade, control-plane drift,
|
|
53
|
+
source/runtime mismatch, and artifact substitution. A successful result is a
|
|
54
|
+
scoped capability receipt, not a bearer credential.
|
|
55
|
+
|
|
56
|
+
## Runner and control-plane evidence
|
|
57
|
+
|
|
58
|
+
Runner evidence uses exactly four classes: `ephemeral`, `reimaged`,
|
|
59
|
+
`persistent-measured`, and `unqualified`. Ephemeral runners also record their
|
|
60
|
+
job-isolation boundary. Reimaged and persistent runners qualify only when a
|
|
61
|
+
clean baseline is proven and baseline, toolchain, cache-contract, and task-
|
|
62
|
+
isolation digests are all present. Otherwise they still emit diagnostic
|
|
63
|
+
evidence with `qualificationStatus = unqualified`, but cannot receive a product
|
|
64
|
+
capability.
|
|
65
|
+
|
|
66
|
+
The external audit records digests and pass/fail status for repository Actions
|
|
67
|
+
defaults, classic branch protection or an active matching repository ruleset,
|
|
68
|
+
declared protected Environment policy or an explicit no-Environment binding,
|
|
69
|
+
job-scoped credentials,
|
|
70
|
+
absence of long-lived workflow publication credentials, provider authority,
|
|
71
|
+
and authorized runner class. Provider modes are `npm-trusted-publisher`,
|
|
72
|
+
`github-token`, and `oidc-role`. The OIDC-role mode consumes only a sanitized
|
|
73
|
+
provider audit containing a role digest and qualifying decision; raw IAM policy,
|
|
74
|
+
tokens, or credentials are rejected. Package-owner, cloud-root, GitHub
|
|
75
|
+
administrator, and registry-root credentials remain outside Buildchain's trust
|
|
76
|
+
boundary. Missing or unreadable facts fail closed.
|
|
77
|
+
|
|
78
|
+
An unauthenticated local npm CLI is not evidence that Trusted Publishing is
|
|
79
|
+
missing. `npm whoami` reports only the local CLI session and does not report the
|
|
80
|
+
OIDC identity that npm creates during `npm publish`. The default read-only audit
|
|
81
|
+
therefore binds the exact provider, repository, caller workflow, optional
|
|
82
|
+
Environment, job-scoped OIDC permission, and absence of long-lived credentials,
|
|
83
|
+
then records `provider-at-transaction`: npm makes the final authorization
|
|
84
|
+
decision when `npm publish` exchanges the job's OIDC token. A missing or drifted
|
|
85
|
+
trusted-publisher configuration consequently denies the transaction safely; it
|
|
86
|
+
is not preflighted through an unrelated long-lived npm login.
|
|
87
|
+
|
|
88
|
+
An authenticated external auditor can add stronger point-in-time evidence by
|
|
89
|
+
supplying sanitized `npm trust list --json` output with `--npm-trust-json`. This
|
|
90
|
+
changes the publisher fact to `audited-control-plane`; the workflow never runs
|
|
91
|
+
`npm trust list` itself and never receives that auditor's npm credential.
|
|
92
|
+
|
|
93
|
+
The credential-free collector proves effective Actions and runner scope from
|
|
94
|
+
the publication workflow fetched at `--workflow-ref`: explicit read-only
|
|
95
|
+
workflow defaults, job-scoped write/OIDC permissions, and an exact GitHub-hosted
|
|
96
|
+
runner label. It does not call repository Actions-default or self-hosted-runner
|
|
97
|
+
administration endpoints. Branch/ruleset and OIDC subject facts remain live
|
|
98
|
+
read-only provider queries. When the detailed branch-protection endpoint is not
|
|
99
|
+
readable with the workflow token, `--source-sha` binds the provider's public
|
|
100
|
+
protected-branch summary to the exact merged PR, independent approval, required
|
|
101
|
+
successful check, same-repository lineage, and current branch head. This records
|
|
102
|
+
provider-enforced transaction evidence without treating an unavailable
|
|
103
|
+
administration endpoint as an unprotected branch. It avoids turning a
|
|
104
|
+
repository-admin token into a publication prerequisite.
|
|
105
|
+
|
|
106
|
+
For non-dry-run workflows, missing admission, runner, control-plane, Gate, or
|
|
107
|
+
expected-binding evidence is rejected before Buildchain downloads candidate
|
|
108
|
+
artifacts. The denial explicitly records that npm Trusted Publishing and OIDC
|
|
109
|
+
were not evaluated, so downstream diagnostics cannot misclassify an admission
|
|
110
|
+
assembly failure as an npm authentication failure.
|
|
111
|
+
|
|
112
|
+
Buildchain's own `workflow_run` promotion lane may assemble those inputs only
|
|
113
|
+
for `kungfu-systems/buildchain`. It downloads the exact prior RC passport,
|
|
114
|
+
summary, referenced controller receipt, manifests, and product payloads; proves
|
|
115
|
+
the admitted channel commit has the same Git tree as the RC; performs the live
|
|
116
|
+
read-only control-plane audit; records the GitHub-hosted job as ephemeral runner
|
|
117
|
+
provenance; and creates an explicit Buildchain-owned no-Gate decision. The
|
|
118
|
+
independent verifier then recomputes every receipt and payload digest exactly as
|
|
119
|
+
it does for externally supplied admission. The self-assembly mode rejects other
|
|
120
|
+
repositories, unknown refs, non-exact source SHAs, and any caller other than
|
|
121
|
+
`.github/workflows/buildchain-ref-promotion.yml`. Manual apply and external
|
|
122
|
+
consumer workflows still require their own explicit admission inputs.
|
|
123
|
+
|
|
124
|
+
Evidence publication is a separate authority class and never grants product
|
|
125
|
+
publication.
|
|
126
|
+
|
|
127
|
+
## API and CLI
|
|
128
|
+
|
|
129
|
+
Use `@kungfu-tech/buildchain/publication-authority` or run:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
buildchain verify publication-admission admission.json \
|
|
133
|
+
--registry-json publication-authority-registry.json \
|
|
134
|
+
--runner-json runner.json \
|
|
135
|
+
--control-plane-audit-json control-plane.json \
|
|
136
|
+
--publication-evidence-json publication-evidence.json \
|
|
137
|
+
--expected-json expected.json \
|
|
138
|
+
--used-nonce previous-run-nonce \
|
|
139
|
+
--json
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
The read-only live collector defaults to npm trusted publishing. Other product
|
|
143
|
+
providers select an explicit adapter:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
buildchain audit publication-control-plane \
|
|
147
|
+
--repository kungfu-systems/buildchain \
|
|
148
|
+
--branch dev/v2/v2.12 \
|
|
149
|
+
--source-sha <exact-merged-branch-sha> \
|
|
150
|
+
--workflow .github/workflows/release-candidate-promote.yml \
|
|
151
|
+
--workflow-ref <exact-buildchain-sha> \
|
|
152
|
+
--publisher-workflow .github/workflows/buildchain-ref-promotion.yml \
|
|
153
|
+
--job promote \
|
|
154
|
+
--environment none
|
|
155
|
+
|
|
156
|
+
# Optional stronger external evidence; generate the JSON outside the workflow.
|
|
157
|
+
buildchain audit publication-control-plane \
|
|
158
|
+
--repository kungfu-systems/buildchain \
|
|
159
|
+
--branch dev/v2/v2.12 \
|
|
160
|
+
--workflow .github/workflows/release-candidate-promote.yml \
|
|
161
|
+
--publisher-workflow .github/workflows/buildchain-ref-promotion.yml \
|
|
162
|
+
--job promote \
|
|
163
|
+
--environment none \
|
|
164
|
+
--npm-trust-json sanitized-npm-trust.json
|
|
165
|
+
|
|
166
|
+
buildchain audit publication-control-plane \
|
|
167
|
+
--repository kungfu-systems/buildchain \
|
|
168
|
+
--branch release/v2/v2.12 \
|
|
169
|
+
--workflow .github/workflows/.binary-release-assets.yml \
|
|
170
|
+
--job publish \
|
|
171
|
+
--environment buildchain-release-assets \
|
|
172
|
+
--publisher-mode github-token
|
|
173
|
+
|
|
174
|
+
buildchain audit publication-control-plane \
|
|
175
|
+
--repository OWNER/CONSUMER \
|
|
176
|
+
--workflow-repository kungfu-systems/buildchain \
|
|
177
|
+
--branch main \
|
|
178
|
+
--workflow .github/workflows/.web-surface.yml \
|
|
179
|
+
--job production-apply \
|
|
180
|
+
--environment production \
|
|
181
|
+
--publisher-mode oidc-role \
|
|
182
|
+
--provider-audit-json sanitized-oidc-role-audit.json
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
The authority workflow identifies the reusable implementation that performs the
|
|
186
|
+
publication job. The publisher workflow identifies the caller filename bound by
|
|
187
|
+
the provider's trusted-publisher policy; these identities are deliberately
|
|
188
|
+
separate. `--environment none` is an explicit assertion that the job declares no
|
|
189
|
+
GitHub Environment and the provider policy has no Environment restriction. A
|
|
190
|
+
named Environment must exist, be protected, and be declared by the job. The
|
|
191
|
+
Buildchain receipt alone is never sufficient authorization.
|
|
192
|
+
|
|
193
|
+
## Publication lanes
|
|
194
|
+
|
|
195
|
+
`Binary Distribution` is evidence-only. It builds platform archives and a
|
|
196
|
+
release evidence bundle with read-only repository permissions. GitHub Release
|
|
197
|
+
asset writes live in `Binary Release Assets`, which downloads an exact prior
|
|
198
|
+
evidence run, verifies its bundle digest against the sealed capability, and is
|
|
199
|
+
the only binary job with `contents: write` in the protected
|
|
200
|
+
`buildchain-release-assets` Environment.
|
|
201
|
+
|
|
202
|
+
The npm/promotion, paper, binary-release, and web-production lanes all depend on
|
|
203
|
+
the independent verifier. Preview, staging, build, source-check, controller,
|
|
204
|
+
and failure-evidence lanes do not inherit product publication capability.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kungfu-tech/buildchain",
|
|
3
|
-
"version": "2.12.
|
|
3
|
+
"version": "2.12.7-alpha.1",
|
|
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",
|
|
@@ -29,6 +29,9 @@
|
|
|
29
29
|
"./logging": "./packages/core/logging.js",
|
|
30
30
|
"./publication-artifact": "./packages/core/publication-artifact.js",
|
|
31
31
|
"./publication-package": "./packages/core/publication-package.js",
|
|
32
|
+
"./publication-authority": "./packages/core/publication-authority.js",
|
|
33
|
+
"./publication-control-plane-audit": "./packages/core/publication-control-plane-audit.js",
|
|
34
|
+
"./buildchain-publication-authority": "./packages/core/buildchain-publication-authority.js",
|
|
32
35
|
"./kfd-gate": "./packages/core/kfd-gate.js",
|
|
33
36
|
"./release-candidate": "./packages/core/release-candidate.js",
|
|
34
37
|
"./stable-candidate-ledger": "./packages/core/stable-candidate-ledger.js",
|
|
@@ -47,6 +50,7 @@
|
|
|
47
50
|
"./site/kfd-claims.json": "./dist/site/kfd-claims.json",
|
|
48
51
|
"./site/workflow-registry.json": "./dist/site/workflow-registry.json",
|
|
49
52
|
"./site/controller-registry.json": "./dist/site/controller-registry.json",
|
|
53
|
+
"./site/publication-authority-registry.json": "./dist/site/publication-authority-registry.json",
|
|
50
54
|
"./site/public-surface-audit.json": "./dist/site/public-surface-audit.json",
|
|
51
55
|
"./site/kfd-upstream-aggregate.json": "./dist/site/kfd-upstream-aggregate.json",
|
|
52
56
|
"./site/release-model.json": "./dist/site/release-model.json",
|
|
@@ -16,6 +16,7 @@ export const BUILDCHAIN_AGENT_MANUALS = Object.freeze([
|
|
|
16
16
|
{ id: "install", title: "Install and verify Buildchain", path: "docs/install.md", plane: "use" },
|
|
17
17
|
{ id: "release-passport", title: "Release Passport protocol", path: "docs/release-passport.md", plane: "verify" },
|
|
18
18
|
{ id: "controller-evidence", title: "Controller evidence contract", path: "docs/controller-evidence.md", plane: "verify" },
|
|
19
|
+
{ id: "publication-authority", title: "Sealed publication authority", path: "docs/publication-authority.md", plane: "verify" },
|
|
19
20
|
{ id: "release-candidate", title: "Release Candidate Passport", path: "docs/release-candidate.md", plane: "verify" },
|
|
20
21
|
{ id: "release-propagation", title: "Release propagation", path: "docs/release-propagation.md", plane: "use" },
|
|
21
22
|
{ id: "readme-badges", title: "README badge blocks", path: "docs/readme-badges.md", plane: "use" },
|
|
@@ -52,6 +53,7 @@ const SITE_CONTRACT_FILES = Object.freeze([
|
|
|
52
53
|
"dist/site/node-api-registry.json",
|
|
53
54
|
"dist/site/workflow-registry.json",
|
|
54
55
|
"dist/site/controller-registry.json",
|
|
56
|
+
"dist/site/publication-authority-registry.json",
|
|
55
57
|
"dist/site/public-surface-audit.json",
|
|
56
58
|
"dist/site/release-model.json",
|
|
57
59
|
"dist/site/artifact-schemas.json",
|
|
@@ -68,6 +70,9 @@ const SCHEMA_AND_STANDARD_FILES = Object.freeze([
|
|
|
68
70
|
"packages/core/release-passport.js",
|
|
69
71
|
"packages/core/buildchain-contract.js",
|
|
70
72
|
"packages/core/controller-evidence.js",
|
|
73
|
+
"packages/core/publication-authority.js",
|
|
74
|
+
"packages/core/publication-control-plane-audit.js",
|
|
75
|
+
"packages/core/buildchain-publication-authority.js",
|
|
71
76
|
"packages/core/buildchain-kfd-claims.js",
|
|
72
77
|
"packages/core/kfd3-surface-register.js",
|
|
73
78
|
"packages/core/public-surface-audit.js",
|