@kungfu-tech/buildchain 2.13.0-alpha.0 → 2.13.0-alpha.2

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.
@@ -626,6 +626,9 @@
626
626
  "auto-no-gate",
627
627
  "buildchain-ref",
628
628
  "buildchain-repository",
629
+ "consumer-predicate-digest",
630
+ "consumer-predicate-id",
631
+ "consumer-qualification-required",
629
632
  "control-plane-audit-json",
630
633
  "dry-run",
631
634
  "evidence-controller-artifact",
@@ -649,15 +652,17 @@
649
652
  "target-ref",
650
653
  "used-nonces-json"
651
654
  ],
652
- "inputCount": 29,
655
+ "inputCount": 32,
653
656
  "secrets": [],
654
657
  "secretCount": 0,
655
658
  "outputs": [
656
659
  "capability-artifact",
657
660
  "capability-digest",
658
- "capability-json"
661
+ "capability-json",
662
+ "gate-aggregate-digest",
663
+ "gate-aggregate-json"
659
664
  ],
660
- "outputCount": 3
665
+ "outputCount": 5
661
666
  },
662
667
  {
663
668
  "id": ".release-docker",
@@ -1615,6 +1620,8 @@
1615
1620
  "publication-admission-json",
1616
1621
  "publication-auto-admission",
1617
1622
  "publication-auto-no-gate",
1623
+ "publication-consumer-predicate-id",
1624
+ "publication-consumer-qualification-command",
1618
1625
  "publication-control-plane-audit-json",
1619
1626
  "publication-expected-json",
1620
1627
  "publication-gate-aggregate-json",
@@ -1624,6 +1631,7 @@
1624
1631
  "publication-runner-provenance-json",
1625
1632
  "publication-target",
1626
1633
  "publication-used-nonces-json",
1634
+ "publication-used-qualification-nonces-json",
1627
1635
  "publish-artifact-kind",
1628
1636
  "publish-command",
1629
1637
  "publish-dist-tag",
@@ -1652,7 +1660,7 @@
1652
1660
  "target-sha",
1653
1661
  "trusted-publishing"
1654
1662
  ],
1655
- "inputCount": 56,
1663
+ "inputCount": 59,
1656
1664
  "secrets": [
1657
1665
  "BUILDCHAIN_ISSUE_APP_ID",
1658
1666
  "BUILDCHAIN_ISSUE_APP_PRIVATE_KEY",
@@ -1835,6 +1843,10 @@
1835
1843
  "github-release-notes",
1836
1844
  "github-release-title",
1837
1845
  "promote-only-release-candidate",
1846
+ "publication-capability-json",
1847
+ "publication-gate-aggregate-json",
1848
+ "publication-qualification-receipt-json",
1849
+ "publication-used-qualification-nonces-json",
1838
1850
  "publish-auth",
1839
1851
  "publish-command",
1840
1852
  "publish-dist-tag",
@@ -1867,6 +1879,7 @@
1867
1879
  "release-passport-platform-manifest-paths",
1868
1880
  "release-passport-product-name",
1869
1881
  "require-governance",
1882
+ "require-publication-qualification",
1870
1883
  "require-publish-source-lock",
1871
1884
  "require-version-state",
1872
1885
  "required-status-check",
@@ -1877,7 +1890,7 @@
1877
1890
  "transaction-state-path",
1878
1891
  "verification-command"
1879
1892
  ],
1880
- "inputCount": 54
1893
+ "inputCount": 59
1881
1894
  },
1882
1895
  {
1883
1896
  "id": "report-buildchain-issue",
@@ -3428,8 +3441,8 @@
3428
3441
  "workflowRegistryPath": "dist/site/workflow-registry.json",
3429
3442
  "pageRegistryPath": "dist/site/page-registry.json",
3430
3443
  "cliRegistryDigest": "ff1772371ec74271c21b6723dad0745a080347be8feef36a37e3948ebd19993d",
3431
- "workflowRegistryDigest": "c496f3c91b98409ecadf252ac087e620bb95c02222690ec4543013d0740190d1",
3432
- "pageRegistryDigest": "246e694c72df3166277b128d60bf18bf58c15583d0b70f5652dd4f342510fcdc"
3444
+ "workflowRegistryDigest": "f4dc70cba95a30b79eadbffc3a4ba5f8d382aae220a7bc13965365c2bbd5e674",
3445
+ "pageRegistryDigest": "5df8fd620c13f894a00ecc7159b7a53f518692d3d2ab3ad0b78687582efa406a"
3433
3446
  },
