@kungfu-tech/buildchain 3.0.2 → 3.0.3-alpha.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/actions/report-buildchain-issue/README.md +1 -1
- package/contracts/buildchain-v2-residuals-v1.json +191 -0
- package/dist/site/buildchain-contract.json +58 -35
- package/dist/site/buildchain-site.json +33 -33
- package/dist/site/controller-registry.json +24 -3
- package/dist/site/kfd-claims.json +11 -6
- package/dist/site/kfd-upstream-aggregate.json +1 -1
- package/dist/site/manual-registry.json +7 -7
- package/dist/site/node-api-registry.json +6 -6
- package/dist/site/page-registry.json +22 -22
- package/dist/site/public-surface-audit.json +10 -5
- package/dist/site/publication-registry.json +4 -4
- package/dist/site/site-manifest.json +11 -11
- package/dist/site/workflow-registry.json +8 -3
- package/docs/auditable-demo.md +19 -1
- package/docs/consumer-issue-reporting.md +1 -1
- package/docs/dev-alpha-candidate-patrol.md +24 -10
- package/docs/github-governance-authority.md +23 -30
- package/docs/observed-evidence-patrol.md +28 -12
- package/docs/release-governance.md +8 -1
- package/docs/reusable-build-surface.md +124 -64
- package/docs/shifu-gate-profiles.md +7 -1
- package/docs/versioning.md +41 -21
- package/docs/web-surface-deployments.md +20 -1
- package/package.json +1 -1
- package/packages/core/artifact-signing.js +1 -0
- package/packages/core/buildchain-contract.js +1 -0
- package/packages/core/controller-evidence.js +2 -0
- package/packages/core/github-governance-authority.js +25 -17
- package/packages/core/publication-control-plane-audit.js +28 -0
- package/packages/core/release-passport.js +36 -27
- package/packages/core/stable-release-gate.js +4 -1
- package/scripts/artifact-signing-delegation.mjs +268 -0
- package/scripts/audit-github-governance.mjs +32 -13
- package/scripts/audit-publication-control-plane.mjs +17 -8
- package/scripts/auditable-demo.mjs +147 -2
- package/scripts/buildchain-patrol.mjs +1 -1
- package/scripts/check-inventory.mjs +1 -0
- package/scripts/dev-alpha-candidate-patrol.mjs +20 -0
- package/scripts/dispatch-artifact-signing-authority.mjs +7 -1
- package/scripts/finalize-native-artifact-signing-result.mjs +114 -31
- package/scripts/gate-profile-core.mjs +6 -1
- package/scripts/inspect-artifact-signing-requests.mjs +45 -14
- package/scripts/observed-evidence.mjs +151 -33
- package/scripts/reconcile-github-governance.mjs +8 -1
- package/scripts/resolve-artifact-signing-upload-route.mjs +55 -0
- package/scripts/run-candidate-body-prefix-renderer.mjs +187 -0
- package/scripts/runtime-ref-core.mjs +13 -2
- package/scripts/seal-artifact-signing-requests.mjs +51 -6
- package/scripts/stable-candidate-qualification.mjs +8 -0
- package/scripts/verify-artifact-signing-results.mjs +26 -1
- package/scripts/web-surface-production-decision.mjs +19 -3
|
@@ -567,6 +567,7 @@
|
|
|
567
567
|
"path": ".github/workflows/.build.yml",
|
|
568
568
|
"reusable": true,
|
|
569
569
|
"inputs": [
|
|
570
|
+
"artifact-compression-level",
|
|
570
571
|
"artifact-name",
|
|
571
572
|
"artifact-name-template",
|
|
572
573
|
"artifact-paths",
|
|
@@ -578,6 +579,7 @@
|
|
|
578
579
|
"artifact-relay-s3-role-arn",
|
|
579
580
|
"artifact-relay-s3-upload-role-arn",
|
|
580
581
|
"artifact-retention-days",
|
|
582
|
+
"artifact-signing-request-upload-no-proxy",
|
|
581
583
|
"artifact-transfer-mode",
|
|
582
584
|
"build-command",
|
|
583
585
|
"buildchain-contract-compatibility-policy",
|
|
@@ -640,7 +642,7 @@
|
|
|
640
642
|
"verify-command",
|
|
641
643
|
"working-directory"
|
|
642
644
|
],
|
|
643
|
-
"inputCount":
|
|
645
|
+
"inputCount": 74,
|
|
644
646
|
"secrets": [
|
|
645
647
|
"BUILDCHAIN_ARTIFACT_RELAY_S3_DOWNLOAD_ROLE_ARN",
|
|
646
648
|
"BUILDCHAIN_ARTIFACT_RELAY_S3_ROLE_ARN",
|
|
@@ -1364,6 +1366,7 @@
|
|
|
1364
1366
|
"path": ".github/workflows/build.yml",
|
|
1365
1367
|
"reusable": true,
|
|
1366
1368
|
"inputs": [
|
|
1369
|
+
"artifact-compression-level",
|
|
1367
1370
|
"artifact-name",
|
|
1368
1371
|
"artifact-name-template",
|
|
1369
1372
|
"artifact-paths",
|
|
@@ -1375,6 +1378,7 @@
|
|
|
1375
1378
|
"artifact-relay-s3-role-arn",
|
|
1376
1379
|
"artifact-relay-s3-upload-role-arn",
|
|
1377
1380
|
"artifact-retention-days",
|
|
1381
|
+
"artifact-signing-request-upload-no-proxy",
|
|
1378
1382
|
"artifact-transfer-mode",
|
|
1379
1383
|
"build-command",
|
|
1380
1384
|
"buildchain-alpha-contract-lock-path",
|
|
@@ -1440,7 +1444,7 @@
|
|
|
1440
1444
|
"verify-command",
|
|
1441
1445
|
"working-directory"
|
|
1442
1446
|
],
|
|
1443
|
-
"inputCount":
|
|
1447
|
+
"inputCount": 77,
|
|
1444
1448
|
"secrets": [
|
|
1445
1449
|
"BUILDCHAIN_ARTIFACT_RELAY_S3_DOWNLOAD_ROLE_ARN",
|
|
1446
1450
|
"BUILDCHAIN_ARTIFACT_RELAY_S3_ROLE_ARN",
|
|
@@ -1666,11 +1670,12 @@
|
|
|
1666
1670
|
"dry-run",
|
|
1667
1671
|
"max-age-seconds",
|
|
1668
1672
|
"pull-request-body-prefix",
|
|
1673
|
+
"pull-request-body-prefix-renderer",
|
|
1669
1674
|
"settlement-authorized",
|
|
1670
1675
|
"source-branch",
|
|
1671
1676
|
"target-branch"
|
|
1672
1677
|
],
|
|
1673
|
-
"inputCount":
|
|
1678
|
+
"inputCount": 12,
|
|
1674
1679
|
"secrets": [
|
|
1675
1680
|
"promotion-token"
|
|
1676
1681
|
],
|
|
@@ -4260,8 +4265,8 @@
|
|
|
4260
4265
|
"workflowRegistryPath": "dist/site/workflow-registry.json",
|
|
4261
4266
|
"pageRegistryPath": "dist/site/page-registry.json",
|
|
4262
4267
|
"cliRegistryDigest": "0be723caa314a36a1a36b03522527eb5b13e9b741e6566ff7f6ee06958df02ca",
|
|
4263
|
-
"workflowRegistryDigest": "
|
|
4264
|
-
"pageRegistryDigest": "
|
|
4268
|
+
"workflowRegistryDigest": "b89bf8a2a89711fd2033b022bc70dcf92bc1b84ce7697b2c736f098d41fefe92",
|
|
4269
|
+
"pageRegistryDigest": "0f3f8b75b0443b08ed07f8545495b789ac76337dc2639c5112e572e728b0f1dc"
|
|
4265
4270
|
},
|
|
4266
4271
|
"comparison": {
|
|
4267
4272
|
"missingCliRegistry": [],
|
|
@@ -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-30T09:49:04.119Z",
|
|
5
|
+
"publishedAt": "2026-07-30T09:49:04.119Z",
|
|
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": "5770bd104905c6a7ac9fe6b0513ca9e24e5814b4",
|
|
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.
|
|
35
|
+
"version": "3.0.3-alpha.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-30T09:49:04.119Z",
|
|
5
|
+
"publishedAt": "2026-07-30T09:49:04.119Z",
|
|
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": "5770bd104905c6a7ac9fe6b0513ca9e24e5814b4",
|
|
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.
|
|
40
|
+
"version": "3.0.3-alpha.0",
|
|
41
41
|
"versionSource": "package.json#version"
|
|
42
42
|
},
|
|
43
43
|
"entrypoint": "buildchain-site.json",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"path": "docs/auditable-demo.md",
|
|
62
62
|
"plane": "verify",
|
|
63
63
|
"exists": true,
|
|
64
|
-
"digest": "sha256:
|
|
64
|
+
"digest": "sha256:6af21e489bc3d2e9e2d01838926f1fbab6d74d92446d1f9cfc5eb08e090dd3a5"
|
|
65
65
|
},
|
|
66
66
|
{
|
|
67
67
|
"id": "install",
|
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
"path": "docs/github-governance-authority.md",
|
|
110
110
|
"plane": "verify",
|
|
111
111
|
"exists": true,
|
|
112
|
-
"digest": "sha256:
|
|
112
|
+
"digest": "sha256:304d0246d21bdd0f6a77183ac6839a5d1234d08d98bd5da9728c85a65b1ff7b7"
|
|
113
113
|
},
|
|
114
114
|
{
|
|
115
115
|
"id": "release-candidate",
|
|
@@ -157,7 +157,7 @@
|
|
|
157
157
|
"path": "docs/consumer-issue-reporting.md",
|
|
158
158
|
"plane": "use",
|
|
159
159
|
"exists": true,
|
|
160
|
-
"digest": "sha256:
|
|
160
|
+
"digest": "sha256:20c33ab68e91227837626d1289d6c5540a318c8ff484d9a1f0ebe7dbe8626d02"
|
|
161
161
|
},
|
|
162
162
|
{
|
|
163
163
|
"id": "infra-contract",
|
|
@@ -253,7 +253,7 @@
|
|
|
253
253
|
"path": "docs/reusable-build-surface.md",
|
|
254
254
|
"plane": "use",
|
|
255
255
|
"exists": true,
|
|
256
|
-
"digest": "sha256:
|
|
256
|
+
"digest": "sha256:4409c8259c3613b51a1db809493e73d9b85a0d16d292a491046fd36770d98fb0"
|
|
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:
|
|
272
|
+
"digest": "sha256:8c31e6daccd40ea4e7cb08e8fa3eb2f238006e331621aed45eddcb80aee5532f"
|
|
273
273
|
},
|
|
274
274
|
{
|
|
275
275
|
"id": "release-flow",
|
|
@@ -293,7 +293,7 @@
|
|
|
293
293
|
"path": "docs/versioning.md",
|
|
294
294
|
"plane": "why",
|
|
295
295
|
"exists": true,
|
|
296
|
-
"digest": "sha256:
|
|
296
|
+
"digest": "sha256:52f58a1a69ea924cb1fae11bb6a8def2b0c66cc4ab08416553cf680c213b5ded"
|
|
297
297
|
},
|
|
298
298
|
{
|
|
299
299
|
"id": "web-surface-deployments",
|
|
@@ -301,7 +301,7 @@
|
|
|
301
301
|
"path": "docs/web-surface-deployments.md",
|
|
302
302
|
"plane": "use",
|
|
303
303
|
"exists": true,
|
|
304
|
-
"digest": "sha256:
|
|
304
|
+
"digest": "sha256:6b907af93c55ffd8274cd83ad87a45dd48eb9a01938cf419aafebb5557be5821"
|
|
305
305
|
}
|
|
306
306
|
],
|
|
307
307
|
"facts": [
|
|
@@ -77,6 +77,7 @@
|
|
|
77
77
|
"path": ".github/workflows/.build.yml",
|
|
78
78
|
"reusable": true,
|
|
79
79
|
"inputs": [
|
|
80
|
+
"artifact-compression-level",
|
|
80
81
|
"artifact-name",
|
|
81
82
|
"artifact-name-template",
|
|
82
83
|
"artifact-paths",
|
|
@@ -88,6 +89,7 @@
|
|
|
88
89
|
"artifact-relay-s3-role-arn",
|
|
89
90
|
"artifact-relay-s3-upload-role-arn",
|
|
90
91
|
"artifact-retention-days",
|
|
92
|
+
"artifact-signing-request-upload-no-proxy",
|
|
91
93
|
"artifact-transfer-mode",
|
|
92
94
|
"build-command",
|
|
93
95
|
"buildchain-contract-compatibility-policy",
|
|
@@ -150,7 +152,7 @@
|
|
|
150
152
|
"verify-command",
|
|
151
153
|
"working-directory"
|
|
152
154
|
],
|
|
153
|
-
"inputCount":
|
|
155
|
+
"inputCount": 74,
|
|
154
156
|
"secrets": [
|
|
155
157
|
"BUILDCHAIN_ARTIFACT_RELAY_S3_DOWNLOAD_ROLE_ARN",
|
|
156
158
|
"BUILDCHAIN_ARTIFACT_RELAY_S3_ROLE_ARN",
|
|
@@ -937,6 +939,7 @@
|
|
|
937
939
|
"path": ".github/workflows/build.yml",
|
|
938
940
|
"reusable": true,
|
|
939
941
|
"inputs": [
|
|
942
|
+
"artifact-compression-level",
|
|
940
943
|
"artifact-name",
|
|
941
944
|
"artifact-name-template",
|
|
942
945
|
"artifact-paths",
|
|
@@ -948,6 +951,7 @@
|
|
|
948
951
|
"artifact-relay-s3-role-arn",
|
|
949
952
|
"artifact-relay-s3-upload-role-arn",
|
|
950
953
|
"artifact-retention-days",
|
|
954
|
+
"artifact-signing-request-upload-no-proxy",
|
|
951
955
|
"artifact-transfer-mode",
|
|
952
956
|
"build-command",
|
|
953
957
|
"buildchain-alpha-contract-lock-path",
|
|
@@ -1013,7 +1017,7 @@
|
|
|
1013
1017
|
"verify-command",
|
|
1014
1018
|
"working-directory"
|
|
1015
1019
|
],
|
|
1016
|
-
"inputCount":
|
|
1020
|
+
"inputCount": 77,
|
|
1017
1021
|
"secrets": [
|
|
1018
1022
|
"BUILDCHAIN_ARTIFACT_RELAY_S3_DOWNLOAD_ROLE_ARN",
|
|
1019
1023
|
"BUILDCHAIN_ARTIFACT_RELAY_S3_ROLE_ARN",
|
|
@@ -1272,11 +1276,12 @@
|
|
|
1272
1276
|
"dry-run",
|
|
1273
1277
|
"max-age-seconds",
|
|
1274
1278
|
"pull-request-body-prefix",
|
|
1279
|
+
"pull-request-body-prefix-renderer",
|
|
1275
1280
|
"settlement-authorized",
|
|
1276
1281
|
"source-branch",
|
|
1277
1282
|
"target-branch"
|
|
1278
1283
|
],
|
|
1279
|
-
"inputCount":
|
|
1284
|
+
"inputCount": 12,
|
|
1280
1285
|
"secrets": [
|
|
1281
1286
|
"promotion-token"
|
|
1282
1287
|
],
|
package/docs/auditable-demo.md
CHANGED
|
@@ -41,6 +41,18 @@ public-projection.json
|
|
|
41
41
|
scene.json
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
+
It may additionally emit one declared `terminal-capture.json` using
|
|
45
|
+
`kungfu.terminal-capture/v1`. The optional capture is bounded to 60 seconds,
|
|
46
|
+
fixed 80-200 by 24-80 terminal cells, 10,000 events, and 4 MiB of canonical
|
|
47
|
+
base64 bytes. It must contain a passed completion sentinel and an explicitly
|
|
48
|
+
empty authority-grant list. Existing three-file adapters remain valid.
|
|
49
|
+
|
|
50
|
+
Terminal bytes are volatile observations, not Work, Warrant, capability, or
|
|
51
|
+
publication authority. First-party or System identity, KFD compliance, Product
|
|
52
|
+
System metadata, package metadata, scan output, registry history, and
|
|
53
|
+
standalone generation remain non-authoritative unless an exact higher-level
|
|
54
|
+
contract independently admits them.
|
|
55
|
+
|
|
44
56
|
The adapter must not rebuild or rerun the product. It receives:
|
|
45
57
|
|
|
46
58
|
```text
|
|
@@ -78,7 +90,8 @@ The Gate:
|
|
|
78
90
|
- resolves and downloads one exact same-run GitHub Artifact;
|
|
79
91
|
- invokes the checked-in adapter by argv, never as an evaluated shell string;
|
|
80
92
|
- rejects undeclared adapter outputs, symlinks, invalid UTF-8, invalid scene or
|
|
81
|
-
projection
|
|
93
|
+
projection or terminal-capture schemas, implicit capture grants,
|
|
94
|
+
out-of-range transcript references, and oversized input;
|
|
82
95
|
- derives a one-second compatibility scene from the consumer projection;
|
|
83
96
|
- anonymously pulls an immutable `image@sha256:digest` renderer;
|
|
84
97
|
- runs it as non-root with `--network none`, a read-only root filesystem, and a
|
|
@@ -105,6 +118,11 @@ distribution checksums. A web-delivery profile also retains
|
|
|
105
118
|
`media-inspection.json`, whose content root is bound into the receipt.
|
|
106
119
|
`render-media: false` does not weaken or skip the Gate.
|
|
107
120
|
|
|
121
|
+
When the Gate bundle contains a qualified terminal capture, the render job
|
|
122
|
+
passes it read-only to the immutable renderer. The renderer manifest binds the
|
|
123
|
+
capture root and terminal-state-machine version, but raw capture bytes remain
|
|
124
|
+
in the Gate bundle rather than being copied into the public media bundle.
|
|
125
|
+
|
|
108
126
|
## Media Qualification Profiles
|
|
109
127
|
|
|
110
128
|
The single machine-readable source is
|
|
@@ -34,7 +34,7 @@ The recommended pattern is:
|
|
|
34
34
|
summary: "Buildchain reusable build failed before artifact finalization"
|
|
35
35
|
failure-code: reusable-build-failed
|
|
36
36
|
diagnostics-path: .buildchain/artifacts/diagnostics.json
|
|
37
|
-
buildchain-ref: ${{ inputs.buildchain-ref || '
|
|
37
|
+
buildchain-ref: ${{ inputs.buildchain-ref || 'v3' }}
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
## Behavior
|
|
@@ -8,12 +8,12 @@ confidence: high
|
|
|
8
8
|
sensitivity: public
|
|
9
9
|
evidence_grade: A
|
|
10
10
|
review_state: self-reviewed
|
|
11
|
-
last_reviewed: 2026-07-
|
|
11
|
+
last_reviewed: 2026-07-29
|
|
12
12
|
ai_provenance:
|
|
13
13
|
model_family: GPT-5
|
|
14
14
|
product: Codex
|
|
15
|
-
generated_at: 2026-07-
|
|
16
|
-
visible_context: Existing Buildchain
|
|
15
|
+
generated_at: 2026-07-29
|
|
16
|
+
visible_context: Existing Buildchain source locks, Kungfu exact-source Alpha preflight, Dev Patrol, repository release governance, and the consumer-owned settlement renderer threat model.
|
|
17
17
|
invisible_context_boundary: No credentials, private logs, or private configuration were used.
|
|
18
18
|
---
|
|
19
19
|
|
|
@@ -77,13 +77,27 @@ exact same-SHA evidence, it may set `settlement-authorized: true` and
|
|
|
77
77
|
alias for settlement authorization.
|
|
78
78
|
|
|
79
79
|
Repositories whose promotion policy requires a machine-readable PR declaration
|
|
80
|
-
can pass
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
80
|
+
can pass static text through `pull-request-body-prefix`. When the declaration
|
|
81
|
+
depends on the exact qualified delta, use `pull-request-body-prefix-renderer`
|
|
82
|
+
instead. It names a repository-relative Node.js file in the consumer checkout.
|
|
83
|
+
The read-only `observe` job checks out the selected SHA with credentials disabled,
|
|
84
|
+
runs the renderer with a reduced environment, and requires it to write UTF-8 text
|
|
85
|
+
to `BUILDCHAIN_CHANNEL_PATROL_PR_BODY_PREFIX_OUTPUT`. The renderer also receives
|
|
86
|
+
the selected SHA plus source and target branch names. It may derive a declaration
|
|
87
|
+
from the exact checkout and `origin/<target-branch>` without receiving the
|
|
88
|
+
promotion token.
|
|
89
|
+
|
|
90
|
+
Static and rendered prefixes are mutually exclusive. A renderer failure, path
|
|
91
|
+
escape, source-SHA mismatch, empty or oversized result, invalid UTF-8, or managed
|
|
92
|
+
controller-marker injection fails before the write-permission job can run. The
|
|
93
|
+
rendered bytes are retained with the read-only observation artifact and passed
|
|
94
|
+
to `settle` as a job output, so the candidate PR is created with the correct
|
|
95
|
+
declaration on its first write. Buildchain preserves that repository-owned text
|
|
96
|
+
when later observations update only the managed state marker. Before any write,
|
|
97
|
+
`settle` also requires its fresh observation to select the same SHA that produced
|
|
98
|
+
the rendered bytes. Concurrent qualification progress therefore fails closed
|
|
99
|
+
and is recomputed by the next patrol instead of attaching a declaration to the
|
|
100
|
+
wrong candidate.
|
|
87
101
|
|
|
88
102
|
The separately permissioned `settle` job re-runs the exact observation before
|
|
89
103
|
any write. With no active managed candidate, it creates one branch named from
|
|
@@ -8,11 +8,11 @@ confidence: high
|
|
|
8
8
|
sensitivity: public
|
|
9
9
|
evidence_grade: B
|
|
10
10
|
review_state: unreviewed
|
|
11
|
-
last_reviewed: 2026-07-
|
|
11
|
+
last_reviewed: 2026-07-30
|
|
12
12
|
ai_provenance:
|
|
13
13
|
model_family: GPT-5
|
|
14
14
|
product: Codex
|
|
15
|
-
generated_at: 2026-07-
|
|
15
|
+
generated_at: 2026-07-30
|
|
16
16
|
limits: Live GitHub state and account recovery remain provider-controlled and must be re-audited.
|
|
17
17
|
---
|
|
18
18
|
|
|
@@ -75,16 +75,19 @@ protection. Inspecting only one layer is insufficient because an applicable
|
|
|
75
75
|
bypass or weaker update path in another layer can invalidate the effective
|
|
76
76
|
policy.
|
|
77
77
|
|
|
78
|
+
When an admitted default development branch uses GitHub merge queue, its
|
|
79
|
+
candidate-source, queue-lease, and final build checks are one exact authority
|
|
80
|
+
set. The queue lease may remain intentionally unbound while workflow-produced
|
|
81
|
+
checks retain their GitHub Actions App binding; strictness must match the live
|
|
82
|
+
queue ruleset.
|
|
83
|
+
|
|
78
84
|
## Repository and plan admission
|
|
79
85
|
|
|
80
|
-
The 2026-07-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
changing repository identity or creating a circular admission dependency. A
|
|
86
|
-
newly discovered repository or target ref is non-authoritative until explicitly
|
|
87
|
-
admitted.
|
|
86
|
+
The 2026-07-30 baseline contains 16 managed public repositories. The descriptor
|
|
87
|
+
sets `managedVisibilities` to `public`; private repositories are outside the
|
|
88
|
+
managed-zone inventory and do not produce governance receipts. Public
|
|
89
|
+
repository names are versioned in the descriptor. A newly discovered public
|
|
90
|
+
repository or target ref is non-authoritative until explicitly admitted.
|
|
88
91
|
|
|
89
92
|
The descriptor also versions every active public merge target. The full audit
|
|
90
93
|
evaluates one receipt per authoritative target rather than assuming the default
|
|
@@ -94,19 +97,11 @@ which case it is non-qualifying. Retained historical channels and generated
|
|
|
94
97
|
per-release publish-gate refs are not silently deleted or promoted to current
|
|
95
98
|
authority; they require an explicit registry revision before they can qualify.
|
|
96
99
|
|
|
97
|
-
For an admitted private repository, the active target set is the current
|
|
98
|
-
default branch plus existing alpha/release siblings on the same version line.
|
|
99
|
-
Its required-check bindings remain non-qualifying until their sanitized binding
|
|
100
|
-
roots are sealed into the private identity entry after supported native
|
|
101
|
-
protection exists.
|
|
102
|
-
|
|
103
100
|
Public repositories can qualify on supported Free, Team, or Enterprise
|
|
104
|
-
enforcement.
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
and the implementation never makes a private repository public as a
|
|
109
|
-
workaround.
|
|
101
|
+
enforcement. Organization-wide rules require Team or Enterprise capability.
|
|
102
|
+
The verifier does not reinterpret an excluded private repository as qualifying,
|
|
103
|
+
replace missing native enforcement with CI or documentation, or make a private
|
|
104
|
+
repository public as a workaround.
|
|
110
105
|
|
|
111
106
|
## Read-only audit
|
|
112
107
|
|
|
@@ -148,12 +143,10 @@ allow the exact publication transaction audit to resolve required check runs
|
|
|
148
143
|
and merged pull-request review lineage. Omitting either read permission makes
|
|
149
144
|
the transaction evidence incomplete and therefore non-qualifying.
|
|
150
145
|
|
|
151
|
-
The output is sanitized.
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
CODEOWNERS bytes, raw permission payloads, and credential-bearing URLs are
|
|
156
|
-
never included.
|
|
146
|
+
The output is sanitized. Managed public repositories retain their public
|
|
147
|
+
identity. Excluded private repositories produce no receipt or diagnostic.
|
|
148
|
+
Tokens, cookies, recovery material, private CODEOWNERS bytes, raw permission
|
|
149
|
+
payloads, and credential-bearing URLs are never included.
|
|
157
150
|
|
|
158
151
|
## Mutation and rollback boundary
|
|
159
152
|
|
|
@@ -206,8 +199,8 @@ buildchain github-governance rollback \
|
|
|
206
199
|
|
|
207
200
|
For an admitted exact target, classic branch protection can also be compiled
|
|
208
201
|
directly from the authority descriptor. This mode preserves both App-bound
|
|
209
|
-
checks and intentionally unbound check contexts such as Kungfu
|
|
210
|
-
`build`, rather than guessing a provider App identity.
|
|
202
|
+
checks and intentionally unbound check contexts such as Kungfu release's
|
|
203
|
+
legacy `build`, rather than guessing a provider App identity.
|
|
211
204
|
|
|
212
205
|
```bash
|
|
213
206
|
buildchain github-governance protection-policy-plan \
|
|
@@ -8,11 +8,11 @@ confidence: high
|
|
|
8
8
|
sensitivity: public
|
|
9
9
|
evidence_grade: A
|
|
10
10
|
review_state: unreviewed
|
|
11
|
-
last_reviewed: 2026-07-
|
|
11
|
+
last_reviewed: 2026-07-30
|
|
12
12
|
ai_provenance:
|
|
13
13
|
model_family: GPT-5
|
|
14
14
|
product: Codex
|
|
15
|
-
generated_at: 2026-07-
|
|
15
|
+
generated_at: 2026-07-30
|
|
16
16
|
invisible_context_boundary: No credentials, private logs, or unpublished evidence values are included.
|
|
17
17
|
---
|
|
18
18
|
|
|
@@ -30,15 +30,28 @@ binds one `snapshot.id` to two byte-identical JSON files:
|
|
|
30
30
|
`dogfood-evidence/snapshots/<snapshotId>.json`;
|
|
31
31
|
- a mutable last-known-good alias such as `dogfood-evidence.json`.
|
|
32
32
|
|
|
33
|
+
The bundle may also declare up to 16 derived mutable projections under
|
|
34
|
+
`publication.projections`. Each projection declares its artifact-relative
|
|
35
|
+
`source`, bounded destination `key`, exact `sha256`, `contentType`, and
|
|
36
|
+
`cacheControl`. This supports static HTML such as `dogfood/index.html` without
|
|
37
|
+
changing the existing immutable/latest JSON contract.
|
|
38
|
+
|
|
33
39
|
Buildchain verifies both file digests and snapshot identities before receiving
|
|
34
40
|
production authority. Apply then performs this order:
|
|
35
41
|
|
|
36
42
|
1. conditionally create the immutable key with `If-None-Match: *`;
|
|
37
43
|
2. read the immutable key back and verify its declared SHA-256 metadata;
|
|
38
|
-
3. record
|
|
39
|
-
4.
|
|
40
|
-
5.
|
|
41
|
-
6.
|
|
44
|
+
3. record preceding version metadata for every declared mutable key;
|
|
45
|
+
4. write and read back each derived projection in manifest order;
|
|
46
|
+
5. atomically replace the latest object;
|
|
47
|
+
6. read latest back and verify the same snapshot and digest;
|
|
48
|
+
7. invalidate only the declared viewer paths.
|
|
49
|
+
|
|
50
|
+
Projection-enabled publication requires bucket versioning before replacing an
|
|
51
|
+
existing mutable key. If a later projection, latest update, or invalidation
|
|
52
|
+
fails, Buildchain restores preceding object versions in reverse order and
|
|
53
|
+
removes newly introduced declared projection keys. Rollback never lists the
|
|
54
|
+
bucket and never touches keys outside the manifest.
|
|
42
55
|
|
|
43
56
|
Any generator, schema, digest, immutable-key, provider, or read-after-write
|
|
44
57
|
failure leaves the previous latest object in place. A colliding immutable key
|
|
@@ -58,6 +71,8 @@ review gate for steady-state refreshes. Its policy should allow only:
|
|
|
58
71
|
|
|
59
72
|
- `s3:GetObject` and `s3:PutObject` on the exact latest key;
|
|
60
73
|
- the same actions on the exact immutable snapshot prefix;
|
|
74
|
+
- for projection-enabled bundles, `s3:GetObjectVersion` and bounded
|
|
75
|
+
`s3:DeleteObject` on the exact declared mutable keys;
|
|
61
76
|
- `cloudfront:CreateInvalidation` on the one distribution.
|
|
62
77
|
|
|
63
78
|
It must not receive bucket-wide delete, list, repository write, GitHub PR, or
|
|
@@ -76,9 +91,10 @@ fallback.
|
|
|
76
91
|
|
|
77
92
|
## Rollback and recovery
|
|
78
93
|
|
|
79
|
-
Every receipt records the previous latest snapshot
|
|
80
|
-
version
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
94
|
+
Every receipt records the previous latest and projection snapshot ids, digests,
|
|
95
|
+
ETags, and S3 version ids when available. A projection transaction rolls back
|
|
96
|
+
automatically when a later mutable step or CDN invalidation fails. Operators
|
|
97
|
+
can also regenerate a bundle whose latest file is the selected immutable
|
|
98
|
+
snapshot and republish it through the same validator; immutable history is
|
|
99
|
+
never overwritten or deleted. Legacy bundles without projections retain their
|
|
100
|
+
existing idempotent rerun behavior when CDN invalidation alone fails.
|
|
@@ -260,6 +260,13 @@ Developer ID, Windows Authenticode, and detached cryptographic signatures share
|
|
|
260
260
|
the request/receipt model, while each profile retains its honest platform
|
|
261
261
|
semantics and fail-closed verification requirements.
|
|
262
262
|
|
|
263
|
+
The authority verifies the complete result set on GitHub-hosted infrastructure
|
|
264
|
+
before delivery. The consumer controller also performs final result verification,
|
|
265
|
+
exact-byte import, manifest recomputation, and deterministic-artifact replacement
|
|
266
|
+
on a GitHub-hosted lane. Self-hosted build runners do not download authority
|
|
267
|
+
result payloads, and aggregate/release evidence fails closed until this
|
|
268
|
+
finalization succeeds.
|
|
269
|
+
|
|
263
270
|
The central `buildchain-artifact-signing` environment reuses the established
|
|
264
271
|
macOS Credential Island names (`BUILDCHAIN_MACOS_CERTIFICATE_*`,
|
|
265
272
|
`BUILDCHAIN_MACOS_NOTARY_API_*`, and
|
|
@@ -681,7 +688,7 @@ jobs:
|
|
|
681
688
|
dry-run: true
|
|
682
689
|
```
|
|
683
690
|
|
|
684
|
-
All three wrappers default to the `
|
|
691
|
+
All three wrappers default to the `v3` floating Buildchain runtime. When
|
|
685
692
|
`target-branch` is omitted, the caller's current/default branch selects the
|
|
686
693
|
active semver dev line, so consumers do not pin patrol to a stale minor branch.
|
|
687
694
|
The separate workflow names keep consumer schedules readable and stable while
|