@kungfu-tech/buildchain 2.12.7-alpha.1 → 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 (32) hide show
  1. package/actions/promote-buildchain-ref/README.md +4 -0
  2. package/dist/site/buildchain-contract.json +48 -23
  3. package/dist/site/buildchain-site.json +16 -16
  4. package/dist/site/capability-registry.json +1 -1
  5. package/dist/site/controller-registry.json +23 -3
  6. package/dist/site/kfd-claims.json +60 -8
  7. package/dist/site/kfd-upstream-aggregate.json +1 -1
  8. package/dist/site/manual-registry.json +2 -2
  9. package/dist/site/node-api-registry.json +6 -6
  10. package/dist/site/page-registry.json +10 -10
  11. package/dist/site/public-surface-audit.json +69 -9
  12. package/dist/site/publication-authority-registry.json +25 -1
  13. package/dist/site/publication-registry.json +4 -4
  14. package/dist/site/site-manifest.json +6 -6
  15. package/dist/site/workflow-registry.json +69 -6
  16. package/docs/publication-artifacts.md +25 -20
  17. package/docs/publication-authority.md +11 -2
  18. package/docs/release-governance.md +3 -1
  19. package/docs/shifu-gate-profiles.md +6 -0
  20. package/package.json +1 -1
  21. package/packages/core/buildchain-publication-authority.js +1 -0
  22. package/packages/core/controller-evidence.js +1 -1
  23. package/packages/core/index.js +7 -0
  24. package/packages/core/publication-artifact-candidate.js +128 -0
  25. package/packages/core/publication-authority.js +41 -2
  26. package/packages/core/publication-control-plane-audit.js +3 -1
  27. package/scripts/assemble-publication-artifact-admission.mjs +190 -0
  28. package/scripts/assemble-self-publication-admission.mjs +2 -1
  29. package/scripts/audit-publication-control-plane.mjs +5 -2
  30. package/scripts/check-inventory.mjs +5 -0
  31. package/scripts/publication-artifact-candidate.mjs +130 -0
  32. package/scripts/workflow-friction-report.mjs +13 -2
@@ -4,7 +4,7 @@
4
4
  "status": "passed",
