@kungfu-tech/buildchain 4.0.2 → 4.0.3-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
@@ -140,7 +140,7 @@ export function recoverLegacyTerminalDevDeliveryQueue(
|
|
|
140
140
|
);
|
|
141
141
|
}
|
|
142
142
|
const before = normalizeDevDeliveryQueue(queueInput, {
|
|
143
|
-
|
|
143
|
+
allowLegacyBaselineReadback: true,
|
|
144
144
|
});
|
|
145
145
|
const expectedOldStateRoot = exactRoot(
|
|
146
146
|
request.expectedOldStateRoot,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export function lacksExactNativeExecutionContract(
|
|
2
2
|
candidate,
|
|
3
|
-
|
|
3
|
+
allowLegacyBaselineReadback = false,
|
|
4
4
|
) {
|
|
5
5
|
const native =
|
|
6
6
|
candidate.deliveryClass !== "non-native-fast" ||
|
|
@@ -9,17 +9,17 @@ export function lacksExactNativeExecutionContract(
|
|
|
9
9
|
return Boolean(
|
|
10
10
|
native &&
|
|
11
11
|
(!candidate.environmentRoot ||
|
|
12
|
-
(!candidate.nativeCommandContract && !
|
|
12
|
+
(!candidate.nativeCommandContract && !allowLegacyBaselineReadback)),
|
|
13
13
|
);
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export function lacksLiveNativeProof(
|
|
17
17
|
candidate,
|
|
18
18
|
status,
|
|
19
|
-
{ allowLegacyV3Readback = false, allowLegacyQueuedReadback = false } = {},
|
|
19
|
+
{ allowLegacyV3Readback: legacyReadback = false, allowLegacyBaselineReadback = legacyReadback, allowLegacyQueuedReadback = false } = {},
|
|
20
20
|
) {
|
|
21
21
|
return (
|
|
22
|
-
lacksExactNativeExecutionContract(candidate,
|
|
22
|
+
lacksExactNativeExecutionContract(candidate, allowLegacyBaselineReadback) &&
|
|
23
23
|
!(status === "queued" && allowLegacyQueuedReadback) &&
|
|
24
24
|
!TERMINAL_STATES.has(status)
|
|
25
25
|
);
|
|
@@ -279,7 +279,8 @@ function normalizeCandidate(input, expected) {
|
|
|
279
279
|
}
|
|
280
280
|
if (
|
|
281
281
|
lacksLiveNativeProof(candidate, status, {
|
|
282
|
-
|
|
282
|
+
allowLegacyBaselineReadback:
|
|
283
|
+
expected.allowLegacyBaselineReadback ?? expected.allowLegacyV3Readback,
|
|
283
284
|
allowLegacyQueuedReadback: expected.allowLegacyQueuedNativeReadback,
|
|
284
285
|
})
|
|
285
286
|
)
|
|
@@ -358,12 +359,12 @@ export function normalizeDevDeliveryQueue(input, expected = {}) {
|
|
|
358
359
|
const hasExecutionReceipt = !!queue.activeWarrant?.nativeExecutionReceiptRoot;
|
|
359
360
|
const hasQualificationReceipt =
|
|
360
361
|
!!queue.activeWarrant?.qualificationReceiptRoot;
|
|
361
|
-
const
|
|
362
|
-
expected.allowLegacyV3Readback ===
|
|
363
|
-
|
|
362
|
+
const allowLegacyBaselineReadback =
|
|
363
|
+
(expected.allowLegacyBaselineReadback ?? expected.allowLegacyV3Readback) ===
|
|
364
|
+
true && hasExecutionReceipt === hasQualificationReceipt;
|
|
364
365
|
const candidateExpected = {
|
|
365
366
|
...queue,
|
|
366
|
-
|
|
367
|
+
allowLegacyBaselineReadback,
|
|
367
368
|
allowLegacyQueuedNativeReadback: true,
|
|
368
369
|
};
|
|
369
370
|
queue.candidates = (queue.candidates || []).map((candidate) =>
|
|
@@ -372,7 +373,7 @@ export function normalizeDevDeliveryQueue(input, expected = {}) {
|
|
|
372
373
|
validateDevDeliveryCandidateChain(queue.candidates, TERMINAL_STATES);
|
|
373
374
|
queue.updatedAt = timestamp(queue.updatedAt, "queue updatedAt");
|
|
374
375
|
if (queue.activeWarrant) {
|
|
375
|
-
validateActiveDevDeliveryWarrant(queue, {
|
|
376
|
+
validateActiveDevDeliveryWarrant(queue, { allowLegacyBaselineReadback });
|
|
376
377
|
} else if (
|
|
377
378
|
queue.candidates.some((candidate) =>
|
|
378
379
|
["selected", "proving", "waiting", "blocked", "qualified"].includes(
|
|
@@ -571,12 +572,11 @@ function effectivePriority(candidate, policy, now) {
|
|
|
571
572
|
releaseBlocker: Boolean(candidate.releaseBlockerPriority),
|
|
572
573
|
};
|
|
573
574
|
}
|
|
574
|
-
export function rankDevDeliveryCandidates(
|
|
575
|
-
|
|
576
|
-
{ now = new Date().toISOString(), allowLegacyV3Readback = false } = {},
|
|
577
|
-
) {
|
|
575
|
+
export function rankDevDeliveryCandidates(queueInput, options = {}) {
|
|
576
|
+
const { now = new Date().toISOString() } = options;
|
|
578
577
|
const queue = normalizeDevDeliveryQueue(queueInput, {
|
|
579
|
-
|
|
578
|
+
allowLegacyBaselineReadback:
|
|
579
|
+
options.allowLegacyBaselineReadback ?? options.allowLegacyV3Readback,
|
|
580
580
|
});
|
|
581
581
|
const currentTime = timestamp(now, "now");
|
|
582
582
|
return queue.candidates
|
|
@@ -534,10 +534,10 @@ export const reconcileDevDeliveryTerminalEvidence =
|
|
|
534
534
|
});
|
|
535
535
|
export function observeDevDeliveryQueue(
|
|
536
536
|
queueInput,
|
|
537
|
-
{ now = new Date().toISOString(), allowLegacyV3Readback = false } = {},
|
|
537
|
+
{ now = new Date().toISOString(), allowLegacyV3Readback: legacyReadback = false, allowLegacyBaselineReadback = legacyReadback } = {},
|
|
538
538
|
) {
|
|
539
539
|
const queue = normalizeDevDeliveryQueue(queueInput, {
|
|
540
|
-
|
|
540
|
+
allowLegacyBaselineReadback,
|
|
541
541
|
});
|
|
542
542
|
const currentTime = timestamp(now, "now");
|
|
543
543
|
const states = {};
|
|
@@ -545,7 +545,7 @@ export function observeDevDeliveryQueue(
|
|
|
545
545
|
states[candidate.status] = (states[candidate.status] || 0) + 1;
|
|
546
546
|
const queued = rankDevDeliveryCandidates(queue, {
|
|
547
547
|
now: currentTime,
|
|
548
|
-
|
|
548
|
+
allowLegacyBaselineReadback,
|
|
549
549
|
});
|
|
550
550
|
return {
|
|
551
551
|
schema: "kungfu.buildchain.dev-delivery-queue-observation/v1",
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Generated by scripts/build-domain-wasm.mjs.
|
|
2
|
+
export const DOMAIN_WASM_ABI_VERSION = 1;
|
|
3
|
+
export const DOMAIN_WASM_RUSTC = "rustc 1.96.0 (ac68faa20 2026-05-25)";
|
|
4
|
+
export const DOMAIN_WASM_SOURCE_SHA256 =
|
|
5
|
+
"d575dc3680de68f5f165b9fe584cf63ba2498adf45d286320b797a9caccf19f9";
|
|
6
|
+
export const DOMAIN_WASM_SHA256 =
|
|
7
|
+
"e04814473796c483e82e450b651b60e63609bfca182140b333dd0e6994ae63db";
|
|
@@ -2,32 +2,32 @@ import fs from "node:fs";
|
|
|
2
2
|
import { createHash } from "node:crypto";
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
} from "./
|
|
5
|
+
DOMAIN_WASM_ABI_VERSION,
|
|
6
|
+
DOMAIN_WASM_SHA256,
|
|
7
|
+
} from "./domain-wasm-artifact.js";
|
|
8
8
|
|
|
9
|
-
export const
|
|
9
|
+
export const DOMAIN_WASM_REQUEST_CONTRACT =
|
|
10
10
|
"kungfu-buildchain-v4-domain-wasm-request/v1";
|
|
11
|
-
export const
|
|
11
|
+
export const DOMAIN_WASM_RESPONSE_CONTRACT =
|
|
12
12
|
"kungfu-buildchain-v4-domain-wasm-response/v1";
|
|
13
13
|
|
|
14
|
-
const WASM_URL = new URL("./buildchain-
|
|
14
|
+
const WASM_URL = new URL("./buildchain-domain.wasm", import.meta.url);
|
|
15
15
|
const REQUIRED_EXPORTS = [
|
|
16
16
|
"memory",
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
17
|
+
"buildchain_domain_wasm_abi_version",
|
|
18
|
+
"buildchain_domain_wasm_alloc",
|
|
19
|
+
"buildchain_domain_wasm_dealloc",
|
|
20
|
+
"buildchain_domain_wasm_invoke",
|
|
21
|
+
"buildchain_domain_wasm_response_pointer",
|
|
22
|
+
"buildchain_domain_wasm_response_length",
|
|
23
23
|
];
|
|
24
24
|
|
|
25
25
|
let loaded;
|
|
26
26
|
|
|
27
|
-
export class
|
|
27
|
+
export class DomainWasmFault extends Error {
|
|
28
28
|
constructor(fault) {
|
|
29
29
|
super(fault?.message || "Rust/WASM domain request failed");
|
|
30
|
-
this.name = "
|
|
30
|
+
this.name = "DomainWasmFault";
|
|
31
31
|
this.fault = fault;
|
|
32
32
|
this.code = fault?.code || "rust-wasm-domain-failed";
|
|
33
33
|
this.path = fault?.path || "$";
|
|
@@ -43,7 +43,7 @@ function failClosed(message, cause) {
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
function invalidTransport(code, path, message) {
|
|
46
|
-
throw new
|
|
46
|
+
throw new DomainWasmFault({ code, path, message, retry: "stop" });
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
function validateJsonTransport(value, path, active) {
|
|
@@ -131,9 +131,9 @@ function loadAuthority() {
|
|
|
131
131
|
failClosed(`cannot read ${WASM_URL.pathname}`, error);
|
|
132
132
|
}
|
|
133
133
|
const observedSha256 = createHash("sha256").update(bytes).digest("hex");
|
|
134
|
-
if (observedSha256 !==
|
|
134
|
+
if (observedSha256 !== DOMAIN_WASM_SHA256) {
|
|
135
135
|
failClosed(
|
|
136
|
-
`artifact digest mismatch (expected ${
|
|
136
|
+
`artifact digest mismatch (expected ${DOMAIN_WASM_SHA256}, observed ${observedSha256})`,
|
|
137
137
|
);
|
|
138
138
|
}
|
|
139
139
|
let instance;
|
|
@@ -148,17 +148,17 @@ function loadAuthority() {
|
|
|
148
148
|
if (missing.length > 0) {
|
|
149
149
|
failClosed(`artifact is missing exports: ${missing.join(", ")}`);
|
|
150
150
|
}
|
|
151
|
-
const abiVersion = instance.exports.
|
|
152
|
-
if (abiVersion !==
|
|
151
|
+
const abiVersion = instance.exports.buildchain_domain_wasm_abi_version();
|
|
152
|
+
if (abiVersion !== DOMAIN_WASM_ABI_VERSION) {
|
|
153
153
|
failClosed(
|
|
154
|
-
`ABI mismatch (expected ${
|
|
154
|
+
`ABI mismatch (expected ${DOMAIN_WASM_ABI_VERSION}, observed ${abiVersion})`,
|
|
155
155
|
);
|
|
156
156
|
}
|
|
157
157
|
loaded = instance.exports;
|
|
158
158
|
return loaded;
|
|
159
159
|
}
|
|
160
160
|
|
|
161
|
-
export function
|
|
161
|
+
export function invokeDomainWasm(operation, payload) {
|
|
162
162
|
if (
|
|
163
163
|
["canonical-json", "content-root", "release-tail-root"].includes(operation)
|
|
164
164
|
) {
|
|
@@ -167,23 +167,23 @@ export function invokeV4DomainWasm(operation, payload) {
|
|
|
167
167
|
const authority = loadAuthority();
|
|
168
168
|
const input = new TextEncoder().encode(
|
|
169
169
|
JSON.stringify({
|
|
170
|
-
schema:
|
|
170
|
+
schema: DOMAIN_WASM_REQUEST_CONTRACT,
|
|
171
171
|
operation,
|
|
172
172
|
payload,
|
|
173
173
|
}),
|
|
174
174
|
);
|
|
175
|
-
const inputPointer = authority.
|
|
175
|
+
const inputPointer = authority.buildchain_domain_wasm_alloc(input.byteLength);
|
|
176
176
|
try {
|
|
177
177
|
new Uint8Array(authority.memory.buffer, inputPointer, input.byteLength).set(
|
|
178
178
|
input,
|
|
179
179
|
);
|
|
180
180
|
try {
|
|
181
|
-
authority.
|
|
181
|
+
authority.buildchain_domain_wasm_invoke(inputPointer, input.byteLength);
|
|
182
182
|
} catch (error) {
|
|
183
183
|
failClosed(`operation '${operation}' trapped`, error);
|
|
184
184
|
}
|
|
185
|
-
const responsePointer = authority.
|
|
186
|
-
const responseLength = authority.
|
|
185
|
+
const responsePointer = authority.buildchain_domain_wasm_response_pointer();
|
|
186
|
+
const responseLength = authority.buildchain_domain_wasm_response_length();
|
|
187
187
|
let response;
|
|
188
188
|
try {
|
|
189
189
|
const responseBytes = new Uint8Array(
|
|
@@ -199,18 +199,18 @@ export function invokeV4DomainWasm(operation, payload) {
|
|
|
199
199
|
);
|
|
200
200
|
}
|
|
201
201
|
if (
|
|
202
|
-
response?.schema !==
|
|
202
|
+
response?.schema !== DOMAIN_WASM_RESPONSE_CONTRACT ||
|
|
203
203
|
typeof response.ok !== "boolean"
|
|
204
204
|
) {
|
|
205
205
|
failClosed(`operation '${operation}' returned an unsupported response`);
|
|
206
206
|
}
|
|
207
|
-
if (!response.ok) throw new
|
|
207
|
+
if (!response.ok) throw new DomainWasmFault(response.fault);
|
|
208
208
|
return response.value;
|
|
209
209
|
} finally {
|
|
210
|
-
authority.
|
|
210
|
+
authority.buildchain_domain_wasm_dealloc(inputPointer, input.byteLength);
|
|
211
211
|
}
|
|
212
212
|
}
|
|
213
213
|
|
|
214
|
-
export function
|
|
215
|
-
return
|
|
214
|
+
export function domainWasmInfo() {
|
|
215
|
+
return invokeDomainWasm("abi-info", {});
|
|
216
216
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import crypto from "node:crypto";
|
|
2
2
|
|
|
3
|
-
export const
|
|
3
|
+
export const FLOATING_CONSUMER_POLICY =
|
|
4
4
|
"kungfu-buildchain-v4-floating-consumer-policy/v1";
|
|
5
|
-
export const
|
|
5
|
+
export const FLOATING_CONSUMER_RECEIPT =
|
|
6
6
|
"kungfu-buildchain-v4-floating-consumer-policy-receipt/v1";
|
|
7
|
-
export const
|
|
7
|
+
export const FLOATING_CONSUMER_CERTIFICATION =
|
|
8
8
|
"kungfu-buildchain-v4-floating-consumer-certification/v1";
|
|
9
9
|
|
|
10
10
|
const SHA256_ROOT = /^sha256:[0-9a-f]{64}$/u;
|
|
@@ -135,18 +135,18 @@ function verifyFloatingSelector(value, check, label) {
|
|
|
135
135
|
);
|
|
136
136
|
}
|
|
137
137
|
|
|
138
|
-
export function
|
|
138
|
+
export function floatingConsumerDocumentRoot(value) {
|
|
139
139
|
return documentRoot(value);
|
|
140
140
|
}
|
|
141
141
|
|
|
142
|
-
export function
|
|
142
|
+
export function verifyFloatingConsumerPolicyReceipt(options = {}) {
|
|
143
143
|
const { receipt, receiptRoot = "", expectedReceiptRoot = "" } = options;
|
|
144
144
|
const failures = [];
|
|
145
145
|
const check = checker(failures);
|
|
146
146
|
check(
|
|
147
|
-
receipt?.schema ===
|
|
147
|
+
receipt?.schema === FLOATING_CONSUMER_RECEIPT,
|
|
148
148
|
"receipt-contract-invalid",
|
|
149
|
-
`receipt must use ${
|
|
149
|
+
`receipt must use ${FLOATING_CONSUMER_RECEIPT}`,
|
|
150
150
|
);
|
|
151
151
|
check(
|
|
152
152
|
receipt?.status === "passed",
|
|
@@ -199,10 +199,10 @@ function defaultAuthority(options, receiptRoot) {
|
|
|
199
199
|
};
|
|
200
200
|
}
|
|
201
201
|
|
|
202
|
-
export function
|
|
203
|
-
const verification =
|
|
202
|
+
export function certifyFloatingConsumerPolicyReceipt(options = {}) {
|
|
203
|
+
const verification = verifyFloatingConsumerPolicyReceipt(options);
|
|
204
204
|
const certification = {
|
|
205
|
-
schema:
|
|
205
|
+
schema: FLOATING_CONSUMER_CERTIFICATION,
|
|
206
206
|
status: verification.ok ? "certified" : "rejected",
|
|
207
207
|
receiptRoot: verification.receiptRoot,
|
|
208
208
|
caller: options.receipt?.caller || {},
|
|
@@ -284,14 +284,14 @@ function verifyCertificationAuthority(certification, expected, check) {
|
|
|
284
284
|
);
|
|
285
285
|
}
|
|
286
286
|
|
|
287
|
-
export function
|
|
287
|
+
export function verifyFloatingConsumerPolicyCertification(options = {}) {
|
|
288
288
|
const { certification, certificationRoot = "" } = options;
|
|
289
289
|
const failures = [];
|
|
290
290
|
const check = checker(failures);
|
|
291
291
|
check(
|
|
292
|
-
certification?.schema ===
|
|
292
|
+
certification?.schema === FLOATING_CONSUMER_CERTIFICATION,
|
|
293
293
|
"certification-contract-invalid",
|
|
294
|
-
`certification must use ${
|
|
294
|
+
`certification must use ${FLOATING_CONSUMER_CERTIFICATION}`,
|
|
295
295
|
);
|
|
296
296
|
check(
|
|
297
297
|
certification?.status === "certified",
|
|
@@ -7,20 +7,20 @@ import {
|
|
|
7
7
|
} from "./buildchain-contract.js";
|
|
8
8
|
import { parseYamlUses } from "./workflow-yaml-contract.js";
|
|
9
9
|
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
} from "./
|
|
10
|
+
FLOATING_CONSUMER_POLICY,
|
|
11
|
+
FLOATING_CONSUMER_RECEIPT,
|
|
12
|
+
floatingConsumerDocumentRoot,
|
|
13
|
+
} from "./floating-consumer-evidence.js";
|
|
14
14
|
|
|
15
15
|
export {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
} from "./
|
|
16
|
+
FLOATING_CONSUMER_CERTIFICATION,
|
|
17
|
+
FLOATING_CONSUMER_POLICY,
|
|
18
|
+
FLOATING_CONSUMER_RECEIPT,
|
|
19
|
+
certifyFloatingConsumerPolicyReceipt,
|
|
20
|
+
floatingConsumerDocumentRoot,
|
|
21
|
+
verifyFloatingConsumerPolicyCertification,
|
|
22
|
+
verifyFloatingConsumerPolicyReceipt,
|
|
23
|
+
} from "./floating-consumer-evidence.js";
|
|
24
24
|
|
|
25
25
|
const EXACT_SHA = /^[0-9a-f]{40}$/u;
|
|
26
26
|
const SHA256_ROOT = /^sha256:[0-9a-f]{64}$/u;
|
|
@@ -36,12 +36,12 @@ const DEFAULT_ALPHA_LOCK_PATH = ".buildchain/alpha-contract-lock.json";
|
|
|
36
36
|
const TRANSIENT_ACTION =
|
|
37
37
|
/^\.\/\.buildchain\/(?:runtime|workflow-shell|attester-runtime|release-tail-runtime)\//u;
|
|
38
38
|
const SCANNER_PATHS = Object.freeze([
|
|
39
|
-
"architecture/
|
|
39
|
+
"architecture/floating-consumer-policy.json",
|
|
40
40
|
"contracts/v4-floating-consumer-policy-receipt-v1.schema.json",
|
|
41
41
|
"packages/core/buildchain-contract.js",
|
|
42
|
-
"packages/core/
|
|
42
|
+
"packages/core/floating-consumer-policy.js",
|
|
43
43
|
"packages/core/workflow-yaml-contract.js",
|
|
44
|
-
"scripts/
|
|
44
|
+
"scripts/consumer-policy.mjs",
|
|
45
45
|
]);
|
|
46
46
|
|
|
47
47
|
function defaultRuntimeRoot() {
|
|
@@ -73,9 +73,7 @@ function resolveInside(root, relative, label) {
|
|
|
73
73
|
return file;
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
export function
|
|
77
|
-
runtimeRoot = defaultRuntimeRoot(),
|
|
78
|
-
) {
|
|
76
|
+
export function consumerPolicyScannerRoot(runtimeRoot = defaultRuntimeRoot()) {
|
|
79
77
|
return sha256(
|
|
80
78
|
stableJson(
|
|
81
79
|
SCANNER_PATHS.map((relative) => ({
|
|
@@ -86,7 +84,7 @@ export function v4ConsumerPolicyScannerRoot(
|
|
|
86
84
|
);
|
|
87
85
|
}
|
|
88
86
|
|
|
89
|
-
export function
|
|
87
|
+
export function resolveFloatingConsumerPolicyAuthority({
|
|
90
88
|
runtimeRoot = defaultRuntimeRoot(),
|
|
91
89
|
callerRoot = process.cwd(),
|
|
92
90
|
stableLockPath = DEFAULT_STABLE_LOCK_PATH,
|
|
@@ -94,7 +92,7 @@ export function resolveV4FloatingConsumerPolicyAuthority({
|
|
|
94
92
|
} = {}) {
|
|
95
93
|
const policy = readJson(
|
|
96
94
|
runtimeRoot,
|
|
97
|
-
"architecture/
|
|
95
|
+
"architecture/floating-consumer-policy.json",
|
|
98
96
|
"v4 floating consumer policy",
|
|
99
97
|
).value;
|
|
100
98
|
const readLock = (relative, label) => {
|
|
@@ -102,12 +100,12 @@ export function resolveV4FloatingConsumerPolicyAuthority({
|
|
|
102
100
|
if (!fs.existsSync(file))
|
|
103
101
|
throw new Error(`${label} contract lock is missing: ${relative}`);
|
|
104
102
|
const value = JSON.parse(fs.readFileSync(file, "utf8"));
|
|
105
|
-
return { path: relative, root:
|
|
103
|
+
return { path: relative, root: floatingConsumerDocumentRoot(value) };
|
|
106
104
|
};
|
|
107
105
|
return {
|
|
108
106
|
policy,
|
|
109
|
-
policyRoot:
|
|
110
|
-
scannerRoot:
|
|
107
|
+
policyRoot: floatingConsumerDocumentRoot(policy),
|
|
108
|
+
scannerRoot: consumerPolicyScannerRoot(runtimeRoot),
|
|
111
109
|
contractLocks: {
|
|
112
110
|
stable: readLock(stableLockPath, "stable"),
|
|
113
111
|
alpha: readLock(alphaLockPath, "alpha"),
|
|
@@ -287,14 +285,14 @@ function classifyBuildchainUses(records, failures, { repository } = {}) {
|
|
|
287
285
|
for (const record of records) {
|
|
288
286
|
const parsed = coordinate(record.uses);
|
|
289
287
|
if (!parsed || parsed.repository !== BUILDCHAIN_REPOSITORY) continue;
|
|
290
|
-
const
|
|
288
|
+
const domainCandidate =
|
|
291
289
|
parsed.selector === "v4" ||
|
|
292
290
|
parsed.selector === "v4-alpha" ||
|
|
293
291
|
/^v4(?:[./-]|$)/u.test(parsed.selector) ||
|
|
294
292
|
parsed.selector === ALPHA_RECOVERY_BOOTSTRAP.selector ||
|
|
295
293
|
EXACT_SHA.test(parsed.selector.toLowerCase()) ||
|
|
296
294
|
parsed.selector.includes("${{");
|
|
297
|
-
if (!
|
|
295
|
+
if (!domainCandidate) continue;
|
|
298
296
|
const bootstrapShape =
|
|
299
297
|
normalizeWorkflowPath(parsed.path) ===
|
|
300
298
|
ALPHA_RECOVERY_BOOTSTRAP.workflow &&
|
|
@@ -429,7 +427,7 @@ function verifySelectedLock({
|
|
|
429
427
|
}
|
|
430
428
|
}
|
|
431
429
|
|
|
432
|
-
export function
|
|
430
|
+
export function scanFloatingConsumerPolicy({
|
|
433
431
|
root = process.cwd(),
|
|
434
432
|
invocationRoot = root,
|
|
435
433
|
repository = "",
|
|
@@ -446,8 +444,8 @@ export function scanV4FloatingConsumerPolicy({
|
|
|
446
444
|
} = {}) {
|
|
447
445
|
const resolvedRoot = path.resolve(root);
|
|
448
446
|
const resolvedInvocationRoot = path.resolve(invocationRoot);
|
|
449
|
-
if (!policy || policy.contract !==
|
|
450
|
-
throw new Error(`policy must use ${
|
|
447
|
+
if (!policy || policy.contract !== FLOATING_CONSUMER_POLICY) {
|
|
448
|
+
throw new Error(`policy must use ${FLOATING_CONSUMER_POLICY}`);
|
|
451
449
|
}
|
|
452
450
|
const failures = [];
|
|
453
451
|
const normalizedSourceSha = String(sourceSha || "").toLowerCase();
|
|
@@ -535,7 +533,7 @@ export function scanV4FloatingConsumerPolicy({
|
|
|
535
533
|
invocationUses,
|
|
536
534
|
});
|
|
537
535
|
const receipt = {
|
|
538
|
-
schema:
|
|
536
|
+
schema: FLOATING_CONSUMER_RECEIPT,
|
|
539
537
|
status: failures.length ? "failed" : "passed",
|
|
540
538
|
caller: { repository, sourceSha: normalizedSourceSha },
|
|
541
539
|
invocation: {
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
} from "./
|
|
4
|
+
floatingConsumerDocumentRoot,
|
|
5
|
+
verifyFloatingConsumerPolicyCertification,
|
|
6
|
+
} from "./floating-consumer-evidence.js";
|
|
7
7
|
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
} from "./
|
|
8
|
+
verifyRuntimeAuthorizationReceipt,
|
|
9
|
+
verifyRuntimeResumeLineage,
|
|
10
|
+
} from "./runtime-ref-resume-authority.js";
|
|
11
11
|
const SHA256_ROOT = /^sha256:[0-9a-f]{64}$/u;
|
|
12
|
-
export function
|
|
12
|
+
export function isPromotionRouting(value = undefined) {
|
|
13
13
|
return [
|
|
14
14
|
value?.router?.ref,
|
|
15
15
|
value?.shell?.ref,
|
|
@@ -31,13 +31,13 @@ function resolveCallerLock(root, relative, label) {
|
|
|
31
31
|
}
|
|
32
32
|
return {
|
|
33
33
|
path: relative,
|
|
34
|
-
root:
|
|
34
|
+
root: floatingConsumerDocumentRoot(
|
|
35
35
|
JSON.parse(fs.readFileSync(file, "utf8")),
|
|
36
36
|
),
|
|
37
37
|
};
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
export function
|
|
40
|
+
export function resolveFloatingConsumerCallerLocks(value, cwd) {
|
|
41
41
|
const certification = value?.certification || value;
|
|
42
42
|
const declared = certification?.authority || {};
|
|
43
43
|
const stableLockPath = declared?.contractLocks?.stable?.path || "";
|
|
@@ -55,7 +55,7 @@ function normalizeCertification(value, expected) {
|
|
|
55
55
|
throw new Error("v4ConsumerPolicyCertification must be a JSON object");
|
|
56
56
|
}
|
|
57
57
|
const certification = value.certification || value;
|
|
58
|
-
const verification =
|
|
58
|
+
const verification = verifyFloatingConsumerPolicyCertification({
|
|
59
59
|
certification,
|
|
60
60
|
certificationRoot: value.certificationRoot || "",
|
|
61
61
|
expectedCertificationRoot: expected.certificationRoot,
|
|
@@ -76,7 +76,7 @@ function normalizeCertification(value, expected) {
|
|
|
76
76
|
}
|
|
77
77
|
return { certificationRoot: verification.certificationRoot, certification };
|
|
78
78
|
}
|
|
79
|
-
export function
|
|
79
|
+
export function resolveConsumerPolicyCertificationIdentity({
|
|
80
80
|
release = {},
|
|
81
81
|
routing = {},
|
|
82
82
|
runtimeResume = undefined,
|
|
@@ -101,7 +101,7 @@ export function resolveV4ConsumerPolicyCertificationIdentity({
|
|
|
101
101
|
runtimeSha: buildSha || certifiedSha || routing?.runtime?.resolvedSha || "",
|
|
102
102
|
};
|
|
103
103
|
}
|
|
104
|
-
export function
|
|
104
|
+
export function requireConsumerPolicyCertification({
|
|
105
105
|
value,
|
|
106
106
|
repository,
|
|
107
107
|
sourceSha,
|
|
@@ -110,14 +110,14 @@ export function requireV4ConsumerPolicyCertification({
|
|
|
110
110
|
cwd,
|
|
111
111
|
certificationRoot,
|
|
112
112
|
}) {
|
|
113
|
-
const
|
|
114
|
-
if (
|
|
113
|
+
const domainRouting = isPromotionRouting(routing);
|
|
114
|
+
if (domainRouting && !value) {
|
|
115
115
|
throw new Error(
|
|
116
116
|
"Buildchain v4 Release Passport requires an external floating consumer policy certification",
|
|
117
117
|
);
|
|
118
118
|
}
|
|
119
119
|
if (!value) return undefined;
|
|
120
|
-
if (
|
|
120
|
+
if (domainRouting && !SHA256_ROOT.test(String(certificationRoot || ""))) {
|
|
121
121
|
throw new Error(
|
|
122
122
|
"Buildchain v4 Release Passport requires an expected external certification root",
|
|
123
123
|
);
|
|
@@ -127,7 +127,7 @@ export function requireV4ConsumerPolicyCertification({
|
|
|
127
127
|
sourceSha,
|
|
128
128
|
runtimeSha: runtimeSha || routing?.runtime?.resolvedSha || "",
|
|
129
129
|
certificationRoot,
|
|
130
|
-
...(
|
|
130
|
+
...(domainRouting ? resolveFloatingConsumerCallerLocks(value, cwd) : {}),
|
|
131
131
|
});
|
|
132
132
|
}
|
|
133
133
|
|
|
@@ -137,7 +137,7 @@ export function releasePassportCertificationVerificationOptions({
|
|
|
137
137
|
routing,
|
|
138
138
|
}) {
|
|
139
139
|
const authority = evidence?.certification?.authority || {};
|
|
140
|
-
const identity =
|
|
140
|
+
const identity = resolveConsumerPolicyCertificationIdentity({
|
|
141
141
|
release: { ...passport?.release, certification: evidence?.certification },
|
|
142
142
|
routing,
|
|
143
143
|
runtimeResume: passport?.v4RuntimeResume,
|
|
@@ -203,21 +203,21 @@ export function normalizePromotionEvidence({
|
|
|
203
203
|
release = {},
|
|
204
204
|
v4ConsumerPolicyCertification: certification,
|
|
205
205
|
v4ConsumerPolicyCertificationRoot: certificationRoot,
|
|
206
|
-
|
|
206
|
+
domainRuntimeResumeEvidence,
|
|
207
207
|
repository,
|
|
208
208
|
sourceSha,
|
|
209
209
|
cwd,
|
|
210
210
|
}) {
|
|
211
211
|
const routing = normalizePromotionRouting(release.promotionRouting);
|
|
212
|
-
const identity =
|
|
212
|
+
const identity = resolveConsumerPolicyCertificationIdentity({
|
|
213
213
|
release: { ...release, certification },
|
|
214
214
|
routing,
|
|
215
|
-
runtimeResume:
|
|
215
|
+
runtimeResume: domainRuntimeResumeEvidence,
|
|
216
216
|
sourceSha,
|
|
217
217
|
});
|
|
218
218
|
return {
|
|
219
219
|
routing,
|
|
220
|
-
consumerPolicy:
|
|
220
|
+
consumerPolicy: requireConsumerPolicyCertification({
|
|
221
221
|
value: certification,
|
|
222
222
|
repository,
|
|
223
223
|
sourceSha: identity.sourceSha,
|
|
@@ -229,12 +229,12 @@ export function normalizePromotionEvidence({
|
|
|
229
229
|
};
|
|
230
230
|
}
|
|
231
231
|
|
|
232
|
-
export function
|
|
232
|
+
export function normalizeRuntimeResumeEvidence(value, expected = {}) {
|
|
233
233
|
if (value === undefined || value === null || value === "") return undefined;
|
|
234
234
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
235
|
-
throw new Error("
|
|
235
|
+
throw new Error("domainRuntimeResumeEvidence must be a JSON object");
|
|
236
236
|
}
|
|
237
|
-
const authorizationVerification =
|
|
237
|
+
const authorizationVerification = verifyRuntimeAuthorizationReceipt({
|
|
238
238
|
receipt: value.authorization,
|
|
239
239
|
receiptRoot: value.authorizationRoot,
|
|
240
240
|
repository: expected.repository,
|
|
@@ -247,7 +247,7 @@ export function normalizeV4RuntimeResumeEvidence(value, expected = {}) {
|
|
|
247
247
|
`v4 runtime authorization invalid: ${authorizationVerification.failures.join(", ")}`,
|
|
248
248
|
);
|
|
249
249
|
}
|
|
250
|
-
const lineageVerification =
|
|
250
|
+
const lineageVerification = verifyRuntimeResumeLineage({
|
|
251
251
|
lineage: value.lineage,
|
|
252
252
|
lineageRoot: value.lineageRoot,
|
|
253
253
|
repository: expected.repository,
|
package/packages/core/index.js
CHANGED
|
@@ -644,9 +644,9 @@ export {
|
|
|
644
644
|
} from "./kfd3-surface-register.js";
|
|
645
645
|
|
|
646
646
|
export * from "./release-propagation.js";
|
|
647
|
-
export * from "./
|
|
648
|
-
export * from "./
|
|
649
|
-
export * from "./
|
|
647
|
+
export * from "./floating-consumer-policy.js";
|
|
648
|
+
export * from "./runtime-ref-resume-authority.js";
|
|
649
|
+
export * from "./publication-qualification.js";
|
|
650
650
|
|
|
651
651
|
export {
|
|
652
652
|
RELEASE_ACTIVATION_CONTRACT,
|
|
@@ -698,8 +698,4 @@ export {
|
|
|
698
698
|
writePaperScaffold,
|
|
699
699
|
} from "./paper.js"; export * from "./paper-work.js"; export * from "./paper-fleet.js";
|
|
700
700
|
|
|
701
|
-
export
|
|
702
|
-
SURFACE_TIMESTAMP_POLICY_CONTRACT,
|
|
703
|
-
applySurfaceTimestampPolicy,
|
|
704
|
-
createSurfaceTimestampPolicy,
|
|
705
|
-
} from "./surface-manifest.js";
|
|
701
|
+
export * from "./public-export-compatibility.js";
|