@kungfu-tech/buildchain 2.14.2 → 2.14.3-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 (57) hide show
  1. package/dist/site/agent-index.json +2 -0
  2. package/dist/site/artifact-schemas.json +4 -0
  3. package/dist/site/badge-endpoint-registry.json +320 -0
  4. package/dist/site/badges/v1/kfd-5/aligned.json +14 -0
  5. package/dist/site/badges/v1/kfd-5/declared.json +14 -0
  6. package/dist/site/badges/v1/kfd-5/downgraded.json +14 -0
  7. package/dist/site/badges/v1/kfd-5/draft.json +14 -0
  8. package/dist/site/badges/v1/kfd-5/failed.json +14 -0
  9. package/dist/site/badges/v1/kfd-5/missing.json +14 -0
  10. package/dist/site/badges/v1/kfd-5/passed.json +14 -0
  11. package/dist/site/badges/v1/kfd-5/planned.json +14 -0
  12. package/dist/site/badges/v1/kfd-6/aligned.json +14 -0
  13. package/dist/site/badges/v1/kfd-6/declared.json +14 -0
  14. package/dist/site/badges/v1/kfd-6/downgraded.json +14 -0
  15. package/dist/site/badges/v1/kfd-6/draft.json +14 -0
  16. package/dist/site/badges/v1/kfd-6/failed.json +14 -0
  17. package/dist/site/badges/v1/kfd-6/missing.json +14 -0
  18. package/dist/site/badges/v1/kfd-6/passed.json +14 -0
  19. package/dist/site/badges/v1/kfd-6/planned.json +14 -0
  20. package/dist/site/buildchain-contract.json +149 -28
  21. package/dist/site/buildchain-site.json +25 -23
  22. package/dist/site/capability-registry.json +2 -2
  23. package/dist/site/controller-registry.json +61 -5
  24. package/dist/site/kfd-claims.json +129 -11
  25. package/dist/site/kfd-upstream-aggregate.json +12 -12
  26. package/dist/site/manual-registry.json +6 -6
  27. package/dist/site/node-api-registry.json +20 -7
  28. package/dist/site/page-registry.json +12 -12
  29. package/dist/site/public-surface-audit.json +134 -8
  30. package/dist/site/publication-authority-registry.json +26 -1
  31. package/dist/site/publication-registry.json +4 -4
  32. package/dist/site/release-model.json +3 -1
  33. package/dist/site/release-passport-check-manifest.json +167 -0
  34. package/dist/site/release-provenance.json +3 -0
  35. package/dist/site/schemas/release-passport-v1.schema.json +198 -0
  36. package/dist/site/site-manifest.json +10 -10
  37. package/dist/site/workflow-registry.json +128 -4
  38. package/docs/migration-inventory.md +8 -0
  39. package/docs/release-candidate.md +3 -0
  40. package/docs/release-governance.md +5 -4
  41. package/docs/release-passport.md +19 -0
  42. package/docs/release-propagation.md +19 -7
  43. package/docs/reusable-build-surface.md +26 -1
  44. package/package.json +5 -2
  45. package/packages/core/buildchain-contract.js +41 -0
  46. package/packages/core/buildchain-kfd-claims.js +4 -0
  47. package/packages/core/buildchain-publication-authority.js +1 -0
  48. package/packages/core/controller-evidence.js +1 -1
  49. package/packages/core/index.js +9 -0
  50. package/packages/core/package-manager.js +32 -0
  51. package/packages/core/release-passport-contract.js +249 -0
  52. package/packages/core/release-passport.js +39 -0
  53. package/scripts/check-inventory.mjs +37 -3
  54. package/scripts/generate-channel-promotion-workflow.mjs +331 -0
  55. package/scripts/generate-site-bundle.mjs +15 -0
  56. package/scripts/promotion-channel-router.mjs +132 -0
  57. package/scripts/validate-package-manager-contract.mjs +24 -0
