@kungfu-tech/buildchain 3.0.2-alpha.7 → 3.0.2-alpha.9

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 (54) hide show
  1. package/README.md +3 -2
  2. package/contracts/auditable-demo-media-profiles-v1.json +168 -0
  3. package/contracts/evidence/auditable-demo-web-delivery-v1.json +103 -0
  4. package/contracts/fixtures/auditable-demo-web-delivery-v1/complete-transcript.txt +2 -0
  5. package/contracts/fixtures/auditable-demo-web-delivery-v1/public-projection.json +16 -0
  6. package/contracts/fixtures/auditable-demo-web-delivery-v1/scene.json +12 -0
  7. package/dist/site/buildchain-contract.json +44 -26
  8. package/dist/site/buildchain-site.json +42 -32
  9. package/dist/site/capability-registry.json +3 -3
  10. package/dist/site/controller-registry.json +11 -3
  11. package/dist/site/kfd-claims.json +74 -8
  12. package/dist/site/kfd-upstream-aggregate.json +1 -1
  13. package/dist/site/manual-registry.json +7 -7
  14. package/dist/site/node-api-registry.json +44 -5
  15. package/dist/site/page-registry.json +30 -20
  16. package/dist/site/public-surface-audit.json +38 -10
  17. package/dist/site/publication-authority-registry.json +26 -1
  18. package/dist/site/publication-registry.json +4 -4
  19. package/dist/site/release-provenance.json +3 -0
  20. package/dist/site/site-manifest.json +11 -11
  21. package/dist/site/workflow-registry.json +41 -7
  22. package/docs/MAP.md +2 -0
  23. package/docs/auditable-demo.md +55 -3
  24. package/docs/dev-alpha-candidate-patrol.md +9 -0
  25. package/docs/github-artifact-attestation.md +1 -1
  26. package/docs/release-governance.md +32 -0
  27. package/docs/reusable-build-surface.md +73 -58
  28. package/docs/runtime-train-validation.md +21 -0
  29. package/docs/versioning.md +1 -0
  30. package/package.json +5 -1
  31. package/packages/core/artifact-signing-result.js +228 -0
  32. package/packages/core/artifact-signing.js +412 -0
  33. package/packages/core/buildchain-config.js +58 -0
  34. package/packages/core/buildchain-contract.js +8 -0
  35. package/packages/core/buildchain-publication-authority.js +1 -0
  36. package/packages/core/detached-artifact-signature.js +121 -0
  37. package/packages/core/github-governance-authority.js +6 -0
  38. package/packages/core/index.js +27 -0
  39. package/scripts/auditable-demo.mjs +491 -22
  40. package/scripts/buildchain-channel-router.mjs +8 -2
  41. package/scripts/check-inventory.mjs +5 -0
  42. package/scripts/dev-alpha-candidate-patrol.mjs +18 -0
  43. package/scripts/dispatch-artifact-signing-authority.mjs +152 -0
  44. package/scripts/finalize-native-artifact-signing-result.mjs +96 -0
  45. package/scripts/generate-site-bundle.mjs +3 -0
  46. package/scripts/import-artifact-signing-results.mjs +76 -0
  47. package/scripts/inspect-artifact-signing-requests.mjs +101 -0
  48. package/scripts/materialize-artifact-signing-request.mjs +66 -0
  49. package/scripts/merge-artifact-signing-results.mjs +76 -0
  50. package/scripts/release-line-policy.mjs +27 -0
  51. package/scripts/runtime-ref-core.mjs +10 -6
  52. package/scripts/seal-artifact-signing-requests.mjs +368 -0
  53. package/scripts/sign-detached-artifact-requests.mjs +237 -0
  54. package/scripts/verify-artifact-signing-results.mjs +99 -0
@@ -4,7 +4,7 @@
4
4
  "status": "passed",
5
5
  "summary": {
6
6
  "cliCommandCount": 97,
7
- "workflowCount": 55,
7
+ "workflowCount": 57,
8
8
  "actionCount": 6,
9
9
  "sitePageCount": 59,
10
10
  "docCommandRefCount": 291,
@@ -507,6 +507,7 @@
507
507
  "adapter-path",
508
508
  "artifact-retention-days",
509
509
  "buildchain-repository",
510
+ "media-profile",
510
511
  "render-media",
511
512
  "renderer-image",
512
513
  "require-trusted-event",
@@ -514,7 +515,7 @@
514
515
  "source-artifact-name",
515
516
  "source-ref"
516
517
  ],
