@kungfu-tech/buildchain 2.12.6 → 2.12.7-alpha.10

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 (40) hide show
  1. package/actions/promote-buildchain-ref/README.md +11 -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 +163 -38
  6. package/dist/site/buildchain-site.json +73 -17
  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 +121 -10
  10. package/dist/site/kfd-claims.json +305 -17
  11. package/dist/site/kfd-upstream-aggregate.json +1 -1
  12. package/dist/site/manual-registry.json +16 -2
  13. package/dist/site/node-api-registry.json +43 -4
  14. package/dist/site/page-registry.json +58 -11
  15. package/dist/site/public-surface-audit.json +212 -19
  16. package/dist/site/publication-authority-registry.json +778 -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 +15 -6
  20. package/dist/site/workflow-registry.json +173 -12
  21. package/docs/MAP.md +2 -1
  22. package/docs/publication-artifacts.md +25 -18
  23. package/docs/publication-authority.md +213 -0
  24. package/docs/release-governance.md +3 -1
  25. package/docs/shifu-gate-profiles.md +6 -0
  26. package/package.json +5 -1
  27. package/packages/core/buildchain-kfd-claims.js +5 -0
  28. package/packages/core/buildchain-publication-authority.js +80 -0
  29. package/packages/core/controller-evidence.js +8 -8
  30. package/packages/core/index.js +35 -0
  31. package/packages/core/publication-artifact-candidate.js +128 -0
  32. package/packages/core/publication-authority.js +764 -0
  33. package/packages/core/publication-control-plane-audit.js +135 -0
  34. package/scripts/assemble-publication-artifact-admission.mjs +190 -0
  35. package/scripts/assemble-self-publication-admission.mjs +183 -0
  36. package/scripts/audit-publication-control-plane.mjs +409 -0
  37. package/scripts/check-inventory.mjs +25 -2
  38. package/scripts/generate-site-bundle.mjs +16 -0
  39. package/scripts/publication-artifact-candidate.mjs +130 -0
  40. package/scripts/workflow-friction-report.mjs +13 -2
@@ -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-15T02:23:03.502Z",
5
+ "publishedAt": "2026-07-15T02:23:03.502Z",
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": "5f17ef81ba524233331ffcd0c15b1fb800b3fa82",
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.10",
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-15T02:23:03.502Z",
5
+ "publishedAt": "2026-07-15T02:23:03.502Z",
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": "5f17ef81ba524233331ffcd0c15b1fb800b3fa82",
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.10",
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:06ba05f9d8a2685a0896334b6013a97c45b7d71163cf6898e5a6274baf7f0296"
89
+ },
82
90
  {
83
91
  "id": "release-candidate",
84
92
  "title": "Release Candidate Passport",
@@ -229,7 +237,7 @@
229
237
  "path": "docs/release-governance.md",
230
238
  "plane": "why",
231
239
  "exists": true,
232
- "digest": "sha256:beba38634bfdde032bb2ff85dc98dd8d755f942dabe227bf9b7aba8127ab7ce9"
240
+ "digest": "sha256:cce9f80add3c746fe28d8ebf5afb809348694741cb75d19154ed3057a9374c0d"
233
241
  },
234
242
  {
235
243
  "id": "release-flow",
@@ -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,53 @@
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
+ "authority-workflow-path",
219
+ "auto-admission",
220
+ "auto-admission-kind",
221
+ "buildchain-ref",
222
+ "buildchain-repository",
223
+ "control-plane-audit-json",
224
+ "dry-run",
225
+ "evidence-controller-artifact",
226
+ "evidence-manifest-pattern",
227
+ "evidence-passport-artifact",
228
+ "evidence-payload-pattern",
229
+ "evidence-publication-artifact",
230
+ "evidence-repository",
231
+ "evidence-run-id",
232
+ "evidence-summary-artifact",
233
+ "expected-json",
234
+ "gate-aggregate-json",
235
+ "package-name",
236
+ "product",
237
+ "publication-target",
238
+ "publication-version",
239
+ "publisher-workflow-path",
240
+ "required-status-check",
241
+ "runner-provenance-json",
242
+ "source-sha",
243
+ "target-ref",
244
+ "used-nonces-json"
245
+ ],
246
+ "inputCount": 28,
247
+ "secrets": [],
248
+ "secretCount": 0,
249
+ "outputs": [
250
+ "capability-artifact",
251
+ "capability-digest",
252
+ "capability-json"
253
+ ],
254
+ "outputCount": 3,
255
+ "surface": "reusable-workflow",
256
+ "capabilityGroup": "api-cli-reference",
257
+ "status": "active"
258
+ },
188
259
  {
189
260
  "id": ".release-docker",
190
261
  "path": ".github/workflows/.release-docker.yml",
@@ -474,6 +545,11 @@
474
545
  "production-release-on-main",
475
546
  "production-release-pr-mode",
476
547
  "production-release-pr-token",
548
+ "publication-admission-json",
549
+ "publication-control-plane-audit-json",
550
+ "publication-expected-json",
551
+ "publication-runner-provenance-json",
552
+ "publication-used-nonces-json",
477
553
  "release-feedback-actor-privacy",
478
554
  "staging-apply",
479
555
  "staging-aws-role-arn",
@@ -481,7 +557,7 @@
481
557
  "verify-command",
482
558
  "working-directory"
483
559
  ],
