@kungfu-tech/buildchain 3.0.9-alpha.9 → 4.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +39 -0
- package/README.md +17 -13
- package/actions/promote-buildchain-ref/README.md +0 -10
- package/actions/release-tail/README.md +6 -10
- package/architecture/internal-capabilities.json +502 -0
- package/architecture/maintainability-baseline.json +59 -0
- package/architecture/maintainability-policy.json +1384 -0
- package/architecture/release-tail-contract-inventory.json +587 -0
- package/architecture/v3-core-mechanism-inventory.json +1043 -0
- package/architecture/v3-core-mechanism-inventory.md +67 -0
- package/architecture/v4-adopter-delivery-parity.json +47 -0
- package/architecture/v4-architecture-constitution.md +210 -0
- package/architecture/v4-bootstrap-authority.json +56 -0
- package/architecture/v4-canonical-contract-fixtures.json +105 -0
- package/architecture/v4-capability-state-machine-manifest.json +480 -0
- package/architecture/v4-capability-state-machine-manifest.schema.json +202 -0
- package/architecture/v4-delivery-warrant-shadow-bootstrap-plan.json +830 -0
- package/architecture/v4-delivery-warrant-shadow-bootstrap-plan.md +223 -0
- package/architecture/v4-delivery-warrant-shadow-bootstrap-plan.schema.json +318 -0
- package/architecture/v4-delivery-warrant-shadow-fixtures.json +227 -0
- package/architecture/v4-delivery-warrant-shadow-fixtures.schema.json +67 -0
- package/architecture/v4-exception-ledger.json +5 -0
- package/architecture/v4-exception-ledger.schema.json +56 -0
- package/architecture/v4-partial-mutation-recovery-qualification.json +65 -0
- package/architecture/v4-platform-stage-checkpoints.json +97 -0
- package/architecture/v4-provider-operation-journal-contract.json +113 -0
- package/architecture/v4-release-activation-shadow-domain.json +61 -0
- package/architecture/v4-release-train-parity.json +68 -0
- package/architecture/v4-rust-libnode-bridge-evaluation.json +107 -0
- package/architecture/v4-rust-libnode-bridge-spike.md +85 -0
- package/architecture/v4-stable-publication-fence.json +66 -0
- package/architecture/v4-stage-capsule-contract.json +90 -0
- package/architecture/v4-stage-capsule-qualification.json +99 -0
- package/architecture/v4-stage-capsule-resume-planner.json +52 -0
- package/architecture/v4-stage-capsule-store-contract.json +72 -0
- package/bin/buildchain.mjs +15 -10
- package/contracts/auditable-demo-scenario-v1.schema.json +1 -1
- package/contracts/buildchain-v2-residuals-v1.json +2 -2
- package/contracts/fixtures/v4-delivery-warrant-trace-v1/golden.json +158 -0
- package/contracts/fixtures/v4-delivery-warrant-trace-v1/property.json +380 -0
- package/contracts/fixtures/v4-delivery-warrant-trace-v1/replay.json +163 -0
- package/contracts/fixtures/v4-partial-mutation-recovery-v1/shared.json +155 -0
- package/contracts/fixtures/v4-provider-operation-journal-v1/shared.json +457 -0
- package/contracts/fixtures/v4-provider-readback-idempotency-v1/shared.json +682 -0
- package/contracts/fixtures/v4-release-activation-shadow-v1/shared.json +53 -0
- package/contracts/fixtures/v4-stable-publication-fence-v1/shared.json +56 -0
- package/contracts/fixtures/v4-stage-capsule-resume-v1/late-platform-failure.json +176 -0
- package/contracts/fixtures/v4-stage-capsule-store-v1/shared.json +132 -0
- package/contracts/fixtures/v4-stage-capsule-v1/shared.json +111 -0
- package/contracts/v4-canonical-contracts-v1.schema.json +182 -0
- package/contracts/v4-delivery-warrant-semantic-diff-report-v1.schema.json +284 -0
- package/contracts/v4-delivery-warrant-trace-v1.schema.json +215 -0
- package/contracts/v4-host-contract-v1.schema.json +135 -0
- package/contracts/v4-partial-mutation-recovery-v1.schema.json +168 -0
- package/contracts/v4-provider-operation-journal-v1.schema.json +381 -0
- package/contracts/v4-release-activation-shadow-v1.schema.json +186 -0
- package/contracts/v4-stable-publication-fence-v1.schema.json +125 -0
- package/contracts/v4-stage-capsule-resume-v1.schema.json +225 -0
- package/contracts/v4-stage-capsule-store-v1.schema.json +154 -0
- package/contracts/v4-stage-capsule-v1.schema.json +178 -0
- package/crates/buildchain-v4-bridge/Cargo.lock +213 -0
- package/crates/buildchain-v4-bridge/Cargo.toml +12 -0
- package/crates/buildchain-v4-bridge/src/main.rs +495 -0
- package/dist/site/agent-index.json +0 -4
- package/dist/site/artifact-schemas.json +0 -8
- package/dist/site/buildchain-contract.json +103 -397
- package/dist/site/buildchain-site.json +301 -388
- package/dist/site/capability-registry.json +9 -11
- package/dist/site/cli-registry.json +8 -53
- package/dist/site/controller-registry.json +48 -8
- package/dist/site/kfd-claims.json +129 -167
- package/dist/site/kfd-upstream-aggregate.json +9 -9
- package/dist/site/manual-registry.json +18 -49
- package/dist/site/node-api-registry.json +4345 -7345
- package/dist/site/page-registry.json +278 -346
- package/dist/site/public-surface-audit.json +85 -404
- package/dist/site/publication-authority-registry.json +11 -1
- package/dist/site/publication-registry.json +3 -6
- package/dist/site/release-provenance.json +3 -9
- package/dist/site/schemas/kfd-support-projection-v1.schema.json +106 -0
- package/dist/site/site-manifest.json +21 -40
- package/dist/site/workflow-registry.json +78 -35
- package/docs/MAP.md +8 -5
- package/docs/auditable-demo.md +2 -2
- package/docs/aws-us-elastic-runner-burst-plane.md +7 -59
- package/docs/cli-reference.md +15 -213
- package/docs/cli.md +14 -14
- package/docs/dev-alpha-candidate-patrol.md +3 -11
- package/docs/dev-delivery-warrant.md +29 -194
- package/docs/engineering-housekeeper.md +12 -4
- package/docs/getting-started.md +1 -1
- package/docs/install.md +5 -5
- package/docs/kfd-support.md +2 -7
- package/docs/lifecycle-protocol.md +2 -4
- package/docs/node-api-reference.md +414 -554
- package/docs/release-flow.md +31 -31
- package/docs/release-governance.md +16 -28
- package/docs/release-passport.md +2 -15
- package/docs/release-tail-contract.md +13 -6
- package/docs/release-tail-provider-plane.md +13 -19
- package/docs/release-train.md +4 -4
- package/docs/reusable-build-surface.md +14 -27
- package/docs/site-bundle-contract.md +1 -5
- package/docs/stable-candidate-patrol.md +7 -7
- package/docs/v4-canonical-contracts.md +92 -0
- package/docs/v4-delivery-warrant-read-candidate.md +73 -0
- package/docs/v4-delivery-warrant-semantic-diff.md +75 -0
- package/docs/v4-production-release.md +63 -0
- package/docs/v4-stage-capsule.md +193 -0
- package/docs/versioning.md +3 -5
- package/package.json +19 -19
- package/packages/core/adopter-delivery-gate.js +576 -0
- package/packages/core/adopter-delivery-json.js +66 -0
- package/packages/core/artifact-signing.js +0 -61
- package/packages/core/artifact-verification-envelope.js +5 -5
- package/packages/core/build-facts.js +12 -4
- package/packages/core/buildchain-agent-manuals.js +0 -2
- package/packages/core/buildchain-channel-identity.js +3 -2
- package/packages/core/buildchain-config.js +4 -69
- package/packages/core/buildchain-contract.js +232 -46
- package/packages/core/buildchain-kfd-claims.js +1 -1
- package/packages/core/channel-candidate.js +0 -8
- package/packages/core/channel-promotion-baseline.js +0 -52
- package/packages/core/controller-evidence.js +3 -4
- package/packages/core/dev-alpha-candidate-selection.js +2 -10
- package/packages/core/dev-delivery-warrant-cancellation.js +0 -1
- package/packages/core/dev-delivery-warrant-settlement.js +20 -67
- package/packages/core/dev-delivery-warrant.js +50 -138
- package/packages/core/diagnostics.js +3 -8
- package/packages/core/github-governance-authority.js +3 -1
- package/packages/core/kfd-adopter-category-driver.js +167 -0
- package/packages/core/kfd-adopter-manifest.js +47 -46
- package/packages/core/kfd-gate.js +15 -45
- package/packages/core/paper-agent-entry.js +7 -16
- package/packages/core/paper-fleet.js +2 -2
- package/packages/core/paper-repository.js +2 -3
- package/packages/core/paper-scaffold-content.js +2 -23
- package/packages/core/paper.js +11 -43
- package/packages/core/publication-reproducibility.js +4 -4
- package/packages/core/release-line-bootstrap.js +21 -8
- package/packages/core/release-passport-contract.js +5 -5
- package/packages/core/release-passport.js +20 -131
- package/packages/core/self-dogfood-version.js +48 -35
- package/packages/core/spawn-command.js +232 -8
- package/packages/core/v4-adopter-delivery-parity.js +219 -0
- package/packages/core/v4-canonical-contracts.js +284 -0
- package/packages/core/v4-delivery-warrant-fixture-runner.js +371 -0
- package/packages/core/v4-delivery-warrant-read-candidate.js +279 -0
- package/packages/core/v4-delivery-warrant-semantic-diff-gate.js +352 -0
- package/packages/core/v4-delivery-warrant-shadow-adapter.js +447 -0
- package/packages/core/v4-partial-mutation-recovery-qualification.js +395 -0
- package/packages/core/v4-platform-stage-checkpoints.js +471 -0
- package/packages/core/v4-provider-operation-journal.js +531 -0
- package/packages/core/v4-provider-readback-idempotency.js +394 -0
- package/packages/core/v4-release-activation-shadow.js +519 -0
- package/packages/core/v4-stable-publication-fence.js +357 -0
- package/packages/core/v4-stage-capsule-local-store.js +426 -0
- package/packages/core/v4-stage-capsule-qualification-campaign.js +512 -0
- package/packages/core/v4-stage-capsule-qualification.js +456 -0
- package/packages/core/v4-stage-capsule-resume-planner.js +397 -0
- package/packages/core/v4-stage-capsule-store.js +401 -0
- package/packages/core/v4-stage-capsule.js +319 -0
- package/scripts/assemble-self-publication-admission.mjs +1 -1
- package/scripts/audit-publication-control-plane.mjs +5 -5
- package/scripts/auditable-demo-bundle-verification.mjs +3 -2
- package/scripts/auditable-demo-platform.mjs +2 -2
- package/scripts/auditable-demo-renditions.mjs +1 -1
- package/scripts/auditable-demo.mjs +2 -2
- package/scripts/aws-macos-jit-controller-core.mjs +13 -346
- package/scripts/aws-macos-jit-controller-runtime.mjs +2 -210
- package/scripts/aws-macos-jit-controller.mjs +37 -275
- package/scripts/aws-macos-jit-core.mjs +3 -41
- package/scripts/aws-macos-jit.mjs +0 -12
- package/scripts/aws-windows-jit-campaign.mjs +2 -2
- package/scripts/aws-windows-jit-controller-core.mjs +1 -1
- package/scripts/aws-windows-jit-controller.mjs +3 -3
- package/scripts/build-contract-core.mjs +3 -8
- package/scripts/build-standalone-binary.mjs +3 -14
- package/scripts/buildchain-channel-router.mjs +4 -0
- package/scripts/buildchain-cli-help.mjs +7 -16
- package/scripts/buildchain-contract-lock.mjs +0 -6
- package/scripts/check-action-bundles.mjs +3 -4
- package/scripts/check-internal-architecture.mjs +7 -6
- package/scripts/check-inventory.mjs +30 -25
- package/scripts/check-v4-public-dogfood-contract.mjs +270 -0
- package/scripts/create-release-bundle.mjs +8 -4
- package/scripts/dev-alpha-candidate-patrol.mjs +1 -22
- package/scripts/dev-delivery-proof.mjs +2 -64
- package/scripts/dev-delivery-warrant.mjs +61 -86
- package/scripts/dev-pr-auto-merge.mjs +4 -30
- package/scripts/dev-pr-delivery-warrant.mjs +0 -55
- package/scripts/dispatch-artifact-signing-authority.mjs +7 -4
- package/scripts/generate-buildchain-kfd-witnesses.mjs +94 -88
- package/scripts/generate-channel-build-workflow.mjs +54 -24
- package/scripts/generate-channel-promotion-workflow.mjs +15 -6
- package/scripts/generate-site-bundle.mjs +8 -27
- package/scripts/git-fetch-process-tree.mjs +34 -1
- package/scripts/init-repo.mjs +64 -159
- package/scripts/inspect-artifact-signing-requests.mjs +0 -6
- package/scripts/locked-source-checkout.mjs +3 -4
- package/scripts/maintainability-metrics.mjs +8 -2
- package/scripts/npm-publish-dry-run.mjs +2 -2
- package/scripts/npm-publish-transaction.mjs +2 -2
- package/scripts/publication-commit-evidence.mjs +23 -69
- package/scripts/release-candidate-resolver.mjs +11 -17
- package/scripts/release-tail.mjs +3 -49
- package/scripts/resume-from-candidate-run.mjs +9 -123
- package/scripts/run-lifecycle-core.mjs +12 -13
- package/scripts/seal-artifact-signing-requests.mjs +17 -21
- package/scripts/site-capability-metadata.mjs +3 -20
- package/scripts/stable-candidate-qualification.mjs +10 -10
- package/scripts/v4-architecture.mjs +12 -2
- package/scripts/v4-bridge-bootstrap.mjs +141 -0
- package/scripts/v4-bridge-evidence.mjs +141 -0
- package/scripts/v4-host-adapter.mjs +182 -0
- package/scripts/v4-platform-stage-checkpoint-rehearsal.mjs +207 -0
- package/scripts/v4-stage-capsule-qualification.mjs +528 -0
- package/scripts/v4-stage-capsule-resume-rehearsal.mjs +57 -0
- package/scripts/v4-warrant-shadow-plan.mjs +601 -0
- package/scripts/verify-golden-path.mjs +5 -5
- package/scripts/web-surface-cloudfront-rewrite.mjs +15 -15
- package/scripts/web-surface-core.mjs +2 -8
- package/scripts/workflow-call-contract.mjs +5 -184
- package/contracts/dev-delivery-authority-v2.schema.json +0 -253
- package/contracts/fixtures/kfd-adopter-release-v1/kfd-4-perspective.json +0 -16
- package/contracts/fixtures/kfd-adopter-release-v1/kfd-4-replay.json +0 -57
- package/contracts/fixtures/next-development-transition-v1/anchored-manual-waiting.json +0 -47
- package/contracts/fixtures/next-development-transition-v1/semver-auto-planned.json +0 -47
- package/contracts/fixtures/next-development-transition-v1/version-model-cases.json +0 -40
- package/contracts/next-development-request-v1.schema.json +0 -66
- package/contracts/next-development-transition-v1.schema.json +0 -292
- package/contracts/publication-rehearsal-capsule-v1.schema.json +0 -173
- package/dist/site/schemas/dev-delivery-authority-v2.schema.json +0 -442
- package/dist/site/schemas/publication-rehearsal-capsule-v1.schema.json +0 -269
- package/dist/site/schemas/release-tail-capabilities-v1.schema.json +0 -353
- package/dist/site/schemas/release-tail-provider-bindings-v1.schema.json +0 -94
- package/docs/dev-delivery-qualification-landing-adr.md +0 -137
- package/docs/next-development-transition.md +0 -119
- package/docs/publication-rehearsal.md +0 -94
- package/packages/core/buildchain-compatibility-proof.js +0 -631
- package/packages/core/dev-delivery-authority.js +0 -996
- package/packages/core/dev-delivery-native-proof.js +0 -418
- package/packages/core/dev-delivery-warrant-shadow.js +0 -502
- package/packages/core/next-development-candidate-reservation.js +0 -186
- package/packages/core/next-development-controller.js +0 -726
- package/packages/core/next-development-projection.js +0 -288
- package/packages/core/next-development-transition.js +0 -738
- package/packages/core/publication-rehearsal-projection.js +0 -173
- package/packages/core/publication-rehearsal-runtime.js +0 -921
- package/scripts/aws-macos-jit-instance-rehydrate.mjs +0 -260
- package/scripts/aws-macos-jit-source-rebind.mjs +0 -724
- package/scripts/dev-delivery-authority.mjs +0 -368
- package/scripts/dev-delivery-native-run.mjs +0 -235
- package/scripts/dev-delivery-two-phase-resume.mjs +0 -90
- package/scripts/dev-delivery-two-phase.mjs +0 -577
- package/scripts/generate-next-development-guidance.mjs +0 -49
- package/scripts/materialize-self-release-candidate-version.mjs +0 -137
- package/scripts/next-development-self-dogfood-harness.mjs +0 -409
- package/scripts/next-development-self-dogfood.mjs +0 -532
- package/scripts/next-development-transition.mjs +0 -47
- package/scripts/release-candidate-tail-reseal.mjs +0 -426
- package/templates/native-dev-delivery.yml +0 -86
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import {
|
|
2
|
+
V4ContractFault,
|
|
3
|
+
v4ContentRoot,
|
|
4
|
+
validateV4Clock,
|
|
5
|
+
validateV4Root,
|
|
6
|
+
} from "./v4-canonical-contracts.js";
|
|
7
|
+
|
|
8
|
+
export const V4_STAGE_CAPSULE_CONTRACT = "buildchain-v4-stage-capsule/v1";
|
|
9
|
+
export const V4_STAGE_CAPSULE_IDENTITY_CONTRACT =
|
|
10
|
+
"buildchain-v4-stage-capsule-identity/v1";
|
|
11
|
+
export const V4_STAGE_CAPSULE_AVAILABILITY_CONTRACT =
|
|
12
|
+
"buildchain-v4-stage-capsule-availability/v1";
|
|
13
|
+
export const V4_STAGE_CAPSULE_REUSE_CONTRACT =
|
|
14
|
+
"buildchain-v4-stage-capsule-reuse/v1";
|
|
15
|
+
|
|
16
|
+
const TOKEN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/u;
|
|
17
|
+
const AVAILABILITY = new Set([
|
|
18
|
+
"available",
|
|
19
|
+
"missing",
|
|
20
|
+
"expired",
|
|
21
|
+
"partial",
|
|
22
|
+
"corrupt",
|
|
23
|
+
"quarantined",
|
|
24
|
+
"root-mismatch",
|
|
25
|
+
]);
|
|
26
|
+
|
|
27
|
+
function fault(code, path, message) {
|
|
28
|
+
throw new V4ContractFault(code, path, message);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function exactKeys(value, keys, path) {
|
|
32
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
33
|
+
fault("invalid-stage-capsule-shape", path, `${path} must be an object`);
|
|
34
|
+
const actual = Object.keys(value).sort();
|
|
35
|
+
const expected = [...keys].sort();
|
|
36
|
+
if (
|
|
37
|
+
actual.length !== expected.length ||
|
|
38
|
+
actual.some((key, index) => key !== expected[index])
|
|
39
|
+
)
|
|
40
|
+
fault(
|
|
41
|
+
"invalid-stage-capsule-shape",
|
|
42
|
+
path,
|
|
43
|
+
`${path} keys are not canonical`,
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function validateToken(value, path) {
|
|
48
|
+
if (typeof value !== "string" || !TOKEN.test(value))
|
|
49
|
+
fault(
|
|
50
|
+
"invalid-stage-capsule-token",
|
|
51
|
+
path,
|
|
52
|
+
`${path} must be an ASCII token`,
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function validateNamedRoots(value, path) {
|
|
57
|
+
if (!Array.isArray(value))
|
|
58
|
+
fault("invalid-stage-capsule-shape", path, `${path} must be an array`);
|
|
59
|
+
let prior = null;
|
|
60
|
+
for (const [index, entry] of value.entries()) {
|
|
61
|
+
const entryPath = `${path}/${index}`;
|
|
62
|
+
exactKeys(entry, ["name", "root"], entryPath);
|
|
63
|
+
validateToken(entry.name, `${entryPath}/name`);
|
|
64
|
+
validateV4Root(entry.root, `${entryPath}/root`);
|
|
65
|
+
if (prior !== null && entry.name <= prior)
|
|
66
|
+
fault(
|
|
67
|
+
"unordered-stage-capsule-roots",
|
|
68
|
+
`${entryPath}/name`,
|
|
69
|
+
`${path} names must be unique and byte-sorted`,
|
|
70
|
+
);
|
|
71
|
+
prior = entry.name;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function validateV4StageCapsuleIdentity(value) {
|
|
76
|
+
exactKeys(
|
|
77
|
+
value,
|
|
78
|
+
[
|
|
79
|
+
"schema",
|
|
80
|
+
"sourceRoot",
|
|
81
|
+
"platform",
|
|
82
|
+
"platformRoot",
|
|
83
|
+
"stage",
|
|
84
|
+
"toolchainRoots",
|
|
85
|
+
"runtimeRoot",
|
|
86
|
+
"policyRoot",
|
|
87
|
+
"declaredInputs",
|
|
88
|
+
"transformationRoot",
|
|
89
|
+
"outputManifestRoot",
|
|
90
|
+
"qualificationRoot",
|
|
91
|
+
"observationRoots",
|
|
92
|
+
],
|
|
93
|
+
"$/identity",
|
|
94
|
+
);
|
|
95
|
+
if (value.schema !== V4_STAGE_CAPSULE_IDENTITY_CONTRACT)
|
|
96
|
+
fault(
|
|
97
|
+
"unsupported-stage-capsule-version",
|
|
98
|
+
"$/identity/schema",
|
|
99
|
+
"unsupported Stage Capsule identity schema",
|
|
100
|
+
);
|
|
101
|
+
for (const name of ["platform", "stage"])
|
|
102
|
+
validateToken(value[name], `$/identity/${name}`);
|
|
103
|
+
for (const name of [
|
|
104
|
+
"sourceRoot",
|
|
105
|
+
"platformRoot",
|
|
106
|
+
"runtimeRoot",
|
|
107
|
+
"policyRoot",
|
|
108
|
+
"transformationRoot",
|
|
109
|
+
"outputManifestRoot",
|
|
110
|
+
"qualificationRoot",
|
|
111
|
+
])
|
|
112
|
+
validateV4Root(value[name], `$/identity/${name}`);
|
|
113
|
+
validateNamedRoots(value.toolchainRoots, "$/identity/toolchainRoots");
|
|
114
|
+
validateNamedRoots(value.declaredInputs, "$/identity/declaredInputs");
|
|
115
|
+
validateNamedRoots(value.observationRoots, "$/identity/observationRoots");
|
|
116
|
+
return value;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function v4StageCapsuleIdentityRoot(identity) {
|
|
120
|
+
validateV4StageCapsuleIdentity(identity);
|
|
121
|
+
return v4ContentRoot("stage-capsule-identity", identity);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function validateRetentionPromise(value) {
|
|
125
|
+
exactKeys(value, ["class", "retainUntil"], "$/retentionPromise");
|
|
126
|
+
validateToken(value.class, "$/retentionPromise/class");
|
|
127
|
+
validateV4Clock(value.retainUntil, "$/retentionPromise/retainUntil");
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function capsulePayload(value) {
|
|
131
|
+
return {
|
|
132
|
+
schema: value.schema,
|
|
133
|
+
writerAuthority: value.writerAuthority,
|
|
134
|
+
rustAuthority: value.rustAuthority,
|
|
135
|
+
identity: value.identity,
|
|
136
|
+
identityRoot: value.identityRoot,
|
|
137
|
+
retentionPromise: value.retentionPromise,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export function validateV4StageCapsule(value) {
|
|
142
|
+
exactKeys(
|
|
143
|
+
value,
|
|
144
|
+
[
|
|
145
|
+
"schema",
|
|
146
|
+
"writerAuthority",
|
|
147
|
+
"rustAuthority",
|
|
148
|
+
"identity",
|
|
149
|
+
"identityRoot",
|
|
150
|
+
"retentionPromise",
|
|
151
|
+
"capsuleRoot",
|
|
152
|
+
],
|
|
153
|
+
"$",
|
|
154
|
+
);
|
|
155
|
+
if (value.schema !== V4_STAGE_CAPSULE_CONTRACT)
|
|
156
|
+
fault(
|
|
157
|
+
"unsupported-stage-capsule-version",
|
|
158
|
+
"$/schema",
|
|
159
|
+
"unsupported Stage Capsule schema",
|
|
160
|
+
);
|
|
161
|
+
if (
|
|
162
|
+
value.writerAuthority !== "typescript-v3" ||
|
|
163
|
+
value.rustAuthority !== "validation-only"
|
|
164
|
+
)
|
|
165
|
+
fault(
|
|
166
|
+
"invalid-stage-capsule-authority",
|
|
167
|
+
"$/writerAuthority",
|
|
168
|
+
"Stage Capsule authority must remain TypeScript v3 with validation-only Rust",
|
|
169
|
+
);
|
|
170
|
+
const identityRoot = v4StageCapsuleIdentityRoot(value.identity);
|
|
171
|
+
validateV4Root(value.identityRoot, "$/identityRoot");
|
|
172
|
+
if (value.identityRoot !== identityRoot)
|
|
173
|
+
fault(
|
|
174
|
+
"stage-capsule-identity-root-mismatch",
|
|
175
|
+
"$/identityRoot",
|
|
176
|
+
"identityRoot does not bind the canonical Stage Capsule identity",
|
|
177
|
+
);
|
|
178
|
+
validateRetentionPromise(value.retentionPromise);
|
|
179
|
+
validateV4Root(value.capsuleRoot, "$/capsuleRoot");
|
|
180
|
+
const capsuleRoot = v4ContentRoot("stage-capsule", capsulePayload(value));
|
|
181
|
+
if (value.capsuleRoot !== capsuleRoot)
|
|
182
|
+
fault(
|
|
183
|
+
"stage-capsule-root-mismatch",
|
|
184
|
+
"$/capsuleRoot",
|
|
185
|
+
"capsuleRoot does not bind the canonical Stage Capsule",
|
|
186
|
+
);
|
|
187
|
+
return value;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export function v4StageCapsuleRoot(value) {
|
|
191
|
+
validateV4StageCapsuleIdentity(value.identity);
|
|
192
|
+
validateRetentionPromise(value.retentionPromise);
|
|
193
|
+
return v4ContentRoot("stage-capsule", capsulePayload(value));
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export function validateV4StageCapsuleAvailability(value) {
|
|
197
|
+
exactKeys(
|
|
198
|
+
value,
|
|
199
|
+
[
|
|
200
|
+
"schema",
|
|
201
|
+
"capsuleRoot",
|
|
202
|
+
"observedAt",
|
|
203
|
+
"status",
|
|
204
|
+
"contentRoot",
|
|
205
|
+
"qualificationRoot",
|
|
206
|
+
"transports",
|
|
207
|
+
"faultCode",
|
|
208
|
+
],
|
|
209
|
+
"$/availability",
|
|
210
|
+
);
|
|
211
|
+
if (value.schema !== V4_STAGE_CAPSULE_AVAILABILITY_CONTRACT)
|
|
212
|
+
fault(
|
|
213
|
+
"unsupported-stage-capsule-version",
|
|
214
|
+
"$/availability/schema",
|
|
215
|
+
"unsupported Stage Capsule availability schema",
|
|
216
|
+
);
|
|
217
|
+
validateV4Root(value.capsuleRoot, "$/availability/capsuleRoot");
|
|
218
|
+
validateV4Clock(value.observedAt, "$/availability/observedAt");
|
|
219
|
+
if (!AVAILABILITY.has(value.status))
|
|
220
|
+
fault(
|
|
221
|
+
"invalid-stage-capsule-availability",
|
|
222
|
+
"$/availability/status",
|
|
223
|
+
"unsupported Stage Capsule availability status",
|
|
224
|
+
);
|
|
225
|
+
for (const name of ["contentRoot", "qualificationRoot"])
|
|
226
|
+
if (value[name] !== null)
|
|
227
|
+
validateV4Root(value[name], `$/availability/${name}`);
|
|
228
|
+
validateNamedRoots(value.transports, "$/availability/transports");
|
|
229
|
+
if (value.faultCode !== null)
|
|
230
|
+
validateToken(value.faultCode, "$/availability/faultCode");
|
|
231
|
+
if (
|
|
232
|
+
value.status === "available" &&
|
|
233
|
+
(value.contentRoot === null ||
|
|
234
|
+
value.qualificationRoot === null ||
|
|
235
|
+
value.faultCode !== null)
|
|
236
|
+
)
|
|
237
|
+
fault(
|
|
238
|
+
"invalid-stage-capsule-availability",
|
|
239
|
+
"$/availability",
|
|
240
|
+
"available content requires content and qualification roots without a fault",
|
|
241
|
+
);
|
|
242
|
+
if (value.status !== "available" && value.faultCode === null)
|
|
243
|
+
fault(
|
|
244
|
+
"invalid-stage-capsule-availability",
|
|
245
|
+
"$/availability/faultCode",
|
|
246
|
+
"unavailable content requires a typed fault code",
|
|
247
|
+
);
|
|
248
|
+
return value;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
export function v4StageCapsuleAvailabilityRoot(value) {
|
|
252
|
+
validateV4StageCapsuleAvailability(value);
|
|
253
|
+
return v4ContentRoot("stage-capsule-availability", value);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
export function evaluateV4StageCapsuleReuse(request) {
|
|
257
|
+
exactKeys(
|
|
258
|
+
request,
|
|
259
|
+
[
|
|
260
|
+
"schema",
|
|
261
|
+
"capsule",
|
|
262
|
+
"availability",
|
|
263
|
+
"evaluatedAt",
|
|
264
|
+
"expectedCapsuleRoot",
|
|
265
|
+
"expectedOutputManifestRoot",
|
|
266
|
+
"expectedQualificationRoot",
|
|
267
|
+
],
|
|
268
|
+
"$",
|
|
269
|
+
);
|
|
270
|
+
if (request.schema !== V4_STAGE_CAPSULE_REUSE_CONTRACT)
|
|
271
|
+
fault(
|
|
272
|
+
"unsupported-stage-capsule-version",
|
|
273
|
+
"$/schema",
|
|
274
|
+
"unsupported Stage Capsule reuse schema",
|
|
275
|
+
);
|
|
276
|
+
validateV4StageCapsule(request.capsule);
|
|
277
|
+
validateV4StageCapsuleAvailability(request.availability);
|
|
278
|
+
validateV4Clock(request.evaluatedAt, "$/evaluatedAt");
|
|
279
|
+
for (const name of [
|
|
280
|
+
"expectedCapsuleRoot",
|
|
281
|
+
"expectedOutputManifestRoot",
|
|
282
|
+
"expectedQualificationRoot",
|
|
283
|
+
])
|
|
284
|
+
validateV4Root(request[name], `$/${name}`);
|
|
285
|
+
const fail = (reason) => ({
|
|
286
|
+
schema: V4_STAGE_CAPSULE_REUSE_CONTRACT,
|
|
287
|
+
eligible: false,
|
|
288
|
+
capsuleRoot: request.capsule.capsuleRoot,
|
|
289
|
+
availabilityRoot: v4StageCapsuleAvailabilityRoot(request.availability),
|
|
290
|
+
reason,
|
|
291
|
+
});
|
|
292
|
+
if (
|
|
293
|
+
request.expectedCapsuleRoot !== request.capsule.capsuleRoot ||
|
|
294
|
+
request.availability.capsuleRoot !== request.capsule.capsuleRoot
|
|
295
|
+
)
|
|
296
|
+
return fail("root-mismatch");
|
|
297
|
+
if (request.availability.status !== "available")
|
|
298
|
+
return fail(request.availability.status);
|
|
299
|
+
if (request.evaluatedAt > request.capsule.retentionPromise.retainUntil)
|
|
300
|
+
return fail("expired");
|
|
301
|
+
if (
|
|
302
|
+
request.expectedOutputManifestRoot !==
|
|
303
|
+
request.capsule.identity.outputManifestRoot ||
|
|
304
|
+
request.availability.contentRoot !==
|
|
305
|
+
request.capsule.identity.outputManifestRoot ||
|
|
306
|
+
request.expectedQualificationRoot !==
|
|
307
|
+
request.capsule.identity.qualificationRoot ||
|
|
308
|
+
request.availability.qualificationRoot !==
|
|
309
|
+
request.capsule.identity.qualificationRoot
|
|
310
|
+
)
|
|
311
|
+
return fail("root-mismatch");
|
|
312
|
+
return {
|
|
313
|
+
schema: V4_STAGE_CAPSULE_REUSE_CONTRACT,
|
|
314
|
+
eligible: true,
|
|
315
|
+
capsuleRoot: request.capsule.capsuleRoot,
|
|
316
|
+
availabilityRoot: v4StageCapsuleAvailabilityRoot(request.availability),
|
|
317
|
+
reason: "eligible",
|
|
318
|
+
};
|
|
319
|
+
}
|
|
@@ -173,7 +173,7 @@ async function main() {
|
|
|
173
173
|
artifactDigest: artifactSet.manifestSetDigest,
|
|
174
174
|
nonce: `${required("GITHUB_RUN_ID")}:${required("GITHUB_RUN_ATTEMPT")}:${sourceSha}`,
|
|
175
175
|
issuedAt: issuedAt.toISOString(),
|
|
176
|
-
expiresAt: new Date(issuedAt.getTime() +
|
|
176
|
+
expiresAt: new Date(issuedAt.getTime() + 10 * 60 * 1000).toISOString(),
|
|
177
177
|
qualification: {
|
|
178
178
|
required: qualificationRequired,
|
|
179
179
|
predicateId: process.env.BUILDCHAIN_CONSUMER_PREDICATE_ID || "",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { spawnSync } from "node:child_process";
|
|
3
2
|
import fs from "node:fs";
|
|
4
3
|
import path from "node:path";
|
|
4
|
+
import { spawnSyncCommand } from "../packages/core/spawn-command.js";
|
|
5
5
|
|
|
6
6
|
import {
|
|
7
7
|
evaluateBuildchainReleaseReconciliation,
|
|
@@ -17,7 +17,7 @@ function flag(name, fallback = "") {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
function commandJson(command, args, label) {
|
|
20
|
-
const result =
|
|
20
|
+
const result = spawnSyncCommand(command, args, {
|
|
21
21
|
encoding: "utf8",
|
|
22
22
|
timeout: 60_000,
|
|
23
23
|
maxBuffer: GITHUB_JSON_MAX_BUFFER,
|
|
@@ -38,7 +38,7 @@ function githubJson(apiPath, label) {
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
function githubJsonOptional(apiPath, label, fallback) {
|
|
41
|
-
const result =
|
|
41
|
+
const result = spawnSyncCommand("gh", ["api", apiPath, "-H", "Accept: application/vnd.github+json"], {
|
|
42
42
|
encoding: "utf8",
|
|
43
43
|
timeout: 60_000,
|
|
44
44
|
maxBuffer: GITHUB_JSON_MAX_BUFFER,
|
|
@@ -56,7 +56,7 @@ function githubJsonOptional(apiPath, label, fallback) {
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
function githubJsonReadLimited(apiPath, label, fallback) {
|
|
59
|
-
const result =
|
|
59
|
+
const result = spawnSyncCommand("gh", ["api", apiPath, "-H", "Accept: application/vnd.github+json"], {
|
|
60
60
|
encoding: "utf8",
|
|
61
61
|
timeout: 60_000,
|
|
62
62
|
maxBuffer: GITHUB_JSON_MAX_BUFFER,
|
|
@@ -453,7 +453,7 @@ function main() {
|
|
|
453
453
|
const reviewRules = (environmentState.protection_rules || []).filter((rule) => rule.type === "required_reviewers");
|
|
454
454
|
const runsOn = (block.match(/^\s{4}runs-on:\s*([^\n#]+)/m)?.[1] || "").trim().replace(/["']/g, "");
|
|
455
455
|
const observedAt = new Date();
|
|
456
|
-
const expiresAt = new Date(observedAt.getTime() +
|
|
456
|
+
const expiresAt = new Date(observedAt.getTime() + 10 * 60 * 1000);
|
|
457
457
|
const receipt = evaluatePublicationControlPlaneSnapshot({
|
|
458
458
|
repository,
|
|
459
459
|
workflowPath,
|
|
@@ -4,10 +4,11 @@
|
|
|
4
4
|
import crypto from "node:crypto";
|
|
5
5
|
import fs from "node:fs";
|
|
6
6
|
import path from "node:path";
|
|
7
|
-
import {
|
|
7
|
+
import { readRendererManifest } from "./auditable-demo-renditions.mjs";
|
|
8
8
|
|
|
9
9
|
const DIGEST = /^sha256:[0-9a-f]{64}$/u;
|
|
10
10
|
const MAX_METADATA_MEMBER_BYTES = 8 * 1024 * 1024;
|
|
11
|
+
const MAX_LONG_FORM_MANIFEST_BYTES = 32 * 1024 * 1024;
|
|
11
12
|
const MAX_TERMINAL_CAPTURE_BYTES = 4 * 1024 * 1024;
|
|
12
13
|
const MAX_TERMINAL_CAPTURE_EVENTS = 10_000;
|
|
13
14
|
const DIGEST_BUFFER_BYTES = 64 * 1024;
|
|
@@ -112,7 +113,7 @@ export function verifyBundleChecksums(root, label, options = {}) {
|
|
|
112
113
|
declared.add(match[2]);
|
|
113
114
|
const metadataMember = match[2].endsWith(".json") || match[2].endsWith(".sha256");
|
|
114
115
|
const maximum = options.allowLongFormRendererManifest && match[2] === "manifest.json"
|
|
115
|
-
?
|
|
116
|
+
? MAX_LONG_FORM_MANIFEST_BYTES
|
|
116
117
|
: metadataMember
|
|
117
118
|
? MAX_METADATA_MEMBER_BYTES
|
|
118
119
|
: (options.maximumMemberBytes || MAX_METADATA_MEMBER_BYTES);
|
|
@@ -23,10 +23,10 @@ const NON_AUTHORITIES = [
|
|
|
23
23
|
];
|
|
24
24
|
const RENDITIONS = [
|
|
25
25
|
{ id: "1080p", role: "primary", columns: 150, rows: 36, width: 1920, height: 1080 },
|
|
26
|
-
{ id: "720p", role: "responsive", columns:
|
|
26
|
+
{ id: "720p", role: "responsive", columns: 100, rows: 28, width: 1280, height: 720 },
|
|
27
27
|
];
|
|
28
28
|
const STANDARD_MAX_SECONDS = 60;
|
|
29
|
-
const LONG_FORM_MAX_SECONDS =
|
|
29
|
+
const LONG_FORM_MAX_SECONDS = 180;
|
|
30
30
|
const PRESENTATION_FRAMED = "presentation-framed";
|
|
31
31
|
const TERMINAL_FILL = "terminal-fill";
|
|
32
32
|
const MAX_EXECUTABLE_FILES = 32;
|
|
@@ -17,7 +17,7 @@ const RENDITION_SET_NON_AUTHORITIES = [
|
|
|
17
17
|
...TERMINAL_CAPTURE_NON_AUTHORITIES,
|
|
18
18
|
];
|
|
19
19
|
const MAX_BUNDLE_MEMBER_BYTES = 8 * 1024 * 1024;
|
|
20
|
-
|
|
20
|
+
const MAX_LONG_FORM_RENDERER_MANIFEST_BYTES = 32 * 1024 * 1024;
|
|
21
21
|
const PRESENTATION_FRAMED = "presentation-framed";
|
|
22
22
|
const TERMINAL_FILL = "terminal-fill";
|
|
23
23
|
const GEOMETRY_TOLERANCE = 0.001;
|
|
@@ -7,7 +7,7 @@ import os from "node:os";
|
|
|
7
7
|
import path from "node:path";
|
|
8
8
|
import { spawnSync } from "node:child_process";
|
|
9
9
|
import { fileURLToPath } from "node:url";
|
|
10
|
-
import {
|
|
10
|
+
import { readRendererManifest, validateRendererCompositionInputs, validateRenditionSet, validateTerminalCapture } from "./auditable-demo-renditions.mjs";
|
|
11
11
|
|
|
12
12
|
const UTF8 = new TextDecoder("utf-8", { fatal: true });
|
|
13
13
|
const IMAGE_PATTERN = /^[a-z0-9][a-z0-9./_-]*@sha256:[0-9a-f]{64}$/;
|
|
@@ -141,7 +141,7 @@ function verifyChecksums(root, checksumName = "checksums.sha256", options = {})
|
|
|
141
141
|
invariant(!declared.has(member), `duplicate checksum member: ${member}`);
|
|
142
142
|
declared.add(member);
|
|
143
143
|
const maximumBytes = options.allowLongFormRendererManifest && member === "manifest.json"
|
|
144
|
-
?
|
|
144
|
+
? 32 * 1024 * 1024
|
|
145
145
|
: MAX_BUNDLE_MEMBER_BYTES;
|
|
146
146
|
invariant(
|
|
147
147
|
sha256(readRegular(target, member, maximumBytes)).slice(7) === match[1],
|