517
- "inputCount": 9,
518
+ "inputCount": 10,
518
519
  "secrets": [],
519
520
  "secretCount": 0,
520
521
  "outputs": [
@@ -527,10 +528,12 @@
527
528
  "media-artifact-id",
528
529
  "media-artifact-name",
529
530
  "media-artifact-url",
531
+ "media-profile",
532
+ "media-qualification-root",
530
533
  "media-root",
531
534
  "source-sha"
532
535
  ],
533
- "outputCount": 11
536
+ "outputCount": 13
534
537
  },
535
538
  {
536
539
  "id": ".binary-release-assets",
@@ -646,9 +649,10 @@
646
649
  "BUILDCHAIN_MACOS_CERTIFICATE_PASSWORD",
647
650
  "BUILDCHAIN_MACOS_NOTARY_API_ISSUER",
648
651
  "BUILDCHAIN_MACOS_NOTARY_API_KEY_ID",
649
- "BUILDCHAIN_MACOS_NOTARY_API_KEY_P8_BASE64"
652
+ "BUILDCHAIN_MACOS_NOTARY_API_KEY_P8_BASE64",
653
+ "BUILDCHAIN_PROMOTION_TOKEN"
650
654
  ],
651
- "secretCount": 8,
655
+ "secretCount": 9,
652
656
  "outputs": [
653
657
  "artifact-coordinates-json",
654
658
  "build-diagnostics-summary-artifact",
@@ -1300,6 +1304,28 @@
1300
1304
  "outputs": [],
1301
1305
  "outputCount": 0
1302
1306
  },
1307
+ {
1308
+ "id": "artifact-signing-authority",
1309
+ "path": ".github/workflows/artifact-signing-authority.yml",
1310
+ "reusable": false,
1311
+ "inputs": [],
1312
+ "inputCount": 0,
1313
+ "secrets": [],
1314
+ "secretCount": 0,
1315
+ "outputs": [],
1316
+ "outputCount": 0
1317
+ },
1318
+ {
1319
+ "id": "auditable-demo-media-profile-qualification",
1320
+ "path": ".github/workflows/auditable-demo-media-profile-qualification.yml",
1321
+ "reusable": false,
1322
+ "inputs": [],
1323
+ "inputCount": 0,
1324
+ "secrets": [],
1325
+ "secretCount": 0,
1326
+ "outputs": [],
1327
+ "outputCount": 0
1328
+ },
1303
1329
  {
1304
1330
  "id": "binary-distribution",
1305
1331
  "path": ".github/workflows/binary-distribution.yml",
@@ -1423,9 +1449,10 @@
1423
1449
  "BUILDCHAIN_MACOS_CERTIFICATE_PASSWORD",
1424
1450
  "BUILDCHAIN_MACOS_NOTARY_API_ISSUER",
1425
1451
  "BUILDCHAIN_MACOS_NOTARY_API_KEY_ID",
1426
- "BUILDCHAIN_MACOS_NOTARY_API_KEY_P8_BASE64"
1452
+ "BUILDCHAIN_MACOS_NOTARY_API_KEY_P8_BASE64",
1453
+ "BUILDCHAIN_PROMOTION_TOKEN"
1427
1454
  ],
1428
- "secretCount": 8,
1455
+ "secretCount": 9,
1429
1456
  "outputs": [
1430
1457
  "artifact-coordinates-json",
1431
1458
  "build-diagnostics-summary-artifact",
@@ -1638,11 +1665,12 @@
1638
1665
  "dev-workflow-path",
1639
1666
  "dry-run",
1640
1667
  "max-age-seconds",
1668
+ "pull-request-body-prefix",
1641
1669
  "settlement-authorized",
1642
1670
  "source-branch",
1643
1671
  "target-branch"
1644
1672
  ],
1645
- "inputCount": 10,
1673
+ "inputCount": 11,
1646
1674
  "secrets": [
1647
1675
  "promotion-token"
1648
1676
  ],
@@ -4232,8 +4260,8 @@
4232
4260
  "workflowRegistryPath": "dist/site/workflow-registry.json",