@@ -0,0 +1,198 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://buildchain.libkungfu.dev/schemas/release-passport-v1.schema.json",
4
+ "title": "Buildchain Release Passport v1",
5
+ "description": "Standalone structural schema for the Buildchain-owned release-passport envelope. KFD subsection semantics remain owned by their canonical KFD schemas.",
6
+ "type": "object",
7
+ "required": [
8
+ "schemaVersion",
9
+ "contract",
10
+ "product",
11
+ "release",
12
+ "artifacts",
13
+ "evidence",
14
+ "recovery"
15
+ ],
16
+ "properties": {
17
+ "schemaVersion": {
18
+ "const": 1
19
+ },
20
+ "contract": {
21
+ "const": "kungfu-buildchain-release-passport"
22
+ },
23
+ "generatedAt": {
24
+ "type": "string",
25
+ "format": "date-time"
26
+ },
27
+ "product": {
28
+ "type": "object",
29
+ "required": [
30
+ "name",
31
+ "repository",
32
+ "mechanism"
33
+ ],
34
+ "properties": {
35
+ "name": {
36
+ "type": "string",
37
+ "minLength": 1
38
+ },
39
+ "repository": {
40
+ "type": "string",
41
+ "minLength": 1
42
+ },
43
+ "mechanism": {
44
+ "type": "string",
45
+ "minLength": 1
46
+ }
47
+ },
48
+ "additionalProperties": true
49
+ },
50
+ "release": {
51
+ "type": "object",
52
+ "required": [
53
+ "tag"
54
+ ],
55
+ "properties": {
56
+ "tag": {
57
+ "type": "string",
58
+ "minLength": 1
59
+ },
60
+ "sourceSha": {
61
+ "type": "string"
62
+ },
63
+ "releaseSha": {
64
+ "type": "string"
65
+ },
66
+ "releaseMaterialSha": {
67
+ "type": "string"
68
+ },
69
+ "targetRef": {
70
+ "type": "string"
71
+ },
72
+ "channel": {
73
+ "type": "string"
74
+ },
75
+ "line": {
76
+ "type": "string"
77
+ },
78
+ "package": {
79
+ "type": "object"
80
+ }
81
+ },
82
+ "additionalProperties": true
83
+ },
84
+ "artifacts": {
85
+ "type": "array",
86
+ "minItems": 1,
87
+ "items": {
88
+ "type": "object",
89
+ "required": [
90
+ "name"
91
+ ],
92
+ "properties": {
93
+ "name": {
94
+ "type": "string",
95
+ "minLength": 1
96
+ }
97
+ },
98
+ "additionalProperties": true
99
+ }
100
+ },
101
+ "evidence": {
102
+ "type": "object",
103
+ "required": [
104
+ "artifactEvidence",
105
+ "impact",
106
+ "agentIndex"
107
+ ],
108
+ "properties": {
109
+ "artifactEvidence": {
110
+ "type": "string",
111
+ "minLength": 1
112
+ },
113
+ "impact": {
114
+ "type": "string",
115
+ "minLength": 1
116
+ },
117
+ "agentIndex": {
118
+ "type": "string",
119
+ "minLength": 1
120
+ },
121
+ "publishEvidence": {
122
+ "type": "string"
123
+ },
124
+ "transactionState": {
125
+ "type": "string"
126
+ }
127
+ },
128
+ "additionalProperties": true
129
+ },
130
+ "recovery": {
131
+ "type": "object"
132
+ },
133
+ "workflow": {
134
+ "type": "object"
135
+ },
136
+ "runnerPolicy": {
137
+ "type": "object"
138
+ },
139
+ "versionImpact": {
140
+ "type": "object"
141
+ },
142
+ "surfaceImpacts": {
143
+ "type": "array",
144
+ "items": {
145
+ "type": "object"
146
+ }
147
+ },
148
+ "packageSet": {
149
+ "type": "object"
150
+ },
151
+ "anchorManifest": {
152
+ "type": "object"
153
+ },
154
+ "trustedPublishing": {
155
+ "type": "object"
156
+ },
157
+ "transaction": {
158
+ "type": "object"
159
+ },
160
+ "surfaceTimestampPolicy": {
161
+ "type": "object"
162
+ },
163
+ "buildFacts": {
164
+ "type": "array",
165
+ "items": {
166
+ "type": "object"
167
+ }
168
+ },
169
+ "buildSummary": {
170
+ "type": "object"
171
+ },
172
+ "platformArtifactManifests": {
173
+ "type": "array",
174
+ "items": {
175
+ "type": "object"
176
+ }
177
+ },
178
+ "distTagPromotion": {
179
+ "type": "object"
180
+ },
181
+ "controllerReceipts": {
182
+ "type": "array",
183
+ "items": {
184
+ "type": "object"
185
+ }
186
+ },
187
+ "kfd-1": {
188
+ "type": "object"
189
+ },
190
+ "kfd-2": {
191
+ "type": "object"
192
+ },
193
+ "kfd-3": {
194
+ "type": "object"
195
+ }
196
+ },
197
+ "additionalProperties": true
198
+ }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "contract": "kungfu-buildchain-site-manifest",
4
- "generatedAt": "2026-07-18T01:00:00.995Z",
5
- "publishedAt": "2026-07-18T01:00:00.995Z",
4
+ "generatedAt": "2026-07-19T00:00:09.045Z",
5
+ "publishedAt": "2026-07-19T00:00:09.045Z",
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": "ae16e640bf2f21c8f981ffa8b3523c8aae9200b2",
22
+ "sourceRevision": "cb4ea966786d561d5f6e9c53d55bba5e951bdb24",
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.14.2",
40
+ "version": "2.14.3-alpha.1",
41
41
  "versionSource": "package.json#version"