484
- "inputCount": 33,
560
+ "inputCount": 38,
485
561
  "secrets": [
486
562
  "production-release-app-private-key"
487
563
  ],
@@ -575,6 +651,20 @@
575
651
  "capabilityGroup": "api-cli-reference",
576
652
  "status": "active"
577
653
  },
654
+ {
655
+ "id": "binary-release-assets",
656
+ "path": ".github/workflows/binary-release-assets.yml",
657
+ "reusable": false,
658
+ "inputs": [],
659
+ "inputCount": 0,
660
+ "secrets": [],
661
+ "secretCount": 0,
662
+ "outputs": [],
663
+ "outputCount": 0,
664
+ "surface": "repository-workflow",
665
+ "capabilityGroup": "api-cli-reference",
666
+ "status": "active"
667
+ },
578
668
  {
579
669
  "id": "build-surface-fixture",
580
670
  "path": ".github/workflows/build-surface-fixture.yml",
@@ -940,6 +1030,52 @@
940
1030
  "capabilityGroup": "api-cli-reference",
941
1031
  "status": "active"
942
1032
  },
1033
+ {
1034
+ "id": "paper-release-sealed",
1035
+ "path": ".github/workflows/paper-release-sealed.yml",
1036
+ "reusable": true,
1037
+ "inputs": [
1038
+ "artifact-name",
1039
+ "artifact-paths",
1040
+ "artifact-retention-days",
1041
+ "branch-protection-bypass-apps",
1042
+ "branch-protection-bypass-teams",
1043
+ "branch-protection-bypass-users",
1044
+ "buildchain-contract-lock-path",
1045
+ "buildchain-ref",
1046
+ "buildchain-repository",
1047
+ "dry-run",
1048
+ "github-release",
1049
+ "github-release-notes",
1050
+ "github-release-title",
1051
+ "package-name",
1052
+ "publish-dist-tag",
1053
+ "publisher-workflow-path",
1054
+ "release-passport-impact-json",
1055
+ "release-passport-output-dir",
1056
+ "release-passport-product-name",
1057
+ "required-status-check",
1058
+ "target-ref",
1059
+ "target-sha",
1060
+ "toolchain-type",
1061
+ "verify-command",
1062
+ "working-directory"
1063
+ ],
1064
+ "inputCount": 25,
1065
+ "secrets": [],
1066
+ "secretCount": 0,
1067
+ "outputs": [
1068
+ "github-release-url",
1069
+ "package-name",
1070
+ "package-version",
1071
+ "public-release-tag",
1072
+ "release-passport-path"
1073
+ ],
1074
+ "outputCount": 5,
1075
+ "surface": "repository-workflow",
1076
+ "capabilityGroup": "api-cli-reference",
1077
+ "status": "active"
1078
+ },
943
1079
  {
944
1080
  "id": "paper-release",
945
1081
  "path": ".github/workflows/paper-release.yml",
@@ -962,6 +1098,11 @@
962
1098
  "github-release-title",
963
1099
  "node-version",
964
1100
  "package-name",
1101
+ "publication-admission-json",
1102
+ "publication-control-plane-audit-json",
1103
+ "publication-expected-json",
1104
+ "publication-runner-provenance-json",
1105
+ "publication-used-nonces-json",
965
1106
  "publish-dist-tag",
966
1107
  "publish-package-set-order",
967
1108
  "release-passport-impact-json",
@@ -978,11 +1119,9 @@
978
1119
  "verify-command",
979
1120
  "working-directory"
980
1121
  ],