4233
4261
  "pageRegistryPath": "dist/site/page-registry.json",
4234
4262
  "cliRegistryDigest": "0be723caa314a36a1a36b03522527eb5b13e9b741e6566ff7f6ee06958df02ca",
4235
- "workflowRegistryDigest": "18405fac6ddfebd647c2ba7d3927ec666e6d43dc1913043b0334c91e2bf143f1",
4236
- "pageRegistryDigest": "b453877a28760e2446d5b58ee2bcbb3edd1059731a4046166ce1a4fc6649624b"
4263
+ "workflowRegistryDigest": "01792ad09bcdcd3c12d018e6ee9613a09b5a1b87525d6f643a18f963f0d973a1",
4264
+ "pageRegistryDigest": "56583b14046754bc0c02c512602c4e1c4e9ecdf68e6e639fcab8d550c3e082b4"
4237
4265
  },
4238
4266
  "comparison": {
4239
4267
  "missingCliRegistry": [],
@@ -167,6 +167,19 @@
167
167
  "runnerPolicy": "unqualified",
168
168
  "notes": ""
169
169
  },
170
+ {
171
+ "workflowPath": ".github/workflows/artifact-signing-authority.yml",
172
+ "authorityClass": "evidence-publication",
173
+ "publicationCapable": false,
174
+ "capabilityIds": [],
175
+ "credentialMode": "none",
176
+ "publisherWorkflowMode": "fixed",
177
+ "publisherWorkflowPath": ".github/workflows/artifact-signing-authority.yml",
178
+ "environment": "",
179
+ "environmentMode": "fixed",
180
+ "runnerPolicy": "unqualified",
181
+ "notes": ""
182
+ },
170
183
  {
171
184
  "workflowPath": ".github/workflows/binary-distribution.yml",
172
185
  "authorityClass": "evidence-publication",
@@ -677,6 +690,18 @@
677
690
  ],
678
691
  "classified": true
679
692
  },
693
+ {
694
+ "path": ".github/workflows/artifact-signing-authority.yml",
695
+ "signals": [
696
+ "environment"
697
+ ],
698
+ "classified": true
699
+ },
700
+ {
701
+ "path": ".github/workflows/auditable-demo-media-profile-qualification.yml",
702
+ "signals": [],
703
+ "classified": false
704
+ },
680
705
  {
681
706
  "path": ".github/workflows/binary-distribution.yml",
682
707
  "signals": [
@@ -933,5 +958,5 @@
933
958
  "classified": false
934
959
  }
935
960
  ],
936
- "registryDigest": "26c309e610d1d8885cfd7d78fb7a574be903bf9085d5db929f9b41005c4f682b"
961
+ "registryDigest": "0f4705fb7b2afcb72e9136dac44eac7fc47d9440330aa3c72a8ae8bd8f3339c3"
937
962
  }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "contract": "kungfu-buildchain-publication-release-registry",
4
- "generatedAt": "2026-07-27T12:02:17.639Z",
5
- "publishedAt": "2026-07-27T12:02:17.639Z",
4
+ "generatedAt": "2026-07-28T14:38:17.137Z",
5
+ "publishedAt": "2026-07-28T14:38:17.137Z",
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": "c0ccc4b25d65ad0e007e36d8545dfdf06853bb89",
22
+ "sourceRevision": "b609f2cf8e7ab3e98685c434add4913d5220f509",
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": "3.0.2-alpha.7",
35
+ "version": "3.0.2-alpha.9",
36
36
  "versionSource": "package.json#version"
37
37
  },
38
38
  "sourceKind": "package-site-bundle",
@@ -15,6 +15,9 @@
15
15
  "./artifact-passport": "./packages/core/artifact-passport.js",
16
16
  "./artifact-verification-envelope": "./packages/core/artifact-verification-envelope.js",
17
17
  "./github-artifact-attestation": "./packages/core/github-artifact-attestation.js",
18
+ "./artifact-signing": "./packages/core/artifact-signing.js",
19
+ "./artifact-signing-result": "./packages/core/artifact-signing-result.js",
20
+ "./detached-artifact-signature": "./packages/core/detached-artifact-signature.js",
18
21
  "./anchored-version-material": "./packages/core/anchored-version-material.js",