5
5
  "summary": {
6
6
  "cliCommandCount": 79,
7
- "workflowCount": 46,
7
+ "workflowCount": 47,
8
8
  "actionCount": 4,
9
9
  "sitePageCount": 49,
10
10
  "docCommandRefCount": 246,
@@ -609,14 +609,18 @@
609
609
  "reusable": true,
610
610
  "inputs": [
611
611
  "admission-json",
612
+ "authority-workflow-path",
612
613
  "auto-admission",
614
+ "auto-admission-kind",
613
615
  "buildchain-ref",
614
616
  "buildchain-repository",
615
617
  "control-plane-audit-json",
616
618
  "dry-run",
619
+ "evidence-controller-artifact",
617
620
  "evidence-manifest-pattern",
618
621
  "evidence-passport-artifact",
619
622
  "evidence-payload-pattern",
623
+ "evidence-publication-artifact",
620
624
  "evidence-repository",
621
625
  "evidence-run-id",
622
626
  "evidence-summary-artifact",
@@ -625,13 +629,15 @@
625
629
  "package-name",
626
630
  "product",
627
631
  "publication-target",
632
+ "publication-version",
628
633
  "publisher-workflow-path",
634
+ "required-status-check",
629
635
  "runner-provenance-json",
630
636
  "source-sha",
631
637
  "target-ref",
632
638
  "used-nonces-json"
633
639
  ],
634
- "inputCount": 22,
640
+ "inputCount": 28,
635
641
  "secrets": [],
636
642
  "secretCount": 0,
637
643
  "outputs": [
@@ -1334,6 +1340,49 @@
1334
1340
  "outputs": [],
1335
1341
  "outputCount": 0
1336
1342
  },
1343
+ {
1344
+ "id": "paper-release-sealed",
1345
+ "path": ".github/workflows/paper-release-sealed.yml",
1346
+ "reusable": true,
1347
+ "inputs": [
1348
+ "artifact-name",
1349
+ "artifact-paths",
1350
+ "artifact-retention-days",
1351
+ "branch-protection-bypass-apps",
1352
+ "branch-protection-bypass-teams",
1353
+ "branch-protection-bypass-users",
1354
+ "buildchain-contract-lock-path",
1355
+ "buildchain-ref",
1356
+ "buildchain-repository",
1357
+ "dry-run",
1358
+ "github-release",
1359
+ "github-release-notes",
1360
+ "github-release-title",
1361
+ "package-name",
1362
+ "publish-dist-tag",
1363
+ "publisher-workflow-path",
1364
+ "release-passport-impact-json",
1365
+ "release-passport-output-dir",
1366
+ "release-passport-product-name",
1367
+ "required-status-check",
1368
+ "target-ref",
1369
+ "target-sha",
1370
+ "toolchain-type",
1371
+ "verify-command",
1372
+ "working-directory"
1373
+ ],
1374
+ "inputCount": 25,
1375
+ "secrets": [],
1376
+ "secretCount": 0,
1377
+ "outputs": [
1378
+ "github-release-url",
1379
+ "package-name",
1380
+ "package-version",
1381
+ "public-release-tag",
1382
+ "release-passport-path"
1383
+ ],
1384
+ "outputCount": 5
1385
+ },
1337
1386
  {
1338
1387
  "id": "paper-release",
1339
1388
  "path": ".github/workflows/paper-release.yml",
@@ -1491,7 +1540,11 @@
1491
1540
  "buildchain-ref",
1492
1541
  "buildchain-repository",
1493
1542
  "node-version",
1543
+ "package-name",
1544
+ "prepare-paper-package",
1545
+ "publish-dist-tag",
1494
1546
  "setup-node",
1547
+ "target-ref",
1495
1548
  "toolchain-command",
1496
1549
  "toolchain-digest",
1497
1550
  "toolchain-image",
@@ -1499,7 +1552,7 @@
1499
1552
  "verify-command",
1500
1553
  "working-directory"
1501
1554
  ],
1502
- "inputCount": 17,
1555
+ "inputCount": 21,
1503
1556
  "secrets": [],
1504
1557
  "secretCount": 0,
1505
1558
  "outputs": [
@@ -1510,13 +1563,17 @@
1510
1563
  "controller-receipt-digest",
1511
1564
  "controller-receipt-json",
1512
1565
  "controller-receipt-status",
1566
+ "package-name",
1567
+ "package-version",
1513
1568
  "publication-artifact-name",
1514
1569
  "publication-manifest-json",
1515
1570
  "publication-manifest-path",
1516
1571
  "publication-passport-path",
1517
- "publication-registry-path"
1572
+ "publication-registry-path",
1573
+ "publish-dist-tag",
1574
+ "runtime-sha"
1518
1575
  ],
1519
- "outputCount": 12
1576
+ "outputCount": 16
1520
1577
  },
1521
1578
  {
1522
1579
  "id": "release-candidate-promote",
@@ -1584,11 +1641,12 @@
1584
1641
  "BUILDCHAIN_ISSUE_APP_ID",
1585
1642
  "BUILDCHAIN_ISSUE_APP_PRIVATE_KEY",
1586
1643
  "BUILDCHAIN_ISSUE_TOKEN",
1644
+ "BUILDCHAIN_PROMOTION_TOKEN",
1587
1645
  "buildchain-issue-app-id",
1588
1646
  "buildchain-issue-app-private-key",
1589
1647
  "buildchain-issue-token"
1590
1648
  ],
1591
- "secretCount": 6,
1649
+ "secretCount": 7,
1592
1650
  "outputs": [
1593
1651
  "built-source-sha",
1594
1652
  "controller-plan-artifact",
@@ -1753,9 +1811,11 @@
1753
1811
  "branch-protection-bypass-teams",
1754
1812
  "branch-protection-bypass-users",
1755
1813
  "dry-run",
1814
+ "expected-publication-version",
1756
1815
  "generated-ref-update-token",
1757
1816
  "generated-status-check-token",
1758
1817
  "github-release",
1818
+ "github-release-artifact-paths",
1759
1819
  "github-release-notes",
1760
1820
  "github-release-title",
1761
1821
  "promote-only-release-candidate",
@@ -1801,7 +1861,7 @@
1801
1861
  "transaction-state-path",
1802
1862
  "verification-command"
1803
1863
  ],