3434
3447
  "comparison": {
3435
3448
  "missingCliRegistry": [],
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "contract": "kungfu-buildchain-publication-release-registry",
4
- "generatedAt": "2026-07-15T16:38:35.118Z",
5
- "publishedAt": "2026-07-15T16:38:35.118Z",
4
+ "generatedAt": "2026-07-16T02:29:49.950Z",
5
+ "publishedAt": "2026-07-16T02:29:49.950Z",
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": "aa454f78402e4e89a05592f8714e2d0f55f10c86",
22
+ "sourceRevision": "87491685ffc7b6522176f8e7519f6c595e9bf5a7",
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.13.0-alpha.0",
35
+ "version": "2.13.0-alpha.2",
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-15T16:38:35.118Z",
5
- "publishedAt": "2026-07-15T16:38:35.118Z",
4
+ "generatedAt": "2026-07-16T02:29:49.950Z",
5
+ "publishedAt": "2026-07-16T02:29:49.950Z",
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": "aa454f78402e4e89a05592f8714e2d0f55f10c86",
22
+ "sourceRevision": "87491685ffc7b6522176f8e7519f6c595e9bf5a7",
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.13.0-alpha.0",
40
+ "version": "2.13.0-alpha.2",
41
41
  "versionSource": "package.json#version"
42
42
  },
43
43
  "entrypoint": "buildchain-site.json",
@@ -61,7 +61,7 @@
61
61
  "path": "docs/install.md",
62
62
  "plane": "use",
63
63
  "exists": true,
64
- "digest": "sha256:2600738a92b5853bc26d4e01211f0c07b8b36a21d4d72ca809bc6032dff5dc5f"
64
+ "digest": "sha256:1879849c01f82b8820f2d9aeb09faed0931954cb7fe6939176a5eb69110cee59"
65
65
  },
66
66
  {
67
67
  "id": "release-passport",
@@ -85,7 +85,7 @@
85
85
  "path": "docs/publication-authority.md",
86
86
  "plane": "verify",
87
87
  "exists": true,
88
- "digest": "sha256:05bc22c7e5885e591bc121fc43f588e5d49ccf0a8de6a642811c1d0d03dcee1e"
88
+ "digest": "sha256:920d4f14902ded1999f46d39f6d02db8cb5be6f22e376f6f2d456b3a1cc0c674"
89
89
  },
90
90
  {
91
91
  "id": "release-candidate",
@@ -93,7 +93,7 @@
93
93
  "path": "docs/release-candidate.md",
94
94
  "plane": "verify",
95
95
  "exists": true,
96
- "digest": "sha256:554613c963f57cc391acbd072bf73e1a2543d9bd1371087d4411577cccbf817c"
96
+ "digest": "sha256:1fc581cf1b4e4a202464c8d6671b3bff12d0b349760246a951e88ef524f99e6b"
97
97
  },
98
98
  {
99
99
  "id": "release-propagation",
@@ -229,7 +229,7 @@
229
229
  "path": "docs/publish-transaction.md",
230
230
  "plane": "verify",
231
231
  "exists": true,
232
- "digest": "sha256:8d5d7075cf8b4280a4c5097726f5c51ae40db83e2652eafefe4fa5e487794f57"
232
+ "digest": "sha256:9e77030dbd69e27c2402d855980f7560a465270cac1f3225c0470523ab4a8ddf"
233
233
  },
234
234
  {
235
235
  "id": "release-governance",
@@ -237,7 +237,7 @@
237
237
  "path": "docs/release-governance.md",
238
238
  "plane": "why",
239
239
  "exists": true,
240
- "digest": "sha256:03108f05a608cb0849e7a668fe23671b62863907ce02a70bc6522eb8074f3e63"
240
+ "digest": "sha256:cb6aafc3410c0e72da3d9c3ba330421005af27c3c67665a2f3356603f02da84a"
241
241
  },