19
22
  "./buildchain-contract": "./packages/core/buildchain-contract.js",
20
23
  "./candidate-timeline": "./packages/core/candidate-timeline.js",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "contract": "kungfu-buildchain-site-manifest",
4
- "generatedAt": "2026-07-27T12:02:17.639Z",
5
- "publishedAt": "2026-07-27T12:02:17.639Z",
4
+ "generatedAt": "2026-07-28T14:38:17.137Z",
5
+ "publishedAt": "2026-07-28T14:38:17.137Z",
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": "c0ccc4b25d65ad0e007e36d8545dfdf06853bb89",
22
+ "sourceRevision": "b609f2cf8e7ab3e98685c434add4913d5220f509",
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": "3.0.2-alpha.7",
40
+ "version": "3.0.2-alpha.9",
41
41
  "versionSource": "package.json#version"
42
42
  },
43
43
  "entrypoint": "buildchain-site.json",
@@ -53,7 +53,7 @@
53
53
  "path": "docs/MAP.md",
54
54
  "plane": "use",
55
55
  "exists": true,
56
- "digest": "sha256:23158252e5d2bd09b9b54dc08a0a452562e4b3a6ec3861b991632a34199d9820"
56
+ "digest": "sha256:cc32692e8d04816e8de94f208e43c2d5c5c7a8425cec8b32edc73ab78591fbbf"
57
57
  },
58
58
  {
59
59
  "id": "auditable-demo",
@@ -61,7 +61,7 @@
61
61
  "path": "docs/auditable-demo.md",
62
62
  "plane": "verify",
63
63
  "exists": true,
64
- "digest": "sha256:cff9786d4de098c84ea7e494b523627d6431909f15c82940e2193dbda1ef10e9"
64
+ "digest": "sha256:0e8cf2162c2e1f83cfe3a6171e3055f494cab5f03fdcbec3854e1793678e6908"
65
65
  },
66
66
  {
67
67
  "id": "install",
@@ -85,7 +85,7 @@
85
85
  "path": "docs/github-artifact-attestation.md",
86
86
  "plane": "verify",
87
87
  "exists": true,
88
- "digest": "sha256:afdb8172bc41b9a20c0d18f4ddcc55ee287ac56db05e67e55d12de1843b724e1"
88
+ "digest": "sha256:51f28b0b01fae4e3f80a7433f6c491d0c795bd091bff64ca1264c5cc0819c545"
89
89
  },
90
90
  {
91
91
  "id": "controller-evidence",
@@ -253,7 +253,7 @@
253
253
  "path": "docs/reusable-build-surface.md",
254
254
  "plane": "use",
255
255
  "exists": true,
256
- "digest": "sha256:5d46d0f5e6e03541c187ffea154dcce703ef78e59d16bd0e4fa7c175da940480"
256
+ "digest": "sha256:ea36ec722f811f5156735aa7471ed080cdc7e87d71c20c300243b226e233e675"
257
257
  },
258
258
  {
259
259
  "id": "publish-transaction",
@@ -269,7 +269,7 @@
269
269
  "path": "docs/release-governance.md",
270
270
  "plane": "why",
271
271
  "exists": true,
272
- "digest": "sha256:a77c2bb1d2245e1ee2318f650ad64ada6c8cdd3292a62a028e3ccc7517fb4e12"
272
+ "digest": "sha256:42a45f51db7ea11658431718835e1a430959db2a5cc80fc4651681502fe6fb7c"
273
273
  },
274
274
  {
275
275
  "id": "release-flow",
@@ -285,7 +285,7 @@
285
285
  "path": "docs/runtime-train-validation.md",
286
286
  "plane": "verify",
287
287
  "exists": true,
288
- "digest": "sha256:1315fe264d0e22215183122fc05e287be974751a78268642076898b689e435e6"
288
+ "digest": "sha256:c9ebf451294f92a2be3aa2ac4b2ec7afb3cc17bbeae2ece7879b800c0f274a40"
289
289
  },
290
290
  {
291
291
  "id": "versioning",
@@ -293,7 +293,7 @@
293
293
  "path": "docs/versioning.md",
294
294
  "plane": "why",
295
295
  "exists": true,
296
- "digest": "sha256:f3665f2f173bdcb287cf8aa509035164e818b20088849f4a2bce098951c84ea3"
296
+ "digest": "sha256:4b40cb8675c111b7588297102a61cb241630f2b707a67a0384a6df7527b2c64c"
297
297
  },