981
- "inputCount": 32,
982
- "secrets": [
983
- "BUILDCHAIN_PROMOTION_TOKEN"
984
- ],
985
- "secretCount": 1,
1122
+ "inputCount": 37,
1123
+ "secrets": [],
1124
+ "secretCount": 0,
986
1125
  "outputs": [
987
1126
  "controller-plan-artifact",
988
1127
  "controller-plan-digest",
@@ -1106,7 +1245,11 @@
1106
1245
  "buildchain-ref",
1107
1246
  "buildchain-repository",
1108
1247
  "node-version",
1248
+ "package-name",
1249
+ "prepare-paper-package",
1250
+ "publish-dist-tag",
1109
1251
  "setup-node",
1252
+ "target-ref",
1110
1253
  "toolchain-command",
1111
1254
  "toolchain-digest",
1112
1255
  "toolchain-image",
@@ -1114,7 +1257,7 @@
1114
1257
  "verify-command",
1115
1258
  "working-directory"
1116
1259
  ],
1117
- "inputCount": 17,
1260
+ "inputCount": 21,
1118
1261
  "secrets": [],
1119
1262
  "secretCount": 0,
1120
1263
  "outputs": [
@@ -1125,13 +1268,17 @@
1125
1268
  "controller-receipt-digest",
1126
1269
  "controller-receipt-json",
1127
1270
  "controller-receipt-status",
1271
+ "package-name",
1272
+ "package-version",
1128
1273
  "publication-artifact-name",
1129
1274
  "publication-manifest-json",
1130
1275
  "publication-manifest-path",
1131
1276
  "publication-passport-path",
1132
- "publication-registry-path"
1277
+ "publication-registry-path",
1278
+ "publish-dist-tag",
1279
+ "runtime-sha"
1133
1280
  ],
1134
- "outputCount": 12,
1281
+ "outputCount": 16,
1135
1282
  "surface": "repository-workflow",
1136
1283
  "capabilityGroup": "reusable-build",
1137
1284
  "status": "active"
@@ -1158,6 +1305,17 @@
1158
1305
  "github-release-notes",
1159
1306
  "github-release-title",
1160
1307
  "package-manager",
1308
+ "publication-admission-json",
1309
+ "publication-auto-admission",
1310
+ "publication-control-plane-audit-json",
1311
+ "publication-expected-json",
1312
+ "publication-gate-aggregate-json",
1313
+ "publication-package-name",
1314
+ "publication-product",
1315
+ "publication-publisher-workflow-path",
1316
+ "publication-runner-provenance-json",
1317
+ "publication-target",
1318
+ "publication-used-nonces-json",
1161
1319
  "publish-artifact-kind",
1162
1320
  "publish-command",
1163
1321
  "publish-dist-tag",
@@ -1186,7 +1344,7 @@
1186
1344
  "target-sha",
1187
1345
  "trusted-publishing"
1188
1346
  ],
1189
- "inputCount": 44,
1347
+ "inputCount": 55,
1190
1348
  "secrets": [
1191
1349
  "BUILDCHAIN_ISSUE_APP_ID",
1192
1350
  "BUILDCHAIN_ISSUE_APP_PRIVATE_KEY",
@@ -1207,9 +1365,10 @@
1207
1365
  "controller-receipt-json",
1208
1366
  "controller-receipt-status",
1209
1367
  "promoted-sha",
1368
+ "publication-capability-digest",
1210
1369
  "release-candidate-artifact"
1211
1370
  ],
1212
- "outputCount": 10,
1371
+ "outputCount": 11,
1213
1372
  "surface": "release-governance",
1214
1373
  "capabilityGroup": "reusable-build",
1215
1374
  "status": "active"
@@ -1388,9 +1547,11 @@
1388
1547
  "branch-protection-bypass-teams",
1389
1548
  "branch-protection-bypass-users",
1390
1549
  "dry-run",
1550
+ "expected-publication-version",
1391
1551
  "generated-ref-update-token",
1392
1552
  "generated-status-check-token",
