@kungfu-tech/buildchain 2.14.18 → 3.0.0
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.
- package/dist/site/buildchain-contract.json +36 -31
- package/dist/site/buildchain-site.json +4 -4
- package/dist/site/controller-registry.json +6 -2
- package/dist/site/kfd-claims.json +8 -6
- package/dist/site/kfd-upstream-aggregate.json +1 -1
- package/dist/site/node-api-registry.json +1 -1
- package/dist/site/public-surface-audit.json +5 -3
- package/dist/site/publication-registry.json +4 -4
- package/dist/site/site-manifest.json +4 -4
- package/dist/site/workflow-registry.json +4 -2
- package/package.json +1 -1
- package/packages/core/publication-authority.js +5 -1
- package/packages/core/self-dogfood-version.js +85 -0
- package/scripts/check-inventory.mjs +21 -9
- package/scripts/release-candidate-resolver.mjs +50 -3
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
"product": {
|
|
5
5
|
"name": "Buildchain",
|
|
6
6
|
"package": "@kungfu-tech/buildchain",
|
|
7
|
-
"version": "
|
|
7
|
+
"version": "3.0.0",
|
|
8
8
|
"repository": "https://github.com/kungfu-systems/buildchain"
|
|
9
9
|
},
|
|
10
|
-
"majorLine": "
|
|
10
|
+
"majorLine": "v3",
|
|
11
11
|
"compatibilityPolicy": "major-compatible",
|
|
12
12
|
"surfaces": [
|
|
13
13
|
{
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"id": "reusable-build",
|
|
18
18
|
"kind": "workflow",
|
|
19
19
|
"path": ".github/workflows/.build.yml",
|
|
20
|
-
"publicRef": "kungfu-systems/buildchain/.github/workflows/.build.yml@
|
|
20
|
+
"publicRef": "kungfu-systems/buildchain/.github/workflows/.build.yml@v3",
|
|
21
21
|
"requiredInputs": [],
|
|
22
22
|
"requiredOutputs": [
|
|
23
23
|
"buildchain-runtime-sha",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"id": "channel-build-router",
|
|
60
60
|
"kind": "workflow",
|
|
61
61
|
"path": ".github/workflows/build.yml",
|
|
62
|
-
"publicRef": "kungfu-systems/buildchain/.github/workflows/build.yml@
|
|
62
|
+
"publicRef": "kungfu-systems/buildchain/.github/workflows/build.yml@v3",
|
|
63
63
|
"requiredInputs": [],
|
|
64
64
|
"requiredOutputs": [
|
|
65
65
|
"buildchain-channel",
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
"id": "release-candidate-promote",
|
|
99
99
|
"kind": "workflow",
|
|
100
100
|
"path": ".github/workflows/release-candidate-promote.yml",
|
|
101
|
-
"publicRef": "kungfu-systems/buildchain/.github/workflows/release-candidate-promote.yml@
|
|
101
|
+
"publicRef": "kungfu-systems/buildchain/.github/workflows/release-candidate-promote.yml@v3",
|
|
102
102
|
"requiredInputs": [
|
|
103
103
|
"channel"
|
|
104
104
|
],
|
|
@@ -109,8 +109,8 @@
|
|
|
109
109
|
],
|
|
110
110
|
"breakingDefaults": {
|
|
111
111
|
"channelDefault": "auto",
|
|
112
|
-
"alphaShellDefault": "
|
|
113
|
-
"stableShellDefault": "
|
|
112
|
+
"alphaShellDefault": "v3-alpha",
|
|
113
|
+
"stableShellDefault": "v3",
|
|
114
114
|
"promoteOnlyReleaseCandidate": true,
|
|
115
115
|
"requiredStatusCheck": "check / check"
|
|
116
116
|
},
|
|
@@ -169,8 +169,8 @@
|
|
|
169
169
|
"publish-gate source locks are created by the wrapper and enforced by promote-buildchain-ref before publish side effects",
|
|
170
170
|
"GitHub Release passport and evidence publication is delegated to promote-buildchain-ref after the semver release transaction completes"
|
|
171
171
|
],
|
|
172
|
-
"breakingDigest": "sha256:
|
|
173
|
-
"auditDigest": "sha256:
|
|
172
|
+
"breakingDigest": "sha256:acd401cfc46450115a3763fd4b679d85f185e8757ebd52510d6262e1533df4cf",
|
|
173
|
+
"auditDigest": "sha256:fb1e6e05c16df3e357a9b47d2c8335b99e23b2ccf8d92432b0cbc655fa9196a1"
|
|
174
174
|
},
|
|
175
175
|
{
|
|
176
176
|
"contractVersion": 1,
|
|
@@ -179,7 +179,7 @@
|
|
|
179
179
|
"id": "advanced-release-candidate-promote",
|
|
180
180
|
"kind": "workflow",
|
|
181
181
|
"path": ".github/workflows/.release-candidate-promote.yml",
|
|
182
|
-
"publicRef": "kungfu-systems/buildchain/.github/workflows/.release-candidate-promote.yml@
|
|
182
|
+
"publicRef": "kungfu-systems/buildchain/.github/workflows/.release-candidate-promote.yml@v3",
|
|
183
183
|
"requiredInputs": [
|
|
184
184
|
"channel"
|
|
185
185
|
],
|
|
@@ -212,7 +212,7 @@
|
|
|
212
212
|
"promotion reuses PR-stage release-candidate artifacts and does not run the heavy native build matrix"
|
|
213
213
|
],
|
|
214
214
|
"breakingDigest": "sha256:aa30f22e3af0a89841310bdbdc900844dd95a66974db173fa140a71bbd7e82c0",
|
|
215
|
-
"auditDigest": "sha256:
|
|
215
|
+
"auditDigest": "sha256:821aa9a8b69fc2fb0fdea3fe569133b9f084be6bb0e4543e1583372c10d2316f"
|
|
216
216
|
},
|
|
217
217
|
{
|
|
218
218
|
"contractVersion": 1,
|
|
@@ -221,7 +221,7 @@
|
|
|
221
221
|
"id": "web-surface",
|
|
222
222
|
"kind": "workflow",
|
|
223
223
|
"path": ".github/workflows/.web-surface.yml",
|
|
224
|
-
"publicRef": "kungfu-systems/buildchain/.github/workflows/.web-surface.yml@
|
|
224
|
+
"publicRef": "kungfu-systems/buildchain/.github/workflows/.web-surface.yml@v3",
|
|
225
225
|
"requiredInputs": [],
|
|
226
226
|
"requiredOutputs": [
|
|
227
227
|
"buildchain-runtime-sha",
|
|
@@ -265,7 +265,7 @@
|
|
|
265
265
|
"id": "promote-buildchain-ref-action",
|
|
266
266
|
"kind": "action",
|
|
267
267
|
"path": "actions/promote-buildchain-ref/action.yml",
|
|
268
|
-
"publicRef": "kungfu-systems/buildchain/actions/promote-buildchain-ref@
|
|
268
|
+
"publicRef": "kungfu-systems/buildchain/actions/promote-buildchain-ref@v3",
|
|
269
269
|
"requiredInputs": [
|
|
270
270
|
"token",
|
|
271
271
|
"sha",
|
|
@@ -327,7 +327,7 @@
|
|
|
327
327
|
"sha256:a59f0910e6df842e7699139472e5dd69ac2fdd7f7213bf2cb346d1d622556874"
|
|
328
328
|
],
|
|
329
329
|
"breakingDigest": "sha256:6147c0a8d5c36bfaa6021871574e1fc28192a3f1b8cfdae4d24ef3059ac1ebda",
|
|
330
|
-
"auditDigest": "sha256:
|
|
330
|
+
"auditDigest": "sha256:90dc42a2b7077441afba4493132c1baf2645be46e3e73abe9f8436598d9b9bc9"
|
|
331
331
|
},
|
|
332
332
|
{
|
|
333
333
|
"contractVersion": 1,
|
|
@@ -336,7 +336,7 @@
|
|
|
336
336
|
"id": "macos-credential-island-action",
|
|
337
337
|
"kind": "action",
|
|
338
338
|
"path": "actions/macos-credential-island/action.yml",
|
|
339
|
-
"publicRef": "kungfu-systems/buildchain/actions/macos-credential-island@
|
|
339
|
+
"publicRef": "kungfu-systems/buildchain/actions/macos-credential-island@v3",
|
|
340
340
|
"requiredInputs": [
|
|
341
341
|
"input-root",
|
|
342
342
|
"output-root",
|
|
@@ -392,7 +392,7 @@
|
|
|
392
392
|
"id": "report-buildchain-issue-action",
|
|
393
393
|
"kind": "action",
|
|
394
394
|
"path": "actions/report-buildchain-issue/action.yml",
|
|
395
|
-
"publicRef": "kungfu-systems/buildchain/actions/report-buildchain-issue@
|
|
395
|
+
"publicRef": "kungfu-systems/buildchain/actions/report-buildchain-issue@v3",
|
|
396
396
|
"requiredInputs": [
|
|
397
397
|
"token"
|
|
398
398
|
],
|
|
@@ -663,7 +663,7 @@
|
|
|
663
663
|
"agents can discover supported Node APIs without importing internal file paths"
|
|
664
664
|
],
|
|
665
665
|
"breakingDigest": "sha256:48f925608d3e2131d90936b07dc2a30341204cae3e6e785c0f77d61ad755c945",
|
|
666
|
-
"auditDigest": "sha256:
|
|
666
|
+
"auditDigest": "sha256:9e45dffc31b061f2c074cbc50e2d2b61da67250504f20cff475c4648fea4ae65"
|
|
667
667
|
},
|
|
668
668
|
{
|
|
669
669
|
"contractVersion": 1,
|
|
@@ -714,7 +714,7 @@
|
|
|
714
714
|
"controllerDescriptor": {
|
|
715
715
|
"contract": "buildchain.controller-descriptor/v1",
|
|
716
716
|
"digest": "sha256:373723a73d188194d389dee04c394d3b79cb0c016a370f2f5d0f60979a02ed48",
|
|
717
|
-
"registryDigest": "sha256:
|
|
717
|
+
"registryDigest": "sha256:5dc72042c6cd7d50fc4b77d186e14b676b48be0ac8c88ee85eb54ea1b428e144",
|
|
718
718
|
"inputClassifications": {
|
|
719
719
|
"buildchain-ref": {
|
|
720
720
|
"classification": "included",
|
|
@@ -873,7 +873,7 @@
|
|
|
873
873
|
"controllerDescriptor": {
|
|
874
874
|
"contract": "buildchain.controller-descriptor/v1",
|
|
875
875
|
"digest": "sha256:a06607b6ebd3fb00b77519098c81d6fb5e9943ec268aebb1e5fdbefef6e598ad",
|
|
876
|
-
"registryDigest": "sha256:
|
|
876
|
+
"registryDigest": "sha256:5dc72042c6cd7d50fc4b77d186e14b676b48be0ac8c88ee85eb54ea1b428e144",
|
|
877
877
|
"inputClassifications": {
|
|
878
878
|
"BUILDCHAIN_ARTIFACT_RELAY_S3_DOWNLOAD_ROLE_ARN": {
|
|
879
879
|
"classification": "redacted",
|
|
@@ -1297,7 +1297,7 @@
|
|
|
1297
1297
|
"controllerDescriptor": {
|
|
1298
1298
|
"contract": "buildchain.controller-descriptor/v1",
|
|
1299
1299
|
"digest": "sha256:4fc6c33bf5b429f8087ac752d5cf2a19f4a1cc30db01aae927a28cee1cf924f0",
|
|
1300
|
-
"registryDigest": "sha256:
|
|
1300
|
+
"registryDigest": "sha256:5dc72042c6cd7d50fc4b77d186e14b676b48be0ac8c88ee85eb54ea1b428e144",
|
|
1301
1301
|
"inputClassifications": {
|
|
1302
1302
|
"BUILDCHAIN_ARTIFACT_RELAY_S3_DOWNLOAD_ROLE_ARN": {
|
|
1303
1303
|
"classification": "redacted",
|
|
@@ -1671,7 +1671,7 @@
|
|
|
1671
1671
|
"controllerDescriptor": {
|
|
1672
1672
|
"contract": "buildchain.controller-descriptor/v1",
|
|
1673
1673
|
"digest": "sha256:29569f4b754595792a16742d1c4c63838b54601674a2cb6c96261a72c962dece",
|
|
1674
|
-
"registryDigest": "sha256:
|
|
1674
|
+
"registryDigest": "sha256:5dc72042c6cd7d50fc4b77d186e14b676b48be0ac8c88ee85eb54ea1b428e144",
|
|
1675
1675
|
"inputClassifications": {
|
|
1676
1676
|
"artifact-name": {
|
|
1677
1677
|
"classification": "included",
|
|
@@ -1843,7 +1843,7 @@
|
|
|
1843
1843
|
"controllerDescriptor": {
|
|
1844
1844
|
"contract": "buildchain.controller-descriptor/v1",
|
|
1845
1845
|
"digest": "sha256:65cc01e6d2b622277d67237e4811e82d24d2289d55c2f7d2dfb72325c610b2ea",
|
|
1846
|
-
"registryDigest": "sha256:
|
|
1846
|
+
"registryDigest": "sha256:5dc72042c6cd7d50fc4b77d186e14b676b48be0ac8c88ee85eb54ea1b428e144",
|
|
1847
1847
|
"inputClassifications": {
|
|
1848
1848
|
"artifact-path": {
|
|
1849
1849
|
"classification": "digest-only",
|
|
@@ -2083,7 +2083,7 @@
|
|
|
2083
2083
|
"controllerDescriptor": {
|
|
2084
2084
|
"contract": "buildchain.controller-descriptor/v1",
|
|
2085
2085
|
"digest": "sha256:6b132790b9798e8a5dfbe095701d8e024c160a08bc7c4bd477ee79feef7a9cfd",
|
|
2086
|
-
"registryDigest": "sha256:
|
|
2086
|
+
"registryDigest": "sha256:5dc72042c6cd7d50fc4b77d186e14b676b48be0ac8c88ee85eb54ea1b428e144",
|
|
2087
2087
|
"inputClassifications": {
|
|
2088
2088
|
"artifact-name": {
|
|
2089
2089
|
"classification": "included",
|
|
@@ -2265,7 +2265,7 @@
|
|
|
2265
2265
|
"controllerDescriptor": {
|
|
2266
2266
|
"contract": "buildchain.controller-descriptor/v1",
|
|
2267
2267
|
"digest": "sha256:6d71409659fbf8543c7e520b0c493d8afe86bdf60286b860bb917f0041ebc173",
|
|
2268
|
-
"registryDigest": "sha256:
|
|
2268
|
+
"registryDigest": "sha256:5dc72042c6cd7d50fc4b77d186e14b676b48be0ac8c88ee85eb54ea1b428e144",
|
|
2269
2269
|
"inputClassifications": {
|
|
2270
2270
|
"artifact-name": {
|
|
2271
2271
|
"classification": "included",
|
|
@@ -2539,6 +2539,7 @@
|
|
|
2539
2539
|
"publish-rematerialize-on-resume",
|
|
2540
2540
|
"publish-required-artifacts-json",
|
|
2541
2541
|
"publish-target",
|
|
2542
|
+
"publish-transaction-override",
|
|
2542
2543
|
"release-candidate-workflow-file",
|
|
2543
2544
|
"release-candidate-workflow-name",
|
|
2544
2545
|
"release-passport",
|
|
@@ -2564,8 +2565,8 @@
|
|
|
2564
2565
|
],
|
|
2565
2566
|
"controllerDescriptor": {
|
|
2566
2567
|
"contract": "buildchain.controller-descriptor/v1",
|
|
2567
|
-
"digest": "sha256:
|
|
2568
|
-
"registryDigest": "sha256:
|
|
2568
|
+
"digest": "sha256:0fcfcb36cad335e6ffe50b087d17f8bce9d6bd711e285740b28ce05bf9be7c6e",
|
|
2569
|
+
"registryDigest": "sha256:5dc72042c6cd7d50fc4b77d186e14b676b48be0ac8c88ee85eb54ea1b428e144",
|
|
2569
2570
|
"inputClassifications": {
|
|
2570
2571
|
"BUILDCHAIN_ISSUE_APP_ID": {
|
|
2571
2572
|
"classification": "redacted",
|
|
@@ -2831,6 +2832,10 @@
|
|
|
2831
2832
|
"classification": "included",
|
|
2832
2833
|
"source": "workflow-call-input"
|
|
2833
2834
|
},
|
|
2835
|
+
"publish-transaction-override": {
|
|
2836
|
+
"classification": "included",
|
|
2837
|
+
"source": "workflow-call-input"
|
|
2838
|
+
},
|
|
2834
2839
|
"release-candidate-workflow-file": {
|
|
2835
2840
|
"classification": "included",
|
|
2836
2841
|
"source": "workflow-call-input"
|
|
@@ -2928,7 +2933,7 @@
|
|
|
2928
2933
|
"missing receipts are non-qualifying and must not be represented as a successful controller run"
|
|
2929
2934
|
],
|
|
2930
2935
|
"breakingDigest": "sha256:015d8de793adbd4c539416be7d7512e18cc92097e629b0203fa06d2c183e98bd",
|
|
2931
|
-
"auditDigest": "sha256:
|
|
2936
|
+
"auditDigest": "sha256:821aa9a8b69fc2fb0fdea3fe569133b9f084be6bb0e4543e1583372c10d2316f"
|
|
2932
2937
|
},
|
|
2933
2938
|
{
|
|
2934
2939
|
"contractVersion": 1,
|
|
@@ -2989,7 +2994,7 @@
|
|
|
2989
2994
|
"controllerDescriptor": {
|
|
2990
2995
|
"contract": "buildchain.controller-descriptor/v1",
|
|
2991
2996
|
"digest": "sha256:f97656a8df0758c8e404d5b7c387529256a1ec45d1748f8efb6847a3256b1216",
|
|
2992
|
-
"registryDigest": "sha256:
|
|
2997
|
+
"registryDigest": "sha256:5dc72042c6cd7d50fc4b77d186e14b676b48be0ac8c88ee85eb54ea1b428e144",
|
|
2993
2998
|
"inputClassifications": {
|
|
2994
2999
|
"buildchain-ref": {
|
|
2995
3000
|
"classification": "included",
|
|
@@ -3112,7 +3117,7 @@
|
|
|
3112
3117
|
"controllerDescriptor": {
|
|
3113
3118
|
"contract": "buildchain.controller-descriptor/v1",
|
|
3114
3119
|
"digest": "sha256:b6f53563c0adc859bc586c05fce560a5094d7d9666438d63c5fd3e1fc4774555",
|
|
3115
|
-
"registryDigest": "sha256:
|
|
3120
|
+
"registryDigest": "sha256:5dc72042c6cd7d50fc4b77d186e14b676b48be0ac8c88ee85eb54ea1b428e144",
|
|
3116
3121
|
"inputClassifications": {}
|
|
3117
3122
|
},
|
|
3118
3123
|
"guarantees": [
|
|
@@ -3125,6 +3130,6 @@
|
|
|
3125
3130
|
"auditDigest": "sha256:e07a5db56a71bd0ac79c81f12619938055361bf0a0ed8e5891f88ca1c51f1c93"
|
|
3126
3131
|
}
|
|
3127
3132
|
],
|
|
3128
|
-
"compatibilityDigest": "sha256:
|
|
3129
|
-
"contractDigest": "sha256:
|
|
3133
|
+
"compatibilityDigest": "sha256:199fd83a7da33b0f654692ca973b33155e376ed50f0ce1f5864e1b6b18e0500a",
|
|
3134
|
+
"contractDigest": "sha256:914720131f07664cd187a1033f357c4952ef1008f5553cb6b285a75f786a7fbc"
|
|
3130
3135
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"contract": "kungfu-buildchain-site-bundle",
|
|
4
|
-
"generatedAt": "2026-07-
|
|
5
|
-
"publishedAt": "2026-07-
|
|
4
|
+
"generatedAt": "2026-07-25T02:29:54.202Z",
|
|
5
|
+
"publishedAt": "2026-07-25T02:29:54.202Z",
|
|
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": "
|
|
22
|
+
"sourceRevision": "173df79be292987e76383a1955c8a9d31b0cb499",
|
|
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": "
|
|
40
|
+
"version": "3.0.0",
|
|
41
41
|
"versionSource": "package.json#version"
|
|
42
42
|
},
|
|
43
43
|
"source": {
|
|
@@ -1718,6 +1718,10 @@
|
|
|
1718
1718
|
"classification": "included",
|
|
1719
1719
|
"source": "workflow-call-input"
|
|
1720
1720
|
},
|
|
1721
|
+
"publish-transaction-override": {
|
|
1722
|
+
"classification": "included",
|
|
1723
|
+
"source": "workflow-call-input"
|
|
1724
|
+
},
|
|
1721
1725
|
"release-candidate-workflow-file": {
|
|
1722
1726
|
"classification": "included",
|
|
1723
1727
|
"source": "workflow-call-input"
|
|
@@ -1848,7 +1852,7 @@
|
|
|
1848
1852
|
"controller-receipt"
|
|
1849
1853
|
]
|
|
1850
1854
|
},
|
|
1851
|
-
"digest": "sha256:
|
|
1855
|
+
"digest": "sha256:0fcfcb36cad335e6ffe50b087d17f8bce9d6bd711e285740b28ce05bf9be7c6e"
|
|
1852
1856
|
},
|
|
1853
1857
|
{
|
|
1854
1858
|
"schemaVersion": 1,
|
|
@@ -2024,5 +2028,5 @@
|
|
|
2024
2028
|
"digest": "sha256:b6f53563c0adc859bc586c05fce560a5094d7d9666438d63c5fd3e1fc4774555"
|
|
2025
2029
|
}
|
|
2026
2030
|
],
|
|
2027
|
-
"digest": "sha256:
|
|
2031
|
+
"digest": "sha256:5dc72042c6cd7d50fc4b77d186e14b676b48be0ac8c88ee85eb54ea1b428e144"
|
|
2028
2032
|
}
|
|
@@ -14,14 +14,14 @@
|
|
|
14
14
|
},
|
|
15
15
|
"runtimeContract": {
|
|
16
16
|
"contract": "kungfu-buildchain-runtime-contract-world",
|
|
17
|
-
"compatibilityDigest": "sha256:
|
|
18
|
-
"majorLine": "
|
|
17
|
+
"compatibilityDigest": "sha256:199fd83a7da33b0f654692ca973b33155e376ed50f0ce1f5864e1b6b18e0500a",
|
|
18
|
+
"majorLine": "v3"
|
|
19
19
|
},
|
|
20
20
|
"publicSurfaceReverseAudit": {
|
|
21
21
|
"contract": "kungfu-buildchain-public-surface-reverse-audit",
|
|
22
22
|
"path": "dist/site/public-surface-audit.json",
|
|
23
23
|
"status": "passed",
|
|
24
|
-
"sha256": "
|
|
24
|
+
"sha256": "e04e65883d48ed353c4a07f340b827444122ec28815d9b0d876b6fe45833e3bf",
|
|
25
25
|
"summary": {
|
|
26
26
|
"cliCommandCount": 87,
|
|
27
27
|
"workflowCount": 52,
|
|
@@ -228,7 +228,7 @@
|
|
|
228
228
|
"contract": "kungfu-buildchain-public-surface-reverse-audit",
|
|
229
229
|
"path": "dist/site/public-surface-audit.json",
|
|
230
230
|
"status": "passed",
|
|
231
|
-
"sha256": "
|
|
231
|
+
"sha256": "e04e65883d48ed353c4a07f340b827444122ec28815d9b0d876b6fe45833e3bf",
|
|
232
232
|
"summary": {
|
|
233
233
|
"cliCommandCount": 87,
|
|
234
234
|
"workflowCount": 52,
|
|
@@ -2933,7 +2933,7 @@
|
|
|
2933
2933
|
"visibility": "public",
|
|
2934
2934
|
"participantFacing": true,
|
|
2935
2935
|
"public": true,
|
|
2936
|
-
"inputCount":
|
|
2936
|
+
"inputCount": 79,
|
|
2937
2937
|
"inputs": [
|
|
2938
2938
|
"allow-repository",
|
|
2939
2939
|
"artifact-name",
|
|
@@ -2991,6 +2991,7 @@
|
|
|
2991
2991
|
"publish-rematerialize-on-resume",
|
|
2992
2992
|
"publish-required-artifacts-json",
|
|
2993
2993
|
"publish-target",
|
|
2994
|
+
"publish-transaction-override",
|
|
2994
2995
|
"release-candidate-workflow-file",
|
|
2995
2996
|
"release-candidate-workflow-name",
|
|
2996
2997
|
"release-passport",
|
|
@@ -3919,7 +3920,7 @@
|
|
|
3919
3920
|
"visibility": "public",
|
|
3920
3921
|
"participantFacing": true,
|
|
3921
3922
|
"public": true,
|
|
3922
|
-
"inputCount":
|
|
3923
|
+
"inputCount": 71,
|
|
3923
3924
|
"inputs": [
|
|
3924
3925
|
"allow-repository",
|
|
3925
3926
|
"artifact-name",
|
|
@@ -3969,6 +3970,7 @@
|
|
|
3969
3970
|
"publish-rematerialize-on-resume",
|
|
3970
3971
|
"publish-required-artifacts-json",
|
|
3971
3972
|
"publish-target",
|
|
3973
|
+
"publish-transaction-override",
|
|
3972
3974
|
"release-candidate-workflow-file",
|
|
3973
3975
|
"release-candidate-workflow-name",
|
|
3974
3976
|
"release-passport",
|
|
@@ -307,7 +307,7 @@
|
|
|
307
307
|
"specifier": "@kungfu-tech/buildchain/publication-authority",
|
|
308
308
|
"export": "./publication-authority",
|
|
309
309
|
"target": "./packages/core/publication-authority.js",
|
|
310
|
-
"digest": "sha256:
|
|
310
|
+
"digest": "sha256:10a33dae7768c9fced757c7d75c673adbd016b149064dce39d9f42df5c84073e",
|
|
311
311
|
"summary": "Sealed publication authority registry, runner provenance, control-plane audit, admission, and independent verification APIs.",
|
|
312
312
|
"capabilityGroup": "release-passport-trust",
|
|
313
313
|
"audience": [
|
|
@@ -777,6 +777,7 @@
|
|
|
777
777
|
"publish-rematerialize-on-resume",
|
|
778
778
|
"publish-required-artifacts-json",
|
|
779
779
|
"publish-target",
|
|
780
|
+
"publish-transaction-override",
|
|
780
781
|
"release-candidate-workflow-file",
|
|
781
782
|
"release-candidate-workflow-name",
|
|
782
783
|
"release-passport",
|
|
@@ -800,7 +801,7 @@
|
|
|
800
801
|
"target-sha",
|
|
801
802
|
"trusted-publishing"
|
|
802
803
|
],
|
|
803
|
-
"inputCount":
|
|
804
|
+
"inputCount": 79,
|
|
804
805
|
"secrets": [
|
|
805
806
|
"BUILDCHAIN_ISSUE_APP_ID",
|
|
806
807
|
"BUILDCHAIN_ISSUE_APP_PRIVATE_KEY",
|
|
@@ -1887,6 +1888,7 @@
|
|
|
1887
1888
|
"publish-rematerialize-on-resume",
|
|
1888
1889
|
"publish-required-artifacts-json",
|
|
1889
1890
|
"publish-target",
|
|
1891
|
+
"publish-transaction-override",
|
|
1890
1892
|
"release-candidate-workflow-file",
|
|
1891
1893
|
"release-candidate-workflow-name",
|
|
1892
1894
|
"release-passport",
|
|
@@ -1910,7 +1912,7 @@
|
|
|
1910
1912
|
"target-sha",
|
|
1911
1913
|
"trusted-publishing"
|
|
1912
1914
|
],
|
|
1913
|
-
"inputCount":
|
|
1915
|
+
"inputCount": 71,
|
|
1914
1916
|
"secrets": [
|
|
1915
1917
|
"BUILDCHAIN_ISSUE_APP_ID",
|
|
1916
1918
|
"BUILDCHAIN_ISSUE_APP_PRIVATE_KEY",
|
|
@@ -3910,7 +3912,7 @@
|
|
|
3910
3912
|
"workflowRegistryPath": "dist/site/workflow-registry.json",
|
|
3911
3913
|
"pageRegistryPath": "dist/site/page-registry.json",
|
|
3912
3914
|
"cliRegistryDigest": "5ba7fd93a13993b05767b6f02d0626a7347f25c3d7cd4589ed4f70028c1f1bd1",
|
|
3913
|
-
"workflowRegistryDigest": "
|
|
3915
|
+
"workflowRegistryDigest": "aab70864785c4b8f2089dd833732dbbb26b1b29cf20063a2fcdeeee3f36d2780",
|
|
3914
3916
|
"pageRegistryDigest": "16a40ed6f3848fcb6a743f9d0369b04e956dfb7b8548b1a7a79266f76b928c80"
|
|
3915
3917
|
},
|
|
3916
3918
|
"comparison": {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"contract": "kungfu-buildchain-publication-release-registry",
|
|
4
|
-
"generatedAt": "2026-07-
|
|
5
|
-
"publishedAt": "2026-07-
|
|
4
|
+
"generatedAt": "2026-07-25T02:29:54.202Z",
|
|
5
|
+
"publishedAt": "2026-07-25T02:29:54.202Z",
|
|
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": "
|
|
22
|
+
"sourceRevision": "173df79be292987e76383a1955c8a9d31b0cb499",
|
|
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": "
|
|
35
|
+
"version": "3.0.0",
|
|
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-
|
|
5
|
-
"publishedAt": "2026-07-
|
|
4
|
+
"generatedAt": "2026-07-25T02:29:54.202Z",
|
|
5
|
+
"publishedAt": "2026-07-25T02:29:54.202Z",
|
|
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": "
|
|
22
|
+
"sourceRevision": "173df79be292987e76383a1955c8a9d31b0cb499",
|
|
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": "
|
|
40
|
+
"version": "3.0.0",
|
|
41
41
|
"versionSource": "package.json#version"
|
|
42
42
|
},
|
|
43
43
|
"entrypoint": "buildchain-site.json",
|
|
@@ -346,6 +346,7 @@
|
|
|
346
346
|
"publish-rematerialize-on-resume",
|
|
347
347
|
"publish-required-artifacts-json",
|
|
348
348
|
"publish-target",
|
|
349
|
+
"publish-transaction-override",
|
|
349
350
|
"release-candidate-workflow-file",
|
|
350
351
|
"release-candidate-workflow-name",
|
|
351
352
|
"release-passport",
|
|
@@ -369,7 +370,7 @@
|
|
|
369
370
|
"target-sha",
|
|
370
371
|
"trusted-publishing"
|
|
371
372
|
],
|
|
372
|
-
"inputCount":
|
|
373
|
+
"inputCount": 79,
|
|
373
374
|
"secrets": [
|
|
374
375
|
"BUILDCHAIN_ISSUE_APP_ID",
|
|
375
376
|
"BUILDCHAIN_ISSUE_APP_PRIVATE_KEY",
|
|
@@ -1567,6 +1568,7 @@
|
|
|
1567
1568
|
"publish-rematerialize-on-resume",
|
|
1568
1569
|
"publish-required-artifacts-json",
|
|
1569
1570
|
"publish-target",
|
|
1571
|
+
"publish-transaction-override",
|
|
1570
1572
|
"release-candidate-workflow-file",
|
|
1571
1573
|
"release-candidate-workflow-name",
|
|
1572
1574
|
"release-passport",
|
|
@@ -1590,7 +1592,7 @@
|
|
|
1590
1592
|
"target-sha",
|
|
1591
1593
|
"trusted-publishing"
|
|
1592
1594
|
],
|
|
1593
|
-
"inputCount":
|
|
1595
|
+
"inputCount": 71,
|
|
1594
1596
|
"secrets": [
|
|
1595
1597
|
"BUILDCHAIN_ISSUE_APP_ID",
|
|
1596
1598
|
"BUILDCHAIN_ISSUE_APP_PRIVATE_KEY",
|
package/package.json
CHANGED
|
@@ -54,6 +54,10 @@ const REQUIRED_CONTROL_PLANE_FACTS = Object.freeze([
|
|
|
54
54
|
"runner-policy",
|
|
55
55
|
]);
|
|
56
56
|
|
|
57
|
+
function releaseCandidateEvidenceChannel(publicationChannel) {
|
|
58
|
+
return publicationChannel === "major" ? "release" : publicationChannel;
|
|
59
|
+
}
|
|
60
|
+
|
|
57
61
|
function stableJson(value) {
|
|
58
62
|
if (Array.isArray(value)) return `[${value.map(stableJson).join(",")}]`;
|
|
59
63
|
if (value && typeof value === "object") {
|
|
@@ -633,7 +637,7 @@ function validatePublicationEvidence(publicationEvidence, admission) {
|
|
|
633
637
|
passport,
|
|
634
638
|
buildSummary,
|
|
635
639
|
repository: admission.repository,
|
|
636
|
-
targetChannel: admission.channel,
|
|
640
|
+
targetChannel: releaseCandidateEvidenceChannel(admission.channel),
|
|
637
641
|
});
|
|
638
642
|
if (!passportValidation.ok) {
|
|
639
643
|
throw new Error(`release-candidate passport did not qualify: ${passportValidation.errors.join("; ")}`);
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
function parsePackageVersion(version) {
|
|
2
|
+
const match = String(version || "").match(
|
|
3
|
+
/^(\d+)\.(\d+)\.(\d+)(?:-alpha\.(\d+))?$/,
|
|
4
|
+
);
|
|
5
|
+
if (!match) {
|
|
6
|
+
throw new Error(
|
|
7
|
+
"root package version must expose a numeric semver version for self-dogfood",
|
|
8
|
+
);
|
|
9
|
+
}
|
|
10
|
+
return {
|
|
11
|
+
major: Number(match[1]),
|
|
12
|
+
minor: Number(match[2]),
|
|
13
|
+
patch: Number(match[3]),
|
|
14
|
+
alpha: match[4] === undefined ? undefined : Number(match[4]),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function parseAlphaRef(ref) {
|
|
19
|
+
const match = String(ref || "").match(/^v(\d+)-alpha$/);
|
|
20
|
+
if (!match) {
|
|
21
|
+
throw new Error(
|
|
22
|
+
"Buildchain self-dogfood alpha lock must target a major alpha ref",
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
return Number(match[1]);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function resolveSelfDogfoodMajor({
|
|
29
|
+
packageVersion,
|
|
30
|
+
alphaRef,
|
|
31
|
+
majorBootstrap = false,
|
|
32
|
+
} = {}) {
|
|
33
|
+
const version = parsePackageVersion(packageVersion);
|
|
34
|
+
const acceptedMajor = parseAlphaRef(alphaRef);
|
|
35
|
+
if (acceptedMajor === version.major) {
|
|
36
|
+
return {
|
|
37
|
+
packageMajor: version.major,
|
|
38
|
+
workflowMajor: acceptedMajor,
|
|
39
|
+
bootstrap: false,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const stableBootstrap =
|
|
44
|
+
version.minor === 0 && version.patch === 0 && version.alpha === undefined;
|
|
45
|
+
const nextAlphaBootstrap =
|
|
46
|
+
version.minor === 0 && version.patch === 1 && version.alpha !== undefined;
|
|
47
|
+
if (
|
|
48
|
+
majorBootstrap === true &&
|
|
49
|
+
acceptedMajor + 1 === version.major &&
|
|
50
|
+
(stableBootstrap || nextAlphaBootstrap)
|
|
51
|
+
) {
|
|
52
|
+
return {
|
|
53
|
+
packageMajor: version.major,
|
|
54
|
+
workflowMajor: acceptedMajor,
|
|
55
|
+
bootstrap: true,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
throw new Error(
|
|
60
|
+
"Buildchain self-dogfood alpha lock must target the current major alpha ref",
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function contractForSelfDogfoodEvaluation({
|
|
65
|
+
currentContract,
|
|
66
|
+
majorResolution,
|
|
67
|
+
} = {}) {
|
|
68
|
+
if (!currentContract || typeof currentContract !== "object") {
|
|
69
|
+
throw new Error("Buildchain self-dogfood requires a current contract");
|
|
70
|
+
}
|
|
71
|
+
if (!majorResolution?.bootstrap) {
|
|
72
|
+
return currentContract;
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
...currentContract,
|
|
76
|
+
majorLine: `v${majorResolution.workflowMajor}`,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function canAdmitSelfDogfoodLockEvaluation({
|
|
81
|
+
evaluation,
|
|
82
|
+
majorResolution,
|
|
83
|
+
} = {}) {
|
|
84
|
+
return evaluation?.compatible === true || majorResolution?.bootstrap === true;
|
|
85
|
+
}
|
|
@@ -5,6 +5,11 @@ import {
|
|
|
5
5
|
collectPublicSurfaceReverseAudit,
|
|
6
6
|
} from "../packages/core/public-surface-audit.js";
|
|
7
7
|
import { evaluateBuildchainContractLock } from "../packages/core/buildchain-contract.js";
|
|
8
|
+
import {
|
|
9
|
+
canAdmitSelfDogfoodLockEvaluation,
|
|
10
|
+
contractForSelfDogfoodEvaluation,
|
|
11
|
+
resolveSelfDogfoodMajor,
|
|
12
|
+
} from "../packages/core/self-dogfood-version.js";
|
|
8
13
|
import { generateChannelBuildWorkflow } from "./generate-channel-build-workflow.mjs";
|
|
9
14
|
import {
|
|
10
15
|
generateChannelPromotionWorkflow,
|
|
@@ -138,13 +143,12 @@ const selfDogfoodAlphaLock = JSON.parse(
|
|
|
138
143
|
const currentBuildchainContract = JSON.parse(
|
|
139
144
|
fs.readFileSync(path.join(root, "dist/site/buildchain-contract.json"), "utf8"),
|
|
140
145
|
);
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
}
|
|
146
|
+
const selfDogfoodMajorResolution = resolveSelfDogfoodMajor({
|
|
147
|
+
packageVersion: rootPackage.version,
|
|
148
|
+
alphaRef: selfDogfoodAlphaLock.buildchain?.ref,
|
|
149
|
+
majorBootstrap: process.env.BUILDCHAIN_MAJOR_VERSION_BOOTSTRAP === "true",
|
|
150
|
+
});
|
|
151
|
+
const selfDogfoodMajor = String(selfDogfoodMajorResolution.workflowMajor);
|
|
148
152
|
if (!/^[0-9a-f]{40}$/.test(selfDogfoodAlphaLock.buildchain?.resolvedSha || "")) {
|
|
149
153
|
throw new Error("Buildchain self-dogfood alpha lock must record an exact accepted SHA");
|
|
150
154
|
}
|
|
@@ -153,12 +157,20 @@ if (selfDogfoodAlphaLock.buildchain?.compatibilityPolicy !== "major-compatible")
|
|
|
153
157
|
}
|
|
154
158
|
const selfDogfoodAlphaEvaluation = evaluateBuildchainContractLock({
|
|
155
159
|
lock: selfDogfoodAlphaLock,
|
|
156
|
-
current:
|
|
160
|
+
current: contractForSelfDogfoodEvaluation({
|
|
161
|
+
currentContract: currentBuildchainContract,
|
|
162
|
+
majorResolution: selfDogfoodMajorResolution,
|
|
163
|
+
}),
|
|
157
164
|
runtimeRef: `v${selfDogfoodMajor}-alpha`,
|
|
158
165
|
runtimeSha: "current-development-contract",
|
|
159
166
|
runtimeClass: "alpha",
|
|
160
167
|
});
|
|
161
|
-
if (
|
|
168
|
+
if (
|
|
169
|
+
!canAdmitSelfDogfoodLockEvaluation({
|
|
170
|
+
evaluation: selfDogfoodAlphaEvaluation,
|
|
171
|
+
majorResolution: selfDogfoodMajorResolution,
|
|
172
|
+
})
|
|
173
|
+
) {
|
|
162
174
|
throw new Error("Buildchain self-dogfood alpha lock requires review after a breaking contract change");
|
|
163
175
|
}
|
|
164
176
|
for (const requiredSnippet of [
|
|
@@ -402,7 +402,9 @@ export async function resolveReleaseCandidateArtifacts({
|
|
|
402
402
|
const repoInfo = splitRepository(repository);
|
|
403
403
|
const sha = assertSha(targetSha, "targetSha");
|
|
404
404
|
const normalizedTarget = normalizeBranch(targetRef);
|
|
405
|
-
|
|
405
|
+
const releaseCandidateTarget = /^(alpha|release)\/v\d+\/v\d+\.\d+$/.test(normalizedTarget);
|
|
406
|
+
const majorGateTarget = normalizedTarget === "publish-gate/major" || normalizedTarget === "major-gate";
|
|
407
|
+
if (!releaseCandidateTarget && !majorGateTarget) {
|
|
406
408
|
return {
|
|
407
409
|
enabled: false,
|
|
408
410
|
reason: `target ref ${normalizedTarget || "(empty)"} does not require release-candidate promotion`,
|
|
@@ -414,14 +416,49 @@ export async function resolveReleaseCandidateArtifacts({
|
|
|
414
416
|
fetchImpl,
|
|
415
417
|
path: `/repos/${repoInfo.owner}/${repoInfo.repo}/commits/${sha}/pulls`,
|
|
416
418
|
});
|
|
417
|
-
const
|
|
419
|
+
const channelPullRequest = selectMergedChannelPullRequest({
|
|
418
420
|
pullRequests: Array.isArray(pulls) ? pulls : [],
|
|
419
421
|
targetRef: normalizedTarget,
|
|
420
422
|
repository: repoInfo.fullName,
|
|
421
423
|
});
|
|
422
|
-
if (!
|
|
424
|
+
if (!channelPullRequest) {
|
|
423
425
|
throw new Error(`no same-repository merged channel PR found for ${sha} into ${normalizedTarget}`);
|
|
424
426
|
}
|
|
427
|
+
let pullRequest = channelPullRequest;
|
|
428
|
+
if (majorGateTarget) {
|
|
429
|
+
const releaseRef = normalizeBranch(channelPullRequest.head?.ref || "");
|
|
430
|
+
if (!/^release\/v\d+\/v\d+\.\d+$/.test(releaseRef)) {
|
|
431
|
+
throw new Error(
|
|
432
|
+
`major gate ${normalizedTarget} must be merged from a release/vN/vN.M head, got ${releaseRef || "<empty>"}`,
|
|
433
|
+
);
|
|
434
|
+
}
|
|
435
|
+
const releaseSha = assertSha(channelPullRequest.head?.sha, "major gate release head SHA");
|
|
436
|
+
const releasePulls = await githubJson({
|
|
437
|
+
apiUrl,
|
|
438
|
+
token,
|
|
439
|
+
fetchImpl,
|
|
440
|
+
path: `/repos/${repoInfo.owner}/${repoInfo.repo}/commits/${releaseSha}/pulls`,
|
|
441
|
+
});
|
|
442
|
+
pullRequest = selectMergedChannelPullRequest({
|
|
443
|
+
pullRequests: Array.isArray(releasePulls) ? releasePulls : [],
|
|
444
|
+
targetRef: releaseRef,
|
|
445
|
+
repository: repoInfo.fullName,
|
|
446
|
+
});
|
|
447
|
+
if (!pullRequest) {
|
|
448
|
+
throw new Error(
|
|
449
|
+
`no same-repository merged release-candidate PR found for major gate release head ${releaseSha} into ${releaseRef}`,
|
|
450
|
+
);
|
|
451
|
+
}
|
|
452
|
+
const releaseMergeSha = assertSha(
|
|
453
|
+
pullRequest.merge_commit_sha || pullRequest.mergeCommit?.oid,
|
|
454
|
+
"release-candidate PR merge SHA",
|
|
455
|
+
);
|
|
456
|
+
if (releaseMergeSha !== releaseSha) {
|
|
457
|
+
throw new Error(
|
|
458
|
+
`major gate release head ${releaseSha} does not equal release-candidate PR #${pullRequest.number} merge ${releaseMergeSha}`,
|
|
459
|
+
);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
425
462
|
const timeoutMs = Number(waitSeconds) * 1000;
|
|
426
463
|
const intervalMs = Number(pollIntervalMs);
|
|
427
464
|
if (!Number.isFinite(timeoutMs) || timeoutMs < 0) {
|
|
@@ -501,6 +538,16 @@ export async function resolveReleaseCandidateArtifacts({
|
|
|
501
538
|
headRef: pullRequest.head?.ref || "",
|
|
502
539
|
baseRef: pullRequest.base?.ref || "",
|
|
503
540
|
},
|
|
541
|
+
...(majorGateTarget
|
|
542
|
+
? {
|
|
543
|
+
promotionPullRequest: {
|
|
544
|
+
number: channelPullRequest.number,
|
|
545
|
+
url: channelPullRequest.html_url || channelPullRequest.url || "",
|
|
546
|
+
headRef: channelPullRequest.head?.ref || "",
|
|
547
|
+
baseRef: channelPullRequest.base?.ref || "",
|
|
548
|
+
},
|
|
549
|
+
}
|
|
550
|
+
: {}),
|
|
504
551
|
run: {
|
|
505
552
|
id: String(run.id || ""),
|
|
506
553
|
url: run.html_url || run.url || "",
|