1804
- "inputCount": 52
1864
+ "inputCount": 54
1805
1865
  },
1806
1866
  {
1807
1867
  "id": "report-buildchain-issue",
@@ -3327,8 +3387,8 @@
3327
3387
  "workflowRegistryPath": "dist/site/workflow-registry.json",
3328
3388
  "pageRegistryPath": "dist/site/page-registry.json",
3329
3389
  "cliRegistryDigest": "a6daf4822365bf576425777230246046ebca67b3f8dcfea61fc7a61773776185",
3330
- "workflowRegistryDigest": "c71378eba66d2e03b5c90ed3e5b20a3e68f279b503062ffbf9fdfabe341adcae",
3331
- "pageRegistryDigest": "289cfbb5251f8dcba1ab683da86a434af31de2a791e7cd453e16d1c86b5069be"
3390
+ "workflowRegistryDigest": "a61b85b07185e02e340c27d50f77a6710968db87dd42d1b1f4dd81260779a0ed",
3391
+ "pageRegistryDigest": "3a4779e3d85d0a175e33c7d2a8bee30ede3931cc721a7d8c422ab321f0dec723"
3332
3392
  },
3333
3393
  "comparison": {
3334
3394
  "missingCliRegistry": [],
@@ -306,6 +306,22 @@
306
306
  "runnerPolicy": "unqualified",
307
307
  "notes": ""
308
308
  },
309
+ {
310
+ "workflowPath": ".github/workflows/paper-release-sealed.yml",
311
+ "authorityClass": "product-publication",
312
+ "publicationCapable": true,
313
+ "capabilityIds": [
314
+ "github-release",
315
+ "npm-publish"
316
+ ],
317
+ "credentialMode": "trusted-publishing",
318
+ "publisherWorkflowMode": "caller-bound",
319
+ "publisherWorkflowPath": ".github/workflows/paper-release-sealed.yml",
320
+ "environment": "none",
321
+ "environmentMode": "fixed",
322
+ "runnerPolicy": "qualified-measured",
323
+ "notes": ""
324
+ },
309
325
  {
310
326
  "workflowPath": ".github/workflows/paper-release.yml",
311
327
  "authorityClass": "product-publication",
@@ -655,6 +671,14 @@
655
671
  ],
656
672
  "classified": true
657
673
  },
674
+ {
675
+ "path": ".github/workflows/paper-release-sealed.yml",
676
+ "signals": [
677
+ "write-permission",
678
+ "oidc"
679
+ ],
680
+ "classified": true
681
+ },
658
682
  {
659
683
  "path": ".github/workflows/paper-release.yml",
660
684
  "signals": [
@@ -750,5 +774,5 @@
750
774
  "classified": false
751
775
  }
752
776
  ],
753
- "registryDigest": "a606a7da7188a8eee970d63b15f859b99024c246fb698d74e04fd548d2552c55"
777
+ "registryDigest": "760215fb39e6c85890c925e924c538a766d78abd6319794c8799fb47c23dec3d"
754
778
  }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "contract": "kungfu-buildchain-publication-release-registry",
4
- "generatedAt": "2026-07-14T16:13:01.149Z",
5
- "publishedAt": "2026-07-14T16:13:01.149Z",
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": "3412ff280be0e1160a0e33b11b461adde02b57e4",
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.7-alpha.1",
35
+ "version": "2.12.7-alpha.10",
36
36
  "versionSource": "package.json#version"
37
37
  },
38
38
  "sourceKind": "package-site-bundle",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "contract": "kungfu-buildchain-site-manifest",
4
- "generatedAt": "2026-07-14T16:13:01.149Z",
5
- "publishedAt": "2026-07-14T16:13:01.149Z",
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": "3412ff280be0e1160a0e33b11b461adde02b57e4",
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.7-alpha.1",
40
+ "version": "2.12.7-alpha.10",
41
41
  "versionSource": "package.json#version"
42
42
  },
43
43
  "entrypoint": "buildchain-site.json",
@@ -85,7 +85,7 @@
85
85
  "path": "docs/publication-authority.md",
86
86
  "plane": "verify",
87
87
  "exists": true,