42
42
  },
43
43
  "entrypoint": "buildchain-site.json",
@@ -69,7 +69,7 @@
69
69
  "path": "docs/release-passport.md",
70
70
  "plane": "verify",
71
71
  "exists": true,
72
- "digest": "sha256:2421e3e9f2dd892971bea5deb605492dfec38f3a83e539229442b55380bebe25"
72
+ "digest": "sha256:0029014ffab7d7228a12d8b92326b78cf6757a41f481b661c5997e2cef06d3cc"
73
73
  },
74
74
  {
75
75
  "id": "controller-evidence",
@@ -93,7 +93,7 @@
93
93
  "path": "docs/release-candidate.md",
94
94
  "plane": "verify",
95
95
  "exists": true,
96
- "digest": "sha256:1fc581cf1b4e4a202464c8d6671b3bff12d0b349760246a951e88ef524f99e6b"
96
+ "digest": "sha256:81463a74dfe3d337768797b5b47f8cb3a22389312a917447f9b0e6096ab4f90a"
97
97
  },
98
98
  {
99
99
  "id": "release-propagation",
@@ -101,7 +101,7 @@
101
101
  "path": "docs/release-propagation.md",
102
102
  "plane": "use",
103
103
  "exists": true,
104
- "digest": "sha256:d5877075eb41a3d41e531549da113756d29d6f34c91e3b68b8ce650753d5ca1d"
104
+ "digest": "sha256:fc2b743e3d76c4f90cdd8c6560cf9d619ad25d74c15c074be96db7bcb6cc2a29"
105
105
  },
106
106
  {
107
107
  "id": "readme-badges",
@@ -165,7 +165,7 @@
165
165
  "path": "docs/migration-inventory.md",
166
166
  "plane": "verify",
167
167
  "exists": true,
168
- "digest": "sha256:80018cf78785431e67bbc5278d82dda80d0baa320cdb5e4abda26a0b05e5c0bc"
168
+ "digest": "sha256:08daa7d0b42543c1d1dacf1f56f461f0e7a7ca9e25d0859e39599ceb97054ee0"
169
169
  },