298
298
  {
299
299
  "id": "web-surface-deployments",
@@ -11,6 +11,7 @@
11
11
  "adapter-path",
12
12
  "artifact-retention-days",
13
13
  "buildchain-repository",
14
+ "media-profile",
14
15
  "render-media",
15
16
  "renderer-image",
16
17
  "require-trusted-event",
@@ -18,7 +19,7 @@
18
19
  "source-artifact-name",
19
20
  "source-ref"
20
21
  ],
21
- "inputCount": 9,
22
+ "inputCount": 10,
22
23
  "secrets": [],
23
24
  "secretCount": 0,
24
25
  "outputs": [
@@ -31,10 +32,12 @@
31
32
  "media-artifact-id",
32
33
  "media-artifact-name",
33
34
  "media-artifact-url",
35
+ "media-profile",
36
+ "media-qualification-root",
34
37
  "media-root",
35
38
  "source-sha"
36
39
  ],
37
- "outputCount": 11,
40
+ "outputCount": 13,
38
41
  "surface": "auditable-demo",
39
42
  "capabilityGroup": "api-cli-reference",
40
43
  "status": "preview"
@@ -156,9 +159,10 @@
156
159
  "BUILDCHAIN_MACOS_CERTIFICATE_PASSWORD",
157
160
  "BUILDCHAIN_MACOS_NOTARY_API_ISSUER",
158
161
  "BUILDCHAIN_MACOS_NOTARY_API_KEY_ID",
159
- "BUILDCHAIN_MACOS_NOTARY_API_KEY_P8_BASE64"
162
+ "BUILDCHAIN_MACOS_NOTARY_API_KEY_P8_BASE64",
163
+ "BUILDCHAIN_PROMOTION_TOKEN"
160
164
  ],
161
- "secretCount": 8,
165
+ "secretCount": 9,
162
166
  "outputs": [
163
167
  "artifact-coordinates-json",
164
168
  "build-diagnostics-summary-artifact",
@@ -858,6 +862,34 @@
858
862
  "capabilityGroup": "api-cli-reference",
859
863
  "status": "active"
860
864
  },
865
+ {
866
+ "id": "artifact-signing-authority",
867
+ "path": ".github/workflows/artifact-signing-authority.yml",
868
+ "reusable": false,
869
+ "inputs": [],
870
+ "inputCount": 0,
871
+ "secrets": [],
872
+ "secretCount": 0,
873
+ "outputs": [],
874
+ "outputCount": 0,
875
+ "surface": "repository-workflow",
876
+ "capabilityGroup": "api-cli-reference",
877
+ "status": "active"
878
+ },
879
+ {
880
+ "id": "auditable-demo-media-profile-qualification",
881
+ "path": ".github/workflows/auditable-demo-media-profile-qualification.yml",
882
+ "reusable": false,
883
+ "inputs": [],
884
+ "inputCount": 0,
885
+ "secrets": [],
886
+ "secretCount": 0,
887
+ "outputs": [],
888
+ "outputCount": 0,
889
+ "surface": "repository-workflow",
890
+ "capabilityGroup": "api-cli-reference",
891
+ "status": "active"
892
+ },
861
893
  {
862
894
  "id": "binary-distribution",
863
895
  "path": ".github/workflows/binary-distribution.yml",
@@ -990,9 +1022,10 @@
990
1022
  "BUILDCHAIN_MACOS_CERTIFICATE_PASSWORD",
991
1023
  "BUILDCHAIN_MACOS_NOTARY_API_ISSUER",
992
1024
  "BUILDCHAIN_MACOS_NOTARY_API_KEY_ID",
993
- "BUILDCHAIN_MACOS_NOTARY_API_KEY_P8_BASE64"
1025
+ "BUILDCHAIN_MACOS_NOTARY_API_KEY_P8_BASE64",
1026
+ "BUILDCHAIN_PROMOTION_TOKEN"
994
1027
  ],