88
- "digest": "sha256:fc08e6657a1b586b6b8b5618ca4f49dfaa85955687f5bba8e2e69e7513fe6c71"
88
+ "digest": "sha256:06ba05f9d8a2685a0896334b6013a97c45b7d71163cf6898e5a6274baf7f0296"
89
89
  },
90
90
  {
91
91
  "id": "release-candidate",
@@ -237,7 +237,7 @@
237
237
  "path": "docs/release-governance.md",
238
238
  "plane": "why",
239
239
  "exists": true,
240
- "digest": "sha256:beba38634bfdde032bb2ff85dc98dd8d755f942dabe227bf9b7aba8127ab7ce9"
240
+ "digest": "sha256:cce9f80add3c746fe28d8ebf5afb809348694741cb75d19154ed3057a9374c0d"
241
241
  },
242
242
  {
243
243
  "id": "release-flow",
@@ -215,14 +215,18 @@
215
215
  "reusable": true,
216
216
  "inputs": [
217
217
  "admission-json",
218
+ "authority-workflow-path",
218
219
  "auto-admission",
220
+ "auto-admission-kind",
219
221
  "buildchain-ref",
220
222
  "buildchain-repository",
221
223
  "control-plane-audit-json",
222
224
  "dry-run",
225
+ "evidence-controller-artifact",
223
226
  "evidence-manifest-pattern",
224
227
  "evidence-passport-artifact",
225
228
  "evidence-payload-pattern",
229
+ "evidence-publication-artifact",
226
230
  "evidence-repository",
227
231
  "evidence-run-id",
228
232
  "evidence-summary-artifact",
@@ -231,13 +235,15 @@
231
235
  "package-name",
232
236
  "product",
233
237
  "publication-target",
238
+ "publication-version",
234
239
  "publisher-workflow-path",
240
+ "required-status-check",
235
241
  "runner-provenance-json",
236
242
  "source-sha",
237
243
  "target-ref",
238
244
  "used-nonces-json"
239
245
  ],
240
- "inputCount": 22,
246
+ "inputCount": 28,
241
247
  "secrets": [],
242
248
  "secretCount": 0,
243
249
  "outputs": [
@@ -1024,6 +1030,52 @@
1024
1030
  "capabilityGroup": "api-cli-reference",
1025
1031
  "status": "active"
1026
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
+ },
1027
1079
  {
1028
1080
  "id": "paper-release",
1029
1081
  "path": ".github/workflows/paper-release.yml",
@@ -1193,7 +1245,11 @@
1193
1245
  "buildchain-ref",
1194
1246
  "buildchain-repository",
1195
1247
  "node-version",
1248
+ "package-name",
1249
+ "prepare-paper-package",
1250
+ "publish-dist-tag",
1196
1251
  "setup-node",
1252
+ "target-ref",
1197
1253
  "toolchain-command",
1198
1254
  "toolchain-digest",
1199
1255
  "toolchain-image",
@@ -1201,7 +1257,7 @@
1201
1257
  "verify-command",
1202
1258
  "working-directory"
1203
1259
  ],
1204
- "inputCount": 17,
1260
+ "inputCount": 21,
1205
1261
  "secrets": [],
1206
1262
  "secretCount": 0,
1207
1263
  "outputs": [
@@ -1212,13 +1268,17 @@
1212
1268
  "controller-receipt-digest",
1213
1269
  "controller-receipt-json",
1214
1270
  "controller-receipt-status",
1271
+ "package-name",
1272
+ "package-version",
1215
1273
  "publication-artifact-name",
1216
1274
  "publication-manifest-json",
1217
1275
  "publication-manifest-path",
1218
1276
  "publication-passport-path",
1219
- "publication-registry-path"
1277
+ "publication-registry-path",
1278
+ "publish-dist-tag",
1279
+ "runtime-sha"
1220
1280
  ],
1221
- "outputCount": 12,
1281
+ "outputCount": 16,
1222
1282
  "surface": "repository-workflow",
1223
1283
  "capabilityGroup": "reusable-build",
1224
1284
  "status": "active"
@@ -1289,11 +1349,12 @@
1289
1349
  "BUILDCHAIN_ISSUE_APP_ID",
1290
1350
  "BUILDCHAIN_ISSUE_APP_PRIVATE_KEY",
1291
1351
  "BUILDCHAIN_ISSUE_TOKEN",
1352
+ "BUILDCHAIN_PROMOTION_TOKEN",
1292
1353
  "buildchain-issue-app-id",
1293
1354
  "buildchain-issue-app-private-key",
1294
1355
  "buildchain-issue-token"
1295
1356
  ],