170
170
  {
171
171
  "id": "ownership",
@@ -221,7 +221,7 @@
221
221
  "path": "docs/reusable-build-surface.md",
222
222
  "plane": "use",
223
223
  "exists": true,
224
- "digest": "sha256:a2092c8064332cec9a4be852b24d94f90625cb45f885c4c3208f7068a643a3f0"
224
+ "digest": "sha256:7b745037fedafa1bc2f8ce65f32bb7e887988df2bfe2439694da418d482f6929"
225
225
  },
226
226
  {
227
227
  "id": "publish-transaction",
@@ -237,7 +237,7 @@
237
237
  "path": "docs/release-governance.md",
238
238
  "plane": "why",
239
239
  "exists": true,
240
- "digest": "sha256:e64ffd6183eaa7b73f8c0c133a645ced22212bca70c9609ad5f667cf3830aaae"
240
+ "digest": "sha256:d25a2ceb6cdc1a1db321e7d2a6aa8a454fb4d7a10560177604f8ecb5801a6e66"
241
241
  },
242
242
  {
243
243
  "id": "release-flow",
@@ -263,6 +263,111 @@
263
263
  "capabilityGroup": "api-cli-reference",
264
264
  "status": "active"
265
265
  },
266
+ {
267
+ "id": ".release-candidate-promote",
268
+ "path": ".github/workflows/.release-candidate-promote.yml",
269
+ "reusable": true,
270
+ "inputs": [
271
+ "allow-repository",
272
+ "artifact-name",
273
+ "artifact-patterns",
274
+ "branch-protection-bypass-apps",
275
+ "branch-protection-bypass-teams",
276
+ "branch-protection-bypass-users",
277
+ "buildchain-contract-compatibility-policy",
278
+ "buildchain-contract-drift-issue-mode",
279
+ "buildchain-contract-lock-path",
280
+ "buildchain-ref",
281
+ "buildchain-repository",
282
+ "channel",
283
+ "dry-run",
284
+ "github-release",
285
+ "github-release-notes",
286
+ "github-release-title",
287
+ "package-manager",
288
+ "promotion-contract-lock-digest",
289
+ "promotion-contract-lock-path",
290
+ "promotion-override-used",
291
+ "promotion-publication-channel",
292
+ "promotion-router-ref",
293
+ "promotion-router-sha",
294
+ "promotion-runtime-ref",
295
+ "promotion-runtime-sha",
296
+ "promotion-shell-ref",
297
+ "promotion-shell-sha",
298
+ "promotion-target-ref",
299
+ "publication-admission-json",
300
+ "publication-auto-admission",
301
+ "publication-auto-no-gate",
302
+ "publication-consumer-predicate-id",
303
+ "publication-consumer-qualification-command",
304
+ "publication-control-plane-audit-json",
305
+ "publication-expected-json",
306
+ "publication-gate-aggregate-json",
307
+ "publication-package-name",
308
+ "publication-product",
309
+ "publication-publisher-workflow-path",
310
+ "publication-runner-provenance-json",
311
+ "publication-target",
312
+ "publication-used-nonces-json",
313
+ "publication-used-qualification-nonces-json",
314
+ "publish-artifact-kind",
315
+ "publish-command",
316
+ "publish-dist-tag",
317
+ "publish-mode",
318
+ "publish-package-main",
319
+ "publish-package-set-order",
320
+ "publish-required-artifacts-json",
321
+ "publish-target",
322
+ "release-candidate-workflow-file",
323
+ "release-candidate-workflow-name",
324
+ "release-passport",
325
+ "release-passport-buildchain-self-kfd",
326
+ "release-passport-impact-json",
327
+ "release-passport-kfd-1-witness-jsons",
328
+ "release-passport-kfd-2-claim-jsons",
329
+ "release-passport-kfd-3-artifact-verify-command",
330
+ "release-passport-kfd-3-artifact-witness-jsons",
331
+ "release-passport-kfd-3-prebuild-witness-jsons",
332
+ "release-passport-output-dir",
333
+ "release-passport-platform-manifest-paths",
334
+ "release-passport-product-name",
335
+ "required-artifact-count",
336
+ "required-status-check",
337
+ "runner-preset",
338
+ "target-ref",
339
+ "target-sha",
340
+ "trusted-publishing"
341
+ ],
342
+ "inputCount": 70,
343
+ "secrets": [
344
+ "BUILDCHAIN_ISSUE_APP_ID",
345
+ "BUILDCHAIN_ISSUE_APP_PRIVATE_KEY",
346
+ "BUILDCHAIN_ISSUE_TOKEN",
347
+ "BUILDCHAIN_PROMOTION_TOKEN",
348
+ "buildchain-issue-app-id",
349
+ "buildchain-issue-app-private-key",
350
+ "buildchain-issue-token"
351
+ ],
352
+ "secretCount": 7,
353
+ "outputs": [
354
+ "built-source-sha",
355
+ "controller-plan-artifact",
356
+ "controller-plan-digest",
357
+ "controller-plan-json",
358
+ "controller-receipt-artifact",
359
+ "controller-receipt-digest",
360
+ "controller-receipt-json",
361
+ "controller-receipt-status",
362
+ "promoted-sha",
363
+ "publication-capability-digest",
364
+ "release-candidate-artifact"
365
+ ],
366
+ "outputCount": 11,
367
+ "surface": "reusable-workflow",
368
+ "capabilityGroup": "api-cli-reference",
369
+ "status": "active"
370
+ },
266
371
  {
267
372
  "id": ".release-docker",
268
373
  "path": ".github/workflows/.release-docker.yml",
@@ -1324,11 +1429,14 @@
1324
1429
  "branch-protection-bypass-apps",
1325
1430
  "branch-protection-bypass-teams",
1326
1431
  "branch-protection-bypass-users",
1432
+ "buildchain-alpha-contract-lock-path",
1433
+ "buildchain-channel",
1327
1434
  "buildchain-contract-compatibility-policy",
1328
1435
  "buildchain-contract-drift-issue-mode",
1329
1436
  "buildchain-contract-lock-path",
1330
1437
  "buildchain-ref",
1331
1438
  "buildchain-repository",
1439
+ "buildchain-stable-contract-lock-path",
1332
1440
  "channel",
1333
1441
  "dry-run",
1334
1442
  "github-release",
@@ -1378,7 +1486,7 @@
1378
1486
  "target-sha",
1379
1487
  "trusted-publishing"
1380
1488
  ],
