@kungfu-tech/buildchain 2.14.19-alpha.0 → 2.14.19-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.
- package/README.md +3 -0
- package/dist/site/buildchain-contract.json +60 -10
- package/dist/site/buildchain-site.json +69 -14
- package/dist/site/capability-registry.json +4 -3
- package/dist/site/kfd-claims.json +56 -8
- package/dist/site/kfd-upstream-aggregate.json +1 -1
- package/dist/site/manual-registry.json +16 -2
- package/dist/site/node-api-registry.json +3 -3
- package/dist/site/page-registry.json +54 -7
- package/dist/site/public-surface-audit.json +45 -6
- package/dist/site/publication-authority-registry.json +19 -1
- package/dist/site/publication-registry.json +4 -4
- package/dist/site/site-manifest.json +14 -6
- package/dist/site/workflow-registry.json +40 -2
- package/docs/MAP.md +1 -0
- package/docs/auditable-demo.md +155 -0
- package/docs/versioning.md +1 -0
- package/package.json +1 -1
- package/packages/core/buildchain-contract.js +45 -0
- package/packages/core/buildchain-kfd-claims.js +1 -0
- package/packages/core/buildchain-publication-authority.js +1 -0
- package/scripts/auditable-demo.mjs +576 -0
- package/scripts/check-inventory.mjs +4 -0
- package/scripts/generate-site-bundle.mjs +3 -0
- package/scripts/resolve-artifact-coordinates.mjs +174 -0
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
"status": "passed",
|
|
5
5
|
"summary": {
|
|
6
6
|
"cliCommandCount": 87,
|
|
7
|
-
"workflowCount":
|
|
7
|
+
"workflowCount": 53,
|
|
8
8
|
"actionCount": 5,
|
|
9
|
-
"sitePageCount":
|
|
9
|
+
"sitePageCount": 56,
|
|
10
10
|
"docCommandRefCount": 276,
|
|
11
11
|
"failureCount": 0
|
|
12
12
|
},
|
|
@@ -449,6 +449,39 @@
|
|
|
449
449
|
}
|
|
450
450
|
],
|
|
451
451
|
"workflowInputs": [
|
|
452
|
+
{
|
|
453
|
+
"id": ".auditable-demo",
|
|
454
|
+
"path": ".github/workflows/.auditable-demo.yml",
|
|
455
|
+
"reusable": true,
|
|
456
|
+
"inputs": [
|
|
457
|
+
"adapter-path",
|
|
458
|
+
"artifact-retention-days",
|
|
459
|
+
"buildchain-repository",
|
|
460
|
+
"render-media",
|
|
461
|
+
"renderer-image",
|
|
462
|
+
"require-trusted-event",
|
|
463
|
+
"source-artifact-digest",
|
|
464
|
+
"source-artifact-name",
|
|
465
|
+
"source-ref"
|
|
466
|
+
],
|
|
467
|
+
"inputCount": 9,
|
|
468
|
+
"secrets": [],
|
|
469
|
+
"secretCount": 0,
|
|
470
|
+
"outputs": [
|
|
471
|
+
"gate-artifact-digest",
|
|
472
|
+
"gate-artifact-id",
|
|
473
|
+
"gate-artifact-name",
|
|
474
|
+
"gate-artifact-url",
|
|
475
|
+
"gate-root",
|
|
476
|
+
"media-artifact-digest",
|
|
477
|
+
"media-artifact-id",
|
|
478
|
+
"media-artifact-name",
|
|
479
|
+
"media-artifact-url",
|
|
480
|
+
"media-root",
|
|
481
|
+
"source-sha"
|
|
482
|
+
],
|
|
483
|
+
"outputCount": 11
|
|
484
|
+
},
|
|
452
485
|
{
|
|
453
486
|
"id": ".binary-release-assets",
|
|
454
487
|
"path": ".github/workflows/.binary-release-assets.yml",
|
|
@@ -560,6 +593,7 @@
|
|
|
560
593
|
],
|
|
561
594
|
"secretCount": 8,
|
|
562
595
|
"outputs": [
|
|
596
|
+
"artifact-coordinates-json",
|
|
563
597
|
"build-diagnostics-summary-artifact",
|
|
564
598
|
"build-diagnostics-summary-json",
|
|
565
599
|
"build-summary-artifact",
|
|
@@ -602,7 +636,7 @@
|
|
|
602
636
|
"runner-preset",
|
|
603
637
|
"trusted-event"
|
|
604
638
|
],
|
|
605
|
-
"outputCount":
|
|
639
|
+
"outputCount": 42
|
|
606
640
|
},
|
|
607
641
|
{
|
|
608
642
|
"id": ".bump-minor-version",
|
|
@@ -1309,6 +1343,7 @@
|
|
|
1309
1343
|
],
|
|
1310
1344
|
"secretCount": 8,
|
|
1311
1345
|
"outputs": [
|
|
1346
|
+
"artifact-coordinates-json",
|
|
1312
1347
|
"build-diagnostics-summary-artifact",
|
|
1313
1348
|
"build-diagnostics-summary-json",
|
|
1314
1349
|
"build-summary-artifact",
|
|
@@ -1354,7 +1389,7 @@
|
|
|
1354
1389
|
"runner-preset",
|
|
1355
1390
|
"trusted-event"
|
|
1356
1391
|
],
|
|
1357
|
-
"outputCount":
|
|
1392
|
+
"outputCount": 45
|
|
1358
1393
|
},
|
|
1359
1394
|
{
|
|
1360
1395
|
"id": "buildchain-alpha-self-dogfood",
|
|
@@ -2392,6 +2427,10 @@
|
|
|
2392
2427
|
"id": "manual:artifact-verification-envelope",
|
|
2393
2428
|
"category": "manual"
|
|
2394
2429
|
},
|
|
2430
|
+
{
|
|
2431
|
+
"id": "manual:auditable-demo",
|
|
2432
|
+
"category": "manual"
|
|
2433
|
+
},
|
|
2395
2434
|
{
|
|
2396
2435
|
"id": "manual:binary-distribution",
|
|
2397
2436
|
"category": "manual"
|
|
@@ -3925,8 +3964,8 @@
|
|
|
3925
3964
|
"workflowRegistryPath": "dist/site/workflow-registry.json",
|
|
3926
3965
|
"pageRegistryPath": "dist/site/page-registry.json",
|
|
3927
3966
|
"cliRegistryDigest": "5ba7fd93a13993b05767b6f02d0626a7347f25c3d7cd4589ed4f70028c1f1bd1",
|
|
3928
|
-
"workflowRegistryDigest": "
|
|
3929
|
-
"pageRegistryDigest": "
|
|
3967
|
+
"workflowRegistryDigest": "4a627dcf07131d07095d5e6bf0a3373e55c62cf325b3f81bb156c43d31367d62",
|
|
3968
|
+
"pageRegistryDigest": "76226870160a4e17ebde9e166bb9d3ffe4ce4aa6f6276e992778ffee52ab9a55"
|
|
3930
3969
|
},
|
|
3931
3970
|
"comparison": {
|
|
3932
3971
|
"missingCliRegistry": [],
|
|
@@ -3,6 +3,19 @@
|
|
|
3
3
|
"contract": "kungfu-buildchain-publication-authority-registry",
|
|
4
4
|
"defaultDecision": "deny",
|
|
5
5
|
"entries": [
|
|
6
|
+
{
|
|
7
|
+
"workflowPath": ".github/workflows/.auditable-demo.yml",
|
|
8
|
+
"authorityClass": "non-publication-oidc",
|
|
9
|
+
"publicationCapable": false,
|
|
10
|
+
"capabilityIds": [],
|
|
11
|
+
"credentialMode": "none",
|
|
12
|
+
"publisherWorkflowMode": "fixed",
|
|
13
|
+
"publisherWorkflowPath": ".github/workflows/.auditable-demo.yml",
|
|
14
|
+
"environment": "",
|
|
15
|
+
"environmentMode": "fixed",
|
|
16
|
+
"runnerPolicy": "unqualified",
|
|
17
|
+
"notes": ""
|
|
18
|
+
},
|
|
6
19
|
{
|
|
7
20
|
"workflowPath": ".github/workflows/.binary-release-assets.yml",
|
|
8
21
|
"authorityClass": "product-publication",
|
|
@@ -519,6 +532,11 @@
|
|
|
519
532
|
}
|
|
520
533
|
],
|
|
521
534
|
"workflowFacts": [
|
|
535
|
+
{
|
|
536
|
+
"path": ".github/workflows/.auditable-demo.yml",
|
|
537
|
+
"signals": [],
|
|
538
|
+
"classified": true
|
|
539
|
+
},
|
|
522
540
|
{
|
|
523
541
|
"path": ".github/workflows/.binary-release-assets.yml",
|
|
524
542
|
"signals": [
|
|
@@ -870,5 +888,5 @@
|
|
|
870
888
|
"classified": false
|
|
871
889
|
}
|
|
872
890
|
],
|
|
873
|
-
"registryDigest": "
|
|
891
|
+
"registryDigest": "cb18522c1957f0cb2e03c525847602a6163d3b276c106a8bce5b8028d8b9a011"
|
|
874
892
|
}
|
|
@@ -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-25T15:55:27.133Z",
|
|
5
|
+
"publishedAt": "2026-07-25T15:55:27.133Z",
|
|
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": "1af0d85e3b72750f2e38107573d4e16c1dc6fcb5",
|
|
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.14.19-alpha.
|
|
35
|
+
"version": "2.14.19-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-
|
|
5
|
-
"publishedAt": "2026-07-
|
|
4
|
+
"generatedAt": "2026-07-25T15:55:27.133Z",
|
|
5
|
+
"publishedAt": "2026-07-25T15:55:27.133Z",
|
|
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": "1af0d85e3b72750f2e38107573d4e16c1dc6fcb5",
|
|
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.19-alpha.
|
|
40
|
+
"version": "2.14.19-alpha.2",
|
|
41
41
|
"versionSource": "package.json#version"
|
|
42
42
|
},
|
|
43
43
|
"entrypoint": "buildchain-site.json",
|
|
@@ -53,7 +53,15 @@
|
|
|
53
53
|
"path": "docs/MAP.md",
|
|
54
54
|
"plane": "use",
|
|
55
55
|
"exists": true,
|
|
56
|
-
"digest": "sha256:
|
|
56
|
+
"digest": "sha256:11ccb0a90cc0583a1a67da36609a8b07207f259815ac9ac0926c2ec8d7a8764a"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "auditable-demo",
|
|
60
|
+
"title": "Auditable demo artifact pipeline",
|
|
61
|
+
"path": "docs/auditable-demo.md",
|
|
62
|
+
"plane": "verify",
|
|
63
|
+
"exists": true,
|
|
64
|
+
"digest": "sha256:cff9786d4de098c84ea7e494b523627d6431909f15c82940e2193dbda1ef10e9"
|
|
57
65
|
},
|
|
58
66
|
{
|
|
59
67
|
"id": "install",
|
|
@@ -277,7 +285,7 @@
|
|
|
277
285
|
"path": "docs/versioning.md",
|
|
278
286
|
"plane": "why",
|
|
279
287
|
"exists": true,
|
|
280
|
-
"digest": "sha256:
|
|
288
|
+
"digest": "sha256:0e79392cebea5a19c2bca5d6b3b36738a41ed61d2f61c1f09f09a5c8a28e9540"
|
|
281
289
|
},
|
|
282
290
|
{
|
|
283
291
|
"id": "web-surface-deployments",
|
|
@@ -3,6 +3,42 @@
|
|
|
3
3
|
"contract": "kungfu-buildchain-workflow-registry",
|
|
4
4
|
"workflowSource": ".github/workflows reverse input enumeration",
|
|
5
5
|
"workflows": [
|
|
6
|
+
{
|
|
7
|
+
"id": ".auditable-demo",
|
|
8
|
+
"path": ".github/workflows/.auditable-demo.yml",
|
|
9
|
+
"reusable": true,
|
|
10
|
+
"inputs": [
|
|
11
|
+
"adapter-path",
|
|
12
|
+
"artifact-retention-days",
|
|
13
|
+
"buildchain-repository",
|
|
14
|
+
"render-media",
|
|
15
|
+
"renderer-image",
|
|
16
|
+
"require-trusted-event",
|
|
17
|
+
"source-artifact-digest",
|
|
18
|
+
"source-artifact-name",
|
|
19
|
+
"source-ref"
|
|
20
|
+
],
|
|
21
|
+
"inputCount": 9,
|
|
22
|
+
"secrets": [],
|
|
23
|
+
"secretCount": 0,
|
|
24
|
+
"outputs": [
|
|
25
|
+
"gate-artifact-digest",
|
|
26
|
+
"gate-artifact-id",
|
|
27
|
+
"gate-artifact-name",
|
|
28
|
+
"gate-artifact-url",
|
|
29
|
+
"gate-root",
|
|
30
|
+
"media-artifact-digest",
|
|
31
|
+
"media-artifact-id",
|
|
32
|
+
"media-artifact-name",
|
|
33
|
+
"media-artifact-url",
|
|
34
|
+
"media-root",
|
|
35
|
+
"source-sha"
|
|
36
|
+
],
|
|
37
|
+
"outputCount": 11,
|
|
38
|
+
"surface": "auditable-demo",
|
|
39
|
+
"capabilityGroup": "api-cli-reference",
|
|
40
|
+
"status": "preview"
|
|
41
|
+
},
|
|
6
42
|
{
|
|
7
43
|
"id": ".binary-release-assets",
|
|
8
44
|
"path": ".github/workflows/.binary-release-assets.yml",
|
|
@@ -117,6 +153,7 @@
|
|
|
117
153
|
],
|
|
118
154
|
"secretCount": 8,
|
|
119
155
|
"outputs": [
|
|
156
|
+
"artifact-coordinates-json",
|
|
120
157
|
"build-diagnostics-summary-artifact",
|
|
121
158
|
"build-diagnostics-summary-json",
|
|
122
159
|
"build-summary-artifact",
|
|
@@ -159,7 +196,7 @@
|
|
|
159
196
|
"runner-preset",
|
|
160
197
|
"trusted-event"
|
|
161
198
|
],
|
|
162
|
-
"outputCount":
|
|
199
|
+
"outputCount": 42,
|
|
163
200
|
"surface": "reusable-build",
|
|
164
201
|
"capabilityGroup": "api-cli-reference",
|
|
165
202
|
"status": "active"
|
|
@@ -923,6 +960,7 @@
|
|
|
923
960
|
],
|
|
924
961
|
"secretCount": 8,
|
|
925
962
|
"outputs": [
|
|
963
|
+
"artifact-coordinates-json",
|
|
926
964
|
"build-diagnostics-summary-artifact",
|
|
927
965
|
"build-diagnostics-summary-json",
|
|
928
966
|
"build-summary-artifact",
|
|
@@ -968,7 +1006,7 @@
|
|
|
968
1006
|
"runner-preset",
|
|
969
1007
|
"trusted-event"
|
|
970
1008
|
],
|
|
971
|
-
"outputCount":
|
|
1009
|
+
"outputCount": 45,
|
|
972
1010
|
"surface": "channel-build-router",
|
|
973
1011
|
"capabilityGroup": "reusable-build",
|
|
974
1012
|
"status": "active"
|
package/docs/MAP.md
CHANGED
|
@@ -105,6 +105,7 @@ replace them.
|
|
|
105
105
|
| What package-owned facts should buildchain.libkungfu.dev render? | [`site-bundle-contract.md`](site-bundle-contract.md) | use | stable |
|
|
106
106
|
| How do I call the reusable build workflow? | [`reusable-build-surface.md`](reusable-build-surface.md) | use | stable |
|
|
107
107
|
| How does Buildchain schedule and aggregate a project-owned Shifu Gate profile? | [`shifu-gate-profiles.md`](shifu-gate-profiles.md) | use/verify | draft |
|
|
108
|
+
| How do exact build artifacts become qualified, transcript-traceable demo media? | [`auditable-demo.md`](auditable-demo.md) | use/verify | draft |
|
|
108
109
|
| How do I use one build job that follows alpha during development and stable for releases? | [`reusable-build-surface.md`](reusable-build-surface.md#automatic-channel-router) | use | preview |
|
|
109
110
|
| How do self-hosted runners relay large artifacts through S3 before GitHub artifacts? | [`reusable-build-surface.md`](reusable-build-surface.md#artifact-transfer-relay) | use | stable |
|
|
110
111
|
| How do self-hosted runners reuse local Git checkout caches without weakening source locks? | [`reusable-build-surface.md`](reusable-build-surface.md#locked-source-checkout-cache) | use | stable |
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: draft
|
|
3
|
+
period: 2026-07
|
|
4
|
+
theme: auditable-demo-pipeline
|
|
5
|
+
doc_type: technical-contract
|
|
6
|
+
source_level: local-files
|
|
7
|
+
confidence: high
|
|
8
|
+
sensitivity: public
|
|
9
|
+
evidence_grade: A
|
|
10
|
+
review_state: self-reviewed
|
|
11
|
+
last_reviewed: 2026-07-25
|
|
12
|
+
ai_provenance:
|
|
13
|
+
model_family: GPT-5
|
|
14
|
+
product: Codex
|
|
15
|
+
generated_at: 2026-07-25
|
|
16
|
+
invisible_context_boundary: No hidden model build, parameter count, or private corpus is asserted.
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# Auditable Demo Pipeline
|
|
20
|
+
|
|
21
|
+
Buildchain's auditable demo workflow turns an exact GitHub build artifact into
|
|
22
|
+
two distinct evidence products:
|
|
23
|
+
|
|
24
|
+
1. a required qualified Gate bundle; and
|
|
25
|
+
2. an optional rendered media bundle that can exist only after that exact Gate
|
|
26
|
+
bundle passes.
|
|
27
|
+
|
|
28
|
+
The public reusable workflow is
|
|
29
|
+
`.github/workflows/.auditable-demo.yml`. It is consumer-neutral: Buildchain
|
|
30
|
+
does not know how a Kungfu, library, service, or application artifact should be
|
|
31
|
+
interpreted. The consumer owns a small checked-in executable adapter.
|
|
32
|
+
|
|
33
|
+
## Authority Boundary
|
|
34
|
+
|
|
35
|
+
The retained build output is authoritative. The adapter reads that exact
|
|
36
|
+
artifact and projects three files:
|
|
37
|
+
|
|
38
|
+
```text
|
|
39
|
+
complete-transcript.txt
|
|
40
|
+
public-projection.json
|
|
41
|
+
scene.json
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
The adapter must not rebuild or rerun the product. It receives:
|
|
45
|
+
|
|
46
|
+
```text
|
|
47
|
+
--artifact-root PATH
|
|
48
|
+
--output PATH
|
|
49
|
+
--source-coordinate PATH
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
`--source-coordinate` identifies the caller repository, run, artifact id,
|
|
53
|
+
artifact name, upload digest, expiry, and exact source SHA. The workflow finds
|
|
54
|
+
exactly one live artifact with the requested name in the current caller run and
|
|
55
|
+
rejects a digest mismatch before invoking the adapter. Callers must pass the
|
|
56
|
+
digest emitted by their own `upload-artifact` step; a name resolved later from
|
|
57
|
+
the Actions API is discovery evidence, not a substitute for that producer
|
|
58
|
+
output.
|
|
59
|
+
|
|
60
|
+
Buildchain's reusable build workflow exposes `artifact-coordinates-json` after
|
|
61
|
+
all resolved platform uploads complete. That producer-owned output binds every
|
|
62
|
+
platform id to its same-run artifact id, name, upload digest, URL, and expiry,
|
|
63
|
+
so a consumer that delegates its build to Buildchain can pass an exact
|
|
64
|
+
coordinate without rediscovering authority in a downstream job. The build
|
|
65
|
+
aggregate fails closed if any declared platform lacks one live, digest-bearing
|
|
66
|
+
artifact coordinate. The compact coordinate set is sorted by platform id so
|
|
67
|
+
downstream machine consumers do not depend on matrix completion order.
|
|
68
|
+
|
|
69
|
+
The adapter runs with a disposable Home/XDG/npm prefix, a minimal environment,
|
|
70
|
+
and no GitHub, npm, or cloud credential injection. It must be a regular,
|
|
71
|
+
non-symlink, executable file inside the exact checked-out consumer source.
|
|
72
|
+
|
|
73
|
+
## Required Gate
|
|
74
|
+
|
|
75
|
+
The Gate:
|
|
76
|
+
|
|
77
|
+
- checks out the exact consumer source and exact called-workflow SHA;
|
|
78
|
+
- resolves and downloads one exact same-run GitHub Artifact;
|
|
79
|
+
- invokes the checked-in adapter by argv, never as an evaluated shell string;
|
|
80
|
+
- rejects undeclared adapter outputs, symlinks, invalid UTF-8, invalid scene or
|
|
81
|
+
projection schemas, out-of-range transcript references, and oversized input;
|
|
82
|
+
- derives a one-second compatibility scene from the consumer projection;
|
|
83
|
+
- anonymously pulls an immutable `image@sha256:digest` renderer;
|
|
84
|
+
- runs it as non-root with `--network none`, a read-only root filesystem, and a
|
|
85
|
+
bounded tmpfs;
|
|
86
|
+
- verifies the renderer manifest, media probe, exact input roots, exact output
|
|
87
|
+
member set, and complete checksums;
|
|
88
|
+
- uploads a content-addressed qualified bundle plus an independent GitHub
|
|
89
|
+
Artifact id, URL, archive digest, and expiry-bearing source coordinate.
|
|
90
|
+
|
|
91
|
+
The Gate bundle contains the complete consumer transcript/projection/scene,
|
|
92
|
+
source artifact coordinate, adapter identity, bounded renderer evidence, a
|
|
93
|
+
passed gate receipt, and checksums covering every member exactly once.
|
|
94
|
+
|
|
95
|
+
## Selective Render
|
|
96
|
+
|
|
97
|
+
`render-media: true` enables the second job. It downloads the just-uploaded Gate
|
|
98
|
+
bundle by its content-addressed name, recomputes the Gate member root, verifies
|
|
99
|
+
the exact source SHA and renderer digest, and only then renders the complete
|
|
100
|
+
qualified scene.
|
|
101
|
+
|
|
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.
|
|
105
|
+
|
|
106
|
+
## Consumer Example
|
|
107
|
+
|
|
108
|
+
The build job must expose both the exact artifact name and the digest returned
|
|
109
|
+
by `upload-artifact`:
|
|
110
|
+
|
|
111
|
+
```yaml
|
|
112
|
+
jobs:
|
|
113
|
+
build:
|
|
114
|
+
runs-on: ubuntu-24.04
|
|
115
|
+
outputs:
|
|
116
|
+
artifact-name: product-linux-${{ github.sha }}
|
|
117
|
+
artifact-digest: ${{ steps.upload.outputs.artifact-digest }}
|
|
118
|
+
steps:
|
|
119
|
+
- uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09
|
|
120
|
+
- run: ./scripts/build-product
|
|
121
|
+
- id: upload
|
|
122
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
|
|
123
|
+
with:
|
|
124
|
+
name: product-linux-${{ github.sha }}
|
|
125
|
+
path: dist
|
|
126
|
+
if-no-files-found: error
|
|
127
|
+
retention-days: 14
|
|
128
|
+
compression-level: 0
|
|
129
|
+
|
|
130
|
+
auditable-demo:
|
|
131
|
+
needs: build
|
|
132
|
+
permissions:
|
|
133
|
+
actions: read
|
|
134
|
+
contents: read
|
|
135
|
+
uses: kungfu-systems/buildchain/.github/workflows/.auditable-demo.yml@BUILDCHAIN_EXACT_SHA
|
|
136
|
+
with:
|
|
137
|
+
source-ref: ${{ github.sha }}
|
|
138
|
+
source-artifact-name: ${{ needs.build.outputs.artifact-name }}
|
|
139
|
+
source-artifact-digest: ${{ needs.build.outputs.artifact-digest }}
|
|
140
|
+
adapter-path: scripts/auditable-demo-adapter
|
|
141
|
+
renderer-image: ghcr.io/kungfu-systems/build-images/demo-renderer@sha256:RENDERER_DIGEST
|
|
142
|
+
render-media: false
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Replace both placeholders with reviewed immutable SHAs or digests. An eligible
|
|
146
|
+
build should always call the reusable workflow. Selection policy changes only
|
|
147
|
+
`render-media`; it must never condition away the Gate job.
|
|
148
|
+
|
|
149
|
+
## Failure Evidence
|
|
150
|
+
|
|
151
|
+
Gate and render jobs use bounded timeouts and non-cancelling concurrency.
|
|
152
|
+
Diagnostics artifacts are attempted with `always()` so adapter stdout/stderr
|
|
153
|
+
and the resolved source coordinate remain available when qualification fails.
|
|
154
|
+
No production deployment, publication authority, token, or provider mutation
|
|
155
|
+
is part of this workflow.
|
package/docs/versioning.md
CHANGED
|
@@ -61,6 +61,7 @@ repository changes are patch".
|
|
|
61
61
|
|
|
62
62
|
| Date | Action | Line | Faces | Class | Rationale | PR |
|
|
63
63
|
| --- | --- | --- | --- | --- | --- | --- |
|
|
64
|
+
| 2026-07-25 | extend-minor | `v2.14` | auditable-demo-workflow, auditable-demo-evidence | additive | Add a consumer-neutral reusable Gate that binds exact same-run GitHub Artifacts to checked-in adapters and immutable renderer evidence, with optional media rendering only from the exact passing Gate bundle. | [#1841](https://github.com/kungfu-systems/buildchain/pull/1841) |
|
|
64
65
|
| 2026-07-23 | extend-minor | `v2.14` | credential-island-macos-input, protected-signer-job, macos-signing-evidence, action-subpaths | additive | The reusable build surface can seal an exact source-bound macOS app and hand it to a protected caller environment, where an immutable Buildchain action signs, notarizes, staples, Gatekeeper-assesses, and returns an auditable additional release-candidate platform without exposing credentials to consumer lifecycle jobs. | |
|
|
65
66
|
| 2026-07-20 | extend-minor | `v2.14` | anchored-derived-version-material, build-controller-evidence, release-passport, package-subpaths, release-propagation-controller | additive | Anchored/manual consumers can declare derived version witnesses that Buildchain regenerates and verifies before heavy builds, binds to exact alpha/release trees and passports, and admits during protected promotion; propagation receipts now model their existing optional consumer stages. | |
|
|
66
67
|
| 2026-07-17 | extend-minor | `v2.14` | merge-queue-config, release-line-governance-inheritance | additive | Buildchain config can explicitly enable, inherit, or disable exact dev-channel merge queues, and release-line bootstrap reconciles the declared or inherited policy before moving the repository default branch. | |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kungfu-tech/buildchain",
|
|
3
|
-
"version": "2.14.19-alpha.
|
|
3
|
+
"version": "2.14.19-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",
|
|
@@ -301,6 +301,51 @@ export function createBuildchainContractWorld({
|
|
|
301
301
|
"channel-aware artifact host facts are checked against the deploy plan before adapter side effects",
|
|
302
302
|
],
|
|
303
303
|
}),
|
|
304
|
+
surface(root, {
|
|
305
|
+
id: "auditable-demo",
|
|
306
|
+
kind: "workflow",
|
|
307
|
+
path: ".github/workflows/.auditable-demo.yml",
|
|
308
|
+
publicRef: `${pkg.repository ? "kungfu-systems/buildchain" : "buildchain"}/.github/workflows/.auditable-demo.yml@${majorLine}`,
|
|
309
|
+
requiredInputs: [
|
|
310
|
+
"source-artifact-name",
|
|
311
|
+
"source-artifact-digest",
|
|
312
|
+
"adapter-path",
|
|
313
|
+
"renderer-image",
|
|
314
|
+
],
|
|
315
|
+
requiredOutputs: [
|
|
316
|
+
"source-sha",
|
|
317
|
+
"gate-artifact-name",
|
|
318
|
+
"gate-artifact-id",
|
|
319
|
+
"gate-artifact-digest",
|
|
320
|
+
"gate-artifact-url",
|
|
321
|
+
"gate-root",
|
|
322
|
+
"media-artifact-name",
|
|
323
|
+
"media-artifact-id",
|
|
324
|
+
"media-artifact-digest",
|
|
325
|
+
"media-artifact-url",
|
|
326
|
+
"media-root",
|
|
327
|
+
],
|
|
328
|
+
breakingDefaults: {
|
|
329
|
+
trustedEventRequired: true,
|
|
330
|
+
renderMediaDefault: false,
|
|
331
|
+
artifactRetentionDaysDefault: 14,
|
|
332
|
+
gatePolicy: "required-before-selective-render",
|
|
333
|
+
},
|
|
334
|
+
optionalInputs: [
|
|
335
|
+
"buildchain-repository",
|
|
336
|
+
"source-ref",
|
|
337
|
+
"render-media",
|
|
338
|
+
"artifact-retention-days",
|
|
339
|
+
"require-trusted-event",
|
|
340
|
+
],
|
|
341
|
+
guarantees: [
|
|
342
|
+
"the source GitHub Artifact is admitted by exact same-run name and archive digest",
|
|
343
|
+
"the checked-in consumer adapter runs from the exact consumer source with a disposable home and reduced environment",
|
|
344
|
+
"every invocation runs an immutable network-disabled renderer smoke before emitting a qualified Gate bundle",
|
|
345
|
+
"complete media rendering is optional and consumes only an exact passing Gate bundle",
|
|
346
|
+
"Gate and media bundles expose both GitHub Artifact archive coordinates and deterministic member roots",
|
|
347
|
+
],
|
|
348
|
+
}),
|
|
304
349
|
surface(root, {
|
|
305
350
|
id: "promote-buildchain-ref-action",
|
|
306
351
|
kind: "action",
|
|
@@ -13,6 +13,7 @@ export const BUILDCHAIN_KFD_COLLABORATION_INTERFACE_CONTRACT = "kungfu-buildchai
|
|
|
13
13
|
|
|
14
14
|
export const BUILDCHAIN_AGENT_MANUALS = Object.freeze([
|
|
15
15
|
{ id: "map", title: "Buildchain documentation map", path: "docs/MAP.md", plane: "use" },
|
|
16
|
+
{ id: "auditable-demo", title: "Auditable demo artifact pipeline", path: "docs/auditable-demo.md", plane: "verify" },
|
|
16
17
|
{ id: "install", title: "Install and verify Buildchain", path: "docs/install.md", plane: "use" },
|
|
17
18
|
{ id: "release-passport", title: "Release Passport protocol", path: "docs/release-passport.md", plane: "verify" },
|
|
18
19
|
{ id: "controller-evidence", title: "Controller evidence contract", path: "docs/controller-evidence.md", plane: "verify" },
|
|
@@ -4,6 +4,7 @@ import path from "node:path";
|
|
|
4
4
|
import { createPublicationAuthorityRegistry } from "./publication-authority.js";
|
|
5
5
|
|
|
6
6
|
const DESCRIPTORS = Object.freeze([
|
|
7
|
+
[".github/workflows/.auditable-demo.yml", "non-publication-oidc"],
|
|
7
8
|
[".github/workflows/.build.yml", "non-publication-oidc"],
|
|
8
9
|
[".github/workflows/.release-candidate-promote.yml", "product-publication", true, ["npm-publish", "github-release", "channel-ref"], "trusted-publishing", "none", "fixed", "caller-bound"],
|
|
9
10
|
[".github/workflows/.publication-authority.yml", "evidence-publication"],
|