@kungfu-tech/buildchain 4.0.2-alpha.43 → 4.0.2-alpha.45

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 (40) hide show
  1. package/architecture/maintainability-debt.json +18 -19
  2. package/architecture/maintainability-policy.json +4 -4
  3. package/architecture/v4-release-topology.json +9 -6
  4. package/architecture/v4-universal-workflow-train-admission.json +1 -1
  5. package/dist/site/buildchain-contract.json +7 -7
  6. package/dist/site/buildchain-site.json +50 -14
  7. package/dist/site/capability-registry.json +2 -2
  8. package/dist/site/kfd-claims.json +29 -5
  9. package/dist/site/kfd-upstream-aggregate.json +1 -1
  10. package/dist/site/manual-registry.json +3 -3
  11. package/dist/site/node-api-registry.json +154 -13
  12. package/dist/site/page-registry.json +43 -7
  13. package/dist/site/public-surface-audit.json +7 -3
  14. package/dist/site/publication-authority-registry.json +5 -17
  15. package/dist/site/publication-registry.json +4 -4
  16. package/dist/site/release-provenance.json +2 -1
  17. package/dist/site/site-manifest.json +7 -7
  18. package/dist/site/workflow-registry.json +5 -5
  19. package/docs/MAP.md +1 -0
  20. package/docs/cli.md +3 -0
  21. package/docs/node-api-reference.md +21 -10
  22. package/docs/oci-publication.md +82 -0
  23. package/package.json +3 -2
  24. package/packages/core/buildchain-v4-domain.wasm +0 -0
  25. package/packages/core/oci-publication-bundle.js +241 -0
  26. package/packages/core/paper-agent-entry.js +26 -2
  27. package/packages/core/paper.js +4 -4
  28. package/packages/core/release-tail-product-capabilities.js +9 -0
  29. package/packages/core/v4-canonical-contracts.js +1 -0
  30. package/packages/core/v4-domain-wasm-artifact.js +2 -2
  31. package/scripts/check-v4-release-topology.mjs +14 -4
  32. package/scripts/generate-channel-promotion-workflow.mjs +2 -19
  33. package/scripts/generate-v4-universal-workflow-facades.mjs +8 -2
  34. package/scripts/publication-candidate-kind.mjs +92 -0
  35. package/scripts/publication-candidate-sealer.mjs +9 -0
  36. package/scripts/release-candidate-resolver.mjs +6 -17
  37. package/scripts/resume-from-candidate-run.mjs +10 -17
  38. package/scripts/site-capability-metadata.mjs +1 -0
  39. package/scripts/v4-product-publication-intent.mjs +1 -1
  40. package/scripts/v4-universal-workflow-engine.mjs +2 -0
@@ -6,7 +6,7 @@
6
6
  "cliCommandCount": 117,
7
7
  "workflowCount": 114,
8
8
  "actionCount": 8,
9
- "sitePageCount": 87,
9
+ "sitePageCount": 88,
10
10
  "docCommandRefCount": 1050,
11
11
  "failureCount": 0
12
12
  },
@@ -5518,6 +5518,10 @@
5518
5518
  "id": "manual:observed-evidence-patrol",
5519
5519
  "category": "manual"
5520
5520
  },
5521
+ {
5522
+ "id": "manual:oci-publication",
5523
+ "category": "manual"
5524
+ },
5521
5525
  {
5522
5526
  "id": "manual:ownership",
5523
5527
  "category": "manual"
@@ -10929,8 +10933,8 @@
10929
10933
  "workflowRegistryPath": "dist/site/workflow-registry.json",
10930
10934
  "pageRegistryPath": "dist/site/page-registry.json",
10931
10935
  "cliRegistryDigest": "fbc23073bbae240489a2f826b2c26daadc58e704050c5f8df366509f5c5a1c3e",
10932
- "workflowRegistryDigest": "b3235d2cfb6220c9f349cfaffa8a1f1309444798266a70e2fd020effc3f11ff2",
10933
- "pageRegistryDigest": "48da222775d48a130d729ea7951446259b5cd4db7d4c0bd3234a02f77d5719d9"
10936
+ "workflowRegistryDigest": "e1bacd3ffb652ab8ef5c62986c4048d618e28ff43d4d03b61827adcce0e027be",
10937
+ "pageRegistryDigest": "178bc7609c831a63cecdb5baa817672a53393bb7d40f43b25fc8a736d94e2e9d"
10934
10938
  },