1296
- "secretCount": 6,
1357
+ "secretCount": 7,
1297
1358
  "outputs": [
1298
1359
  "built-source-sha",
1299
1360
  "controller-plan-artifact",
@@ -1486,9 +1547,11 @@
1486
1547
  "branch-protection-bypass-teams",
1487
1548
  "branch-protection-bypass-users",
1488
1549
  "dry-run",
1550
+ "expected-publication-version",
1489
1551
  "generated-ref-update-token",
1490
1552
  "generated-status-check-token",
1491
1553
  "github-release",
1554
+ "github-release-artifact-paths",
1492
1555
  "github-release-notes",
1493
1556
  "github-release-title",
1494
1557
  "promote-only-release-candidate",
@@ -1534,7 +1597,7 @@
1534
1597
  "transaction-state-path",
1535
1598
  "verification-command"
1536
1599
  ],
1537
- "inputCount": 52,
1600
+ "inputCount": 54,
1538
1601
  "capabilityGroup": "release-passport-trust",
1539
1602
  "status": "active"
1540
1603
  },
@@ -182,40 +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
192
  with:
192
193
  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 }}
194
+ publisher-workflow-path: .github/workflows/paper-release.yml
197
195
  toolchain-type: config
198
196
  verify-command: make check
197
+ artifact-paths: _build/paper-name.pdf
199
198
  buildchain-contract-lock-path: .buildchain/contract-lock.json
200
199
  ```
201
200
 
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.
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`.
210
209
 
211
210
  The preset:
212
211
 
213
- - resolves the same floating Buildchain runtime and contract lock as the build
214
- workflow;
215
- - verifies that the declared promotion authority can read the protected target
216
- 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;
217
214
  - builds the PDF through the declared pinned LaTeX Docker toolchain or custom
218
- command;
215
+ command in a read-only job;
219
216
  - verifies the paper repository;
220
217
  - writes the publication manifest, publication passport, optional archive
221
218
  registry, and source bundle;
@@ -226,14 +223,22 @@ The preset:
226
223
  - creates a `publish-gate/<alpha|release>/.../<version>` source lock for the
227
224
  channel commit and requires `promote-buildchain-ref` to verify that lock
228
225
  before any publish side effect;
229
- - 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;
230
228
  - writes Buildchain release/passport evidence; and
231
- - 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.
232
232
 
233
233
  Consumers can opt out of the GitHub Release with `github-release: false`, but
234
234
  the default is on so downstream release propagation can observe
235
235
  `release.published` without hand-written `gh release` steps.
236
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
+
237
242
  For npm Trusted Publishing, register the consumer workflow file that calls this
238
243
  preset, for example `.github/workflows/paper-release.yml`, against the declared
239
244
  package in npm. The trusted publisher is the consumer repository and workflow
@@ -8,11 +8,11 @@ confidence: high
8
8
  sensitivity: public
9
9
  evidence_grade: B
10
10
  review_state: unreviewed
11
- last_reviewed: 2026-07-14
11
+ last_reviewed: 2026-07-15
12
12
  ai_provenance:
13
13
  model_family: GPT-5
14
14
  product: Codex
15
- generated_at: 2026-07-14
15
+ generated_at: 2026-07-15
16
16
  limits: Live provider configuration must be re-audited; no credential values are represented.
17
17
  ---
18
18
 
@@ -121,6 +121,15 @@ repositories, unknown refs, non-exact source SHAs, and any caller other than
121
121
  `.github/workflows/buildchain-ref-promotion.yml`. Manual apply and external
122
122
  consumer workflows still require their own explicit admission inputs.
123
123
 
124
+ Before authority verification, the reusable promotion controller runs the same
125
+ release transaction selector in read-only mode. That plan supplies one exact
126
+ publication version and tag to the admission verifier, the publish-gate source
127
+ lock, and the real promotion action. The verifier rejects a capability for a
128
+ different version, and the promotion action rechecks the planned version before
129
+ any publish transaction side effect. Release-candidate fixture versions are
130
+ artifact evidence only; they never name Buildchain's own source-lock or
131
+ publication capability.
132
+
124
133
  Evidence publication is a separate authority class and never grants product