1381
- "inputCount": 59,
1489
+ "inputCount": 62,
1382
1490
  "secrets": [
1383
1491
  "BUILDCHAIN_ISSUE_APP_ID",
1384
1492
  "BUILDCHAIN_ISSUE_APP_PRIVATE_KEY",
@@ -1390,6 +1498,7 @@
1390
1498
  ],
1391
1499
  "secretCount": 7,
1392
1500
  "outputs": [
1501
+ "buildchain-channel",
1393
1502
  "built-source-sha",
1394
1503
  "controller-plan-artifact",
1395
1504
  "controller-plan-digest",
@@ -1399,10 +1508,21 @@
1399
1508
  "controller-receipt-json",
1400
1509
  "controller-receipt-status",
1401
1510
  "promoted-sha",
1511
+ "promotion-contract-lock-digest",
1512
+ "promotion-contract-lock-path",
1513
+ "promotion-override-used",
1514
+ "promotion-publication-channel",
1515
+ "promotion-router-ref",
1516
+ "promotion-router-sha",
1517
+ "promotion-runtime-ref",
1518
+ "promotion-runtime-sha",
1519
+ "promotion-shell-ref",
1520
+ "promotion-shell-sha",
1521
+ "promotion-target-ref",
1402
1522
  "publication-capability-digest",
1403
1523
  "release-candidate-artifact"
1404
1524
  ],
1405
- "outputCount": 11,
1525
+ "outputCount": 23,
1406
1526
  "surface": "release-governance",