10935
10939
  "comparison": {
10936
10940
  "missingCliRegistry": [],
@@ -1356,10 +1356,7 @@
1356
1356
  },
1357
1357
  {
1358
1358
  "path": ".github/workflows/.release-candidate-promote.yml",
1359
- "signals": [
1360
- "write-permission",
1361
- "oidc"
1362
- ],
1359
+ "signals": [],
1363
1360
  "classified": true
1364
1361
  },
1365
1362
  {
@@ -1374,10 +1371,7 @@
1374
1371
  },
1375
1372
  {
1376
1373
  "path": ".github/workflows/.release-promote.yml",
1377
- "signals": [
1378
- "write-permission",
1379
- "oidc"
1380
- ],
1374
+ "signals": [],
1381
1375
  "classified": true
1382
1376
  },
1383
1377
  {
@@ -1723,10 +1717,7 @@
1723
1717
  },
1724
1718
  {
1725
1719
  "path": ".github/workflows/public-release-promote.yml",
1726
- "signals": [
1727
- "write-permission",
1728
- "oidc"
1729
- ],
1720
+ "signals": [],
1730
1721
  "classified": true
1731
1722
  },
1732
1723
  {
@@ -1768,10 +1759,7 @@
1768
1759
  },
1769
1760
  {
1770
1761
  "path": ".github/workflows/release-candidate-promote.yml",
1771
- "signals": [
1772
- "write-permission",
1773
- "oidc"
1774
- ],
1762
+ "signals": [],
1775
1763
  "classified": true
1776
1764
  },
1777
1765
  {
@@ -2021,5 +2009,5 @@
2021
2009
  "classified": true
2022
2010
  }
2023
2011
  ],
2024
- "registryDigest": "894cce314366698d41a3ab20172a0b7a05f03f2167667eae51793537b832c811"
2012
+ "registryDigest": "9c343ae9f9e778b608317d973b02cada327bd31e5149482d7f385b173c20ec14"
2025
2013
  }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "contract": "kungfu-buildchain-publication-release-registry",
4
- "generatedAt": "2026-09-06T12:32:13.000Z",
5
- "publishedAt": "2026-09-06T12:32:13.000Z",
4
+ "generatedAt": "2026-09-06T14:38:45.000Z",
5
+ "publishedAt": "2026-09-06T14:38:45.000Z",
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": "2c34aaf899b3921588f53023b350565b63914dce",
22
+ "sourceRevision": "7f41a21e534d41655d1c956bdc688e3167c2d340",
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": "4.0.2-alpha.43",
35
+ "version": "4.0.2-alpha.45",
36
36
  "versionSource": "package.json#version"
37
37
  },
38
38
  "sourceKind": "package-site-bundle",
@@ -120,7 +120,8 @@
120
120
  "./site/product-mechanism.json": "./dist/site/product-mechanism.json",
121
121
  "./site/release-provenance.json": "./dist/site/release-provenance.json",
122
122
  "./site/agent-index.json": "./dist/site/agent-index.json",
123
- "./package.json": "./package.json"
123
+ "./package.json": "./package.json",
124
+ "./oci-publication": "./packages/core/oci-publication-bundle.js"
124
125
  }
125
126
  },
126
127
  "repository": "https://github.com/kungfu-systems/buildchain",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "contract": "kungfu-buildchain-site-manifest",
4
- "generatedAt": "2026-09-06T12:32:13.000Z",
5
- "publishedAt": "2026-09-06T12:32:13.000Z",
4
+ "generatedAt": "2026-09-06T14:38:45.000Z",
5
+ "publishedAt": "2026-09-06T14:38:45.000Z",
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": "2c34aaf899b3921588f53023b350565b63914dce",
22
+ "sourceRevision": "7f41a21e534d41655d1c956bdc688e3167c2d340",
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": "4.0.2-alpha.43",
40
+ "version": "4.0.2-alpha.45",
41
41
  "versionSource": "package.json#version"
42
42
  },
43
43
  "entrypoint": "buildchain-site.json",
@@ -53,7 +53,7 @@
53
53
  "path": "docs/MAP.md",
54
54
  "plane": "use",
55
55
  "exists": true,
56
- "digest": "sha256:aef677bb3e37882f73daf65b7052989fc549e3b40d70bc4036beb2738b608345"
56
+ "digest": "sha256:af7bee38e21a9ada99e1731f3576733f2897f9d19bdbf39eb2781650095ae419"
57
57
  },
