@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.
Files changed (34) hide show
  1. package/actions/promote-buildchain-ref/README.md +7 -3
  2. package/bin/buildchain.mjs +78 -0
  3. package/dist/site/agent-index.json +1 -0
  4. package/dist/site/artifact-schemas.json +1 -0
  5. package/dist/site/buildchain-contract.json +137 -37
  6. package/dist/site/buildchain-site.json +68 -12
  7. package/dist/site/capability-registry.json +6 -5
  8. package/dist/site/cli-registry.json +36 -0
  9. package/dist/site/controller-registry.json +104 -13
  10. package/dist/site/kfd-claims.json +251 -15
  11. package/dist/site/kfd-upstream-aggregate.json +1 -1
  12. package/dist/site/manual-registry.json +15 -1
  13. package/dist/site/node-api-registry.json +43 -4
  14. package/dist/site/page-registry.json +54 -7
  15. package/dist/site/public-surface-audit.json +150 -17
  16. package/dist/site/publication-authority-registry.json +754 -0
  17. package/dist/site/publication-registry.json +4 -4
  18. package/dist/site/release-provenance.json +4 -0
  19. package/dist/site/site-manifest.json +14 -5
  20. package/dist/site/workflow-registry.json +108 -10
  21. package/docs/MAP.md +2 -1
  22. package/docs/publication-artifacts.md +12 -10
  23. package/docs/publication-authority.md +204 -0
  24. package/package.json +5 -1
  25. package/packages/core/buildchain-kfd-claims.js +5 -0
  26. package/packages/core/buildchain-publication-authority.js +79 -0
  27. package/packages/core/controller-evidence.js +7 -7
  28. package/packages/core/index.js +28 -0
  29. package/packages/core/publication-authority.js +725 -0
  30. package/packages/core/publication-control-plane-audit.js +133 -0
  31. package/scripts/assemble-self-publication-admission.mjs +182 -0
  32. package/scripts/audit-publication-control-plane.mjs +406 -0
  33. package/scripts/check-inventory.mjs +20 -2
  34. 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-14T04:26:37.000Z",
5
- "publishedAt": "2026-07-14T04:26:37.000Z",
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": "cbc30aab42b6ef7a32f8ab87b9e5674ce676f5c3",
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.6",
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-14T04:26:37.000Z",
5
- "publishedAt": "2026-07-14T04:26:37.000Z",
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": "cbc30aab42b6ef7a32f8ab87b9e5674ce676f5c3",
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.6",
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:223c7e2d20680d4a10c84f6a7c7875602538607217e9dfe291a356bbd21ac4f1"
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": 33,
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": 32,
982
- "secrets": [
983
- "BUILDCHAIN_PROMOTION_TOKEN"
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": 44,
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": 7,
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": 10,
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
- `RELEASE_AUTHORITY_TOKEN` is a caller-chosen release authority secret name.
201
- Map whichever repository or organization secret owns protected release
202
- bookkeeping into the reusable workflow's `BUILDCHAIN_PROMOTION_TOKEN` contract;
203
- the reusable workflow does not require that provider-side secret to use a
204
- specific name. Before it builds the paper, the workflow uses that authority to
205
- read the target channel's branch protection and fails with a configuration
206
- diagnostic if the protection is not readable. `github.token` remains a fallback
207
- for repositories where its permissions are sufficient.
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.6",
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",