995
- "secretCount": 8,
1028
+ "secretCount": 9,
996
1029
  "outputs": [
997
1030
  "artifact-coordinates-json",
998
1031
  "build-diagnostics-summary-artifact",
@@ -1238,11 +1271,12 @@
1238
1271
  "dev-workflow-path",
1239
1272
  "dry-run",
1240
1273
  "max-age-seconds",
1274
+ "pull-request-body-prefix",
1241
1275
  "settlement-authorized",
1242
1276
  "source-branch",
1243
1277
  "target-branch"
1244
1278
  ],
1245
- "inputCount": 10,
1279
+ "inputCount": 11,
1246
1280
  "secrets": [
1247
1281
  "promotion-token"
1248
1282
  ],
package/docs/MAP.md CHANGED
@@ -43,6 +43,7 @@ workflow, action, and Node API export also carries a `capabilityGroup`,
43
43
  | KFD-1 / KFD-2 / KFD-3 release-passport gates | `dist/site/kfd-claims.json`, `dist/site/buildchain-contract.json`, `dist/site/artifact-schemas.json` | [`release-passport.md`](release-passport.md) |
44
44
  | Product invariant Passport release gate | `buildchain.release.json#invariantPassports`, `dist/site/buildchain-contract.json` | [`release-passport.md`](release-passport.md) |
45
45
  | GitHub keyless Linux artifact attestation | `buildchain.release.json#githubArtifactAttestations`, `dist/site/workflow-registry.json`, `dist/site/artifact-schemas.json` | [`github-artifact-attestation.md`](github-artifact-attestation.md) |