125
134
  publication.
126
135
 
@@ -627,7 +627,9 @@ passes `require-publish-source-lock`, `publish-source-ref`,
627
627
  `promote-buildchain-ref`. Direct action callers must pass the same four inputs
628
628
  from the reusable build outputs. Workflows that only collect passports or run
629
629
  dry-run package checks do not move publish refs and are not publish-gate
630
- publication models.
630
+ publication models. A dry-run of `release-candidate-promote.yml` computes and
631
+ reports the exact `publish-gate/*` source lock that a real promotion would use,
632
+ but does not read, create, or move that ref.
631
633
 
632
634
  Semver GitHub Release publication is owned by `promote-buildchain-ref`, not by
633
635
  consumer shell glue. Consumers normally use the `release-candidate-promote.yml`
@@ -78,6 +78,12 @@ Every matrix job checks out the exact source SHA planned by Buildchain, invokes
78
78
  then invokes `shifu gate receipt validate`. Buildchain uploads the original
79
79
  receipt and validation result even when the run fails.
80
80
 
81
+ Before invoking the project-owned command, the workflow adds the runner
82
+ account's `~/.local/bin` directory to `PATH` on Windows, Linux, and macOS. This
83
+ keeps user-scoped tools such as `uv` available to strict Shifu cache profiles
84
+ without assuming an administrator-managed system installation. The consumer or
85
+ runner owner remains responsible for provisioning the declared tools.
86
+
81
87
  The fixed `Gate profile / aggregate` job fails closed for missing receipts,
82
88
  invalid or stale Shifu validation, dirty or mismatched source SHA, registry or
83
89
  plan drift, missing required results, required failures/skips, or gate action
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kungfu-tech/buildchain",
3
- "version": "2.12.7-alpha.1",
3
+ "version": "2.12.7-alpha.10",
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",
@@ -27,6 +27,7 @@ const DESCRIPTORS = Object.freeze([
27
27
  [".github/workflows/buildchain-stable-candidate-patrol.yml", "governance-write"],
28
28
  [".github/workflows/dev-pr-auto-merge.yml", "governance-write"],
29
29
  [".github/workflows/npm-publish.yml", "dry-run-only"],
30
+ [".github/workflows/paper-release-sealed.yml", "product-publication", true, ["npm-publish", "github-release"], "trusted-publishing", "none", "fixed", "caller-bound"],
30
31
  [".github/workflows/paper-release.yml", "product-publication", true, ["npm-publish", "github-release"], "trusted-publishing", "none", "fixed", "caller-bound"],
31
32
  [".github/workflows/patrol-daily.yml", "governance-write"],
32
33
  [".github/workflows/patrol-monthly.yml", "governance-write"],
@@ -303,7 +303,7 @@ function normalizeEvidence(entries = []) {
303
303
  function receiptStatus(plan, stages) {
304
304
  if (stages.some((stage) => stage.status === "failed")) return "failed";
305
305
  if (stages.length > 0 && stages.every((stage) => stage.status === "skipped")) return "skipped";
306
- if (stages.some((stage) => stage.status === "cancelled" || stage.status === "missing")) return "partial";
306
+ if (stages.some((stage) => stage.status === "cancelled" || (stage.required && stage.status === "missing"))) return "partial";
307
307
  const required = new Set(plan.expected.stages.filter((stage) => stage.required).map((stage) => stage.id));
308
308
  if (stages.filter((stage) => required.has(stage.id)).every((stage) => stage.status === "passed")) return "passed";
309
309
  return "partial";
@@ -153,6 +153,13 @@ export {
153
153
  verifyPublicationAdmission,
154
154
  } from "./publication-authority.js";
155
155
 
156
+ export {
157
+ PUBLICATION_ARTIFACT_CANDIDATE_CONTRACT,
158
+ createPublicationArtifactCandidate,
159
+ publicationArtifactCandidateDigest,
160
+ resolvePublicationCandidateFile,
161
+ } from "./publication-artifact-candidate.js";
162
+
156
163
  export {
157
164
  buildchainPublicationAuthorityDescriptors,
158
165
  createBuildchainPublicationAuthorityRegistry,