@kungfu-tech/buildchain 3.0.2 → 3.0.3-alpha.1
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/AGENTS.md +1 -1
- package/CONTRIBUTING.md +1 -1
- package/README.md +27 -1
- package/actions/promote-buildchain-ref/README.md +90 -19
- package/actions/report-buildchain-issue/README.md +20 -2
- package/actions/run-lifecycle/README.md +5 -0
- package/actions/validate-config/README.md +19 -1
- package/bin/buildchain.mjs +56 -2
- package/bin/internal/command-registry.mjs +82 -0
- package/bin/internal/trust-release-cli.mjs +1 -0
- package/contracts/auditable-demo-media-profiles-v1.json +116 -1
- package/contracts/buildchain-v2-residuals-v1.json +146 -0
- package/contracts/evidence/auditable-demo-responsive-web-delivery-v1.json +143 -0
- package/contracts/evidence/auditable-demo-web-delivery-v1.json +7 -3
- package/contracts/fixtures/auditable-demo-responsive-web-delivery-v1/complete-transcript.txt +2 -0
- package/contracts/fixtures/auditable-demo-responsive-web-delivery-v1/public-projection.json +16 -0
- package/contracts/fixtures/auditable-demo-responsive-web-delivery-v1/scene.json +12 -0
- package/dist/site/buildchain-contract.json +188 -46
- package/dist/site/buildchain-site.json +181 -90
- package/dist/site/capability-registry.json +5 -5
- package/dist/site/cli-registry.json +860 -98
- package/dist/site/controller-registry.json +118 -5
- package/dist/site/kfd-claims.json +233 -19
- package/dist/site/kfd-upstream-aggregate.json +1 -1
- package/dist/site/manual-registry.json +20 -20
- package/dist/site/node-api-registry.json +374 -59
- package/dist/site/page-registry.json +156 -65
- package/dist/site/public-surface-audit.json +231 -22
- package/dist/site/publication-registry.json +4 -4
- package/dist/site/release-provenance.json +3 -0
- package/dist/site/site-manifest.json +24 -24
- package/dist/site/workflow-registry.json +575 -79
- package/docs/MAP.md +22 -4
- package/docs/auditable-demo.md +54 -13
- package/docs/aws-us-elastic-runner-burst-plane.md +381 -0
- package/docs/cli.md +119 -12
- package/docs/consumer-issue-reporting.md +20 -2
- package/docs/dev-alpha-candidate-patrol.md +24 -10
- package/docs/github-governance-authority.md +24 -31
- package/docs/lifecycle-protocol.md +20 -2
- package/docs/migration-inventory.md +24 -5
- package/docs/observed-evidence-patrol.md +28 -12
- package/docs/ownership.md +19 -1
- package/docs/publication-artifacts.md +158 -18
- package/docs/publication-authority.md +4 -4
- package/docs/publish-transaction.md +78 -31
- package/docs/release-candidate.md +24 -0
- package/docs/release-flow.md +50 -32
- package/docs/release-governance.md +39 -32
- package/docs/release-passport.md +4 -0
- package/docs/release-propagation.md +57 -12
- package/docs/reusable-build-surface.md +218 -90
- package/docs/runtime-train-validation.md +20 -2
- package/docs/shifu-gate-profiles.md +7 -1
- package/docs/stable-candidate-patrol.md +6 -6
- package/docs/toolkit-observability.md +22 -0
- package/docs/versioning.md +46 -24
- package/docs/web-surface-deployments.md +82 -1
- package/package.json +7 -5
- package/packages/core/README.md +60 -4
- package/packages/core/artifact-signing.js +1 -0
- package/packages/core/buildchain-contract.js +9 -4
- package/packages/core/cache-evidence.js +1 -0
- package/packages/core/controller-evidence.js +2 -0
- package/packages/core/diagnostics.js +105 -30
- package/packages/core/github-governance-authority.js +25 -17
- package/packages/core/index.js +40 -0
- package/packages/core/paper.js +3226 -0
- package/packages/core/public-surface-audit.js +3 -0
- package/packages/core/publication-artifact.js +1 -6
- package/packages/core/publication-authority.js +1 -0
- package/packages/core/publication-control-plane-audit.js +28 -0
- package/packages/core/publication-reproducibility.js +947 -0
- package/packages/core/publication-sealed-bundle.js +190 -0
- package/packages/core/publish-transaction.js +147 -17
- package/packages/core/release-candidate.js +234 -0
- package/packages/core/release-passport.js +519 -228
- package/packages/core/release-propagation.js +175 -1
- 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 +266 -7
- package/scripts/aws-codebuild-toolchain.mjs +285 -0
- package/scripts/aws-macos-jit-core.mjs +378 -0
- package/scripts/aws-macos-jit.mjs +123 -0
- package/scripts/aws-runner-burst-core.mjs +248 -0
- package/scripts/aws-runner-burst.mjs +79 -0
- package/scripts/aws-windows-jit-core.mjs +374 -0
- package/scripts/aws-windows-jit.mjs +121 -0
- package/scripts/build-contract-core.mjs +69 -6
- package/scripts/build-standalone-binary.mjs +23 -0
- package/scripts/buildchain-contract-lock.mjs +1 -1
- package/scripts/buildchain-patrol.mjs +1 -1
- package/scripts/check-internal-architecture.mjs +69 -2
- package/scripts/check-inventory.mjs +70 -2
- package/scripts/check-javascript-syntax.mjs +31 -0
- package/scripts/check-maintainability.mjs +371 -0
- package/scripts/compiler-cache-evidence.mjs +221 -0
- package/scripts/dev-alpha-candidate-patrol.mjs +288 -43
- package/scripts/dispatch-artifact-signing-authority.mjs +7 -1
- package/scripts/finalize-native-artifact-signing-result.mjs +185 -31
- package/scripts/gate-profile-core.mjs +6 -1
- package/scripts/generate-channel-promotion-workflow.mjs +3 -12
- package/scripts/generate-release-candidate-passport.mjs +4 -0
- package/scripts/generate-site-bundle.mjs +84 -18
- package/scripts/import-artifact-signing-results.mjs +64 -5
- package/scripts/inspect-artifact-signing-requests.mjs +52 -14
- package/scripts/maintainability-metrics.mjs +339 -0
- package/scripts/npm-publish-transaction.mjs +57 -6
- package/scripts/observed-evidence.mjs +151 -33
- package/scripts/paper.mjs +645 -0
- package/scripts/promotion-channel-router.mjs +16 -4
- package/scripts/publication-reproducibility.mjs +62 -0
- package/scripts/reconcile-github-governance.mjs +8 -1
- package/scripts/release-propagation.mjs +39 -0
- package/scripts/resolve-artifact-signing-upload-route.mjs +55 -0
- package/scripts/resolve-build-contract.mjs +6 -0
- package/scripts/route-offline-runners.mjs +236 -0
- package/scripts/run-candidate-body-prefix-renderer.mjs +187 -0
- package/scripts/run-lifecycle-core.mjs +62 -1
- package/scripts/runtime-ref-core.mjs +36 -4
- package/scripts/seal-artifact-signing-requests.mjs +64 -12
- package/scripts/stable-candidate-qualification.mjs +50 -0
- package/scripts/verify-artifact-signing-results.mjs +26 -1
- package/scripts/web-surface-core.mjs +272 -86
- package/scripts/web-surface-production-decision.mjs +19 -3
package/AGENTS.md
CHANGED
|
@@ -23,7 +23,7 @@ override that policy:
|
|
|
23
23
|
uses: kungfu-systems/buildchain/.github/workflows/build.yml@v3
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
During
|
|
26
|
+
During v3 prerelease evaluation windows, canaries call the same router through
|
|
27
27
|
the matching prerelease ref:
|
|
28
28
|
|
|
29
29
|
```yaml
|
package/CONTRIBUTING.md
CHANGED
|
@@ -120,7 +120,7 @@ release/vX/vX.Y -> publish-gate/major
|
|
|
120
120
|
branch prefixes, max merges, and dry-run are all declared inputs.
|
|
121
121
|
- When a Buildchain change needs downstream validation before stable refs move,
|
|
122
122
|
publish a temporary runtime train ref such as
|
|
123
|
-
`train/
|
|
123
|
+
`train/v3/v3.0/<capability>` and ask consumers to run trusted
|
|
124
124
|
`workflow_dispatch` with `buildchain-ref` set to that train. Keep the pull
|
|
125
125
|
request against the `dev/*` branch; the train is only a validation pointer,
|
|
126
126
|
not a pending merge target. After validation succeeds, merge into the active
|
package/README.md
CHANGED
|
@@ -191,6 +191,22 @@ npx @kungfu-tech/buildchain validate --require-version-state
|
|
|
191
191
|
npx @kungfu-tech/buildchain release --dry-run --target-ref alpha/v3/v3.0
|
|
192
192
|
```
|
|
193
193
|
|
|
194
|
+
Bootstrap and inspect a governed paper repository through one interface:
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
npx @kungfu-tech/buildchain paper scaffold \
|
|
198
|
+
--package @kungfu-tech/paper-example \
|
|
199
|
+
--repository kungfu-systems/paper-example
|
|
200
|
+
npx @kungfu-tech/buildchain paper preflight --offline
|
|
201
|
+
npx @kungfu-tech/buildchain paper status
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
The paper surface is dry-run first. Add `--write` only to create missing
|
|
205
|
+
scaffold files; external mutations such as npm bootstrap, Alpha PR creation,
|
|
206
|
+
and release resumption require `--execute`. See
|
|
207
|
+
[`docs/publication-artifacts.md`](docs/publication-artifacts.md) for the
|
|
208
|
+
evidence-state model and operator flow.
|
|
209
|
+
|
|
194
210
|
Buildchain supports package and non-package projects through
|
|
195
211
|
`.buildchain/buildchain.toml`. Legacy root `buildchain.toml` files remain
|
|
196
212
|
readable, but new consumers should keep Buildchain-owned files under
|
|
@@ -212,13 +228,23 @@ plus fail-closed product-evidence gates for KFD-4, KFD-5, and KFD-7. These
|
|
|
212
228
|
gates preserve product-owned qualification and support decisions; they do not
|
|
213
229
|
turn a schema-valid record into certification or shipped support.
|
|
214
230
|
|
|
215
|
-
Buildchain's
|
|
231
|
+
Buildchain's action registry currently contains six active entries. Four are
|
|
232
|
+
direct consumer integration actions:
|
|
216
233
|
|
|
217
234
|
- `actions/validate-config`
|
|
218
235
|
- `actions/run-lifecycle`
|
|
219
236
|
- `actions/promote-buildchain-ref`
|
|
220
237
|
- `actions/report-buildchain-issue`
|
|
221
238
|
|
|
239
|
+
Two additional release-authority components are also registered and versioned:
|
|
240
|
+
|
|
241
|
+
- `actions/github-artifact-attestation`
|
|
242
|
+
- `actions/macos-credential-island`
|
|
243
|
+
|
|
244
|
+
`dist/site/workflow-registry.json#actions` is the machine-readable inventory;
|
|
245
|
+
this split keeps the older four-action consumer list from being mistaken for
|
|
246
|
+
the complete current registry.
|
|
247
|
+
|
|
222
248
|
The active reusable workflow surfaces are:
|
|
223
249
|
|
|
224
250
|
- `.github/workflows/.gate-profile.yml` for project-neutral Shifu Gate profile
|
|
@@ -1,28 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: active
|
|
3
|
+
period: ongoing
|
|
4
|
+
theme: buildchain-ref-promotion-action
|
|
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-31
|
|
12
|
+
ai_provenance:
|
|
13
|
+
model_family: GPT-5
|
|
14
|
+
product: Codex
|
|
15
|
+
generated_at: 2026-07-31
|
|
16
|
+
invisible_context: not asserted
|
|
17
|
+
---
|
|
18
|
+
|
|
1
19
|
# promote-buildchain-ref
|
|
2
20
|
|
|
3
21
|
Internal buildchain action for promoting verified buildchain release-line and
|
|
4
22
|
compatibility refs from buildchain release channels:
|
|
5
23
|
|
|
6
|
-
- `alpha/
|
|
7
|
-
`
|
|
24
|
+
- `alpha/v3/v3.0` creates or reuses the next exact prerelease tag such as
|
|
25
|
+
`v3.0.3-alpha.0`, writes that version into package version state, points the
|
|
8
26
|
alpha and dev channel branches at the version commit, then promotes
|
|
9
|
-
`
|
|
10
|
-
- `release/
|
|
11
|
-
`
|
|
27
|
+
`v3.0-alpha` and, when this is the highest published alpha minor, `v3-alpha`;
|
|
28
|
+
- `release/v3/v3.0` creates or reuses the next exact release tag such as
|
|
29
|
+
`v3.0.2`, writes that version into package version state, points the release
|
|
12
30
|
channel branch and release tags at the release commit, then prepares a second
|
|
13
|
-
source commit for the next exact prerelease tag such as `
|
|
14
|
-
points the alpha/dev channel branches plus `
|
|
15
|
-
commit, and moves `v3-alpha` only if no higher
|
|
31
|
+
source commit for the next exact prerelease tag such as `v3.0.3-alpha.0` and
|
|
32
|
+
points the alpha/dev channel branches plus `v3.0-alpha` at that prerelease
|
|
33
|
+
commit, and moves `v3-alpha` only if no higher v3 minor has published an alpha;
|
|
16
34
|
- `publish-gate/major` accepts a reviewed PR from a production release line such
|
|
17
|
-
as `release/
|
|
18
|
-
`
|
|
19
|
-
at that release commit, then prepares `
|
|
20
|
-
`alpha/
|
|
35
|
+
as `release/v3/v3.0`, writes the next major production version such as
|
|
36
|
+
`v4.0.0`, points `publish-gate/major`, `release/v4/v4.0`, `v4.0`, and `v4`
|
|
37
|
+
at that release commit, then prepares `v4.0.1-alpha.0` for
|
|
38
|
+
`alpha/v4/v4.0`, `dev/v4/v4.0`, `v4.0-alpha`, and `v4-alpha`. The older `major-gate`
|
|
21
39
|
branch name is a compatibility alias only.
|
|
22
40
|
|
|
23
41
|
The release branch name defines the minor line. For example,
|
|
24
|
-
`release/
|
|
25
|
-
when the next minor tag such as `
|
|
42
|
+
`release/v3/v3.1` creates `v3.1.N`, promotes `v3.1`, and promotes `v3` only
|
|
43
|
+
when the next minor tag such as `v3.2` does not already exist.
|
|
26
44
|
|
|
27
45
|
The action updates version state in `lerna.json`, root `package.json`, and
|
|
28
46
|
workspace package manifests discovered from package manager metadata
|
|
@@ -134,7 +152,7 @@ trusted channel workflow:
|
|
|
134
152
|
token: ${{ secrets.BUILDCHAIN_PROMOTION_TOKEN }}
|
|
135
153
|
generated-ref-update-token: ${{ github.token }}
|
|
136
154
|
sha: ${{ github.sha }}
|
|
137
|
-
target-ref: release/
|
|
155
|
+
target-ref: release/v3/v3.0
|
|
138
156
|
publish-transaction: "true"
|
|
139
157
|
publish-mode: publish-final-version
|
|
140
158
|
publish-auth: trusted-publishing
|
|
@@ -219,6 +237,10 @@ and fail before publish-gate side effects if it no longer matches:
|
|
|
219
237
|
promote-only-release-candidate: "true"
|
|
220
238
|
release-candidate-passport-path: .buildchain/artifacts/release-candidate-passport.json
|
|
221
239
|
release-candidate-build-summary-path: .buildchain/artifacts/build-summary.json
|
|
240
|
+
release-candidate-family-evidence-required: "true"
|
|
241
|
+
release-candidate-family-evidence-root: sha256:<initiative-family-root>
|
|
242
|
+
release-candidate-family-initiative-id: 2026-07-30-example-initiative
|
|
243
|
+
release-candidate-family-assignment-id: 2026-07-30-example-release
|
|
222
244
|
```
|
|
223
245
|
|
|
224
246
|
The action validates repository, channel, source identity, platform matrix, and
|
|
@@ -229,6 +251,14 @@ channel HEAD's Git tree SHA matching the passport tree hash. If validation
|
|
|
229
251
|
fails, run or attach the verified channel PR build first instead of promoting a
|
|
230
252
|
stale or unproven artifact set.
|
|
231
253
|
|
|
254
|
+
The four family-evidence inputs are optional. When enabled, the action requires
|
|
255
|
+
the candidate passport to carry the exact
|
|
256
|
+
`kungfu-buildchain-initiative-family-release-evidence/v1` envelope and checks
|
|
257
|
+
its family root, Initiative id, and Assignment id before any promotion
|
|
258
|
+
mutation. Buildchain only transports and validates this adapter-edge release
|
|
259
|
+
evidence; Kungfu Work Control remains authoritative for native Family State v1
|
|
260
|
+
and its additive v2 typed envelope.
|
|
261
|
+
|
|
232
262
|
When enabled, the action creates or resumes a release transaction keyed by
|
|
233
263
|
repository, version, source SHA, and target ref. It persists that transaction to
|
|
234
264
|
a machine-managed branch under `buildchain/release-state/<version>`, with
|
|
@@ -244,6 +274,16 @@ Passport collection. This is explicit opt-in because registry publication and
|
|
|
244
274
|
other provider mutations must not be replayed blindly; the option rejects
|
|
245
275
|
`promote-existing-version`.
|
|
246
276
|
|
|
277
|
+
Build-once callers additionally pass `publish-sealed-bundle-root` and
|
|
278
|
+
`publish-sealed-bundle-manifest`. The action verifies the typed manifest and
|
|
279
|
+
persists every declared file below
|
|
280
|
+
`sealed-bundle/<candidate-root>/files/` on the same durable ref before it starts
|
|
281
|
+
the publish command. A fresh runner can omit both inputs: the action restores
|
|
282
|
+
the exact binary bundle into `.buildchain/recovered-publication/<version>/`,
|
|
283
|
+
re-verifies it, and exports the recovered npm tarball through
|
|
284
|
+
`BUILDCHAIN_SEALED_NPM_TARBALL` with its exact integrity and SHA-256. This path
|
|
285
|
+
never repacks the npm tarball.
|
|
286
|
+
|
|
247
287
|
The action runs `lifecycle.publish` from `buildchain.toml` or the explicit
|
|
248
288
|
`publish-command` input, then validates publish evidence before exact tags and
|
|
249
289
|
floating refs move. If durable state persistence fails, the action fails closed
|
|
@@ -275,6 +315,10 @@ BUILDCHAIN_RELEASE_SHA
|
|
|
275
315
|
BUILDCHAIN_RELEASE_MATERIAL_SHA
|
|
276
316
|
BUILDCHAIN_PUBLISH_TOOLING_SHA
|
|
277
317
|
BUILDCHAIN_PUBLISH_EVIDENCE
|
|
318
|
+
BUILDCHAIN_SEALED_BUNDLE_ROOT
|
|
319
|
+
BUILDCHAIN_SEALED_NPM_TARBALL
|
|
320
|
+
BUILDCHAIN_SEALED_NPM_INTEGRITY
|
|
321
|
+
BUILDCHAIN_SEALED_NPM_SHA256
|
|
278
322
|
BUILDCHAIN_REQUIRED_ARTIFACTS
|
|
279
323
|
```
|
|
280
324
|
|
|
@@ -287,11 +331,17 @@ before `lifecycle.publish`. Requirement descriptors may omit `digest`; final
|
|
|
287
331
|
publish evidence may not.
|
|
288
332
|
|
|
289
333
|
The action outputs `transaction-id`, `transaction-state`,
|
|
334
|
+
`transaction-publication-state`, `transaction-sealed-bundle-root`,
|
|
335
|
+
`transaction-resume-command`,
|
|
290
336
|
`transaction-exact-tag`, `public-release-tag`, `transaction-release-sha`,
|
|
291
337
|
`transaction-state-ref`, `transaction-state-sha`, `transaction-state-path`,
|
|
292
338
|
`publish-evidence-path`, and `release-passport-path`, `release-passport-output-dir`,
|
|
293
339
|
`release-passport-state-sha`, and `finalization-needed`.
|
|
294
340
|
`transaction-state-ref` is the durable recovery location.
|
|
341
|
+
`transaction-publication-state` provides the stable
|
|
342
|
+
`prepared`, `sealed`, `package-published`, `alpha-complete`, or
|
|
343
|
+
`release-complete` operator view. `transaction-resume-command` is the exact
|
|
344
|
+
consumer-facing resume entrypoint bound into the sealed manifest.
|
|
295
345
|
`release-passport-state-sha` is the durable ref commit after the generated
|
|
296
346
|
`release-passport/*` files have been uploaded into that recovery ref.
|
|
297
347
|
`finalization-needed=true` means publish evidence is valid, but protected branch
|
|
@@ -311,7 +361,11 @@ package releases, `public-release-tag` is derived
|
|
|
311
361
|
from the published package version, while `transaction-exact-tag` remains the
|
|
312
362
|
internal Buildchain transaction ref for recovery and audit. If the transaction is
|
|
313
363
|
not complete yet, the action defers GitHub Release publication to the next
|
|
314
|
-
idempotent promotion run.
|
|
364
|
+
idempotent promotion run. When sealed release assets are present, those restored
|
|
365
|
+
files replace caller-supplied artifact paths. After upload succeeds, the action
|
|
366
|
+
writes the `github_release` milestone back to the durable transaction; an
|
|
367
|
+
interruption before that write is safe to retry because release creation and
|
|
368
|
+
asset replacement are idempotent.
|
|
315
369
|
|
|
316
370
|
After a publish transaction reaches `complete`, the action generates the unified
|
|
317
371
|
`buildchain-release-passport` in `.buildchain/release-passport` by default and
|
|
@@ -351,6 +405,23 @@ requires a `verified` verdict, complete platform coverage, a clean exact source
|
|
|
351
405
|
revision, and then binds the result into `buildchain.release.json`. Missing,
|
|
352
406
|
stale, falsified, incomplete, dirty, or tampered Passport evidence fails the
|
|
353
407
|
release transaction closed.
|
|
408
|
+
Set `release-passport-evidence-jsons` to newline-separated product-owned release
|
|
409
|
+
evidence attachment indexes. Each JSON document must declare `schemaVersion`, a
|
|
410
|
+
stable `id`, a product contract, and the exact release source SHA, tag, and
|
|
411
|
+
channel. Buildchain copies and hashes the documents, verifies their coordinates
|
|
412
|
+
against the final Passport, and retains them in the release evidence bundle
|
|
413
|
+
without interpreting product-specific or legal claims.
|
|
414
|
+
|
|
415
|
+
When release coordinates are not known until promotion, set
|
|
416
|
+
`release-passport-attachment-command`. Buildchain supplies
|
|
417
|
+
`BUILDCHAIN_RELEASE_SOURCE_SHA`, `BUILDCHAIN_RELEASE_TAG`,
|
|
418
|
+
`BUILDCHAIN_RELEASE_CHANNEL`, `BUILDCHAIN_RELEASE_VERSION`,
|
|
419
|
+
`BUILDCHAIN_RELEASE_DEPLOYMENT_COORDINATE`, `BUILDCHAIN_RELEASE_TARGET_REF`, and
|
|
420
|
+
`BUILDCHAIN_RELEASE_PASSPORT_OUTPUT_DIR`; the command must emit a JSON array or
|
|
421
|
+
an object with a non-empty `files` array. Direct Action callers may still use
|
|
422
|
+
the v2 alias `release-passport-evidence-command`. Reusable v3 workflows reserve
|
|
423
|
+
that older name for the distinct post-activation released-evidence command.
|
|
424
|
+
|
|
354
425
|
Buildchain's own release workflow sets `release-passport-buildchain-self-kfd:
|
|
355
426
|
"true"`. In that mode the action generates Buildchain-owned KFD-1/2/3 witnesses
|
|
356
427
|
inside the final version-state workspace, after the release transaction has
|
|
@@ -446,15 +517,15 @@ so the mutation path cannot widen the authority descriptor.
|
|
|
446
517
|
|
|
447
518
|
The tag names intentionally follow the old ABV release semantics:
|
|
448
519
|
exact release tags are `vX.Y.Z`, exact alpha tags are `vX.Y.Z-alpha.N`, floating
|
|
449
|
-
release tags are minor/major tags such as `
|
|
450
|
-
tags are minor-line tags such as `
|
|
520
|
+
release tags are minor/major tags such as `v3.0` and `v3`, and floating alpha
|
|
521
|
+
tags are minor-line tags such as `v3.0-alpha` plus cross-minor major tags such
|
|
451
522
|
as `v3-alpha`. A major alpha tag only moves for the highest minor in that major
|
|
452
523
|
with a published alpha, so older-line maintenance cannot roll consumers back.
|
|
453
524
|
Bare tags such as `1.0.0` are not
|
|
454
525
|
maintained as buildchain release entrypoints.
|
|
455
526
|
|
|
456
527
|
Repository rulesets should protect exact tags, not every `v*` tag. A ruleset
|
|
457
|
-
such as `refs/tags/v*` also protects floating channel tags like `
|
|
528
|
+
such as `refs/tags/v*` also protects floating channel tags like `v3.0-alpha` and `v3-alpha`,
|
|
458
529
|
which Buildchain must update after exact tags and publish evidence are durable.
|
|
459
530
|
Use an exact-tag rule such as `refs/tags/v*.*.*` for immutable evidence tags and
|
|
460
531
|
leave floating channel tags mutable for the promotion token.
|
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: active
|
|
3
|
+
period: ongoing
|
|
4
|
+
theme: buildchain-consumer-issue-action
|
|
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-31
|
|
12
|
+
ai_provenance:
|
|
13
|
+
model_family: GPT-5
|
|
14
|
+
product: Codex
|
|
15
|
+
generated_at: 2026-07-31
|
|
16
|
+
invisible_context: not asserted
|
|
17
|
+
---
|
|
18
|
+
|
|
1
19
|
# report-buildchain-issue
|
|
2
20
|
|
|
3
21
|
Create or update a Buildchain repository issue from a consumer workflow or from
|
|
@@ -25,7 +43,7 @@ organization.
|
|
|
25
43
|
token: ${{ steps.buildchain-issue-token.outputs.token }}
|
|
26
44
|
summary: "Reusable build failed before artifact finalization"
|
|
27
45
|
failure-code: reusable-build-failed
|
|
28
|
-
buildchain-ref: ${{ inputs.buildchain-ref || '
|
|
46
|
+
buildchain-ref: ${{ inputs.buildchain-ref || 'v3' }}
|
|
29
47
|
diagnostics-path: .buildchain/artifacts/diagnostics.json
|
|
30
48
|
```
|
|
31
49
|
|
|
@@ -76,7 +94,7 @@ steps:
|
|
|
76
94
|
workflow: ${{ github.workflow }}
|
|
77
95
|
run-id: ${{ github.run_id }}
|
|
78
96
|
run-attempt: ${{ github.run_attempt }}
|
|
79
|
-
channel: alpha/
|
|
97
|
+
channel: alpha/v3/v3.0
|
|
80
98
|
source-sha: ${{ github.sha }}
|
|
81
99
|
friction-class: duplicate-build
|
|
82
100
|
related-runs-json: ${{ steps.classify.outputs.related-runs-json }}
|
|
@@ -26,6 +26,11 @@ be diagnosed after the runner is released.
|
|
|
26
26
|
The action writes both a full manifest and a compact summary. It also exposes
|
|
27
27
|
the summary as outputs for reusable workflow callers:
|
|
28
28
|
|
|
29
|
+
For a `build` stage, paths selected by `[[signing.artifacts]]` for the current
|
|
30
|
+
`platform-id` are automatically included in the lifecycle manifest even when
|
|
31
|
+
they sit outside `artifact-paths`. This binds every byte sent to the signing
|
|
32
|
+
authority without changing which ordinary product paths the caller uploads.
|
|
33
|
+
|
|
29
34
|
| Output | Meaning |
|
|
30
35
|
| --- | --- |
|
|
31
36
|
| `manifest-path` | Full manifest path |
|
|
@@ -1,6 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: active
|
|
3
|
+
period: ongoing
|
|
4
|
+
theme: buildchain-config-validation-action
|
|
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-31
|
|
12
|
+
ai_provenance:
|
|
13
|
+
model_family: GPT-5
|
|
14
|
+
product: Codex
|
|
15
|
+
generated_at: 2026-07-31
|
|
16
|
+
invisible_context: not asserted
|
|
17
|
+
---
|
|
18
|
+
|
|
1
19
|
# validate-config
|
|
2
20
|
|
|
3
|
-
Buildchain
|
|
21
|
+
Buildchain v3 action for validating `.buildchain/buildchain.toml` without running lifecycle
|
|
4
22
|
commands.
|
|
5
23
|
|
|
6
24
|
Use this action during repository migration when a heavyweight project needs to
|
package/bin/buildchain.mjs
CHANGED
|
@@ -11,6 +11,8 @@ import { runReleasePropagationCli } from "../scripts/release-propagation.mjs";
|
|
|
11
11
|
import { runReleaseGovernanceCli } from "../scripts/reconcile-release-governance.mjs";
|
|
12
12
|
import { runPublicationArtifactCli } from "../scripts/publication-artifact.mjs";
|
|
13
13
|
import { runPublicationPackageCli } from "../scripts/publication-package.mjs";
|
|
14
|
+
import { runPublicationReproducibilityCli } from "../scripts/publication-reproducibility.mjs";
|
|
15
|
+
import { runPaperCli } from "../scripts/paper.mjs";
|
|
14
16
|
import { validateBuildchainConfig } from "../packages/core/buildchain-config.js";
|
|
15
17
|
import { detectPackageManager } from "../packages/core/package-manager.js";
|
|
16
18
|
import {
|
|
@@ -99,9 +101,14 @@ import {
|
|
|
99
101
|
TRUST_RELEASE_COMMANDS,
|
|
100
102
|
dispatchTrustReleaseCommand,
|
|
101
103
|
} from "./internal/trust-release-cli.mjs";
|
|
104
|
+
import {
|
|
105
|
+
BUILDCHAIN_COMMAND_REGISTRY,
|
|
106
|
+
dispatchRegisteredCommand,
|
|
107
|
+
} from "./internal/command-registry.mjs";
|
|
102
108
|
|
|
103
109
|
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
104
110
|
const embeddedPackageVersion = process.env.BUILDCHAIN_EMBEDDED_PACKAGE_VERSION || "";
|
|
111
|
+
const embeddedSourceSha = process.env.BUILDCHAIN_EMBEDDED_SOURCE_SHA || "";
|
|
105
112
|
|
|
106
113
|
function usage() {
|
|
107
114
|
return `Usage:
|
|
@@ -164,6 +171,7 @@ function usage() {
|
|
|
164
171
|
[--kfd-product-gate-json <json-or-path>]...
|
|
165
172
|
[--invariant-passport-json <json-or-path>]...
|
|
166
173
|
[--invariant-passport-cmd <command>]
|
|
174
|
+
[--release-evidence-json <json-or-path>]...
|
|
167
175
|
[--github-artifact-attestation-policy-json <json-or-path>]...
|
|
168
176
|
[--kfd-agent-hub-evidence-json <json-or-path>]
|
|
169
177
|
[--base-passport-json <json-or-path>] [--require-base-kfd]
|
|
@@ -294,6 +302,20 @@ function usage() {
|
|
|
294
302
|
[--registry-output <file>] [--source-bundle <file>]
|
|
295
303
|
[--no-source-bundle] [--json]
|
|
296
304
|
buildchain publication-artifact npm-package [--cwd <dir>] [--output-dir <dir>] [--package-name <name>] [--json]
|
|
305
|
+
buildchain publication-artifact reproducibility [--cwd <dir>] [--source-sha <sha>]
|
|
306
|
+
[--output <file>] [--promote]
|
|
307
|
+
[--no-toolchain-pull]
|
|
308
|
+
[--allow-unpinned-toolchain] [--json]
|
|
309
|
+
buildchain paper scaffold --package <name> --repository <owner/repo> [--write] [--json]
|
|
310
|
+
buildchain paper migrate [--cwd <dir>] [--write] [--json]
|
|
311
|
+
buildchain paper preflight [--cwd <dir>] [--offline] [--json]
|
|
312
|
+
buildchain paper bootstrap npm [--cwd <dir>] [--execute]
|
|
313
|
+
[--confirm-public-package <name>] [--json]
|
|
314
|
+
buildchain paper build [--cwd <dir>] [--execute] [--json]
|
|
315
|
+
buildchain paper alpha [--cwd <dir>] [--source-ref <ref>] [--target-ref <ref>]
|
|
316
|
+
[--execute] [--json]
|
|
317
|
+
buildchain paper status [--cwd <dir>] [--json]
|
|
318
|
+
buildchain paper resume [--cwd <dir>] [--buildchain-ref <ref>] [--execute] [--json]
|
|
297
319
|
buildchain release-propagation <plan|write-lock> ...
|
|
298
320
|
buildchain badges readme [--cwd <dir>] [--readme <path>] [--check] [--write] [--json]
|
|
299
321
|
buildchain badges bundle [--cwd <dir>] [--readme <path>] [--claims <csv>] [--check] [--write] [--json]
|
|
@@ -329,6 +351,8 @@ Examples:
|
|
|
329
351
|
buildchain infra-contract --mode propagation-apply --propagation-plan <plan.json> --dry-run true
|
|
330
352
|
buildchain infra-contract --mode evidence-bundle --artifact <artifact.json> --propagation-result <result.json>
|
|
331
353
|
buildchain publication-artifact manifest --source-sha <sha> --json
|
|
354
|
+
buildchain paper preflight --json
|
|
355
|
+
buildchain paper status --json
|
|
332
356
|
buildchain release-propagation plan --graph graph.json --upstream-release release.json --json
|
|
333
357
|
buildchain kfd status --json
|
|
334
358
|
buildchain kfd schema list --json
|
|
@@ -1456,8 +1480,7 @@ async function runProcessTreeSample(sampleArgs = []) {
|
|
|
1456
1480
|
return report;
|
|
1457
1481
|
}
|
|
1458
1482
|
|
|
1459
|
-
async function
|
|
1460
|
-
const [command, ...args] = argv;
|
|
1483
|
+
async function runRegisteredCommand(command, args) {
|
|
1461
1484
|
if (!command || command === "-h" || command === "--help" || command === "help") {
|
|
1462
1485
|
process.stdout.write(usage());
|
|
1463
1486
|
return;
|
|
@@ -1814,10 +1837,25 @@ async function main(argv = process.argv.slice(2)) {
|
|
|
1814
1837
|
runPublicationPackageCli(args.slice(1));
|
|
1815
1838
|
return;
|
|
1816
1839
|
}
|
|
1840
|
+
if (args[0] === "reproducibility" || args[0] === "reproducible") {
|
|
1841
|
+
runPublicationReproducibilityCli(args.slice(1));
|
|
1842
|
+
return;
|
|
1843
|
+
}
|
|
1817
1844
|
runPublicationArtifactCli(args);
|
|
1818
1845
|
return;
|
|
1819
1846
|
}
|
|
1820
1847
|
|
|
1848
|
+
if (command === "paper") {
|
|
1849
|
+
await runPaperCli(args, {
|
|
1850
|
+
buildchainRoot: root,
|
|
1851
|
+
buildchainVersion: packageVersion(),
|
|
1852
|
+
buildchainRef: process.env.BUILDCHAIN_RUNTIME_REF || "v3",
|
|
1853
|
+
buildchainSha:
|
|
1854
|
+
process.env.BUILDCHAIN_RUNTIME_SHA || embeddedSourceSha || "",
|
|
1855
|
+
});
|
|
1856
|
+
return;
|
|
1857
|
+
}
|
|
1858
|
+
|
|
1821
1859
|
if (command === "release-propagation") {
|
|
1822
1860
|
runReleasePropagationCli(args);
|
|
1823
1861
|
return;
|
|
@@ -1886,6 +1924,22 @@ async function main(argv = process.argv.slice(2)) {
|
|
|
1886
1924
|
throw new Error(`unsupported buildchain command: ${command}`);
|
|
1887
1925
|
}
|
|
1888
1926
|
|
|
1927
|
+
const BUILDCHAIN_COMMAND_HANDLERS = Object.freeze(Object.fromEntries(
|
|
1928
|
+
BUILDCHAIN_COMMAND_REGISTRY.map((entry) => [
|
|
1929
|
+
entry.id,
|
|
1930
|
+
(args) => runRegisteredCommand(entry.id, args),
|
|
1931
|
+
]),
|
|
1932
|
+
));
|
|
1933
|
+
|
|
1934
|
+
async function main(argv = process.argv.slice(2)) {
|
|
1935
|
+
const [command = "help", ...args] = argv;
|
|
1936
|
+
return dispatchRegisteredCommand({
|
|
1937
|
+
command,
|
|
1938
|
+
args,
|
|
1939
|
+
handlers: BUILDCHAIN_COMMAND_HANDLERS,
|
|
1940
|
+
});
|
|
1941
|
+
}
|
|
1942
|
+
|
|
1889
1943
|
main().catch((error) => {
|
|
1890
1944
|
console.error(`buildchain: ${error.message}`);
|
|
1891
1945
|
process.exitCode = 1;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
const BUILDCHAIN_COMMAND_REGISTRY = Object.freeze([
|
|
2
|
+
{ id: "help", aliases: ["-h", "--help"] },
|
|
3
|
+
{ id: "version", aliases: ["-v", "--version"] },
|
|
4
|
+
{ id: "layout", aliases: [] },
|
|
5
|
+
{ id: "portable-cache", aliases: [] },
|
|
6
|
+
{ id: "candidate", aliases: [] },
|
|
7
|
+
{ id: "init", aliases: [] },
|
|
8
|
+
{ id: "validate", aliases: [] },
|
|
9
|
+
{ id: "doctor", aliases: [] },
|
|
10
|
+
{ id: "dev", aliases: [] },
|
|
11
|
+
{ id: "log", aliases: [] },
|
|
12
|
+
{ id: "diagnostics", aliases: [] },
|
|
13
|
+
{ id: "facts", aliases: [] },
|
|
14
|
+
{ id: "kfd", aliases: [] },
|
|
15
|
+
{ id: "sample", aliases: [] },
|
|
16
|
+
{ id: "mark", aliases: [] },
|
|
17
|
+
{ id: "span", aliases: [] },
|
|
18
|
+
{ id: "lifecycle", aliases: [] },
|
|
19
|
+
{ id: "npm", aliases: [] },
|
|
20
|
+
{ id: "audit", aliases: [] },
|
|
21
|
+
{ id: "collect", aliases: [] },
|
|
22
|
+
{ id: "create", aliases: [] },
|
|
23
|
+
{ id: "explain", aliases: [] },
|
|
24
|
+
{ id: "inspect", aliases: [] },
|
|
25
|
+
{ id: "project", aliases: [] },
|
|
26
|
+
{ id: "release", aliases: [] },
|
|
27
|
+
{ id: "transaction", aliases: [] },
|
|
28
|
+
{ id: "verify", aliases: [] },
|
|
29
|
+
{ id: "web-surface", aliases: [] },
|
|
30
|
+
{ id: "infra-contract", aliases: [] },
|
|
31
|
+
{ id: "publication-artifact", aliases: ["publication"] },
|
|
32
|
+
{ id: "paper", aliases: [] },
|
|
33
|
+
{ id: "release-propagation", aliases: [] },
|
|
34
|
+
{ id: "release-governance", aliases: [] },
|
|
35
|
+
{ id: "github-governance", aliases: [] },
|
|
36
|
+
{ id: "badges", aliases: [] },
|
|
37
|
+
{ id: "homebrew", aliases: [] },
|
|
38
|
+
{ id: "build-contract", aliases: [] },
|
|
39
|
+
{ id: "publish-source", aliases: [] },
|
|
40
|
+
]);
|
|
41
|
+
|
|
42
|
+
function buildCommandLookup(registry = BUILDCHAIN_COMMAND_REGISTRY) {
|
|
43
|
+
const lookup = new Map();
|
|
44
|
+
for (const entry of registry) {
|
|
45
|
+
for (const name of [entry.id, ...entry.aliases]) {
|
|
46
|
+
if (lookup.has(name)) {
|
|
47
|
+
throw new Error(
|
|
48
|
+
`duplicate Buildchain CLI command registration: ${name}`,
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
lookup.set(name, entry);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return lookup;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const BUILDCHAIN_COMMAND_LOOKUP = buildCommandLookup();
|
|
58
|
+
|
|
59
|
+
function resolveBuildchainCommand(command) {
|
|
60
|
+
return BUILDCHAIN_COMMAND_LOOKUP.get(command || "help");
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function dispatchRegisteredCommand({ command, args = [], handlers }) {
|
|
64
|
+
const registration = resolveBuildchainCommand(command);
|
|
65
|
+
if (!registration) {
|
|
66
|
+
throw new Error(`unsupported buildchain command: ${command}`);
|
|
67
|
+
}
|
|
68
|
+
const handler = handlers?.[registration.id];
|
|
69
|
+
if (typeof handler !== "function") {
|
|
70
|
+
throw new Error(
|
|
71
|
+
`Buildchain CLI command has no registered handler: ${registration.id}`,
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
return handler(args, { command, registration });
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export {
|
|
78
|
+
BUILDCHAIN_COMMAND_REGISTRY,
|
|
79
|
+
buildCommandLookup,
|
|
80
|
+
dispatchRegisteredCommand,
|
|
81
|
+
resolveBuildchainCommand,
|
|
82
|
+
};
|
|
@@ -202,6 +202,7 @@ async function dispatchTrustReleaseCommand({ command, args, runScript, packageVe
|
|
|
202
202
|
kfdProductGateJsons: readRepeatedFlag(collectArgs, "kfd-product-gate-json"),
|
|
203
203
|
invariantPassportJsons: readRepeatedFlag(collectArgs, "invariant-passport-json"),
|
|
204
204
|
invariantPassportCommand: readFlag(collectArgs, "invariant-passport-cmd", ""),
|
|
205
|
+
releaseEvidenceJsons: readRepeatedFlag(collectArgs, "release-evidence-json"),
|
|
205
206
|
githubArtifactAttestationPolicyJsons: readRepeatedFlag(
|
|
206
207
|
collectArgs,
|
|
207
208
|
"github-artifact-attestation-policy-json",
|