46
+ | Declarative cross-platform artifact signing | `kungfu-buildchain-artifact-signing-request/v1`, `kungfu-buildchain-artifact-signing-result/v1` | [`reusable-build-surface.md`](reusable-build-surface.md#artifact-signing-authority) |
46
47
  | KFD-3 public surface reverse audit | `dist/site/public-surface-audit.json`, `dist/site/cli-registry.json`, `dist/site/workflow-registry.json`, `dist/site/page-registry.json` | [`cli.md`](cli.md), [`site-bundle-contract.md`](site-bundle-contract.md) |
47
48
  | KFD-1 / KFD-2 / KFD-3 first-class CLI and Node API | `.buildchain/kfd/kfd-3/surfaces.json`, `dist/site/kfd-claims.json`, `buildchain.release.json`, KFD schemas from `@kungfu-tech/kfd` | [`kfd-support.md`](kfd-support.md), [`cli.md`](cli.md#commands) |
48
49
  | Declarative KFD Agent Hub adapter conformance and Passport evidence | `.buildchain/kfd/agent-hub.json`, `.buildchain/artifacts/kfd-agent-hub/evidence.json`, `buildchain.release.json#kfdAgentHub` | [`kfd-agent-hub.md`](kfd-agent-hub.md) |
@@ -87,6 +88,7 @@ replace them.
87
88
  | How do I collect and verify module/product build facts from Git source, version files, and outputs? | [`build-facts.md`](build-facts.md) + [`cli.md`](cli.md) | use/verify | stable |
88
89
  | How do I publish or verify release passport artifacts? | [`release-passport.md`](release-passport.md) | use | stable |
89
90
  | How do I keylessly attest Linux release artifacts with GitHub and bind them to a Release Passport? | [`github-artifact-attestation.md`](github-artifact-attestation.md) | verify/use | preview |
91
+ | How do I request detached, Developer ID, or Authenticode signing without consumer credentials? | [`reusable-build-surface.md`](reusable-build-surface.md#artifact-signing-authority) | verify/use | preview |
90
92
  | How do I seal exact artifact, identity, lifecycle, and KFD assessment roots for KFX admission? | [`artifact-verification-envelope.md`](artifact-verification-envelope.md) | verify/use | preview |
91
93
  | How is product publication authority sealed to an exact workflow, runner, control plane, nonce, and artifact? | [`publication-authority.md`](publication-authority.md) | verify | preview |
92
94
  | How are GitHub ownership, independent review, effective protection, and plan capability audited fail-closed? | [`github-governance-authority.md`](github-governance-authority.md) | verify | preview |
@@ -8,7 +8,7 @@ confidence: high
8
8
  sensitivity: public
9
9
  evidence_grade: A
10
10
  review_state: self-reviewed
11
- last_reviewed: 2026-07-25
11
+ last_reviewed: 2026-07-28
12
12
  ai_provenance:
13
13
  model_family: GPT-5
14
14
  product: Codex
@@ -100,8 +100,53 @@ the exact source SHA and renderer digest, and only then renders the complete
100
100
  qualified scene.
101
101
 
102
102
  The media bundle contains MP4, WebM, GIF, poster, probe, renderer manifest,
103
- renderer checksums, passed Gate receipt, media receipt, and distribution
104
- checksums. `render-media: false` does not weaken or skip the Gate.
103
+ renderer checksums, passed Gate receipt, a versioned media receipt, and
104
+ distribution checksums. A web-delivery profile also retains
105
+ `media-inspection.json`, whose content root is bound into the receipt.
106
+ `render-media: false` does not weaken or skip the Gate.
107
+
108
+ ## Media Qualification Profiles
109
+
110
+ The single machine-readable source is
111
+ `contracts/auditable-demo-media-profiles-v1.json`. Callers select one reviewed
112
+ profile through `media-profile`; they cannot pass ffmpeg commands, codec flags,
113
+ shell fragments, arbitrary profile paths, or transcoding instructions.
114
+
115
+ | Profile | Meaning |
116
+ | --- | --- |
117
+ | `archive-v1` | Default compatibility contract. Retains the exact renderer outputs and classifies GIF as README compatibility evidence without making a browser-delivery claim. |
118
+ | `web-delivery-v1` | Independently qualifies H.264 MP4 and VP9 WebM playback sources, forbids audio, requires exact scene dimensions and bounded duration/frame-rate drift, checks per-rendition byte ceilings, and proves MP4 `moov` precedes `mdat`. PNG remains the lossless evidence poster. |
119
+ | `site-hero-v1` | Extends `web-delivery-v1` and additionally requires a qualified WebP browser poster. The current Build Images v1 renderer does not emit that member, so selecting this profile fails closed until the producer adds it. |
120
+
121
+ For web-delivery profiles, Buildchain runs its own fixed `ffprobe` invocation
122
+ inside the same immutable, network-disabled renderer image. That command is
123
+ Buildchain-controlled; the producer cannot inject flags. The resulting witness
124
+ records exact roots and byte counts plus container, codec, pixel format,
125
+ dimensions, duration, frame rate, audio stream count, and progressive-download
126
+ evidence. Finalization re-hashes the retained bytes, rechecks the witness root,
127
+ and parses MP4 top-level boxes itself. The producer's `media-probe.json.passed`
128
+ field remains supporting evidence, never sufficient authority.
129
+
130
+ The default `archive-v1` path preserves the existing v1 media receipt exactly.
131
+ An explicitly selected web-delivery profile emits a v2 media receipt with a
132
+ content-addressed rendition list and explicit roles and MIME types. Agents and
133
+ site builds select `primary-video`,
134
+ `alternate-video`, `browser-poster`, or evidence-only roles from that receipt;
135
+ they do not infer semantics from extensions or filenames. Additional responsive
136
+ renditions are accepted only when the immutable renderer manifest declares the
137
+ bounded `build-images.auditable-demo-web-delivery/v1` role and MIME metadata and
138
+ the selected Buildchain profile supplies the byte ceiling; producer metadata
139
+ cannot raise that ceiling. Unbound outputs,
140
+ duplicate singleton roles, unknown profiles, or unsupported required versions
141
+ fail closed.
142
+
143
+ Initial byte ceilings are derived from the checked-in
144
+ `auditable-demo-web-delivery-v1` fixture rendered by Build Images
145
+ `v1.3.0-alpha.16` at its exact source SHA and image digest. GIF, MP4, WebM, and
146
+ PNG ceilings are the next power of two above sixteen times the measured member
147
+ bytes. The not-yet-produced WebP poster uses eight times the measured lossless
148
+ PNG as its conservative proxy. The path-scoped qualification workflow
149
+ regenerates the content-addressed evidence and fails on any byte or fact drift.
105
150
 
106
151
  ## Consumer Example
107
152
 
@@ -140,12 +185,19 @@ jobs:
140
185
  adapter-path: scripts/auditable-demo-adapter
141
186
  renderer-image: ghcr.io/kungfu-systems/build-images/demo-renderer@sha256:RENDERER_DIGEST
142
187
  render-media: false
188
+ media-profile: archive-v1
143
189
  ```
144
190
 
145
191
  Replace both placeholders with reviewed immutable SHAs or digests. An eligible
146
192
  build should always call the reusable workflow. Selection policy changes only
147
193
  `render-media`; it must never condition away the Gate job.
148
194
 
195
+ Use `web-delivery-v1` only when the rendered bundle is intended to become a
196
+ qualified web-delivery source. Use `site-hero-v1` when an optimized browser
197
+ poster is also required. Profile qualification does not prove browser playback,
198
+ responsive layout, reduced-motion behavior, accessibility, or production
199
+ deployment; those remain site responsibilities.
200
+
149
201
  ## Failure Evidence
150
202
 
151
203
  Gate and render jobs use bounded timeouts and non-cancelling concurrency.
@@ -76,6 +76,15 @@ exact same-SHA evidence, it may set `settlement-authorized: true` and
76
76
  `dry-run: false`. The older `create-pull-request` input remains a compatibility
77
77
  alias for settlement authorization.
78
78
 
79
+ Repositories whose promotion policy requires a machine-readable PR declaration
80
+ can pass it through `pull-request-body-prefix`. Buildchain prepends that trusted,
81
+ repository-owned text only when it creates the candidate PR and preserves it
82
+ when later controller observations update the managed state marker. Keep the
83
+ declaration source-controlled in the caller workflow and update it whenever the
84
+ qualified development delta changes its release or architecture settlement.
85
+ Buildchain rejects a prefix that attempts to inject its managed controller
86
+ marker.
87
+
79
88
  The separately permissioned `settle` job re-runs the exact observation before
80
89
  any write. With no active managed candidate, it creates one branch named from
81
90
  the target branch and the first 12 characters of the full source SHA. An
@@ -198,7 +198,7 @@ created the build and release evidence.
198
198
 
199
199
  ```bash
200
200
  buildchain verify github-artifact-attestation \
201
- --artifact libnode-linux-x64.tar.gz \
201
+ libnode-linux-x64.tar.gz \
202
202
  --platform-manifest manifest.json \
203
203
  --release-passport buildchain.release.json \
204
204
  --bundle attestation.sigstore.json \
@@ -1,3 +1,21 @@
1
+ ---
2
+ status: draft
3
+ period: ongoing
4
+ theme: buildchain-release-governance
5
+ doc_type: technical-reference
6
+ source_level: local-files
7
+ confidence: high
8
+ sensitivity: public
9
+ evidence_grade: A
10
+ review_state: unreviewed
11
+ last_reviewed: 2026-07-27
12
+ ai_provenance:
13
+ model_family: GPT-5
14
+ product: Codex
15
+ generated_at: 2026-07-27
16
+ invisible_context: not asserted
17
+ ---
18
+
1
19
  # Release Governance
2
20
 
3
21
  Buildchain v2 preserves the release semantics of the older ABV workflow while
@@ -235,6 +253,20 @@ declared install, build, and verify fixture, proving that a single consumer
235
253
  surface routes to distinct released runtimes without duplicating lifecycle
236
254
  configuration in the consumer.
237
255
 
256
+ Buildchain's generic artifact-signing contract seals source-, tree-, runtime-,
257
+ platform-, and digest-bound requests from ordinary credential-free build jobs.
258
+ Provider-specific authority jobs consume only those sealed payloads. Apple
259
+ Developer ID, Windows Authenticode, and detached cryptographic signatures share
260
+ the request/receipt model, while each profile retains its honest platform
261
+ semantics and fail-closed verification requirements.
262
+
263
+ The central `buildchain-artifact-signing` environment reuses the established
264
+ macOS Credential Island names (`BUILDCHAIN_MACOS_CERTIFICATE_*`,
265
+ `BUILDCHAIN_MACOS_NOTARY_API_*`, and
266
+ `BUILDCHAIN_MACOS_EXPECTED_TEAM_ID`). Those authority-only values are never
267
+ declared by or forwarded through a consumer repository. Windows and detached
268
+ providers follow the same central-environment boundary.
269
+
238
270
  The reusable build trust gate reads `job.workflow_ref`, which identifies the
239
271
  called workflow and its selected ref. It does not infer the runtime from
240
272
  `github.workflow_ref`, because GitHub defines that context as the caller