1393
1553
  "github-release",
1554
+ "github-release-artifact-paths",
1394
1555
  "github-release-notes",
1395
1556
  "github-release-title",
1396
1557
  "promote-only-release-candidate",
@@ -1436,7 +1597,7 @@
1436
1597
  "transaction-state-path",
1437
1598
  "verification-command"
1438
1599
  ],
1439
- "inputCount": 52,
1600
+ "inputCount": 54,
1440
1601
  "capabilityGroup": "release-passport-trust",
1441
1602
  "status": "active"
1442
1603
  },
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 |
@@ -182,38 +182,37 @@ on:
182
182
 
183
183
  jobs:
184
184
  paper-release:
185
- uses: kungfu-systems/buildchain/.github/workflows/paper-release.yml@v2
185
+ uses: kungfu-systems/buildchain/.github/workflows/paper-release-sealed.yml@v2
186
186
  permissions:
187
+ actions: read
187
188
  checks: write
188
189
  contents: write
189
190
  id-token: write
190
191
  issues: write
191
- secrets:
192
- BUILDCHAIN_PROMOTION_TOKEN: ${{ secrets.RELEASE_AUTHORITY_TOKEN }}
193
192
  with:
194
193
  buildchain-ref: ${{ inputs.buildchain-ref || '' }}
194
+ publisher-workflow-path: .github/workflows/paper-release.yml
195
195
  toolchain-type: config
196
196
  verify-command: make check
197
+ artifact-paths: _build/paper-name.pdf
197
198
  buildchain-contract-lock-path: .buildchain/contract-lock.json
198
199
  ```
199
200
 
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.
201
+ The sealed preset does not accept a long-lived promotion token. It builds and
202
+ packages the paper in a read-only job, then a credential-free authority job
203
+ downloads that exact candidate, audits the external control plane, and seals a
204
+ capability over the source tree, Buildchain runtime, controller receipt, PDF,
205
+ and npm package bytes. Only the final job receives write and OIDC permissions;
206
+ it downloads the admitted candidate, recomputes the capability binding, and
207
+ publishes without executing consumer build commands. npm binds the OIDC identity
208
+ to the consumer workflow named by `publisher-workflow-path`.
208
209
 
209
210
  The preset:
210
211
 
211
- - resolves the same floating Buildchain runtime and contract lock as the build
212
- workflow;
213
- - verifies that the declared promotion authority can read the protected target
214
- channel before starting the publication build;
212
+ - resolves the floating Buildchain runtime once and binds the exact SHA into the
213
+ publication candidate and authority capability;
215
214
  - builds the PDF through the declared pinned LaTeX Docker toolchain or custom
216
- command;
215
+ command in a read-only job;
217
216
  - verifies the paper repository;
218
217
  - writes the publication manifest, publication passport, optional archive
219
218
  registry, and source bundle;
@@ -224,14 +223,22 @@ The preset:
224
223
  - creates a `publish-gate/<alpha|release>/.../<version>` source lock for the
225
224
  channel commit and requires `promote-buildchain-ref` to verify that lock
226
225
  before any publish side effect;
227
- - publishes the package through npm Trusted Publishing;
226
+ - verifies the complete candidate again after authority and publishes the
227
+ package through npm Trusted Publishing without rebuilding it;
228
228
  - writes Buildchain release/passport evidence; and
229
- - creates or updates the exact-version GitHub Release by default.
229
+ - creates or updates the exact-version GitHub Release by default, uploading
230
+ every file declared by `publication.primary_artifact` and
231
+ `publication.artifact_paths` alongside the release evidence.
230
232
 
231
233
  Consumers can opt out of the GitHub Release with `github-release: false`, but
232
234
  the default is on so downstream release propagation can observe
233
235
  `release.published` without hand-written `gh release` steps.
234
236
 
237
+ Declared publication artifacts are resolved from the generated publication
238
+ manifest rather than repeated in consumer workflow YAML. Publication fails
239
+ before upload if a declared artifact is missing or if its basename would
240
+ collide with another GitHub Release asset.
241
+
235
242
  For npm Trusted Publishing, register the consumer workflow file that calls this
236
243
  preset, for example `.github/workflows/paper-release.yml`, against the declared
237
244
  package in npm. The trusted publisher is the consumer repository and workflow