58
58
  {
59
59
  "id": "getting-started",
@@ -237,7 +237,7 @@
237
237
  "path": "docs/cli.md",
238
238
  "plane": "use",
239
239
  "exists": true,
240
- "digest": "sha256:cd4e6144d45f4f01b733a728695a9f22acdd7124bd4aba18c6b0146d27f57c44"
240
+ "digest": "sha256:fc2e0cd3f5718e05101d85f6363cefcd2336609c05dd6626b6a062b44c3a1a0d"
241
241
  },
242
242
  {
243
243
  "id": "cli-reference",
@@ -253,7 +253,7 @@
253
253
  "path": "docs/node-api-reference.md",
254
254
  "plane": "use",
255
255
  "exists": true,
256
- "digest": "sha256:df79569e33023c30fe010a88acecb45caf769970cda1e83c5fc2657986fa9e33"
256
+ "digest": "sha256:48232d47023b85063e7f779f053850e38149359ea3b2a5acd5126ff81f423ff4"
257
257
  },
258
258
  {
259
259
  "id": "build-facts",
@@ -2746,7 +2746,7 @@
2746
2746
  "status": "preview",
2747
2747
  "owner": "buildchain-workflows",
2748
2748
  "maturity": "preview",
2749
- "introducedVersion": "4.0.2-alpha.43",
2749
+ "introducedVersion": "4.0.2-alpha.45",
2750
2750
  "compatibilityPromise": "preserved-through-the-v3-major-line",
2751
2751
  "deprecationReplacement": "",
2752
2752
  "sunsetCondition": "explicit-breaking-change-review-in-a-future-major-line",
@@ -3943,7 +3943,7 @@
3943
3943
  "status": "preview",
3944
3944
  "owner": "buildchain-workflows",
3945
3945
  "maturity": "preview",
3946
- "introducedVersion": "4.0.2-alpha.43",
3946
+ "introducedVersion": "4.0.2-alpha.45",
3947
3947
  "compatibilityPromise": "preserved-through-the-v3-major-line",
3948
3948
  "deprecationReplacement": "",
3949
3949
  "sunsetCondition": "explicit-breaking-change-review-in-a-future-major-line",
@@ -5970,7 +5970,7 @@
5970
5970
  "status": "preview",
5971
5971
  "owner": "buildchain-workflows",
5972
5972
  "maturity": "preview",
5973
- "introducedVersion": "4.0.2-alpha.43",
5973
+ "introducedVersion": "4.0.2-alpha.45",
5974
5974
  "compatibilityPromise": "preserved-through-the-v3-major-line",
5975
5975
  "deprecationReplacement": "",
5976
5976
  "sunsetCondition": "explicit-breaking-change-review-in-a-future-major-line",
@@ -6001,7 +6001,7 @@
6001
6001
  "status": "preview",
6002
6002
  "owner": "buildchain-workflows",
6003
6003
  "maturity": "preview",
6004
- "introducedVersion": "4.0.2-alpha.43",
6004
+ "introducedVersion": "4.0.2-alpha.45",
6005
6005
  "compatibilityPromise": "preserved-through-the-v3-major-line",
6006
6006
  "deprecationReplacement": "",
6007
6007
  "sunsetCondition": "explicit-breaking-change-review-in-a-future-major-line",
@@ -6032,7 +6032,7 @@
6032
6032
  "status": "preview",
6033
6033
  "owner": "buildchain-workflows",
6034
6034
  "maturity": "preview",
6035
- "introducedVersion": "4.0.2-alpha.43",
6035
+ "introducedVersion": "4.0.2-alpha.45",
6036
6036
  "compatibilityPromise": "preserved-through-the-v3-major-line",
6037
6037
  "deprecationReplacement": "",
6038
6038
  "sunsetCondition": "explicit-breaking-change-review-in-a-future-major-line",
package/docs/MAP.md CHANGED
@@ -38,6 +38,7 @@ running artifact), *use* (consume / extend) - and a **status**:
38
38
  | CLI operator or agent | [Generated CLI Reference](cli-reference.md) | [CLI guide](cli.md) for concepts and worked examples |
39
39
  | Node toolkit developer | [Generated Node API Reference](node-api-reference.md) | [Core package guide](../packages/core/README.md) for recipes |