1407
1527
  "capabilityGroup": "reusable-build",
1408
1528
  "status": "active"
@@ -1444,17 +1564,20 @@
1444
1564
  "buildchain-repository",
1445
1565
  "downstream-base-ref",
1446
1566
  "downstream-branch",
1567
+ "downstream-prepare-command",
1447
1568
  "downstream-repository",
1448
1569
  "downstream-target",
1570
+ "downstream-verify-command",
1449
1571
  "dry-run",
1450
1572
  "graph-json",
1451
1573
  "lock-path",
1452
1574
  "pr-body",
1453
1575
  "pr-title",
1576
+ "refresh-managed-readme-badges",
1454
1577
  "source-node",
1455
1578
  "upstream-release-json"
1456
1579
  ],
1457
- "inputCount": 13,
1580
+ "inputCount": 16,
1458
1581
  "secrets": [
1459
1582
  "propagation-token"
1460
1583
  ],
@@ -1624,6 +1747,7 @@
1624
1747
  "release-passport-output-dir",
1625
1748
  "release-passport-platform-manifest-paths",
1626
1749
  "release-passport-product-name",
1750
+ "release-passport-promotion-routing-json",
1627
1751
  "require-governance",
1628
1752
  "require-publication-qualification",
1629
1753
  "require-publish-source-lock",
@@ -1636,7 +1760,7 @@
1636
1760
  "transaction-state-path",
1637
1761
  "verification-command"
1638
1762
  ],
1639
- "inputCount": 59,
1763
+ "inputCount": 60,
1640
1764
  "capabilityGroup": "release-passport-trust",
1641
1765
  "status": "active"
1642
1766
  },
@@ -37,6 +37,14 @@ migrate to `release-candidate-promote.yml@v2` or a project-owned
37
37
  `lifecycle.publish` command behind a publish-gate source lock, so floating
38
38
  `@v2` consumers cannot bypass source-lock drift protection.
39
39
 
40
+ The public promotion workflow is now a generated dual-channel router. Existing
41
+ callers remain source-compatible, while callers that want alpha workflow-shell
42
+ fixes before stable promotion should add `buildchain-channel: auto` plus
43
+ `buildchain-alpha-contract-lock-path` and
44
+ `buildchain-stable-contract-lock-path`. Keep one common promotion declaration;
45
+ do not duplicate alpha and stable jobs or call
46
+ `.release-candidate-promote.yml` directly.
47
+
40
48
  ## Migrated Actions
41
49
 
42
50
  No standalone `action-*` repository is shipped as a Buildchain action anymore.
@@ -108,6 +108,9 @@ jobs:
108
108
  promote:
109
109
  uses: kungfu-systems/buildchain/.github/workflows/release-candidate-promote.yml@v2
110
110
  with:
111
+ buildchain-channel: auto
112
+ buildchain-alpha-contract-lock-path: .buildchain/alpha-contract-lock.json
113
+ buildchain-stable-contract-lock-path: .buildchain/contract-lock.json
111
114
  channel: alpha
112
115
  artifact-name: libnode
113
116
  release-passport-kfd-1-witness-jsons: .buildchain/kfd/kfd-1/standard-contract.witness.json
@@ -729,7 +729,7 @@ but does not read, create, or move that ref.
729
729
 
730
730
  Semver GitHub Release publication is owned by `promote-buildchain-ref`, not by
731
731
  consumer shell glue. Consumers normally use the `release-candidate-promote.yml`
732
- wrapper, where GitHub Release publication is enabled by default and can be
732
+ generated channel router, where GitHub Release publication is enabled by default and can be
733
733
  disabled with `github-release: false`; the wrapper passes that declaration to
734
734
  the action. After the publish transaction reaches `complete`, Buildchain creates
735
735
  or updates the public GitHub Release and uploads the generated
@@ -764,9 +764,10 @@ When debugging or extending release behavior, read in this order:
764
764
  2. `.github/workflows/release-verify.yml`
765
765
  3. `.github/workflows/buildchain-ref-promotion.yml`
