@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.
Files changed (127) hide show
  1. package/AGENTS.md +1 -1
  2. package/CONTRIBUTING.md +1 -1
  3. package/README.md +27 -1
  4. package/actions/promote-buildchain-ref/README.md +90 -19
  5. package/actions/report-buildchain-issue/README.md +20 -2
  6. package/actions/run-lifecycle/README.md +5 -0
  7. package/actions/validate-config/README.md +19 -1
  8. package/bin/buildchain.mjs +56 -2
  9. package/bin/internal/command-registry.mjs +82 -0
  10. package/bin/internal/trust-release-cli.mjs +1 -0
  11. package/contracts/auditable-demo-media-profiles-v1.json +116 -1
  12. package/contracts/buildchain-v2-residuals-v1.json +146 -0
  13. package/contracts/evidence/auditable-demo-responsive-web-delivery-v1.json +143 -0
  14. package/contracts/evidence/auditable-demo-web-delivery-v1.json +7 -3
  15. package/contracts/fixtures/auditable-demo-responsive-web-delivery-v1/complete-transcript.txt +2 -0
  16. package/contracts/fixtures/auditable-demo-responsive-web-delivery-v1/public-projection.json +16 -0
  17. package/contracts/fixtures/auditable-demo-responsive-web-delivery-v1/scene.json +12 -0
  18. package/dist/site/buildchain-contract.json +188 -46
  19. package/dist/site/buildchain-site.json +181 -90
  20. package/dist/site/capability-registry.json +5 -5
  21. package/dist/site/cli-registry.json +860 -98
  22. package/dist/site/controller-registry.json +118 -5
  23. package/dist/site/kfd-claims.json +233 -19
  24. package/dist/site/kfd-upstream-aggregate.json +1 -1
  25. package/dist/site/manual-registry.json +20 -20
  26. package/dist/site/node-api-registry.json +374 -59
  27. package/dist/site/page-registry.json +156 -65
  28. package/dist/site/public-surface-audit.json +231 -22
  29. package/dist/site/publication-registry.json +4 -4
  30. package/dist/site/release-provenance.json +3 -0
  31. package/dist/site/site-manifest.json +24 -24
  32. package/dist/site/workflow-registry.json +575 -79
  33. package/docs/MAP.md +22 -4
  34. package/docs/auditable-demo.md +54 -13
  35. package/docs/aws-us-elastic-runner-burst-plane.md +381 -0
  36. package/docs/cli.md +119 -12
  37. package/docs/consumer-issue-reporting.md +20 -2
  38. package/docs/dev-alpha-candidate-patrol.md +24 -10
  39. package/docs/github-governance-authority.md +24 -31
  40. package/docs/lifecycle-protocol.md +20 -2
  41. package/docs/migration-inventory.md +24 -5
  42. package/docs/observed-evidence-patrol.md +28 -12
  43. package/docs/ownership.md +19 -1
  44. package/docs/publication-artifacts.md +158 -18
  45. package/docs/publication-authority.md +4 -4
  46. package/docs/publish-transaction.md +78 -31
  47. package/docs/release-candidate.md +24 -0
  48. package/docs/release-flow.md +50 -32
  49. package/docs/release-governance.md +39 -32
  50. package/docs/release-passport.md +4 -0
  51. package/docs/release-propagation.md +57 -12
  52. package/docs/reusable-build-surface.md +218 -90
  53. package/docs/runtime-train-validation.md +20 -2
  54. package/docs/shifu-gate-profiles.md +7 -1
  55. package/docs/stable-candidate-patrol.md +6 -6
  56. package/docs/toolkit-observability.md +22 -0
  57. package/docs/versioning.md +46 -24
  58. package/docs/web-surface-deployments.md +82 -1
  59. package/package.json +7 -5
  60. package/packages/core/README.md +60 -4
  61. package/packages/core/artifact-signing.js +1 -0
  62. package/packages/core/buildchain-contract.js +9 -4
  63. package/packages/core/cache-evidence.js +1 -0
  64. package/packages/core/controller-evidence.js +2 -0
  65. package/packages/core/diagnostics.js +105 -30
  66. package/packages/core/github-governance-authority.js +25 -17
  67. package/packages/core/index.js +40 -0
  68. package/packages/core/paper.js +3226 -0
  69. package/packages/core/public-surface-audit.js +3 -0
  70. package/packages/core/publication-artifact.js +1 -6
  71. package/packages/core/publication-authority.js +1 -0
  72. package/packages/core/publication-control-plane-audit.js +28 -0
  73. package/packages/core/publication-reproducibility.js +947 -0
  74. package/packages/core/publication-sealed-bundle.js +190 -0
  75. package/packages/core/publish-transaction.js +147 -17
  76. package/packages/core/release-candidate.js +234 -0
  77. package/packages/core/release-passport.js +519 -228
  78. package/packages/core/release-propagation.js +175 -1
  79. package/packages/core/stable-release-gate.js +4 -1
  80. package/scripts/artifact-signing-delegation.mjs +268 -0
  81. package/scripts/audit-github-governance.mjs +32 -13
  82. package/scripts/audit-publication-control-plane.mjs +17 -8
  83. package/scripts/auditable-demo.mjs +266 -7
  84. package/scripts/aws-codebuild-toolchain.mjs +285 -0
  85. package/scripts/aws-macos-jit-core.mjs +378 -0
  86. package/scripts/aws-macos-jit.mjs +123 -0
  87. package/scripts/aws-runner-burst-core.mjs +248 -0
  88. package/scripts/aws-runner-burst.mjs +79 -0
  89. package/scripts/aws-windows-jit-core.mjs +374 -0
  90. package/scripts/aws-windows-jit.mjs +121 -0
  91. package/scripts/build-contract-core.mjs +69 -6
  92. package/scripts/build-standalone-binary.mjs +23 -0
  93. package/scripts/buildchain-contract-lock.mjs +1 -1
  94. package/scripts/buildchain-patrol.mjs +1 -1
  95. package/scripts/check-internal-architecture.mjs +69 -2
  96. package/scripts/check-inventory.mjs +70 -2
  97. package/scripts/check-javascript-syntax.mjs +31 -0
  98. package/scripts/check-maintainability.mjs +371 -0
  99. package/scripts/compiler-cache-evidence.mjs +221 -0
  100. package/scripts/dev-alpha-candidate-patrol.mjs +288 -43
  101. package/scripts/dispatch-artifact-signing-authority.mjs +7 -1
  102. package/scripts/finalize-native-artifact-signing-result.mjs +185 -31
  103. package/scripts/gate-profile-core.mjs +6 -1
  104. package/scripts/generate-channel-promotion-workflow.mjs +3 -12
  105. package/scripts/generate-release-candidate-passport.mjs +4 -0
  106. package/scripts/generate-site-bundle.mjs +84 -18
  107. package/scripts/import-artifact-signing-results.mjs +64 -5
  108. package/scripts/inspect-artifact-signing-requests.mjs +52 -14
  109. package/scripts/maintainability-metrics.mjs +339 -0
  110. package/scripts/npm-publish-transaction.mjs +57 -6
  111. package/scripts/observed-evidence.mjs +151 -33
  112. package/scripts/paper.mjs +645 -0
  113. package/scripts/promotion-channel-router.mjs +16 -4
  114. package/scripts/publication-reproducibility.mjs +62 -0
  115. package/scripts/reconcile-github-governance.mjs +8 -1
  116. package/scripts/release-propagation.mjs +39 -0
  117. package/scripts/resolve-artifact-signing-upload-route.mjs +55 -0
  118. package/scripts/resolve-build-contract.mjs +6 -0
  119. package/scripts/route-offline-runners.mjs +236 -0
  120. package/scripts/run-candidate-body-prefix-renderer.mjs +187 -0
  121. package/scripts/run-lifecycle-core.mjs +62 -1
  122. package/scripts/runtime-ref-core.mjs +36 -4
  123. package/scripts/seal-artifact-signing-requests.mjs +64 -12
  124. package/scripts/stable-candidate-qualification.mjs +50 -0
  125. package/scripts/verify-artifact-signing-results.mjs +26 -1
  126. package/scripts/web-surface-core.mjs +272 -86
  127. 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 the v2.12 alpha evaluation window, canaries call the same router through
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/v2/v2.3/<capability>` and ask consumers to run trusted
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 active GitHub Action surface is deliberately small:
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/v2/v2.0` creates or reuses the next exact prerelease tag such as
7
- `v2.0.1-alpha.0`, writes that version into package version state, points the
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
- `v2.0-alpha` and, when this is the highest published alpha minor, `v3-alpha`;
10
- - `release/v2/v2.0` creates or reuses the next exact release tag such as
11
- `v2.0.0`, writes that version into package version state, points the release
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 `v2.0.1-alpha.0` and
14
- points the alpha/dev channel branches plus `v2.0-alpha` at that prerelease
15
- commit, and moves `v3-alpha` only if no higher v2 minor has published an alpha;
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/v2/v2.0`, writes the next major production version such as
18
- `v3.0.0`, points `publish-gate/major`, `release/v3/v3.0`, `v3.0`, and `v3`
19
- at that release commit, then prepares `v3.0.1-alpha.0` for
20
- `alpha/v3/v3.0`, `dev/v3/v3.0`, `v3.0-alpha`, and `v3-alpha`. The older `major-gate`
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/v2/v2.1` creates `v2.1.N`, promotes `v2.1`, and promotes `v2` only
25
- when the next minor tag such as `v2.2` does not already exist.
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/v2/v2.0
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 `v2.0` and `v2`, and floating alpha
450
- tags are minor-line tags such as `v2.0-alpha` plus cross-minor major tags such
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 `v2.0-alpha` and `v3-alpha`,
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 || 'v2' }}
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/v2/v2.4
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 v2 action for validating `buildchain.toml` without running lifecycle
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
@@ -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 main(argv = process.argv.slice(2)) {
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",