242
242
  {
243
243
  "id": "release-flow",
@@ -222,6 +222,9 @@
222
222
  "auto-no-gate",
223
223
  "buildchain-ref",
224
224
  "buildchain-repository",
225
+ "consumer-predicate-digest",
226
+ "consumer-predicate-id",
227
+ "consumer-qualification-required",
225
228
  "control-plane-audit-json",
226
229
  "dry-run",
227
230
  "evidence-controller-artifact",
@@ -245,15 +248,17 @@
245
248
  "target-ref",
246
249
  "used-nonces-json"
247
250
  ],
248
- "inputCount": 29,
251
+ "inputCount": 32,
249
252
  "secrets": [],
250
253
  "secretCount": 0,
251
254
  "outputs": [
252
255
  "capability-artifact",
253
256
  "capability-digest",
254
- "capability-json"
257
+ "capability-json",
258
+ "gate-aggregate-digest",
259
+ "gate-aggregate-json"
255
260
  ],
256
- "outputCount": 3,
261
+ "outputCount": 5,
257
262
  "surface": "reusable-workflow",
258
263
  "capabilityGroup": "api-cli-reference",
259
264
  "status": "active"
@@ -1313,6 +1318,8 @@
1313
1318
  "publication-admission-json",
1314
1319
  "publication-auto-admission",
1315
1320
  "publication-auto-no-gate",
1321
+ "publication-consumer-predicate-id",
1322
+ "publication-consumer-qualification-command",
1316
1323
  "publication-control-plane-audit-json",
1317
1324
  "publication-expected-json",
1318
1325
  "publication-gate-aggregate-json",
@@ -1322,6 +1329,7 @@
1322
1329
  "publication-runner-provenance-json",
1323
1330
  "publication-target",
1324
1331
  "publication-used-nonces-json",
1332
+ "publication-used-qualification-nonces-json",
1325
1333
  "publish-artifact-kind",
1326
1334
  "publish-command",
1327
1335
  "publish-dist-tag",
@@ -1350,7 +1358,7 @@
1350
1358
  "target-sha",
1351
1359
  "trusted-publishing"
1352
1360
  ],
1353
- "inputCount": 56,
1361
+ "inputCount": 59,
1354
1362
  "secrets": [
1355
1363
  "BUILDCHAIN_ISSUE_APP_ID",
1356
1364
  "BUILDCHAIN_ISSUE_APP_PRIVATE_KEY",
@@ -1561,6 +1569,10 @@
1561
1569
  "github-release-notes",
1562
1570
  "github-release-title",
1563
1571
  "promote-only-release-candidate",
1572
+ "publication-capability-json",
1573
+ "publication-gate-aggregate-json",
1574
+ "publication-qualification-receipt-json",
1575
+ "publication-used-qualification-nonces-json",
1564
1576
  "publish-auth",
1565
1577
  "publish-command",
1566
1578
  "publish-dist-tag",
@@ -1593,6 +1605,7 @@
1593
1605
  "release-passport-platform-manifest-paths",
1594
1606
  "release-passport-product-name",
1595
1607
  "require-governance",
1608
+ "require-publication-qualification",
1596
1609
  "require-publish-source-lock",
1597
1610
  "require-version-state",
1598
1611
  "required-status-check",
@@ -1603,7 +1616,7 @@
1603
1616
  "transaction-state-path",
1604
1617
  "verification-command"
1605
1618
  ],
1606
- "inputCount": 54,
1619
+ "inputCount": 59,
1607
1620
  "capabilityGroup": "release-passport-trust",
1608
1621
  "status": "active"
1609
1622
  },
package/docs/install.md CHANGED
@@ -51,7 +51,9 @@ npx buildchain version
51
51
  npx buildchain doctor --json
