@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.
Files changed (52) hide show
  1. package/actions/report-buildchain-issue/README.md +1 -1
  2. package/contracts/buildchain-v2-residuals-v1.json +191 -0
  3. package/dist/site/buildchain-contract.json +58 -35
  4. package/dist/site/buildchain-site.json +33 -33
  5. package/dist/site/controller-registry.json +24 -3
  6. package/dist/site/kfd-claims.json +11 -6
  7. package/dist/site/kfd-upstream-aggregate.json +1 -1
  8. package/dist/site/manual-registry.json +7 -7
  9. package/dist/site/node-api-registry.json +6 -6
  10. package/dist/site/page-registry.json +22 -22
  11. package/dist/site/public-surface-audit.json +10 -5
  12. package/dist/site/publication-registry.json +4 -4
  13. package/dist/site/site-manifest.json +11 -11
  14. package/dist/site/workflow-registry.json +8 -3
  15. package/docs/auditable-demo.md +19 -1
  16. package/docs/consumer-issue-reporting.md +1 -1
  17. package/docs/dev-alpha-candidate-patrol.md +24 -10
  18. package/docs/github-governance-authority.md +23 -30
  19. package/docs/observed-evidence-patrol.md +28 -12
  20. package/docs/release-governance.md +8 -1
  21. package/docs/reusable-build-surface.md +124 -64
  22. package/docs/shifu-gate-profiles.md +7 -1
  23. package/docs/versioning.md +41 -21
  24. package/docs/web-surface-deployments.md +20 -1
  25. package/package.json +1 -1
  26. package/packages/core/artifact-signing.js +1 -0
  27. package/packages/core/buildchain-contract.js +1 -0
  28. package/packages/core/controller-evidence.js +2 -0
  29. package/packages/core/github-governance-authority.js +25 -17
  30. package/packages/core/publication-control-plane-audit.js +28 -0
  31. package/packages/core/release-passport.js +36 -27
  32. package/packages/core/stable-release-gate.js +4 -1
  33. package/scripts/artifact-signing-delegation.mjs +268 -0
  34. package/scripts/audit-github-governance.mjs +32 -13
  35. package/scripts/audit-publication-control-plane.mjs +17 -8
  36. package/scripts/auditable-demo.mjs +147 -2
  37. package/scripts/buildchain-patrol.mjs +1 -1
  38. package/scripts/check-inventory.mjs +1 -0
  39. package/scripts/dev-alpha-candidate-patrol.mjs +20 -0
  40. package/scripts/dispatch-artifact-signing-authority.mjs +7 -1
  41. package/scripts/finalize-native-artifact-signing-result.mjs +114 -31
  42. package/scripts/gate-profile-core.mjs +6 -1
  43. package/scripts/inspect-artifact-signing-requests.mjs +45 -14
  44. package/scripts/observed-evidence.mjs +151 -33
  45. package/scripts/reconcile-github-governance.mjs +8 -1
  46. package/scripts/resolve-artifact-signing-upload-route.mjs +55 -0
  47. package/scripts/run-candidate-body-prefix-renderer.mjs +187 -0
  48. package/scripts/runtime-ref-core.mjs +13 -2
  49. package/scripts/seal-artifact-signing-requests.mjs +51 -6
  50. package/scripts/stable-candidate-qualification.mjs +8 -0
  51. package/scripts/verify-artifact-signing-results.mjs +26 -1
  52. 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": 72,
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": 75,
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": 11,
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": "01792ad09bcdcd3c12d018e6ee9613a09b5a1b87525d6f643a18f963f0d973a1",
4264
- "pageRegistryDigest": "56583b14046754bc0c02c512602c4e1c4e9ecdf68e6e639fcab8d550c3e082b4"
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-30T07:24:06.316Z",
5
- "publishedAt": "2026-07-30T07:24:06.316Z",
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": "1aeb9191f607a7223f8ab63c96427b605ecda9be",
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.2",
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-30T07:24:06.316Z",
5
- "publishedAt": "2026-07-30T07:24:06.316Z",
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": "1aeb9191f607a7223f8ab63c96427b605ecda9be",
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.2",
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:0e8cf2162c2e1f83cfe3a6171e3055f494cab5f03fdcbec3854e1793678e6908"
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:b8c3d9ad53c2509bbd95804ccc31f6aa89989c3aadf3a2b75d9c73aef168b7e8"
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:96804310360c02f408fee9d540385d875a40d09bef046c3df369228d311a1cdd"
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:ea36ec722f811f5156735aa7471ed080cdc7e87d71c20c300243b226e233e675"
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:42a45f51db7ea11658431718835e1a430959db2a5cc80fc4651681502fe6fb7c"
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:4b40cb8675c111b7588297102a61cb241630f2b707a67a0384a6df7527b2c64c"
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:ed4ff02dcb6f66118a29084784f25d8008ca472f59005b2e014133524706a9c5"
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": 72,
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": 75,
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": 11,
1284
+ "inputCount": 12,
1280
1285
  "secrets": [
1281
1286
  "promotion-token"
1282
1287
  ],
@@ -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 schemas, out-of-range transcript references, and oversized input;
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 || 'v2' }}
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-27
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-27
16
- visible_context: Existing Buildchain stable-candidate source locks, Kungfu exact-source Alpha preflight, Dev Patrol, and repository release governance.
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 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.
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-24
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-24
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-24 baseline contains 16 managed repositories: 13 public and three
81
- private. Public repository names are versioned in the descriptor. Private
82
- repository names are never emitted in public evidence; their identities are
83
- represented by stable roots derived from the GitHub provider repository ID,
84
- independent of the governance policy root. This prevents a policy revision from
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. Private repositories and organization-wide rules require Team or
105
- Enterprise capability. On an unsupported plan they remain explicitly
106
- `non-authoritative-plan-capability-required` and publication-ineligible. The
107
- verifier does not replace missing native enforcement with CI or documentation,
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. Public repositories retain their public identity.
152
- Private repositories expose only an identity root, visibility class, target
153
- ref, sanitized required-check bindings and fact roots, and a qualifying or
154
- non-qualifying decision. Tokens, cookies, recovery material, private
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 alpha's
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-21
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-21
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 the previous latest metadata as the rollback pointer;
39
- 4. atomically replace the latest object;
40
- 5. read latest back and verify the same snapshot and digest;
41
- 6. invalidate only the declared viewer paths.
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 id, digest, ETag, and S3
80
- version id when available. Rollback regenerates a bundle whose latest file is
81
- the selected immutable snapshot and republishes it through the same validator;
82
- operators do not edit or delete immutable history. If CDN invalidation fails
83
- after latest advances, rerunning the same bundle is idempotent and repairs edge
84
- convergence.
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 `v2` floating Buildchain runtime. When
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