@kungfu-tech/buildchain 3.0.9-alpha.8 → 4.0.0-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.
Files changed (255) hide show
  1. package/AGENTS.md +39 -0
  2. package/README.md +17 -13
  3. package/actions/promote-buildchain-ref/README.md +0 -10
  4. package/actions/release-tail/README.md +6 -10
  5. package/architecture/internal-capabilities.json +502 -0
  6. package/architecture/maintainability-baseline.json +59 -0
  7. package/architecture/maintainability-policy.json +1384 -0
  8. package/architecture/release-tail-contract-inventory.json +587 -0
  9. package/architecture/v3-core-mechanism-inventory.json +1043 -0
  10. package/architecture/v3-core-mechanism-inventory.md +67 -0
  11. package/architecture/v4-adopter-delivery-parity.json +47 -0
  12. package/architecture/v4-architecture-constitution.md +210 -0
  13. package/architecture/v4-bootstrap-authority.json +56 -0
  14. package/architecture/v4-canonical-contract-fixtures.json +105 -0
  15. package/architecture/v4-capability-state-machine-manifest.json +480 -0
  16. package/architecture/v4-capability-state-machine-manifest.schema.json +202 -0
  17. package/architecture/v4-delivery-warrant-shadow-bootstrap-plan.json +830 -0
  18. package/architecture/v4-delivery-warrant-shadow-bootstrap-plan.md +223 -0
  19. package/architecture/v4-delivery-warrant-shadow-bootstrap-plan.schema.json +318 -0
  20. package/architecture/v4-delivery-warrant-shadow-fixtures.json +227 -0
  21. package/architecture/v4-delivery-warrant-shadow-fixtures.schema.json +67 -0
  22. package/architecture/v4-exception-ledger.json +5 -0
  23. package/architecture/v4-exception-ledger.schema.json +56 -0
  24. package/architecture/v4-partial-mutation-recovery-qualification.json +65 -0
  25. package/architecture/v4-platform-stage-checkpoints.json +97 -0
  26. package/architecture/v4-provider-operation-journal-contract.json +113 -0
  27. package/architecture/v4-release-activation-shadow-domain.json +61 -0
  28. package/architecture/v4-release-train-parity.json +68 -0
  29. package/architecture/v4-rust-libnode-bridge-evaluation.json +107 -0
  30. package/architecture/v4-rust-libnode-bridge-spike.md +85 -0
  31. package/architecture/v4-stable-publication-fence.json +66 -0
  32. package/architecture/v4-stage-capsule-contract.json +90 -0
  33. package/architecture/v4-stage-capsule-qualification.json +99 -0
  34. package/architecture/v4-stage-capsule-resume-planner.json +52 -0
  35. package/architecture/v4-stage-capsule-store-contract.json +72 -0
  36. package/bin/buildchain.mjs +15 -6
  37. package/contracts/auditable-demo-scenario-v1.schema.json +1 -1
  38. package/contracts/buildchain-v2-residuals-v1.json +2 -2
  39. package/contracts/fixtures/v4-delivery-warrant-trace-v1/golden.json +158 -0
  40. package/contracts/fixtures/v4-delivery-warrant-trace-v1/property.json +380 -0
  41. package/contracts/fixtures/v4-delivery-warrant-trace-v1/replay.json +163 -0
  42. package/contracts/fixtures/v4-partial-mutation-recovery-v1/shared.json +155 -0
  43. package/contracts/fixtures/v4-provider-operation-journal-v1/shared.json +457 -0
  44. package/contracts/fixtures/v4-provider-readback-idempotency-v1/shared.json +682 -0
  45. package/contracts/fixtures/v4-release-activation-shadow-v1/shared.json +53 -0
  46. package/contracts/fixtures/v4-stable-publication-fence-v1/shared.json +56 -0
  47. package/contracts/fixtures/v4-stage-capsule-resume-v1/late-platform-failure.json +176 -0
  48. package/contracts/fixtures/v4-stage-capsule-store-v1/shared.json +132 -0
  49. package/contracts/fixtures/v4-stage-capsule-v1/shared.json +111 -0
  50. package/contracts/v4-canonical-contracts-v1.schema.json +182 -0
  51. package/contracts/v4-delivery-warrant-semantic-diff-report-v1.schema.json +284 -0
  52. package/contracts/v4-delivery-warrant-trace-v1.schema.json +215 -0
  53. package/contracts/v4-host-contract-v1.schema.json +135 -0
  54. package/contracts/v4-partial-mutation-recovery-v1.schema.json +168 -0
  55. package/contracts/v4-provider-operation-journal-v1.schema.json +381 -0
  56. package/contracts/v4-release-activation-shadow-v1.schema.json +186 -0
  57. package/contracts/v4-stable-publication-fence-v1.schema.json +125 -0
  58. package/contracts/v4-stage-capsule-resume-v1.schema.json +225 -0
  59. package/contracts/v4-stage-capsule-store-v1.schema.json +154 -0
  60. package/contracts/v4-stage-capsule-v1.schema.json +178 -0
  61. package/crates/buildchain-v4-bridge/Cargo.lock +213 -0
  62. package/crates/buildchain-v4-bridge/Cargo.toml +12 -0
  63. package/crates/buildchain-v4-bridge/src/main.rs +495 -0
  64. package/dist/site/agent-index.json +0 -3
  65. package/dist/site/artifact-schemas.json +0 -6
  66. package/dist/site/buildchain-contract.json +103 -397
  67. package/dist/site/buildchain-site.json +302 -270
  68. package/dist/site/capability-registry.json +9 -11
  69. package/dist/site/cli-registry.json +8 -30
  70. package/dist/site/controller-registry.json +48 -8
  71. package/dist/site/kfd-claims.json +129 -142
  72. package/dist/site/kfd-upstream-aggregate.json +9 -9
  73. package/dist/site/manual-registry.json +18 -49
  74. package/dist/site/node-api-registry.json +1882 -4118
  75. package/dist/site/page-registry.json +278 -230
  76. package/dist/site/public-surface-audit.json +87 -185
  77. package/dist/site/publication-authority-registry.json +11 -1
  78. package/dist/site/publication-registry.json +4 -4
  79. package/dist/site/release-provenance.json +3 -7
  80. package/dist/site/schemas/kfd-support-projection-v1.schema.json +106 -0
  81. package/dist/site/site-manifest.json +22 -38
  82. package/dist/site/workflow-registry.json +80 -35
  83. package/docs/MAP.md +8 -4
  84. package/docs/auditable-demo.md +2 -2
  85. package/docs/aws-us-elastic-runner-burst-plane.md +7 -59
  86. package/docs/cli-reference.md +15 -92
  87. package/docs/cli.md +14 -14
  88. package/docs/dev-alpha-candidate-patrol.md +3 -11
  89. package/docs/dev-delivery-warrant.md +28 -100
  90. package/docs/engineering-housekeeper.md +12 -4
  91. package/docs/getting-started.md +1 -1
  92. package/docs/install.md +5 -5
  93. package/docs/kfd-support.md +2 -7
  94. package/docs/lifecycle-protocol.md +2 -4
  95. package/docs/node-api-reference.md +414 -523
  96. package/docs/release-flow.md +31 -31
  97. package/docs/release-governance.md +16 -28
  98. package/docs/release-passport.md +2 -15
  99. package/docs/release-tail-contract.md +13 -6
  100. package/docs/release-tail-provider-plane.md +13 -19
  101. package/docs/release-train.md +4 -4
  102. package/docs/reusable-build-surface.md +14 -27
  103. package/docs/site-bundle-contract.md +1 -5
  104. package/docs/stable-candidate-patrol.md +7 -7
  105. package/docs/v4-canonical-contracts.md +92 -0
  106. package/docs/v4-delivery-warrant-read-candidate.md +73 -0
  107. package/docs/v4-delivery-warrant-semantic-diff.md +75 -0
  108. package/docs/v4-production-release.md +63 -0
  109. package/docs/v4-stage-capsule.md +193 -0
  110. package/docs/versioning.md +3 -3
  111. package/package.json +19 -17
  112. package/packages/core/adopter-delivery-gate.js +576 -0
  113. package/packages/core/adopter-delivery-json.js +66 -0
  114. package/packages/core/artifact-signing.js +0 -61
  115. package/packages/core/artifact-verification-envelope.js +5 -5
  116. package/packages/core/build-facts.js +12 -4
  117. package/packages/core/buildchain-agent-manuals.js +0 -2
  118. package/packages/core/buildchain-config.js +4 -69
  119. package/packages/core/buildchain-contract.js +232 -46
  120. package/packages/core/buildchain-kfd-claims.js +1 -1
  121. package/packages/core/channel-candidate.js +0 -8
  122. package/packages/core/channel-promotion-baseline.js +0 -52
  123. package/packages/core/controller-evidence.js +3 -4
  124. package/packages/core/dev-alpha-candidate-selection.js +2 -10
  125. package/packages/core/dev-delivery-warrant-cancellation.js +0 -1
  126. package/packages/core/dev-delivery-warrant-settlement.js +1 -5
  127. package/packages/core/dev-delivery-warrant.js +12 -52
  128. package/packages/core/diagnostics.js +3 -8
  129. package/packages/core/github-governance-authority.js +3 -1
  130. package/packages/core/kfd-adopter-category-driver.js +167 -0
  131. package/packages/core/kfd-adopter-manifest.js +47 -46
  132. package/packages/core/kfd-gate.js +15 -45
  133. package/packages/core/paper-agent-entry.js +7 -16
  134. package/packages/core/paper-fleet.js +2 -2
  135. package/packages/core/paper-repository.js +2 -3
  136. package/packages/core/paper-scaffold-content.js +2 -23
  137. package/packages/core/paper.js +11 -43
  138. package/packages/core/publication-reproducibility.js +4 -4
  139. package/packages/core/release-line-bootstrap.js +21 -8
  140. package/packages/core/release-passport-contract.js +5 -5
  141. package/packages/core/release-passport.js +20 -131
  142. package/packages/core/self-dogfood-version.js +48 -35
  143. package/packages/core/spawn-command.js +232 -8
  144. package/packages/core/v4-adopter-delivery-parity.js +219 -0
  145. package/packages/core/v4-canonical-contracts.js +284 -0
  146. package/packages/core/v4-delivery-warrant-fixture-runner.js +371 -0
  147. package/packages/core/v4-delivery-warrant-read-candidate.js +279 -0
  148. package/packages/core/v4-delivery-warrant-semantic-diff-gate.js +352 -0
  149. package/packages/core/v4-delivery-warrant-shadow-adapter.js +447 -0
  150. package/packages/core/v4-partial-mutation-recovery-qualification.js +395 -0
  151. package/packages/core/v4-platform-stage-checkpoints.js +471 -0
  152. package/packages/core/v4-provider-operation-journal.js +531 -0
  153. package/packages/core/v4-provider-readback-idempotency.js +394 -0
  154. package/packages/core/v4-release-activation-shadow.js +519 -0
  155. package/packages/core/v4-stable-publication-fence.js +357 -0
  156. package/packages/core/v4-stage-capsule-local-store.js +426 -0
  157. package/packages/core/v4-stage-capsule-qualification-campaign.js +512 -0
  158. package/packages/core/v4-stage-capsule-qualification.js +456 -0
  159. package/packages/core/v4-stage-capsule-resume-planner.js +397 -0
  160. package/packages/core/v4-stage-capsule-store.js +401 -0
  161. package/packages/core/v4-stage-capsule.js +319 -0
  162. package/scripts/assemble-self-publication-admission.mjs +1 -1
  163. package/scripts/audit-publication-control-plane.mjs +5 -5
  164. package/scripts/auditable-demo-bundle-verification.mjs +3 -2
  165. package/scripts/auditable-demo-platform.mjs +2 -2
  166. package/scripts/auditable-demo-renditions.mjs +1 -1
  167. package/scripts/auditable-demo.mjs +2 -2
  168. package/scripts/aws-macos-jit-controller-core.mjs +13 -346
  169. package/scripts/aws-macos-jit-controller-runtime.mjs +2 -210
  170. package/scripts/aws-macos-jit-controller.mjs +37 -275
  171. package/scripts/aws-macos-jit-core.mjs +3 -41
  172. package/scripts/aws-macos-jit.mjs +0 -12
  173. package/scripts/aws-windows-jit-campaign.mjs +2 -2
  174. package/scripts/aws-windows-jit-controller-core.mjs +1 -1
  175. package/scripts/aws-windows-jit-controller.mjs +3 -3
  176. package/scripts/build-contract-core.mjs +3 -8
  177. package/scripts/build-standalone-binary.mjs +3 -14
  178. package/scripts/buildchain-channel-router.mjs +4 -0
  179. package/scripts/buildchain-cli-help.mjs +7 -13
  180. package/scripts/buildchain-contract-lock.mjs +0 -6
  181. package/scripts/check-action-bundles.mjs +3 -4
  182. package/scripts/check-internal-architecture.mjs +7 -6
  183. package/scripts/check-inventory.mjs +30 -25
  184. package/scripts/check-v4-public-dogfood-contract.mjs +270 -0
  185. package/scripts/create-release-bundle.mjs +8 -4
  186. package/scripts/dev-alpha-candidate-patrol.mjs +1 -22
  187. package/scripts/dev-delivery-proof.mjs +2 -54
  188. package/scripts/dev-delivery-warrant.mjs +59 -77
  189. package/scripts/dev-pr-auto-merge.mjs +4 -30
  190. package/scripts/dev-pr-delivery-warrant.mjs +0 -55
  191. package/scripts/dispatch-artifact-signing-authority.mjs +7 -4
  192. package/scripts/generate-buildchain-kfd-witnesses.mjs +94 -88
  193. package/scripts/generate-channel-build-workflow.mjs +54 -24
  194. package/scripts/generate-channel-promotion-workflow.mjs +15 -6
  195. package/scripts/generate-site-bundle.mjs +5 -21
  196. package/scripts/git-fetch-process-tree.mjs +34 -1
  197. package/scripts/init-repo.mjs +64 -159
  198. package/scripts/inspect-artifact-signing-requests.mjs +0 -6
  199. package/scripts/locked-source-checkout.mjs +3 -4
  200. package/scripts/maintainability-metrics.mjs +8 -2
  201. package/scripts/npm-publish-dry-run.mjs +2 -2
  202. package/scripts/npm-publish-transaction.mjs +2 -2
  203. package/scripts/publication-commit-evidence.mjs +23 -69
  204. package/scripts/release-candidate-resolver.mjs +11 -17
  205. package/scripts/release-tail.mjs +3 -49
  206. package/scripts/resume-from-candidate-run.mjs +9 -123
  207. package/scripts/run-lifecycle-core.mjs +12 -13
  208. package/scripts/seal-artifact-signing-requests.mjs +17 -21
  209. package/scripts/site-capability-metadata.mjs +2 -7
  210. package/scripts/stable-candidate-qualification.mjs +10 -10
  211. package/scripts/v4-architecture.mjs +12 -2
  212. package/scripts/v4-bridge-bootstrap.mjs +141 -0
  213. package/scripts/v4-bridge-evidence.mjs +141 -0
  214. package/scripts/v4-host-adapter.mjs +182 -0
  215. package/scripts/v4-platform-stage-checkpoint-rehearsal.mjs +207 -0
  216. package/scripts/v4-stage-capsule-qualification.mjs +528 -0
  217. package/scripts/v4-stage-capsule-resume-rehearsal.mjs +57 -0
  218. package/scripts/v4-warrant-shadow-plan.mjs +601 -0
  219. package/scripts/verify-golden-path.mjs +5 -5
  220. package/scripts/web-surface-cloudfront-rewrite.mjs +15 -15
  221. package/scripts/web-surface-core.mjs +2 -8
  222. package/scripts/workflow-call-contract.mjs +5 -184
  223. package/contracts/fixtures/kfd-adopter-release-v1/kfd-4-perspective.json +0 -16
  224. package/contracts/fixtures/kfd-adopter-release-v1/kfd-4-replay.json +0 -57
  225. package/contracts/fixtures/next-development-transition-v1/anchored-manual-waiting.json +0 -47
  226. package/contracts/fixtures/next-development-transition-v1/semver-auto-planned.json +0 -47
  227. package/contracts/fixtures/next-development-transition-v1/version-model-cases.json +0 -40
  228. package/contracts/next-development-request-v1.schema.json +0 -66
  229. package/contracts/next-development-transition-v1.schema.json +0 -292
  230. package/contracts/publication-rehearsal-capsule-v1.schema.json +0 -173
  231. package/dist/site/schemas/publication-rehearsal-capsule-v1.schema.json +0 -269
  232. package/dist/site/schemas/release-tail-capabilities-v1.schema.json +0 -353
  233. package/dist/site/schemas/release-tail-provider-bindings-v1.schema.json +0 -94
  234. package/docs/next-development-transition.md +0 -119
  235. package/docs/publication-rehearsal.md +0 -94
  236. package/packages/core/buildchain-compatibility-proof.js +0 -631
  237. package/packages/core/dev-delivery-native-proof.js +0 -333
  238. package/packages/core/dev-delivery-warrant-shadow.js +0 -502
  239. package/packages/core/next-development-candidate-reservation.js +0 -186
  240. package/packages/core/next-development-controller.js +0 -726
  241. package/packages/core/next-development-projection.js +0 -288
  242. package/packages/core/next-development-transition.js +0 -738
  243. package/packages/core/publication-rehearsal-projection.js +0 -173
  244. package/packages/core/publication-rehearsal-runtime.js +0 -921
  245. package/scripts/aws-macos-jit-instance-rehydrate.mjs +0 -260
  246. package/scripts/aws-macos-jit-source-rebind.mjs +0 -724
  247. package/scripts/dev-delivery-native-run.mjs +0 -187
  248. package/scripts/dev-delivery-two-phase.mjs +0 -598
  249. package/scripts/generate-next-development-guidance.mjs +0 -49
  250. package/scripts/materialize-self-release-candidate-version.mjs +0 -137
  251. package/scripts/next-development-self-dogfood-harness.mjs +0 -409
  252. package/scripts/next-development-self-dogfood.mjs +0 -532
  253. package/scripts/next-development-transition.mjs +0 -47
  254. package/scripts/release-candidate-tail-reseal.mjs +0 -426
  255. package/templates/native-dev-delivery.yml +0 -82