52
52
  ```
53
53
 
54
- Alpha releases publish to the `alpha` npm dist-tag. Stable releases publish to
54
+ The highest alpha minor publishes to the `alpha` npm dist-tag; older maintenance
55
+ minor alphas use `vX.Y-alpha` so they cannot roll the global alpha channel back.
56
+ Stable releases publish to
55
57
  `latest`. Both are created by the protected Buildchain promotion transaction.
56
58
 
57
59
  Stable consumers should pin the exact Buildchain version they have validated,
@@ -136,6 +136,32 @@ publication capability.
136
136
  Evidence publication is a separate authority class and never grants product
137
137
  publication.
138
138
 
139
+ ## Consumer qualification handoff
140
+
141
+ Consumers may explicitly opt in to a final, consumer-owned qualification
142
+ predicate. Buildchain then transports the complete Gate aggregate alongside the
143
+ sealed capability instead of reducing it to a summary. The capability binds the
144
+ authority registry, consumer Gate registry and policy, exact source and runtime,
145
+ controller, runner, control-plane, artifact, provider target, channel, version,
146
+ freshness window, nonce, and exact predicate command digest.
147
+
148
+ The predicate runs in a separate job with read-only source access, no inherited
149
+ secrets, no OIDC permission, and no provider write permission. It receives only
150
+ paths to `capability.json` and `gate-aggregate.json` plus the exact predicate id
151
+ and digest. The consumer writes a
152
+ `kungfu-buildchain-consumer-publication-decision`; Buildchain seals that result
153
+ as a deterministic
154
+ `kungfu-buildchain-publication-qualification-receipt`. Buildchain does not parse
155
+ product-specific Gate meanings.
156
+
157
+ The provider action revalidates the capability, full aggregate, receipt,
158
+ predicate identity, freshness, nonce, source, version, channel, target, and all
159
+ sealed digests immediately before the publish transaction. Missing, denied,
160
+ stale, replayed, substituted, or drifted receipts fail before provider mutation.
161
+ Direct calls to the provider action cannot bypass the receipt when
162
+ `require-publication-qualification` is enabled. Consumers that do not opt in
163
+ retain the existing publication contract.
164
+
139
165
  ## API and CLI
140
166
 
141
167
  Use `@kungfu-tech/buildchain/publication-authority` or run:
@@ -210,7 +210,7 @@ Buildchain distinguishes two npm release modes:
210
210
 
211
211
  | Mode | Use | Auth | npm operation |
212
212
  | --- | --- | --- | --- |
213
- | `publish-final-version` | normal alpha or stable publication | `trusted-publishing` | `npm publish --tag <alpha|latest>` |
213
+ | `publish-final-version` | normal alpha or stable publication | `trusted-publishing` | `npm publish --tag <alpha|vX.Y-alpha|latest>` |
214
214
  | `promote-existing-version` | same-version alpha-to-latest recovery | `npm-token` | `npm dist-tag add <pkg>@<version> latest` |
215
215
 
216
216
  The normal libnode path is `publish-final-version`: publish an alpha package set
@@ -140,3 +140,22 @@ consumer with a Shifu Gate registry supplies `publication-gate-aggregate-json`
140
140
  instead. Buildchain still requires caller-owned RC evidence, an exact authority
141
141
  runtime and source SHA, a repository-local publisher workflow, matching npm
142
142
  target/package identity, and a qualifying control-plane audit.
143
+
144
+ A consumer that owns additional product qualification semantics can opt in to
145
+ the sealed handoff without teaching Buildchain those semantics:
146
+
147
+ ```yaml
148
+ publication-consumer-predicate-id: kungfu.release-admission/v1
149
+ publication-consumer-qualification-command: node scripts/qualify-release.mjs
150
+ ```
151
+
152
+ The command reads `BUILDCHAIN_PUBLICATION_CAPABILITY_PATH` and
153
+ `BUILDCHAIN_PUBLICATION_GATE_AGGREGATE_PATH`, evaluates the complete aggregate,
154
+ and writes a decision JSON document to
155
+ `BUILDCHAIN_PUBLICATION_QUALIFICATION_RESULT_PATH`. It also receives
156
+ `BUILDCHAIN_PUBLICATION_PREDICATE_ID` and
157
+ `BUILDCHAIN_PUBLICATION_PREDICATE_DIGEST`. The separate qualification job has
158
+ no write or OIDC permission and does not inherit publication secrets. A
159
+ successful deterministic receipt is rechecked by the provider action
160
+ immediately before mutation. Omitting both inputs preserves the existing
161
+ consumer contract; supplying only one fails closed.
@@ -169,6 +169,11 @@ Buildchain then:
169
169
  7. Moves `vX.Y-alpha` to the same generated alpha commit.
170
170
  8. Moves `vX-alpha` only when `X.Y` is the highest minor in major `X` with a published alpha; older minor alpha work records a skip and cannot move the major channel backwards.
171
171
 
172
+ The npm channel follows the same ownership rule. The highest alpha minor publishes
173
+ with dist-tag `alpha`; maintenance alphas on an older minor publish with the
174
+ line-specific dist-tag `vX.Y-alpha` so they cannot roll the global `alpha`
175
+ channel backward. Exact prerelease versions remain installable directly.
176
+
172
177
  This keeps the test channel self-describing. If a consumer checks out
173
178
  `v2.0-alpha` or `v2-alpha`, the manifests and exact alpha tag agree. The major
174
179
  alpha ref removes routine consumer edits when Buildchain opens a newer minor,
@@ -590,7 +595,11 @@ Buildchain's own promotion workflow reads `BUILDCHAIN_PROMOTION_BYPASS_APPS`,
590
595
  `BUILDCHAIN_PROMOTION_BYPASS_TEAMS` repository variables so the declared bypass
591
596
  identity can match the actual `BUILDCHAIN_PROMOTION_TOKEN` actor, but consumers
592
597
  do not need to duplicate that actor manually when the token identity is
593
- discoverable.
598
+ discoverable. Buildchain's release-line bootstrap applies the same declared
599
+ allowances when it creates new `dev`, `alpha`, and `release` branch protection,
600
+ and fails closed before changing protection when no promotion authority is
601
+ declared. This keeps a new minor line publishable without weakening its normal
602
+ human review gate.
594
603
 
595
604
  ## What This Guarantees
596
605
 
@@ -59,6 +59,15 @@ after the producer has observed the successful authoritative workflow run. The
59
59
  stable gate still verifies the workflow identity, exact runtime SHA, target URL,
60
60
  and allowed attestor before accepting that status.
61
61
 
62
+ When a candidate changes the outer reusable-workflow YAML itself, the stable
63
+ shell cannot exercise that change through a runtime override. A maintainer may
64
+ manually qualify it with `canary-ref` set to an exact 40-character commit in the
65
+ consumer repository whose canary workflow pins the candidate's exact Buildchain
66
+ SHA. The qualification producer still dispatches and observes the authoritative
67
+ consumer workflow before writing the normal candidate-bound status. Floating
68
+ consumer branches are rejected, and the automatic path continues to use the
69
+ consumer default branch.
70
+
62
71
  ## Repository policy
63
72
 
64
73
  Declare the default once in `.buildchain/buildchain.toml`:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kungfu-tech/buildchain",
3
- "version": "2.13.0-alpha.0",
3
+ "version": "2.13.0-alpha.2",
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",
@@ -138,19 +138,25 @@ export {
138
138
  PUBLICATION_AUTHORITY_CLASSES,
139
139
  PUBLICATION_AUTHORITY_REGISTRY_CONTRACT,
140
140
  PUBLICATION_CAPABILITY_CONTRACT,
141
+ CONSUMER_PUBLICATION_DECISION_CONTRACT,
141
142
  PUBLICATION_CONTROL_PLANE_AUDIT_CONTRACT,
142
143
  PUBLICATION_GATE_DECISION_CONTRACT,
144
+ PUBLICATION_QUALIFICATION_RECEIPT_CONTRACT,
143
145
  RUNNER_PROVENANCE_CLASSES,
144
146
  RUNNER_PROVENANCE_CONTRACT,
145
147
  createPublicationAuthorityRegistry,
146
148
  createPublicationAdmission,
147
149
  createPublicationArtifactManifestSet,
150
+ createConsumerPublicationDecision,
148
151
  createPublicationControlPlaneAudit,
149
152
  createPublicationGateDecision,
153
+ createPublicationQualificationReceipt,
150
154
  createRunnerProvenance,
151
155
  detectPublicationAuthoritySignals,
152
156
  publicationAuthorityDigest,
157
+ publicationGateAggregateBindings,
153
158
  verifyPublicationAdmission,
159
+ verifyPublicationQualificationReceipt,
154
160
  } from "./publication-authority.js";
155
161
 
156
162
  export {