@kungfu-tech/buildchain 4.0.2 → 4.0.3
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 +4 -4
- package/CONTRIBUTING.md +34 -0
- package/README.md +1 -1
- package/architecture/agent-change-map.md +154 -147
- package/architecture/{v4-architecture-constitution.md → architecture-constitution.md} +11 -11
- package/architecture/{v3-core-mechanism-inventory.md → baseline-core-mechanism-inventory.md} +1 -1
- package/architecture/{v4-bootstrap-authority.json → bootstrap-authority.json} +3 -3
- package/architecture/{v3-v4-capability-closure.md → capability-parity-closure.md} +3 -3
- package/architecture/{v3-v4-live-capability-inventory.json → capability-parity-live-capability-inventory.json} +4 -4
- package/architecture/{v4-capability-state-machine-manifest.json → capability-state-machine-manifest.json} +2 -2
- package/architecture/{v4-capability-state-machine-manifest.schema.json → capability-state-machine-manifest.schema.json} +2 -2
- package/architecture/ci-lane-change-budget.json +18 -0
- package/architecture/{v4-cross-platform-adopter-qualification.json → cross-platform-adopter-qualification.json} +3 -3
- package/architecture/{v4-delivery-authority-parity.json → delivery-authority-parity.json} +16 -16
- package/architecture/{v4-delivery-warrant-shadow-bootstrap-plan.json → delivery-warrant-shadow-bootstrap-plan.json} +3 -3
- package/architecture/{v4-delivery-warrant-shadow-bootstrap-plan.md → delivery-warrant-shadow-bootstrap-plan.md} +7 -7
- package/architecture/{v4-floating-consumer-policy.md → floating-consumer-policy.md} +1 -1
- package/architecture/implementation-naming.json +1273 -0
- package/architecture/internal-capabilities.json +171 -169
- package/architecture/maintainability-debt.json +87 -82
- package/architecture/maintainability-policy.json +15 -15
- package/architecture/{v4-next-development-parity.json → next-development-parity.json} +8 -8
- package/architecture/{v4-partial-mutation-recovery-qualification.json → partial-mutation-recovery-qualification.json} +8 -8
- package/architecture/{v4-platform-stage-checkpoints.json → platform-stage-checkpoints.json} +2 -2
- package/architecture/{v4-provider-operation-journal-contract.json → provider-operation-journal-contract.json} +9 -9
- package/architecture/{v4-publication-rehearsal-parity.json → publication-rehearsal-parity.json} +4 -4
- package/architecture/{v4-release-activation-shadow-domain.json → release-activation-shadow-domain.json} +8 -8
- package/architecture/{v4-release-topology.json → release-topology.json} +112 -56
- package/architecture/{v4-release-train-parity.json → release-train-parity.json} +2 -2
- package/architecture/{v4-runtime-ref-resume-authority.json → runtime-ref-resume-authority.json} +1 -1
- package/architecture/{v4-runtime-semantic-closure.json → runtime-semantic-closure.json} +2 -2
- package/architecture/{v4-rust-libnode-bridge-evaluation.json → rust-libnode-bridge-evaluation.json} +3 -3
- package/architecture/{v4-rust-libnode-bridge-spike.md → rust-libnode-bridge-spike.md} +6 -6
- package/architecture/{v4-rust-wasm-production-authority.json → rust-wasm-production-authority.json} +11 -11
- package/architecture/{v4-stable-publication-fence.json → stable-publication-fence.json} +6 -6
- package/architecture/{v4-stage-capsule-contract.json → stage-capsule-contract.json} +1 -1
- package/architecture/{v4-stage-capsule-qualification.json → stage-capsule-qualification.json} +6 -6
- package/architecture/{v4-stage-capsule-resume-planner.json → stage-capsule-resume-planner.json} +2 -2
- package/architecture/{v4-stage-capsule-store-contract.json → stage-capsule-store-contract.json} +4 -4
- package/architecture/{v4-tail-reseal-parity.json → tail-reseal-parity.json} +28 -28
- package/architecture/{v4-universal-workflow-bootstrap.json → universal-workflow-bootstrap.json} +9 -4
- package/architecture/{v4-universal-workflow-fault-campaign.json → universal-workflow-fault-campaign.json} +8 -8
- package/architecture/{v4-universal-workflow-train-admission.json → universal-workflow-train-admission.json} +8 -8
- package/architecture/workflow-taxonomy.json +11 -0
- package/bin/buildchain.mjs +3 -3
- package/bin/internal/adopter-delivery-cli.mjs +9 -9
- package/contracts/fixtures/v4-tail-reseal-v1/valid.json +1 -1
- package/crates/{buildchain-v4-bridge → buildchain-host-bridge}/Cargo.lock +1 -1
- package/crates/{buildchain-v4-bridge → buildchain-host-bridge}/Cargo.toml +1 -1
- package/crates/{buildchain-v4-bridge → buildchain-host-bridge}/src/main.rs +3 -3
- package/dist/site/buildchain-contract.json +18 -18
- package/dist/site/buildchain-site.json +167 -71
- package/dist/site/capability-registry.json +5 -5
- package/dist/site/kfd-claims.json +226 -90
- package/dist/site/kfd-upstream-aggregate.json +1 -1
- package/dist/site/manual-registry.json +7 -7
- package/dist/site/node-api-registry.json +12929 -10491
- package/dist/site/page-registry.json +155 -59
- package/dist/site/public-surface-audit.json +65 -46
- package/dist/site/publication-authority-registry.json +27 -17
- package/dist/site/publication-registry.json +4 -4
- package/dist/site/release-provenance.json +18 -9
- package/dist/site/site-manifest.json +11 -11
- package/dist/site/workflow-registry.json +86 -52
- package/docs/MAP.md +4 -3
- package/docs/next-development-transition.md +24 -1
- package/docs/node-api-reference.md +435 -175
- package/docs/oci-publication.md +173 -0
- package/docs/publish-transaction.md +36 -3
- package/docs/release-flow.md +1 -1
- package/docs/reusable-build-surface.md +1 -1
- package/docs/v4-adopter-delivery.md +2 -2
- package/docs/v4-canonical-contracts.md +7 -7
- package/docs/v4-delivery-warrant-read-candidate.md +3 -3
- package/docs/v4-delivery-warrant-semantic-diff.md +3 -3
- package/docs/v4-production-release.md +8 -2
- package/docs/v4-publication-rehearsal.md +3 -3
- package/docs/v4-runtime-ref-resume-authority.md +2 -2
- package/docs/v4-rust-wasm-production-authority.md +6 -6
- package/docs/v4-stage-capsule.md +7 -7
- package/docs/v4-tail-reseal.md +1 -1
- package/docs/workflow-catalog.md +1 -0
- package/package.json +37 -26
- package/packages/compatibility/adopter-delivery.js +16 -0
- package/packages/compatibility/cross-platform-adopter-qualification.js +12 -0
- package/packages/compatibility/floating-consumer-policy.js +14 -0
- package/packages/compatibility/publication-qualification.js +11 -0
- package/packages/compatibility/publication-rehearsal.js +18 -0
- package/packages/compatibility/runtime-ref-resume-authority.js +13 -0
- package/packages/compatibility/tail-reseal-receipt.js +7 -0
- package/packages/compatibility/tail-reseal.js +11 -0
- package/packages/core/{v4-adopter-delivery-parity.js → adopter-delivery-parity.js} +12 -12
- package/packages/core/{v4-adopter-delivery.js → adopter-delivery.js} +24 -24
- package/packages/core/buildchain-contract.js +5 -5
- package/packages/core/buildchain-domain.wasm +0 -0
- package/packages/core/buildchain-publication-authority.js +1 -0
- package/packages/core/{v4-canonical-contracts.js → canonical-contracts.js} +32 -31
- package/packages/core/{v4-cross-platform-adopter-qualification.js → cross-platform-adopter-qualification.js} +19 -19
- package/packages/core/{v4-delivery-warrant-fixture-runner.js → delivery-warrant-fixture-runner.js} +36 -32
- package/packages/core/{v4-delivery-warrant-read-candidate.js → delivery-warrant-read-candidate.js} +40 -40
- package/packages/core/{v4-delivery-warrant-semantic-diff-gate.js → delivery-warrant-semantic-diff-gate.js} +58 -59
- package/packages/core/{v4-delivery-warrant-shadow-adapter.js → delivery-warrant-shadow-adapter.js} +15 -15
- package/packages/core/dev-delivery-execution-transfer.js +6 -6
- package/packages/core/dev-delivery-native-proof.js +12 -8
- package/packages/core/dev-delivery-warrant-legacy-recovery.js +1 -1
- package/packages/core/dev-delivery-warrant-native-compatibility.js +4 -4
- package/packages/core/dev-delivery-warrant-state.js +11 -11
- package/packages/core/dev-delivery-warrant.js +3 -3
- package/packages/core/domain-wasm-artifact.js +7 -0
- package/packages/core/{v4-domain-wasm.js → domain-wasm.js} +31 -31
- package/packages/core/{v4-floating-consumer-evidence.js → floating-consumer-evidence.js} +13 -13
- package/packages/core/{v4-floating-consumer-policy.js → floating-consumer-policy.js} +27 -29
- package/packages/core/{v4-floating-consumer-release-passport.js → floating-consumer-release-passport.js} +25 -25
- package/packages/core/index.js +4 -8
- package/packages/core/next-development-projection.js +24 -1
- package/packages/core/next-development-transition.js +5 -6
- package/packages/core/oci-compose-qualification.js +143 -0
- package/packages/core/oci-publication-bundle.js +281 -0
- package/packages/core/oci-publication-graph.js +206 -0
- package/packages/core/paper-runtime-channels.js +2 -2
- package/packages/core/paper.js +3 -3
- package/packages/core/partial-mutation-recovery-qualification.js +18 -0
- package/packages/core/{v4-platform-stage-checkpoints.js → platform-stage-checkpoints.js} +37 -37
- package/packages/core/{v4-product-publication.js → product-publication.js} +11 -9
- package/packages/core/{v4-protected-publication-source.js → protected-publication-source.js} +3 -3
- package/packages/core/provider-operation-journal.js +62 -0
- package/packages/core/{v4-provider-readback-idempotency.js → provider-readback-idempotency.js} +33 -33
- package/packages/core/public-export-compatibility.js +33 -0
- package/packages/core/publication-development.js +72 -0
- package/packages/core/{v4-publication-qualification.js → publication-qualification.js} +17 -17
- package/packages/core/{v4-publication-rehearsal-capsule.js → publication-rehearsal-capsule.js} +23 -23
- package/packages/core/publication-rehearsal-projection.js +2 -2
- package/packages/core/{v4-publication-rehearsal-provider-bindings.js → publication-rehearsal-provider-bindings.js} +4 -4
- package/packages/core/publication-rehearsal-runtime.js +21 -21
- package/packages/core/{v4-publication-rehearsal.js → publication-rehearsal.js} +33 -33
- package/packages/core/publication-sealed-bundle.js +78 -13
- package/packages/core/release-activation-shadow.js +32 -0
- package/packages/core/release-candidate.js +6 -6
- package/packages/core/{v4-release-invocation.js → release-invocation.js} +15 -15
- package/packages/core/release-passport.js +36 -36
- package/packages/core/release-tail-product-capabilities.js +9 -0
- package/packages/core/release-tail-provider-plane.js +10 -10
- package/packages/core/{v4-runtime-ref-resume-authority.js → runtime-ref-resume-authority.js} +36 -40
- package/packages/core/{v4-runtime-selector-persistence.js → runtime-selector-persistence.js} +7 -7
- package/packages/core/stable-publication-fence.js +28 -0
- package/packages/core/{v4-stage-capsule-local-store.js → stage-capsule-local-store.js} +56 -54
- package/packages/core/{v4-stage-capsule-qualification-campaign.js → stage-capsule-qualification-campaign.js} +37 -38
- package/packages/core/{v4-stage-capsule-qualification.js → stage-capsule-qualification.js} +28 -29
- package/packages/core/{v4-stage-capsule-resume-planner.js → stage-capsule-resume-planner.js} +29 -29
- package/packages/core/{v4-stage-capsule-store.js → stage-capsule-store.js} +59 -56
- package/packages/core/{v4-stage-capsule.js → stage-capsule.js} +45 -45
- package/packages/core/{v4-tail-reseal-contract.js → tail-reseal-contract.js} +6 -6
- package/packages/core/{v4-tail-reseal-github.js → tail-reseal-github.js} +12 -12
- package/packages/core/{v4-tail-reseal-receipt.js → tail-reseal-receipt.js} +22 -22
- package/packages/core/{v4-tail-reseal.js → tail-reseal.js} +29 -29
- package/packages/core/{v4-universal-workflow-bootstrap.js → universal-workflow-bootstrap.js} +23 -23
- package/scripts/{v4-architecture.mjs → architecture.mjs} +6 -6
- package/scripts/binary-publication-evidence.mjs +1 -1
- package/scripts/{v4-bridge-bootstrap.mjs → bridge-bootstrap.mjs} +14 -18
- package/scripts/{v4-bridge-evidence.mjs → bridge-evidence.mjs} +8 -8
- package/scripts/{build-v4-domain-wasm.mjs → build-domain-wasm.mjs} +6 -18
- package/scripts/{v3-v4-capability-catalog.mjs → capability-parity-catalog.mjs} +19 -19
- package/scripts/check-action-bundles.mjs +2 -2
- package/scripts/{check-v3-v4-capability-inventory.mjs → check-capability-parity-inventory.mjs} +42 -42
- package/scripts/check-core-mechanism-inventory.mjs +4 -1
- package/scripts/{check-v4-floating-consumer-policy-contract.mjs → check-floating-consumer-policy-contract.mjs} +8 -8
- package/scripts/check-implementation-naming.mjs +135 -0
- package/scripts/check-inventory.mjs +6 -5
- package/scripts/check-maintainability.mjs +9 -2
- package/scripts/{check-v4-public-dogfood-contract.mjs → check-public-dogfood-contract.mjs} +15 -15
- package/scripts/{check-v4-release-topology.mjs → check-release-topology.mjs} +53 -31
- package/scripts/{check-v4-runtime-semantic-closure.mjs → check-runtime-semantic-closure.mjs} +19 -16
- package/scripts/{check-v4-universal-workflow-bootstrap.mjs → check-universal-workflow-bootstrap.mjs} +14 -14
- package/scripts/{v4-consumer-policy.mjs → consumer-policy.mjs} +15 -15
- package/scripts/{copy-v4-domain-wasm.mjs → copy-domain-wasm.mjs} +3 -3
- package/scripts/{v4-cross-platform-adopter-qualification.mjs → cross-platform-adopter-qualification.mjs} +9 -9
- package/scripts/{v4-declarative-promotion-admission.mjs → declarative-promotion-admission.mjs} +4 -4
- package/scripts/dev-delivery-warrant-options.mjs +1 -1
- package/scripts/dev-delivery-warrant-store.mjs +29 -10
- package/scripts/dev-delivery-warrant.mjs +4 -4
- package/scripts/dev-pr-delivery-warrant.mjs +1 -1
- package/scripts/generate-channel-build-workflow.mjs +2 -2
- package/scripts/generate-channel-promotion-workflow.mjs +14 -31
- package/scripts/generate-release-candidate-passport.mjs +23 -23
- package/scripts/generate-site-bundle.mjs +17 -17
- package/scripts/{generate-v4-universal-workflow-facades.mjs → generate-universal-workflow-facades.mjs} +61 -21
- package/scripts/{v4-host-adapter.mjs → host-adapter.mjs} +1 -1
- package/scripts/implementation-references.mjs +25 -0
- package/scripts/init-repo.mjs +1 -1
- package/scripts/next-development-review.mjs +17 -11
- package/scripts/oci-compose-preview.mjs +261 -0
- package/scripts/{v4-platform-stage-checkpoint-rehearsal.mjs → platform-stage-checkpoint-rehearsal.mjs} +17 -17
- package/scripts/{v4-product-publication-intent.mjs → product-publication-intent.mjs} +16 -8
- package/scripts/publication-candidate-kind.mjs +93 -0
- package/scripts/publication-candidate-sealer.mjs +16 -1
- package/scripts/{v4-publication-rehearsal-fixture.mjs → publication-rehearsal-fixture.mjs} +5 -5
- package/scripts/{v4-publication-settlement.mjs → publication-settlement.mjs} +8 -8
- package/scripts/{v4-release-candidate-adapter.mjs → release-candidate-adapter.mjs} +4 -4
- package/scripts/release-candidate-resolver.mjs +15 -26
- package/scripts/release-tail.mjs +5 -5
- package/scripts/resume-from-candidate-run.mjs +35 -42
- package/scripts/site-capability-metadata.mjs +9 -0
- package/scripts/source-verification-evidence.mjs +7 -7
- package/scripts/{v4-stage-capsule-qualification.mjs → stage-capsule-qualification.mjs} +62 -62
- package/scripts/{v4-stage-capsule-resume-rehearsal.mjs → stage-capsule-resume-rehearsal.mjs} +6 -6
- package/scripts/{v4-tail-reseal-macos-rehearsal.mjs → tail-reseal-macos-rehearsal.mjs} +9 -9
- package/scripts/{v4-tail-reseal.mjs → tail-reseal.mjs} +19 -19
- package/scripts/universal-facade-maintainability.mjs +12 -3
- package/scripts/{v4-universal-workflow-backflow.mjs → universal-workflow-backflow.mjs} +10 -10
- package/scripts/{v4-universal-workflow-engine.mjs → universal-workflow-engine.mjs} +40 -38
- package/scripts/{v4-universal-workflow-self-dogfood.mjs → universal-workflow-self-dogfood.mjs} +12 -12
- package/scripts/verify-version-state-delta.mjs +4 -2
- package/scripts/{v4-warrant-shadow-plan.mjs → warrant-shadow-plan.mjs} +6 -6
- package/templates/universal-buildchain-bootstrap-recovery.yml +4 -4
- package/packages/core/buildchain-v4-domain.wasm +0 -0
- package/packages/core/v4-domain-wasm-artifact.js +0 -7
- package/packages/core/v4-partial-mutation-recovery-qualification.js +0 -18
- package/packages/core/v4-provider-operation-journal.js +0 -62
- package/packages/core/v4-release-activation-shadow.js +0 -32
- package/packages/core/v4-stable-publication-fence.js +0 -28
- /package/actions/{v4-release-candidate-promote → release-candidate-promote}/README.md +0 -0
- /package/architecture/{v4-adopter-delivery-parity.json → adopter-delivery-parity.json} +0 -0
- /package/architecture/{v3-core-mechanism-inventory.json → baseline-core-mechanism-inventory.json} +0 -0
- /package/architecture/{v4-canonical-contract-fixtures.json → canonical-contract-fixtures.json} +0 -0
- /package/architecture/{v4-compatibility-facts-parity.json → compatibility-facts-parity.json} +0 -0
- /package/architecture/{v4-delivery-warrant-shadow-bootstrap-plan.schema.json → delivery-warrant-shadow-bootstrap-plan.schema.json} +0 -0
- /package/architecture/{v4-delivery-warrant-shadow-fixtures.json → delivery-warrant-shadow-fixtures.json} +0 -0
- /package/architecture/{v4-delivery-warrant-shadow-fixtures.schema.json → delivery-warrant-shadow-fixtures.schema.json} +0 -0
- /package/architecture/{v4-exception-ledger.json → exception-ledger.json} +0 -0
- /package/architecture/{v4-exception-ledger.schema.json → exception-ledger.schema.json} +0 -0
- /package/architecture/{v4-floating-consumer-policy.json → floating-consumer-policy.json} +0 -0
- /package/architecture/{v4-publication-facade-patches.json → publication-facade-patches.json} +0 -0
- /package/architecture/{v4-release-invocation-fixtures.json → release-invocation-fixtures.json} +0 -0
|
@@ -2,10 +2,10 @@ import fs from "node:fs";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { pathToFileURL } from "node:url";
|
|
4
4
|
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
} from "../packages/core/
|
|
5
|
+
createReleaseInvocation,
|
|
6
|
+
createReleaseReceipt,
|
|
7
|
+
createDomainReleaseTransaction,
|
|
8
|
+
} from "../packages/core/release-invocation.js";
|
|
9
9
|
import {
|
|
10
10
|
releaseTailRoot,
|
|
11
11
|
validateReleaseTailTransaction,
|
|
@@ -26,8 +26,8 @@ export function verifyPublicationSettlement(
|
|
|
26
26
|
providerState,
|
|
27
27
|
productState,
|
|
28
28
|
} = documents;
|
|
29
|
-
const projected =
|
|
30
|
-
const roots =
|
|
29
|
+
const projected = createReleaseInvocation(invocation);
|
|
30
|
+
const roots = createDomainReleaseTransaction({
|
|
31
31
|
invocationRoot: projected.roots.invocationRoot,
|
|
32
32
|
publisherRoot: projected.roots.publisherRoot,
|
|
33
33
|
runtimeRoot: projected.roots.runtimeRoot,
|
|
@@ -48,7 +48,7 @@ export function verifyPublicationSettlement(
|
|
|
48
48
|
...roots.transaction,
|
|
49
49
|
transactionRoot: roots.transactionRoot,
|
|
50
50
|
}) ||
|
|
51
|
-
|
|
51
|
+
createReleaseReceipt(receiptBody).receiptRoot !== receiptRoot ||
|
|
52
52
|
receipt.transactionRoot !== roots.transactionRoot ||
|
|
53
53
|
receipt.outcome !== "complete" ||
|
|
54
54
|
passportRoot !== releaseTailRoot(passportBody) ||
|
|
@@ -202,7 +202,7 @@ async function main() {
|
|
|
202
202
|
|
|
203
203
|
if (
|
|
204
204
|
process.argv[1] &&
|
|
205
|
-
path.basename(process.argv[1]) === "
|
|
205
|
+
path.basename(process.argv[1]) === "publication-settlement.mjs" &&
|
|
206
206
|
import.meta.url === pathToFileURL(process.argv[1]).href
|
|
207
207
|
)
|
|
208
208
|
main().catch((error) => {
|
|
@@ -6,7 +6,7 @@ import { fileURLToPath, pathToFileURL } from "node:url";
|
|
|
6
6
|
|
|
7
7
|
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
8
8
|
|
|
9
|
-
export function
|
|
9
|
+
export function resolveReleaseCandidateAdapter({
|
|
10
10
|
resumeCandidateRunId = "",
|
|
11
11
|
} = {}) {
|
|
12
12
|
const mode = String(resumeCandidateRunId || "").trim() ? "recovery" : "fresh";
|
|
@@ -19,11 +19,11 @@ export function resolveV4ReleaseCandidateAdapter({
|
|
|
19
19
|
});
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
export function
|
|
22
|
+
export function runReleaseCandidateAdapter({
|
|
23
23
|
env = process.env,
|
|
24
24
|
exec = execFileSync,
|
|
25
25
|
} = {}) {
|
|
26
|
-
const route =
|
|
26
|
+
const route = resolveReleaseCandidateAdapter({
|
|
27
27
|
resumeCandidateRunId: env.BUILDCHAIN_RESUME_CANDIDATE_RUN_ID,
|
|
28
28
|
});
|
|
29
29
|
exec(process.execPath, [path.join(root, route.script)], {
|
|
@@ -37,5 +37,5 @@ if (
|
|
|
37
37
|
process.argv[1] &&
|
|
38
38
|
import.meta.url === pathToFileURL(process.argv[1]).href
|
|
39
39
|
) {
|
|
40
|
-
|
|
40
|
+
runReleaseCandidateAdapter();
|
|
41
41
|
}
|
|
@@ -7,10 +7,10 @@ import { execFileSync } from "node:child_process";
|
|
|
7
7
|
import { Readable } from "node:stream";
|
|
8
8
|
import { pipeline } from "node:stream/promises";
|
|
9
9
|
import { pathToFileURL } from "node:url";
|
|
10
|
-
import {
|
|
10
|
+
import { resolveCandidatePublicationBundle } from "./publication-candidate-sealer.mjs";
|
|
11
11
|
import { writeGitHubOutputs } from "./build-contract-core.mjs";
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
12
|
+
import { domainContentRoot } from "../packages/core/canonical-contracts.js";
|
|
13
|
+
import { domainPublicationQualificationRoot, validatePublicationQualificationReceipt } from "../packages/core/publication-qualification.js";
|
|
14
14
|
|
|
15
15
|
const DEFAULT_WORKFLOW_FILE = "self-build-fixture.yml";
|
|
16
16
|
function env(name, fallback = "") {
|
|
@@ -436,7 +436,7 @@ function findDownloadedFile(root, filename) {
|
|
|
436
436
|
return "";
|
|
437
437
|
}
|
|
438
438
|
|
|
439
|
-
function
|
|
439
|
+
function resolvePublicationEvidence(passportDir, passport, outputPath) {
|
|
440
440
|
const stageCapsulesPath = findDownloadedFile(passportDir, "release-candidate-stage-capsules.json");
|
|
441
441
|
const publicationQualificationPath = findDownloadedFile(passportDir, "release-candidate-publication-qualification.json");
|
|
442
442
|
if (!passport.consumerPolicy?.receiptRoot) {
|
|
@@ -453,12 +453,12 @@ function resolveV4PublicationEvidence(passportDir, passport, outputPath) {
|
|
|
453
453
|
}
|
|
454
454
|
const stageCapsules = JSON.parse(fs.readFileSync(stageCapsulesPath, "utf8"));
|
|
455
455
|
const qualification = JSON.parse(fs.readFileSync(publicationQualificationPath, "utf8"));
|
|
456
|
-
|
|
456
|
+
validatePublicationQualificationReceipt(qualification, {
|
|
457
457
|
repository: passport.repository,
|
|
458
458
|
candidateRoot: `sha256:${passport.candidateHash}`,
|
|
459
459
|
sourceSha: passport.source.headSha,
|
|
460
|
-
sourceRoot:
|
|
461
|
-
artifactRoot:
|
|
460
|
+
sourceRoot: domainContentRoot("candidate-identity", passport.source),
|
|
461
|
+
artifactRoot: domainPublicationQualificationRoot(stageCapsules.capsules.map(({ publicationArtifact }) => publicationArtifact)),
|
|
462
462
|
policyDigest: passport.consumerPolicy.receiptRoot,
|
|
463
463
|
});
|
|
464
464
|
if (stageCapsules.publicationQualificationRoot !== qualification.receiptRoot) throw new Error("Stage Capsules do not bind the publication qualification receipt");
|
|
@@ -705,7 +705,7 @@ export async function resolveReleaseCandidateArtifacts({
|
|
|
705
705
|
throw new Error("downloaded release-candidate artifacts did not contain release-candidate-passport.json and build-summary.json");
|
|
706
706
|
}
|
|
707
707
|
const passport = JSON.parse(fs.readFileSync(passportPath, "utf8"));
|
|
708
|
-
const
|
|
708
|
+
const domainPublication = resolvePublicationEvidence(passportDir, passport, outputPath);
|
|
709
709
|
const platformManifestPaths = findDownloadedFiles(payloadDir, "manifest.json");
|
|
710
710
|
const githubArtifactAttestationPolicyPaths = findDownloadedFiles(
|
|
711
711
|
payloadDir,
|
|
@@ -725,23 +725,12 @@ export async function resolveReleaseCandidateArtifacts({
|
|
|
725
725
|
const noun = publishArtifactKind === "npm" ? "npm package tarballs" : "platform manifests";
|
|
726
726
|
throw new Error(`expected at least ${minimumPayloadCount} downloaded ${noun}, found ${downloadedRequiredArtifactCount}`);
|
|
727
727
|
}
|
|
728
|
-
const sealedBundle = publishArtifactKind
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
sourceSha: passport.source?.headSha,
|
|
733
|
-
sourceTreeSha: passport.source?.treeHash,
|
|
734
|
-
runtimeSha: releaseCandidateRuntimeSha(passport),
|
|
735
|
-
releaseCandidateRoot: passport.candidateHash,
|
|
736
|
-
npmArtifacts: npmTarballPaths.map((tarballPath) => ({
|
|
737
|
-
path: tarballPath,
|
|
738
|
-
...readNpmPackageArtifact({ tarballPath, mainPackage: publishPackageMain }),
|
|
739
|
-
})),
|
|
740
|
-
releaseAssetPaths,
|
|
741
|
-
})
|
|
742
|
-
: undefined;
|
|
728
|
+
const sealedBundle = resolveCandidatePublicationBundle({ kind: publishArtifactKind, payloadDir, passport,
|
|
729
|
+
runtimeSha: releaseCandidateRuntimeSha(passport), releaseAssetPaths,
|
|
730
|
+
npmArtifacts: npmTarballPaths.map((tarballPath) => ({ path: tarballPath,
|
|
731
|
+
...readNpmPackageArtifact({ tarballPath, mainPackage: publishPackageMain }) })) });
|
|
743
732
|
const manifests = platformManifestPaths.map((manifestPath) => JSON.parse(fs.readFileSync(manifestPath, "utf8"))), publicationVersion = resolveFreshPublicationVersion({ sealedBundle, candidateVersion: passport.target?.version });
|
|
744
|
-
const generatedRequiredArtifacts = generatePublishRequiredArtifacts({
|
|
733
|
+
const generatedRequiredArtifacts = sealedBundle?.requiredArtifacts || generatePublishRequiredArtifacts({
|
|
745
734
|
manifests,
|
|
746
735
|
version: publicationVersion,
|
|
747
736
|
kind: publishArtifactKind,
|
|
@@ -759,7 +748,7 @@ export async function resolveReleaseCandidateArtifacts({
|
|
|
759
748
|
paths: {
|
|
760
749
|
passport: outputPath(passportPath),
|
|
761
750
|
buildSummary: outputPath(buildSummaryPath),
|
|
762
|
-
...
|
|
751
|
+
...domainPublication.paths,
|
|
763
752
|
payloads: outputPath(payloadDir),
|
|
764
753
|
platformManifests: platformManifestPaths.map(outputPath),
|
|
765
754
|
githubArtifactAttestationPolicies: githubArtifactAttestationPolicyPaths.map(outputPath),
|
|
@@ -777,7 +766,7 @@ export async function resolveReleaseCandidateArtifacts({
|
|
|
777
766
|
githubArtifactAttestationPolicyCount: githubArtifactAttestationPolicyPaths.length,
|
|
778
767
|
npmTarballCount: npmTarballPaths.length,
|
|
779
768
|
publishRequiredArtifacts: generatedRequiredArtifacts,
|
|
780
|
-
publicationQualificationRoot:
|
|
769
|
+
publicationQualificationRoot: domainPublication.publicationQualificationRoot,
|
|
781
770
|
};
|
|
782
771
|
}
|
|
783
772
|
|
package/scripts/release-tail.mjs
CHANGED
|
@@ -12,9 +12,9 @@ import {
|
|
|
12
12
|
} from "../packages/core/release-tail-provider-plane.js";
|
|
13
13
|
import { diagnoseLegacyReleaseTailHooks } from "../packages/core/release-tail-compatibility.js";
|
|
14
14
|
import {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
} from "../packages/core/
|
|
15
|
+
DOMAIN_PUBLICATION_REHEARSAL_EVIDENCE_CONTRACT,
|
|
16
|
+
executeDomainPublicationRehearsal,
|
|
17
|
+
} from "../packages/core/publication-rehearsal.js";
|
|
18
18
|
|
|
19
19
|
function flag(args, name, fallback = "") {
|
|
20
20
|
const index = args.indexOf(`--${name}`);
|
|
@@ -76,7 +76,7 @@ export async function runReleaseTailCli(args = process.argv.slice(2)) {
|
|
|
76
76
|
error.code = "ambient-environment-forbidden";
|
|
77
77
|
throw error;
|
|
78
78
|
}
|
|
79
|
-
const result = await
|
|
79
|
+
const result = await executeDomainPublicationRehearsal({
|
|
80
80
|
capsule: readJson(capsulePath, "--capsule"),
|
|
81
81
|
candidateRoot,
|
|
82
82
|
mode: rehearsalMode,
|
|
@@ -89,7 +89,7 @@ export async function runReleaseTailCli(args = process.argv.slice(2)) {
|
|
|
89
89
|
} catch (error) {
|
|
90
90
|
output(
|
|
91
91
|
{
|
|
92
|
-
schema:
|
|
92
|
+
schema: DOMAIN_PUBLICATION_REHEARSAL_EVIDENCE_CONTRACT,
|
|
93
93
|
status: "rejected",
|
|
94
94
|
code: error.code || "publication-rehearsal-runtime-error",
|
|
95
95
|
message: error.message,
|
|
@@ -6,6 +6,8 @@ import path from "node:path";
|
|
|
6
6
|
import { execFileSync } from "node:child_process";
|
|
7
7
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
8
8
|
|
|
9
|
+
import { resolveOciCandidate, resolveRecoveredPublicationVersion, resolveRecoveredCandidateVersion } from "./publication-candidate-kind.mjs";
|
|
10
|
+
export { resolveRecoveredPublicationVersion, resolveRecoveredCandidateVersion } from "./publication-candidate-kind.mjs";
|
|
9
11
|
import { writeGitHubOutputs } from "./build-contract-core.mjs";
|
|
10
12
|
import { compareSemver } from "./publication-registry-hydrate.mjs";
|
|
11
13
|
import { normalizeAnchorProvenance, normalizeCandidateRun, recoverCandidateProvenance } from "./release-candidate-anchor-provenance.mjs";
|
|
@@ -31,15 +33,15 @@ import {
|
|
|
31
33
|
} from "../packages/core/publication-artifact-candidate.js";
|
|
32
34
|
import { createPublicationSealedBundle } from "../packages/core/publication-sealed-bundle.js";
|
|
33
35
|
import { releaseTransactionStateRef } from "../packages/core/publish-transaction.js";
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
+
import { domainContentRoot } from "../packages/core/canonical-contracts.js";
|
|
37
|
+
import { validateStageCapsule } from "../packages/core/stage-capsule.js";
|
|
36
38
|
import {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
} from "../packages/core/
|
|
39
|
+
authorizeRuntimeSelection,
|
|
40
|
+
createRuntimeResumeLineage,
|
|
41
|
+
scanRuntimeSelectorPersistence,
|
|
42
|
+
runtimeResumeDocumentRoot,
|
|
43
|
+
verifyRuntimeAuthorizationReceipt,
|
|
44
|
+
} from "../packages/core/runtime-ref-resume-authority.js";
|
|
43
45
|
|
|
44
46
|
function env(name, fallback = "") { return process.env[name] || fallback; }
|
|
45
47
|
function requiredEnv(name) {
|
|
@@ -117,7 +119,7 @@ export function trackedRuntimePersistenceScan({
|
|
|
117
119
|
)
|
|
118
120
|
.split(/\r?\n/)
|
|
119
121
|
.filter((entry) => /\.(?:json|toml|ya?ml)$/u.test(entry));
|
|
120
|
-
return
|
|
122
|
+
return scanRuntimeSelectorPersistence({ root: runtimeRoot, paths });
|
|
121
123
|
}
|
|
122
124
|
|
|
123
125
|
export function verifyReleaseCandidateStageCapsules({ sidecar, passport, downloads }) {
|
|
@@ -136,7 +138,7 @@ export function verifyReleaseCandidateStageCapsules({ sidecar, passport, downloa
|
|
|
136
138
|
const expectedAttempt =
|
|
137
139
|
`github-run:${passport.workflow.runId}:attempt:${passport.workflow.runAttempt}`;
|
|
138
140
|
if (
|
|
139
|
-
sidecar.root !==
|
|
141
|
+
sidecar.root !== runtimeResumeDocumentRoot(payload) ||
|
|
140
142
|
sidecar.repository !== passport.repository ||
|
|
141
143
|
sidecar.source?.sha !== passport.source.headSha ||
|
|
142
144
|
sidecar.source?.treeSha !== passport.source.treeHash ||
|
|
@@ -158,7 +160,7 @@ export function verifyReleaseCandidateStageCapsules({ sidecar, passport, downloa
|
|
|
158
160
|
throw new Error("release-candidate Stage Capsule platform set is incomplete");
|
|
159
161
|
}
|
|
160
162
|
return entries.map((entry) => {
|
|
161
|
-
|
|
163
|
+
validateStageCapsule(entry.capsule);
|
|
162
164
|
const download = artifactByName.get(entry.artifactName);
|
|
163
165
|
const artifact = entry.artifact;
|
|
164
166
|
if (
|
|
@@ -174,9 +176,9 @@ export function verifyReleaseCandidateStageCapsules({ sidecar, passport, downloa
|
|
|
174
176
|
new Date(download.artifact.expires_at).toISOString() ||
|
|
175
177
|
entry.capsule.identity.policyRoot !== sidecar.consumerPolicyReceiptRoot ||
|
|
176
178
|
entry.capsule.identity.sourceRoot !==
|
|
177
|
-
|
|
179
|
+
domainContentRoot("candidate-identity", passport.source) ||
|
|
178
180
|
entry.capsule.identity.runtimeRoot !==
|
|
179
|
-
|
|
181
|
+
domainContentRoot("candidate-identity", { sha: passport.buildchain.sha })
|
|
180
182
|
) {
|
|
181
183
|
throw new Error(
|
|
182
184
|
`Stage Capsule ${entry.platform} does not bind the verified provider artifact`,
|
|
@@ -196,7 +198,7 @@ export function verifyReleaseCandidateStageCapsules({ sidecar, passport, downloa
|
|
|
196
198
|
});
|
|
197
199
|
}
|
|
198
200
|
|
|
199
|
-
export function
|
|
201
|
+
export function validateRuntimeResumePublicReadback({
|
|
200
202
|
targetRef,
|
|
201
203
|
targetSha,
|
|
202
204
|
targetVersion,
|
|
@@ -273,7 +275,7 @@ export async function readPublicResumeState({
|
|
|
273
275
|
if (targetPackageFile?.type !== "file" || targetPackageFile.encoding !== "base64" || !targetPackageFile.content)
|
|
274
276
|
throw new Error("cross-runtime recovery requires protected target version state");
|
|
275
277
|
const targetVersion = JSON.parse(Buffer.from(String(targetPackageFile.content).replace(/\s/g, ""), "base64").toString("utf8")).version;
|
|
276
|
-
|
|
278
|
+
validateRuntimeResumePublicReadback({ targetRef, targetSha, targetVersion, alphaSha,
|
|
277
279
|
exactTagSha, tagLineage, runtimeLineage, floatingTargetLineage, runtimeSha,
|
|
278
280
|
version, transaction, main, npm });
|
|
279
281
|
const body = {
|
|
@@ -296,10 +298,10 @@ export async function readPublicResumeState({
|
|
|
296
298
|
distTagIntegrity: npm.versions[npm["dist-tags"].alpha].dist.integrity,
|
|
297
299
|
},
|
|
298
300
|
};
|
|
299
|
-
return { ...body, root:
|
|
301
|
+
return { ...body, root: runtimeResumeDocumentRoot(body) };
|
|
300
302
|
}
|
|
301
303
|
|
|
302
|
-
export const
|
|
304
|
+
export const resolveRuntimeResumePublicRuntimeSha = (material) =>
|
|
303
305
|
material?.buildAttempt?.runtimeSha || "";
|
|
304
306
|
|
|
305
307
|
function prepareRuntimeResumeEvidence({
|
|
@@ -313,14 +315,14 @@ function prepareRuntimeResumeEvidence({
|
|
|
313
315
|
recovery,
|
|
314
316
|
outputDir,
|
|
315
317
|
}) {
|
|
316
|
-
const authorizationPath = path.resolve(".buildchain/release-candidate/
|
|
318
|
+
const authorizationPath = path.resolve(".buildchain/release-candidate/runtime-authorization.json");
|
|
317
319
|
const delegatedRaw = env("BUILDCHAIN_RUNTIME_AUTHORIZATION_JSON").trim();
|
|
318
320
|
const delegatedRoot = env("BUILDCHAIN_RUNTIME_AUTHORIZATION_ROOT").trim();
|
|
319
321
|
const authorizationFileExists = fs.existsSync(authorizationPath);
|
|
320
322
|
if (!authorizationFileExists && (!delegatedRaw || !delegatedRoot)) throw new Error("cross-runtime recovery requires a fresh runtime authorization receipt");
|
|
321
323
|
const delegated = authorizationFileExists ? readOnlyJson([{ absolutePath: authorizationPath }], "runtime authorization") : JSON.parse(delegatedRaw);
|
|
322
324
|
if (!authorizationFileExists && delegated.receiptRoot !== delegatedRoot) throw new Error("fresh recovery runtime authorization handoff root mismatch");
|
|
323
|
-
const delegatedVerification =
|
|
325
|
+
const delegatedVerification = verifyRuntimeAuthorizationReceipt({
|
|
324
326
|
receipt: delegated.receipt,
|
|
325
327
|
receiptRoot: delegated.receiptRoot,
|
|
326
328
|
repository: repoInfo.fullName,
|
|
@@ -332,7 +334,7 @@ function prepareRuntimeResumeEvidence({
|
|
|
332
334
|
);
|
|
333
335
|
}
|
|
334
336
|
const policy = passport.consumerPolicy.receipt;
|
|
335
|
-
const authorization =
|
|
337
|
+
const authorization = authorizeRuntimeSelection({
|
|
336
338
|
repository: repoInfo.fullName,
|
|
337
339
|
eventName: "workflow_dispatch",
|
|
338
340
|
mode: "resume",
|
|
@@ -362,7 +364,7 @@ function prepareRuntimeResumeEvidence({
|
|
|
362
364
|
rebuildPlatforms: [],
|
|
363
365
|
skippedBuildStages: recovery.receipt.skippedBuildStages,
|
|
364
366
|
};
|
|
365
|
-
const plan = { ...planBody, root:
|
|
367
|
+
const plan = { ...planBody, root: runtimeResumeDocumentRoot(planBody) };
|
|
366
368
|
const materialBody = {
|
|
367
369
|
schemaVersion: 1,
|
|
368
370
|
contract: "kungfu-buildchain-v4-runtime-resume-material/v1",
|
|
@@ -389,7 +391,7 @@ function prepareRuntimeResumeEvidence({
|
|
|
389
391
|
};
|
|
390
392
|
const material = {
|
|
391
393
|
...materialBody,
|
|
392
|
-
root:
|
|
394
|
+
root: runtimeResumeDocumentRoot(materialBody),
|
|
393
395
|
};
|
|
394
396
|
for (const [name, value] of [
|
|
395
397
|
["v4-runtime-resume-plan.json", plan],
|
|
@@ -416,7 +418,7 @@ export async function finalizeRuntimeResumeEvidence({
|
|
|
416
418
|
delete body.root;
|
|
417
419
|
if (
|
|
418
420
|
material.contract !== "kungfu-buildchain-v4-runtime-resume-material/v1" ||
|
|
419
|
-
material.root !==
|
|
421
|
+
material.root !== runtimeResumeDocumentRoot(body)
|
|
420
422
|
) {
|
|
421
423
|
throw new Error("cross-runtime resume material root mismatch");
|
|
422
424
|
}
|
|
@@ -436,14 +438,14 @@ export async function finalizeRuntimeResumeEvidence({
|
|
|
436
438
|
const readback = await readPublicResumeState({
|
|
437
439
|
repoInfo,
|
|
438
440
|
targetRef,
|
|
439
|
-
runtimeSha:
|
|
441
|
+
runtimeSha: resolveRuntimeResumePublicRuntimeSha(material),
|
|
440
442
|
version,
|
|
441
443
|
transaction,
|
|
442
444
|
token,
|
|
443
445
|
apiUrl,
|
|
444
446
|
fetchImpl,
|
|
445
447
|
});
|
|
446
|
-
const resumed =
|
|
448
|
+
const resumed = createRuntimeResumeLineage({
|
|
447
449
|
authorization: material.authorization,
|
|
448
450
|
authorizationRoot: material.authorizationRoot,
|
|
449
451
|
buildAttempt: material.buildAttempt,
|
|
@@ -695,22 +697,6 @@ export function createRecoveredPublicationCandidate({
|
|
|
695
697
|
};
|
|
696
698
|
return { ...payload, candidateDigest: publicationArtifactCandidateDigest(payload) };
|
|
697
699
|
}
|
|
698
|
-
export function resolveRecoveredPublicationVersion({ artifactVersion, channel, rematerializeOnResume = false } = {}) {
|
|
699
|
-
const version = String(artifactVersion || "").trim(), match = version.match(/^(\d+\.\d+\.\d+)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/u);
|
|
700
|
-
if (!match) throw new Error(`recovered npm artifact has invalid publication version: ${version || "<empty>"}`);
|
|
701
|
-
return channel === "release" && rematerializeOnResume ? match[1] : version;
|
|
702
|
-
}
|
|
703
|
-
export function resolveRecoveredCandidateVersion({ artifactVersion, publicationVersion, channel, rematerializeOnResume = false, targetRef = "", candidateRef = "" } = {}) {
|
|
704
|
-
const version = String(artifactVersion || "").trim(), target = String(targetRef || "").replace(/^refs\/heads\//u, ""), candidate = String(candidateRef || "").replace(/^refs\/heads\//u, "");
|
|
705
|
-
if (channel !== "release" || !rematerializeOnResume) return version;
|
|
706
|
-
const prefix = `publish-gate/${target}/`;
|
|
707
|
-
if (!target || !candidate.startsWith(prefix)) throw new Error(`stable recovery candidate ref must descend from ${prefix || "publish-gate/<target>/"}`);
|
|
708
|
-
const candidateVersion = candidate.slice(prefix.length);
|
|
709
|
-
if (!/^\d+\.\d+\.\d+-alpha\.\d+$/u.test(candidateVersion)) throw new Error(`stable recovery candidate ref must bind an exact alpha version, got ${candidateVersion || "<empty>"}`);
|
|
710
|
-
if (candidateVersion.replace(/-alpha\.\d+$/u, "") !== publicationVersion) throw new Error(`stable recovery candidate ${candidateVersion} does not match publication ${publicationVersion || "<empty>"}`);
|
|
711
|
-
if ((version.match(/^(\d+\.\d+\.\d+)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/u)?.[1] || "") !== publicationVersion) throw new Error(`recovered npm artifact version ${version || "<empty>"} does not match publication ${publicationVersion}`);
|
|
712
|
-
return candidateVersion;
|
|
713
|
-
}
|
|
714
700
|
export function createRecoveredPublication({ downloads, bundleRoot, repository, passport, candidateRuntimeSha, publishArtifactKind, publishPackageMain, releasePatterns, platformManifests, channel, targetRef = "", candidateRef = "", rematerializeOnResume = false }) {
|
|
715
701
|
const allFiles = downloads.flatMap((download) => download.files.map((file) => ({ path: path.relative(bundleRoot, file.absolutePath).split(path.sep).join("/"),
|
|
716
702
|
size: file.size, sha256: file.sha256.replace(/^sha256:/, ""), absolutePath: file.absolutePath })))
|
|
@@ -718,6 +704,13 @@ export function createRecoveredPublication({ downloads, bundleRoot, repository,
|
|
|
718
704
|
const kind = String(publishArtifactKind || "npm");
|
|
719
705
|
const releaseMatchers = splitPatterns(releasePatterns).map(patternMatcher);
|
|
720
706
|
const releaseAssets = allFiles.filter((file) => releaseMatchers.some((matcher) => matcher.test(path.basename(file.path))));
|
|
707
|
+
if (kind === "oci") {
|
|
708
|
+
createRecoveredPublicationCandidate({ allFiles, repository, passport, candidateRuntimeSha });
|
|
709
|
+
const sealed = resolveOciCandidate({ payloadRoot: bundleRoot, passport });
|
|
710
|
+
return { manifest: sealed.manifest, bundleRoot: sealed.root, npmArtifacts: [], allFiles, releaseAssets,
|
|
711
|
+
version: sealed.manifest.version, candidateVersion: sealed.manifest.version,
|
|
712
|
+
publishRequiredArtifacts: sealed.requiredArtifacts };
|
|
713
|
+
}
|
|
721
714
|
if (kind !== "npm") {
|
|
722
715
|
createRecoveredPublicationCandidate({ allFiles, repository, passport, candidateRuntimeSha });
|
|
723
716
|
const version = String(passport.target?.version || "").trim();
|
|
@@ -1019,7 +1012,7 @@ export async function resumeFromCandidateRun({
|
|
|
1019
1012
|
npmTarballs: tarballs,
|
|
1020
1013
|
releaseAssets: publication.releaseAssets.map((asset) => outputPath(asset.absolutePath)),
|
|
1021
1014
|
publishRequiredArtifacts: outputPath(requiredArtifactsPath),
|
|
1022
|
-
sealedBundleRoot: publication.manifest ? outputPath(bundleRoot) : "",
|
|
1015
|
+
sealedBundleRoot: publication.manifest ? outputPath(publication.bundleRoot || bundleRoot) : "",
|
|
1023
1016
|
sealedBundleManifest: publication.manifest ? outputPath(sealedManifestPath) : "",
|
|
1024
1017
|
recoveryReceipt: outputPath(recoveryReceiptPath),
|
|
1025
1018
|
stageCapsules: stageCapsuleFile ? outputPath(stageCapsuleFile.absolutePath) : "",
|
|
@@ -206,6 +206,7 @@ export function nodeApiMeta(exportName) {
|
|
|
206
206
|
"./publication-artifact": { group: "reusable-build", summary: "Publication artifact manifest, source bundle, and publication passport APIs." },
|
|
207
207
|
"./publication-package": { group: "reusable-build", summary: "Publication npm package synthesis APIs for Buildchain-managed paper release presets." },
|
|
208
208
|
"./publication-reproducibility": { group: "reusable-build", summary: "Two-clean-build publication byte reproducibility receipt APIs." },
|
|
209
|
+
"./oci-publication": { group: "reusable-build", summary: "Sealed OCI image family verification, provenance, and smoke evidence APIs." },
|
|
209
210
|
"./publication-sealed-bundle": { group: "reusable-build", summary: "Build-once publication bundle manifests and exact-byte resume verification APIs." },
|
|
210
211
|
"./paper": { group: "reusable-build", summary: "Unified Paper work, fleet, scaffold, preflight, npm bootstrap, build, Alpha, status, and resume planning APIs." },
|
|
211
212
|
"./publication-authority": { group: "release-passport-trust", summary: "Sealed publication authority registry, runner provenance, control-plane audit, admission, and independent verification APIs." },
|
|
@@ -226,13 +227,19 @@ export function nodeApiMeta(exportName) {
|
|
|
226
227
|
"./release-passport-contract": { group: "release-passport-trust", summary: "Standalone release passport JSON Schema, ownership/check manifest, and structural validation APIs." },
|
|
227
228
|
"./release-candidate": { group: "reusable-build", summary: "PR-stage release-candidate artifact, passport, and promote-only resolver APIs." },
|
|
228
229
|
"./v4-floating-consumer-policy": { group: "governance-versioning", summary: "Semantic floating-selector admission, dual-lock receipt, and independent v4 consumer certification APIs." },
|
|
230
|
+
"./floating-consumer-policy": { group: "governance-versioning", summary: "Semantic floating-selector admission, dual-lock receipt, and independent v4 consumer certification APIs." },
|
|
229
231
|
"./v4-runtime-ref-resume-authority": { group: "release-passport-trust", summary: "Transient exact-runtime authorization, persisted-selector rejection, fresh-attempt Stage Capsule reuse, and A+B Passport lineage APIs." },
|
|
232
|
+
"./runtime-ref-resume-authority": { group: "release-passport-trust", summary: "Transient exact-runtime authorization, persisted-selector rejection, fresh-attempt Stage Capsule reuse, and A+B Passport lineage APIs." },
|
|
230
233
|
"./v4-tail-reseal": { group: "release-passport-trust", summary: "Effect-pure retained Stage Capsule validation and explicit Warrant-, credential-, and release-tail-fenced macOS reseal planning APIs." },
|
|
234
|
+
"./tail-reseal": { group: "release-passport-trust", summary: "Effect-pure retained Stage Capsule validation and explicit Warrant-, credential-, and release-tail-fenced macOS reseal planning APIs." },
|
|
231
235
|
"./v4-tail-reseal-receipt": { group: "release-passport-trust", summary: "Four-platform byte readback, standard candidate Passport binding, and terminal v4 tail-reseal receipt APIs." },
|
|
236
|
+
"./tail-reseal-receipt": { group: "release-passport-trust", summary: "Four-platform byte readback, standard candidate Passport binding, and terminal v4 tail-reseal receipt APIs." },
|
|
232
237
|
"./v4-publication-rehearsal": { group: "release-passport-trust", summary: "Content-addressed v4 publication rehearsal capsules, shared production release-tail execution, replay, provider observation, and fail-closed verification APIs." },
|
|
238
|
+
"./publication-rehearsal": { group: "release-passport-trust", summary: "Content-addressed v4 publication rehearsal capsules, shared production release-tail execution, replay, provider observation, and fail-closed verification APIs." },
|
|
233
239
|
"./publication-rehearsal-runtime": { group: "release-passport-trust", summary: "Compatibility names for the source-bound v4 publication rehearsal runtime and explicit rooted migration diagnostics." },
|
|
234
240
|
"./publication-rehearsal-projection": { group: "release-passport-trust", summary: "Compatibility projection helpers that emit only the current source-bound v4 publication rehearsal configuration and workflow." },
|
|
235
241
|
"./v4-publication-qualification": { group: "release-passport-trust", summary: "Sealed v4 candidate, source, artifact, policy, freshness, and command-free promotion admission APIs." },
|
|
242
|
+
"./publication-qualification": { group: "release-passport-trust", summary: "Sealed v4 candidate, source, artifact, policy, freshness, and command-free promotion admission APIs." },
|
|
236
243
|
"./adopter-delivery-gate": { group: "reusable-build", summary: "Protocol-neutral adopter delivery gate, driver interface, artifact profiles, and canonical result APIs." },
|
|
237
244
|
"./kfd-adopter-category-driver": { group: "kfd-trust", summary: "Published KFD adopter-category driver and exact package-cut verification APIs." },
|
|
238
245
|
"./buildchain-delivery-infrastructure": { group: "reusable-build", summary: "Public delivery-infrastructure instance creation and KFD verification APIs." },
|
|
@@ -243,7 +250,9 @@ export function nodeApiMeta(exportName) {
|
|
|
243
250
|
"./adopter-delivery-passport": { group: "release-passport-trust", summary: "Non-authoritative adopter delivery Release Passport binding and substitution checks." },
|
|
244
251
|
"./adopter-delivery-vectors": { group: "reusable-build", summary: "Rooted public adopter delivery conformance vector suite APIs." },
|
|
245
252
|
"./v4-adopter-delivery": { group: "reusable-build", summary: "Public v4 adopter delivery runtime, exact readback, N-1 lineage, and published archive verification APIs." },
|
|
253
|
+
"./adopter-delivery": { group: "reusable-build", summary: "Public v4 adopter delivery runtime, exact readback, N-1 lineage, and published archive verification APIs." },
|
|
246
254
|
"./v4-cross-platform-adopter-qualification": { group: "reusable-build", summary: "Exact-source v3 capability matrix reports, executed failure and recovery evidence, and cross-platform public adopter qualification APIs." },
|
|
255
|
+
"./cross-platform-adopter-qualification": { group: "reusable-build", summary: "Exact-source v3 capability matrix reports, executed failure and recovery evidence, and cross-platform public adopter qualification APIs." },
|
|
247
256
|
"./release-candidate-recovery": { group: "release-passport-trust", summary: "Fail-closed verification and immutable receipts for reusing a successful sealed candidate run without rebuilding product payloads." },
|
|
248
257
|
"./release-train": { group: "governance-versioning", summary: "Frozen Release Cut identity, rooted Release Train transitions, Dev observations, supersession, replay, and legacy read compatibility APIs." },
|
|
249
258
|
"./next-development-transition": { group: "governance-versioning", summary: "Provider-neutral completed-Alpha preservation and rooted next-development state, version-model, idempotency, and local materialization APIs." },
|
|
@@ -3,7 +3,7 @@ import fs from "node:fs";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { execFileSync } from "node:child_process";
|
|
5
5
|
import { pathToFileURL } from "node:url";
|
|
6
|
-
import {
|
|
6
|
+
import { invokeDomainWasm } from "../packages/core/domain-wasm.js";
|
|
7
7
|
|
|
8
8
|
const workflow = ".github/workflows/self-build-verify.yml";
|
|
9
9
|
const proofPath = ".buildchain/source-verification/evidence.json";
|
|
@@ -46,14 +46,14 @@ export function verificationIdentity({
|
|
|
46
46
|
"scripts/verify-version-state-delta.mjs",
|
|
47
47
|
]),
|
|
48
48
|
runtimeRoot: named([
|
|
49
|
-
"packages/core/buildchain-
|
|
50
|
-
"packages/core/
|
|
49
|
+
"packages/core/buildchain-domain.wasm",
|
|
50
|
+
"packages/core/domain-wasm-artifact.js",
|
|
51
51
|
]),
|
|
52
52
|
dependencyRoot: named([
|
|
53
53
|
"pnpm-lock.yaml",
|
|
54
54
|
"pnpm-workspace.yaml",
|
|
55
|
-
"crates/buildchain-
|
|
56
|
-
"crates/buildchain-
|
|
55
|
+
"crates/buildchain-domain-contracts/Cargo.lock",
|
|
56
|
+
"crates/buildchain-host-bridge/Cargo.lock",
|
|
57
57
|
]),
|
|
58
58
|
toolchainRoot: hash(
|
|
59
59
|
JSON.stringify([
|
|
@@ -99,11 +99,11 @@ export function verificationIdentity({
|
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
export function planVerification(input) {
|
|
102
|
-
return
|
|
102
|
+
return invokeDomainWasm("source-verification-plan", input);
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
export function sealVerification(input) {
|
|
106
|
-
return
|
|
106
|
+
return invokeDomainWasm("source-verification-seal", input);
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
const api = (endpoint, binary = false) =>
|