40
40
  | Workflow contributor | [Workflow Catalog](workflow-catalog.md) | [Contribution rules](../CONTRIBUTING.md#workflow-organization) and the [exact registry](../architecture/workflow-taxonomy.json) |
41
+ | Container image publisher | [OCI image family publication](oci-publication.md) | [Release Flow](release-flow.md) and [Runtime Train Validation](runtime-train-validation.md) |
41
42
  | Build/release operator | [Reusable Build Surface](reusable-build-surface.md) | [Release Flow](release-flow.md) and [Release Passport](release-passport.md) |
42
43
  | Product/trust reviewer | [Product Mechanism](product-mechanism.md) | [Release Passport](release-passport.md) and [KFD Support](kfd-support.md) |
43
44
 
package/docs/cli.md CHANGED
@@ -169,6 +169,9 @@ The safety and authority boundary is explicit:
169
169
  and verify callers use `@v4-alpha`; release callers select `@v4-alpha` for
170
170
  Alpha and `@v4` for stable releases. Both channel contract locks and their
171
171
  distinct resolved source coordinates are bound into provisioning authority.
172
+ Verify callers grant the reusable Check workflow its required read permissions.
173
+ Paper agent guidance resolves next-development scripts from the installed
174
+ Buildchain package and links to the upstream transition ADR.
172
175
  Migration reads the other channel from its fetched Git tag. Installed-package
173
176
  operators can supply `--stable-buildchain-root` or `--alpha-buildchain-root`
174
177
  pointing to the corresponding exact source checkout instead.
@@ -2325,11 +2325,11 @@ Target: `./packages/core/paper.js`. Public symbols: 48.
2325
2325
 
2326
2326
  | Symbol | Kind and signature | Parameters | Return | Errors | Side effects | Example | Source |
2327
2327
  | --- | --- | --- | --- | --- | --- | --- | --- |
2328
- | `collectPaperAgentEntry` | function: function collectPaperAgentEntry({ cwd = process.cwd(), buildchainSha = "", mode = "contract", env = process.env, runtimeAdmission, } = {}) | { cwd = process.cwd(), buildchainSha = "", mode = "contract", env = process.env, runtimeAdmission, } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { collectPaperAgentEntry } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-agent-entry.js:255` |
2328
+ | `collectPaperAgentEntry` | function: function collectPaperAgentEntry({ cwd = process.cwd(), buildchainSha = "", mode = "contract", env = process.env, runtimeAdmission, } = {}) | { cwd = process.cwd(), buildchainSha = "", mode = "contract", env = process.env, runtimeAdmission, } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { collectPaperAgentEntry } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-agent-entry.js:279` |
2329
2329
  | `collectPaperFleetAudit` | function: function collectPaperFleetAudit({ root = process.cwd(), repositories = [], buildchainRoot = process.cwd(), buildchainVersion = "", buildchainSha = "", governance = {}, } = {}) | { root = process.cwd(), repositories = [], buildchainRoot = process.cwd(), buildchainVersion = "", buildchainSha = "", governance = {}, } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { collectPaperFleetAudit } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-fleet.js:158` |
2330
2330
  | `collectPaperPreflight` | function: function collectPaperPreflight({ cwd = process.cwd(), buildchainRoot = process.cwd(), buildchainVersion = "", buildchainRef = "v3", buildchainSha = "", registry = NPM_REGISTRY, offline = false, agentEntryMode = "contract", } = {}) | { cwd = process.cwd(), buildchainRoot = process.cwd(), buildchainVersion = "", buildchainRef = "v3", buildchainSha = "", registry = NPM_REGISTRY, offline = false, agentEntryMode = "contract", } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { collectPaperPreflight } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper.js:2025` |
2331
2331
  | `collectPaperStatus` | function: function collectPaperStatus({ cwd = process.cwd() } = {}) | { cwd = process.cwd() } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { collectPaperStatus } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper.js:1124` |
2332
- | `createPaperAgentEntry` | function: function createPaperAgentEntry({ buildchainVersion, buildchainSha, developmentRef, }) | { buildchainVersion, buildchainSha, developmentRef, } | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { createPaperAgentEntry } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-agent-entry.js:95` |
2332
+ | `createPaperAgentEntry` | function: function createPaperAgentEntry({ buildchainVersion, buildchainSha, developmentRef, }) | { buildchainVersion, buildchainSha, developmentRef, } | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { createPaperAgentEntry } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-agent-entry.js:101` |
2333
2333
  | `createPaperAlphaPlan` | function: function createPaperAlphaPlan({ cwd = process.cwd(), sourceRef = "", targetRef = "", } = {}) | { cwd = process.cwd(), sourceRef = "", targetRef = "", } = {} | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { createPaperAlphaPlan } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper.js:2267` |
2334
2334
  | `createPaperBuildPlan` | function: function createPaperBuildPlan({ cwd = process.cwd(), sourceSha = "", pullToolchain = true, } = {}) | { cwd = process.cwd(), sourceSha = "", pullToolchain = true, } = {} | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { createPaperBuildPlan } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper.js:2204` |
2335
2335
  | `createPaperProvisioningAuthority` | function: function createPaperProvisioningAuthority({ repository, packageName, buildchainVersion, buildchainSha, contractLock, buildWorkflow, verifyWorkflow, releaseWorkflow, agentEntry, agentInstructions, environment = "", }) | { repository, packageName, buildchainVersion, buildchainSha, contractLock, buildWorkflow, verifyWorkflow, releaseWorkflow, agentEntry, agentInstructions, environment = "", } | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { createPaperProvisioningAuthority } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper.js:511` |
@@ -2340,11 +2340,11 @@ Target: `./packages/core/paper.js`. Public symbols: 48.
2340
2340
  | `executePaperNpmBootstrap` | function: function executePaperNpmBootstrap(options = {}) | options = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | may-write-or-invoke-external-actions | `import { executePaperNpmBootstrap } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper.js:2452` |
2341
2341
  | `executePaperWorkStart` | function: function executePaperWorkStart(plan) | plan | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | may-write-or-invoke-external-actions | `import { executePaperWorkStart } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-work.js:169` |
2342
2342
  | `executePaperWorkSubmitPush` | function: function executePaperWorkSubmitPush(plan) | plan | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | may-write-or-invoke-external-actions | `import { executePaperWorkSubmitPush } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-work.js:357` |
2343
- | `mergePaperAgentEntryInstructions` | function: function mergePaperAgentEntryInstructions(current = "", { developmentRef }) | current = "", { developmentRef } | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { mergePaperAgentEntryInstructions } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-agent-entry.js:63` |
2344
- | `PAPER_AGENT_ENTRY_CONTRACT` | constant: const PAPER_AGENT_ENTRY_CONTRACT | none | value | Import does not declare a throw contract. | none-on-import | `import { PAPER_AGENT_ENTRY_CONTRACT } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-agent-entry.js:18` |
2345
- | `PAPER_AGENT_ENTRY_SCHEMA_VERSION` | constant: const PAPER_AGENT_ENTRY_SCHEMA_VERSION | none | value | Import does not declare a throw contract. | none-on-import | `import { PAPER_AGENT_ENTRY_SCHEMA_VERSION } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-agent-entry.js:19` |
2346
- | `PAPER_AGENT_ENTRY_SECTION_END` | constant: const PAPER_AGENT_ENTRY_SECTION_END | none | value | Import does not declare a throw contract. | none-on-import | `import { PAPER_AGENT_ENTRY_SECTION_END } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-agent-entry.js:22` |
2347
- | `PAPER_AGENT_ENTRY_SECTION_START` | constant: const PAPER_AGENT_ENTRY_SECTION_START | none | value | Import does not declare a throw contract. | none-on-import | `import { PAPER_AGENT_ENTRY_SECTION_START } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-agent-entry.js:20` |
2343
+ | `mergePaperAgentEntryInstructions` | function: function mergePaperAgentEntryInstructions(current = "", { developmentRef }) | current = "", { developmentRef } | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { mergePaperAgentEntryInstructions } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-agent-entry.js:69` |
2344
+ | `PAPER_AGENT_ENTRY_CONTRACT` | constant: const PAPER_AGENT_ENTRY_CONTRACT | none | value | Import does not declare a throw contract. | none-on-import | `import { PAPER_AGENT_ENTRY_CONTRACT } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-agent-entry.js:24` |
2345
+ | `PAPER_AGENT_ENTRY_SCHEMA_VERSION` | constant: const PAPER_AGENT_ENTRY_SCHEMA_VERSION | none | value | Import does not declare a throw contract. | none-on-import | `import { PAPER_AGENT_ENTRY_SCHEMA_VERSION } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-agent-entry.js:25` |
2346
+ | `PAPER_AGENT_ENTRY_SECTION_END` | constant: const PAPER_AGENT_ENTRY_SECTION_END | none | value | Import does not declare a throw contract. | none-on-import | `import { PAPER_AGENT_ENTRY_SECTION_END } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-agent-entry.js:28` |
2347
+ | `PAPER_AGENT_ENTRY_SECTION_START` | constant: const PAPER_AGENT_ENTRY_SECTION_START | none | value | Import does not declare a throw contract. | none-on-import | `import { PAPER_AGENT_ENTRY_SECTION_START } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-agent-entry.js:26` |
2348
2348
  | `PAPER_ALPHA_PLAN_CONTRACT` | constant: const PAPER_ALPHA_PLAN_CONTRACT | none | value | Import does not declare a throw contract. | none-on-import | `import { PAPER_ALPHA_PLAN_CONTRACT } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper.js:98` |
2349
2349
  | `PAPER_BUILD_PLAN_CONTRACT` | constant: const PAPER_BUILD_PLAN_CONTRACT | none | value | Import does not declare a throw contract. | none-on-import | `import { PAPER_BUILD_PLAN_CONTRACT } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper.js:97` |
2350
2350
  | `PAPER_FLEET_AUDIT_CONTRACT` | constant: const PAPER_FLEET_AUDIT_CONTRACT | none | value | Import does not declare a throw contract. | none-on-import | `import { PAPER_FLEET_AUDIT_CONTRACT } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-fleet.js:19` |
@@ -2361,13 +2361,13 @@ Target: `./packages/core/paper.js`. Public symbols: 48.
2361
2361
  | `PAPER_VISIBILITY_CONTRACT` | constant: const PAPER_VISIBILITY_CONTRACT | none | value | Import does not declare a throw contract. | none-on-import | `import { PAPER_VISIBILITY_CONTRACT } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper.js:100` |
2362
2362
  | `PAPER_WORK_START_PLAN_CONTRACT` | constant: const PAPER_WORK_START_PLAN_CONTRACT | none | value | Import does not declare a throw contract. | none-on-import | `import { PAPER_WORK_START_PLAN_CONTRACT } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-work.js:17` |
2363
2363
  | `PAPER_WORK_SUBMIT_PLAN_CONTRACT` | constant: const PAPER_WORK_SUBMIT_PLAN_CONTRACT | none | value | Import does not declare a throw contract. | none-on-import | `import { PAPER_WORK_SUBMIT_PLAN_CONTRACT } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-work.js:19` |
2364
- | `paperAgentEntryFiles` | function: function paperAgentEntryFiles({ cwd, buildchainVersion, buildchainSha, developmentRef = "", }) | { cwd, buildchainVersion, buildchainSha, developmentRef = "", } | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { paperAgentEntryFiles } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-agent-entry.js:152` |
2365
- | `paperAgentEntryInstructions` | function: function paperAgentEntryInstructions({ developmentRef }) | { developmentRef } | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { paperAgentEntryInstructions } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-agent-entry.js:38` |
2364
+ | `paperAgentEntryFiles` | function: function paperAgentEntryFiles({ cwd, buildchainVersion, buildchainSha, developmentRef = "", }) | { cwd, buildchainVersion, buildchainSha, developmentRef = "", } | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { paperAgentEntryFiles } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-agent-entry.js:176` |
2365
+ | `paperAgentEntryInstructions` | function: function paperAgentEntryInstructions({ developmentRef }) | { developmentRef } | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { paperAgentEntryInstructions } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-agent-entry.js:44` |
2366
2366
  | `paperFleetTransitionWorkspace` | function: function paperFleetTransitionWorkspace(workspaceText, lockText) | workspaceText, lockText | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { paperFleetTransitionWorkspace } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-fleet.js:290` |
2367
2367
  | `planPaperFleetUpdate` | function: function planPaperFleetUpdate(options = {}) | options = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { planPaperFleetUpdate } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-fleet.js:209` |
2368
2368
  | `planPaperMigration` | value: planPaperMigration | none | unknown | No narrower error contract was mechanically discoverable. | unknown | `import { planPaperMigration } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper.js:1` |
2369
2369
  | `planPaperScaffold` | value: planPaperScaffold | none | unknown | No narrower error contract was mechanically discoverable. | unknown | `import { planPaperScaffold } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper.js:1` |
2370
- | `resolvePaperBuildchainSha` | function: function resolvePaperBuildchainSha(buildchainRoot, buildchainSha = "") | buildchainRoot, buildchainSha = "" | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { resolvePaperBuildchainSha } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-agent-entry.js:181` |
2370
+ | `resolvePaperBuildchainSha` | function: function resolvePaperBuildchainSha(buildchainRoot, buildchainSha = "") | buildchainRoot, buildchainSha = "" | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { resolvePaperBuildchainSha } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-agent-entry.js:205` |
2371
2371
  | `resolvePaperRepository` | function: function resolvePaperRepository(cwd = process.cwd()) | cwd = process.cwd() | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { resolvePaperRepository } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-repository.js:133` |
2372
2372
  | `resolvePaperRuntimeGitSha` | function: function resolvePaperRuntimeGitSha(buildchainRoot, buildchainVersion = "") | buildchainRoot, buildchainVersion = "" | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { resolvePaperRuntimeGitSha } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper.js:253` |
2373
2373
  | `writePaperFleetUpdate` | function: function writePaperFleetUpdate(plan) | plan | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | may-write-or-invoke-external-actions | `import { writePaperFleetUpdate } from "@kungfu-tech/buildchain/paper";` | `packages/core/paper-fleet.js:271` |
@@ -2832,3 +2832,14 @@ Target: `./packages/core/buildchain-kfd-claims.js`. Public symbols: 10.
2832
2832
  | `createBuildchainKfdClaimRegistry` | function: function createBuildchainKfdClaimRegistry({ root = process.cwd(), sourceSha = "" } = {}) | { root = process.cwd(), sourceSha = "" } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { createBuildchainKfdClaimRegistry } from "@kungfu-tech/buildchain/buildchain-kfd-claims";` | `packages/core/buildchain-kfd-claims.js:510` |
2833
2833
  | `createBuildchainKfdSurfaceRegistry` | function: function createBuildchainKfdSurfaceRegistry({ root = process.cwd() } = {}) | { root = process.cwd() } = {} | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { createBuildchainKfdSurfaceRegistry } from "@kungfu-tech/buildchain/buildchain-kfd-claims";` | `packages/core/buildchain-kfd-claims.js:411` |
2834
2834
  | `createBuildchainPublicClaimDefinitions` | function: function createBuildchainPublicClaimDefinitions() | none | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { createBuildchainPublicClaimDefinitions } from "@kungfu-tech/buildchain/buildchain-kfd-claims";` | `packages/core/buildchain-kfd-claims.js:226` |
2835
+
2836
+ ## `@kungfu-tech/buildchain/oci-publication`
2837
+
2838
+ Target: `./packages/core/oci-publication-bundle.js`. Public symbols: 4.
2839
+
2840
+ | Symbol | Kind and signature | Parameters | Return | Errors | Side effects | Example | Source |
2841
+ | --- | --- | --- | --- | --- | --- | --- | --- |
2842
+ | `OCI_FAMILY_SCHEMA` | constant: const OCI_FAMILY_SCHEMA | none | value | Import does not declare a throw contract. | none-on-import | `import { OCI_FAMILY_SCHEMA } from "@kungfu-tech/buildchain/oci-publication";` | `packages/core/oci-publication-bundle.js:6` |
2843
+ | `ociBundleFile` | function: function ociBundleFile(root, relative) | root, relative | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { ociBundleFile } from "@kungfu-tech/buildchain/oci-publication";` | `packages/core/oci-publication-bundle.js:29` |
2844
+ | `sealOciPublicationBundle` | function: function sealOciPublicationBundle({ bundleRoot, body }) | { bundleRoot, body } | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { sealOciPublicationBundle } from "@kungfu-tech/buildchain/oci-publication";` | `packages/core/oci-publication-bundle.js:10` |
2845
+ | `verifyOciPublicationBundle` | function: function verifyOciPublicationBundle({ bundleRoot, manifest, repository, sourceSha, version, }) | { bundleRoot, manifest, repository, sourceSha, version, } | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { verifyOciPublicationBundle } from "@kungfu-tech/buildchain/oci-publication";` | `packages/core/oci-publication-bundle.js:114` |
@@ -0,0 +1,82 @@
1
+ ---
2
+ status: draft
3
+ period: ongoing
4
+ theme: oci-publication
5
+ doc_type: technical-reference
6
+ source_level: local-files
7
+ confidence: high
8
+ sensitivity: public
9
+ evidence_grade: B
10
+ review_state: unreviewed
11
+ last_reviewed: 2026-09-06
12
+ ai_provenance:
13
+ model_family: GPT-6
14
+ product: Codex
15
+ generated_at: 2026-09-06
16
+ invisible_context_boundary: No credentials or production registry state inspected.
17
+ ---
18
+
19
+ # OCI image family publication
20
+
21
+ Buildchain v4 can publish a sealed family of container images to GHCR through
22
+ `publish-artifact-kind: oci` on the public release candidate promotion workflow.
23
+ The candidate build produces the image bytes and smoke evidence. The built-in
24
+ provider verifies and uploads those bytes, reads back every public image digest,
25
+ then allows release references and GitHub Release evidence to converge.
26
+
27
+ ## Candidate contract
28
+
29
+ Publish exactly one `oci-family.json` alongside OCI layouts and smoke JSON files
30
+ in the Build artifact. Import `sealOciPublicationBundle` from
31
+ `@kungfu-tech/buildchain/oci-publication` to validate and seal the family. Its
32
+ `body` contains:
33
+
34
+ - `schema: kungfu-buildchain-oci-family/v1`, consumer `repository`, exact Git
35
+ `sourceSha`, and candidate package `version`.
36
+ - `expectedImages`: the complete set of image names.
37
+ - `images`: one entry for each expected image, with `name`, `repository`,
38
+ `digest`, `layout`, `platform`, `action`, `content`, and `smoke`.
39
+
40
+ Destinations must be `ghcr.io/<consumer-owner>/<consumer-repo>/<image-name>`.
41
+ `layout` is a relative OCI layout directory. Each image is a single Linux
42
+ amd64 or arm64 manifest; OCI and Docker schema 2 manifests are supported.
43
+ Layouts may share blobs and an index; each shared index entry identifies its
44
+ image with the `org.opencontainers.image.ref.name` annotation.
45
+
46
+ `content` records the image's original `sourceSha` and `version`, matching its
47
+ OCI revision/version labels. For `action: built`, both equal the candidate.
48
+ For `action: reused`, they retain the original content provenance while the
49
+ family binds the current candidate. `smoke` records a relative `path` and SHA256
50
+ `sha256`; its JSON must identify the image and record `passed: true`. The
51
+ consumer owns the actual smoke command and must fail the build if it fails.
52
+
53
+ Sealing verifies all config/layer sizes and digests, platform and provenance
54
+ labels, smoke bytes, and family completeness. Absolute paths, traversal, and
55
+ symlinks are rejected. The resolver derives the exact required image artifacts
56
+ from this sealed family, including when recovering a previous candidate run.
57
+
58
+ ## Authority and publication
59
+
60
+ The thin caller grants `packages: write` in addition to its existing promotion
61
+ permissions. Reusable promotion wrappers inherit that caller envelope; npm
62
+ consumers do not need to request package registry authority. The provider uses
63
+ the action token only for GHCR, scoped to each declared consumer image.
64
+ No consumer publish command is executed.
65
+
66
+ The rooted product plan declares version-state materialization, OCI family
67
+ publication, then release reference convergence. Each image uses the exact
68
+ `v<version>` tag. A different existing digest aborts publication; a matching
69
+ existing image is reused. After a partial failure, recovery validates the same
70
+ candidate bytes and publishes only missing images. GHCR does not provide tag
71
+ compare-and-swap: callers must serialize publishers for a version, and external
72
+ writers must not race the publication workflow.
73
+
74
+ Success requires anonymous readback of every declared image at its expected
75
+ digest. Existing GHCR packages must permit the repository token to write and
76
+ anonymous clients to pull. The provider does not change package visibility or
77
+ access policy. It attaches `oci-publication-readback.json` to the GitHub Release;
78
+ the caller should also include the family and smoke JSON files in
79
+ `github-release-payload-patterns`.
80
+
81
+ See [Runtime Train Validation](runtime-train-validation.md) for testing an
82
+ unreleased runtime without persisting a train or exact SHA in the workflow.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kungfu-tech/buildchain",
3
- "version": "4.0.2-alpha.43",
3
+ "version": "4.0.2-alpha.45",
4
4
  "private": false,
5
5
  "description": "Buildchain Release Passport, release governance, CLI toolkit, and site facts.",
6
6
  "repository": "https://github.com/kungfu-systems/buildchain",
@@ -123,7 +123,8 @@
123
123
  "./site/product-mechanism.json": "./dist/site/product-mechanism.json",
124
124
  "./site/release-provenance.json": "./dist/site/release-provenance.json",
125
125
  "./site/agent-index.json": "./dist/site/agent-index.json",
126
- "./package.json": "./package.json"
126
+ "./package.json": "./package.json",
127
+ "./oci-publication": "./packages/core/oci-publication-bundle.js"
127
128
  },
128
129
  "files": [
129
130
  "AGENTS.md",