@@ -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() + 15 * 60 * 1000).toISOString(),
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 = spawnSync(command, args, {
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 = spawnSync("gh", ["api", apiPath, "-H", "Accept: application/vnd.github+json"], {
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 = spawnSync("gh", ["api", apiPath, "-H", "Accept: application/vnd.github+json"], {
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() + 15 * 60 * 1000);
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 { MAX_LONG_FORM_RENDERER_MANIFEST_BYTES, readRendererManifest } from "./auditable-demo-renditions.mjs";
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
- ? MAX_LONG_FORM_RENDERER_MANIFEST_BYTES
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: 150, rows: 28, width: 1280, height: 720 },
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 = 360;
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
- export const MAX_LONG_FORM_RENDERER_MANIFEST_BYTES = 64 * 1024 * 1024;
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 { MAX_LONG_FORM_RENDERER_MANIFEST_BYTES, readRendererManifest, validateRendererCompositionInputs, validateRenditionSet, validateTerminalCapture } from "./auditable-demo-renditions.mjs";
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
- ? MAX_LONG_FORM_RENDERER_MANIFEST_BYTES
144
+ ? 32 * 1024 * 1024
145
145
  : MAX_BUNDLE_MEMBER_BYTES;
146
146
  invariant(
147
147
  sha256(readRegular(target, member, maximumBytes)).slice(7) === match[1],