766
766
  4. `.github/workflows/release-candidate-promote.yml`
767
- 5. `actions/promote-buildchain-ref/README.md`
768
- 6. `actions/promote-buildchain-ref/src/`
769
- 7. `docs/migration-inventory.md`
767
+ 5. `.github/workflows/.release-candidate-promote.yml`
768
+ 6. `actions/promote-buildchain-ref/README.md`
769
+ 7. `actions/promote-buildchain-ref/src/`
770
+ 8. `docs/migration-inventory.md`
770
771
 
771
772
  That path gives the policy first, the workflow trigger second, and the action
772
773
  implementation last.
@@ -19,6 +19,25 @@ do not infer execution evidence from a green job. See
19
19
  The release passport surface is a welded contract. Additive fields are allowed;
20
20
  breaking semantic changes require a new major line.
21
21
 
22
+ Independent verifiers can pin two package-owned, standalone files without
23
+ scraping this implementation:
24
+
25
+ - `dist/site/schemas/release-passport-v1.schema.json` is the self-contained
26
+ JSON Schema for the Buildchain-owned envelope;
27
+ - `dist/site/release-passport-check-manifest.json` names the normative checker,
28
+ required and conditional sibling evidence, local-resolution rules,
29
+ Buildchain aggregation fields, canonical KFD subsection schema authorities,
30
+ and forward-compatibility policy.
31
+
32
+ The same files are exported as
33
+ `@kungfu-tech/buildchain/site/schemas/release-passport-v1.schema.json` and
34
+ `@kungfu-tech/buildchain/site/release-passport-check-manifest.json`. The schema
35
+ checks the envelope shape. `buildchain verify release-passport` remains the
36
+ normative semantic checker: it resolves sibling evidence relative to the
37
+ passport and fails closed on missing evidence, digest drift, or inconsistent
38
+ release facts. Buildchain owns envelope aggregation; KFD retains schema and
39
+ compatibility authority for the `kfd-1`, `kfd-2`, and `kfd-3` subsections.
40
+
22
41
  P0 protocol artifacts:
23
42
 
24
43
  - `product-mechanism.json`
@@ -182,6 +182,8 @@ jobs:
182
182
  downstream-target: site-libkungfu-dev
183
183
  downstream-repository: kungfu-systems/site-libkungfu-dev
184
184
  downstream-base-ref: dev/v2/v2.7
185
+ downstream-prepare-command: pnpm install --frozen-lockfile --ignore-scripts
186
+ downstream-verify-command: pnpm run check
185
187
  dry-run: false
186
188
  secrets:
187
189
  propagation-token: ${{ secrets.BUILDCHAIN_PROMOTION_TOKEN }}
@@ -199,13 +201,23 @@ open PR.
199
201
  The workflow checks out the Buildchain runtime selected by
200
202
  `buildchain-repository` and `buildchain-ref` into `.buildchain/runtime`, invokes
201
203
  that runtime for the propagation plan and lock write, then checks out the
202
- downstream repository, writes the exact lock, and opens or updates a PR. It does
203
- not publish the downstream release directly. The downstream repository keeps its
204
- normal Buildchain governance: the PR updates source-of-truth facts, then
205
- downstream alpha or release publication runs through its own protected channel.
206
- The workflow stages the declared lock path before checking the index, so the
207
- first propagation creates a PR even when the lock did not previously exist; a
208
- byte-identical rerun is an explicit successful no-op.
204
+ downstream repository and writes the exact lock. A consumer that must pin the
205
+ exact upstream package or regenerate deterministic files declares
206
+ `downstream-prepare-command`. The command receives
207
+ `BUILDCHAIN_UPSTREAM_PACKAGE_NAME`, `BUILDCHAIN_UPSTREAM_PACKAGE_VERSION`, and
208
+ `BUILDCHAIN_UPSTREAM_RELEASE_LOCK`. After preparation, Buildchain refreshes an
209
+ existing `<!-- buildchain:badges:start -->` README block by default. Consumers
210
+ can disable that step with `refresh-managed-readme-badges: false`.
211
+
212
+ `downstream-verify-command` runs against the final tree before any commit or
213
+ push, so consumers can use the same check as their PR workflow. Preparation,
214
+ badge refresh, and verification failures all fail closed. The workflow stages
215
+ the complete deterministic result, signs the propagation commit with DCO, and
216
+ then opens or updates the PR. It does not publish the downstream release
217
+ directly. The downstream repository keeps its normal Buildchain governance: the
218
+ PR updates source-of-truth facts, then downstream alpha or release publication
219
+ runs through its own protected channel. A byte-identical rerun is an explicit
220
+ successful no-op.
209
221
  For unreleased runtime validation, keep the caller's reusable workflow reference
210
222
  on `@v2` and pass a temporary train ref through `buildchain-ref`.
211
223
 
@@ -743,6 +743,23 @@ It does not call `.build.yml`, does not create a matrix, and must fail before
743
743
  publish if the RC evidence, payload set, or source-lock ref is missing or
744
744
  ambiguous.
745
745
 
746
+ The public `release-candidate-promote.yml` is a generated channel router. It
747
+ derives the publication lane from `target-ref`, then selects the matching
748
+ advanced workflow shell, runtime, and consumer lock before the advanced
749
+ promotion starts:
750
+
751
+ - alpha targets use `.release-candidate-promote.yml@vN-alpha`, runtime
752
+ `vN-alpha`, and `buildchain-alpha-contract-lock-path`;
753
+ - release and major targets use `.release-candidate-promote.yml@vN`, runtime
754
+ `vN`, and `buildchain-stable-contract-lock-path`.
755
+
756
+ The router resolves immutable SHAs and the selected lock digest before candidate
757
+ download. The advanced shell verifies the same router, shell, runtime, lock,
758
+ channel, and target binding again. Train and exact-SHA runtime overrides remain
759
+ restricted to trusted `workflow_dispatch` actors with write, maintain, or admin
760
+ permission. Promotion controller evidence, the promotion copy of the release
761
+ candidate passport, and the final release passport record these identities.
762
+
746
763
  ```yaml
747
764
  jobs:
748
765
  promote:
@@ -751,6 +768,9 @@ jobs:
751
768
  buildchain-issue-app-id: ${{ secrets.BUILDCHAIN_ISSUE_APP_ID }}
752
769
  buildchain-issue-app-private-key: ${{ secrets.BUILDCHAIN_ISSUE_APP_PRIVATE_KEY }}
753
770
  with:
771
+ buildchain-channel: auto
772
+ buildchain-alpha-contract-lock-path: .buildchain/alpha-contract-lock.json
773
+ buildchain-stable-contract-lock-path: .buildchain/contract-lock.json
754
774
  channel: alpha
755
775
  target-ref: alpha/v22/v22.22
756
776
  artifact-name: libnode
@@ -769,10 +789,15 @@ jobs:
769
789
  publish-package-set-order: platforms-first-main-last
770
790
  publish-package-main: "@kungfu-tech/libnode"
771
791
  release-passport-product-name: Libnode
772
- buildchain-contract-lock-path: .buildchain/contract-lock.json
773
792
  buildchain-contract-drift-issue-mode: compatible-and-breaking
774
793
  ```
775
794
 
795
+ Existing callers may keep `buildchain-contract-lock-path`; a non-empty explicit
796
+ path overrides channel-specific selection for compatibility. Migration only
797
+ requires adding the two channel lock inputs and may retain the remaining common
798
+ promotion declaration unchanged. Consumers must not call the dot-prefixed
799
+ advanced workflow directly.
800
+
776
801
  `buildchain-issue-app-id` and `buildchain-issue-app-private-key` are optional
777
802
  but recommended for cross-repository consumers. They should identify a GitHub
778
803
  App installation with `issues: write` on `kungfu-systems/buildchain`; the