@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.
Files changed (262) 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 -10
  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 -4
  65. package/dist/site/artifact-schemas.json +0 -8
  66. package/dist/site/buildchain-contract.json +103 -397
  67. package/dist/site/buildchain-site.json +301 -388
  68. package/dist/site/capability-registry.json +9 -11
  69. package/dist/site/cli-registry.json +8 -53
  70. package/dist/site/controller-registry.json +48 -8
  71. package/dist/site/kfd-claims.json +129 -167
  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 +4345 -7345
  75. package/dist/site/page-registry.json +278 -346
  76. package/dist/site/public-surface-audit.json +85 -404
  77. package/dist/site/publication-authority-registry.json +11 -1
  78. package/dist/site/publication-registry.json +3 -6
  79. package/dist/site/release-provenance.json +3 -9
  80. package/dist/site/schemas/kfd-support-projection-v1.schema.json +106 -0
  81. package/dist/site/site-manifest.json +21 -40
  82. package/dist/site/workflow-registry.json +78 -35
  83. package/docs/MAP.md +8 -5
  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 -213
  87. package/docs/cli.md +14 -14
  88. package/docs/dev-alpha-candidate-patrol.md +3 -11
  89. package/docs/dev-delivery-warrant.md +29 -194
  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 -554
  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 -5
  111. package/package.json +19 -19
  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-channel-identity.js +3 -2
  119. package/packages/core/buildchain-config.js +4 -69
  120. package/packages/core/buildchain-contract.js +232 -46
  121. package/packages/core/buildchain-kfd-claims.js +1 -1
  122. package/packages/core/channel-candidate.js +0 -8
  123. package/packages/core/channel-promotion-baseline.js +0 -52
  124. package/packages/core/controller-evidence.js +3 -4
  125. package/packages/core/dev-alpha-candidate-selection.js +2 -10
  126. package/packages/core/dev-delivery-warrant-cancellation.js +0 -1
  127. package/packages/core/dev-delivery-warrant-settlement.js +20 -67
  128. package/packages/core/dev-delivery-warrant.js +50 -138
  129. package/packages/core/diagnostics.js +3 -8
  130. package/packages/core/github-governance-authority.js +3 -1
  131. package/packages/core/kfd-adopter-category-driver.js +167 -0
  132. package/packages/core/kfd-adopter-manifest.js +47 -46
  133. package/packages/core/kfd-gate.js +15 -45
  134. package/packages/core/paper-agent-entry.js +7 -16
  135. package/packages/core/paper-fleet.js +2 -2
  136. package/packages/core/paper-repository.js +2 -3
  137. package/packages/core/paper-scaffold-content.js +2 -23
  138. package/packages/core/paper.js +11 -43
  139. package/packages/core/publication-reproducibility.js +4 -4
  140. package/packages/core/release-line-bootstrap.js +21 -8
  141. package/packages/core/release-passport-contract.js +5 -5
  142. package/packages/core/release-passport.js +20 -131
  143. package/packages/core/self-dogfood-version.js +48 -35
  144. package/packages/core/spawn-command.js +232 -8
  145. package/packages/core/v4-adopter-delivery-parity.js +219 -0
  146. package/packages/core/v4-canonical-contracts.js +284 -0
  147. package/packages/core/v4-delivery-warrant-fixture-runner.js +371 -0
  148. package/packages/core/v4-delivery-warrant-read-candidate.js +279 -0
  149. package/packages/core/v4-delivery-warrant-semantic-diff-gate.js +352 -0
  150. package/packages/core/v4-delivery-warrant-shadow-adapter.js +447 -0
  151. package/packages/core/v4-partial-mutation-recovery-qualification.js +395 -0
  152. package/packages/core/v4-platform-stage-checkpoints.js +471 -0
  153. package/packages/core/v4-provider-operation-journal.js +531 -0
  154. package/packages/core/v4-provider-readback-idempotency.js +394 -0
  155. package/packages/core/v4-release-activation-shadow.js +519 -0
  156. package/packages/core/v4-stable-publication-fence.js +357 -0
  157. package/packages/core/v4-stage-capsule-local-store.js +426 -0
  158. package/packages/core/v4-stage-capsule-qualification-campaign.js +512 -0
  159. package/packages/core/v4-stage-capsule-qualification.js +456 -0
  160. package/packages/core/v4-stage-capsule-resume-planner.js +397 -0
  161. package/packages/core/v4-stage-capsule-store.js +401 -0
  162. package/packages/core/v4-stage-capsule.js +319 -0
  163. package/scripts/assemble-self-publication-admission.mjs +1 -1
  164. package/scripts/audit-publication-control-plane.mjs +5 -5
  165. package/scripts/auditable-demo-bundle-verification.mjs +3 -2
  166. package/scripts/auditable-demo-platform.mjs +2 -2
  167. package/scripts/auditable-demo-renditions.mjs +1 -1
  168. package/scripts/auditable-demo.mjs +2 -2
  169. package/scripts/aws-macos-jit-controller-core.mjs +13 -346
  170. package/scripts/aws-macos-jit-controller-runtime.mjs +2 -210
  171. package/scripts/aws-macos-jit-controller.mjs +37 -275
  172. package/scripts/aws-macos-jit-core.mjs +3 -41
  173. package/scripts/aws-macos-jit.mjs +0 -12
  174. package/scripts/aws-windows-jit-campaign.mjs +2 -2
  175. package/scripts/aws-windows-jit-controller-core.mjs +1 -1
  176. package/scripts/aws-windows-jit-controller.mjs +3 -3
  177. package/scripts/build-contract-core.mjs +3 -8
  178. package/scripts/build-standalone-binary.mjs +3 -14
  179. package/scripts/buildchain-channel-router.mjs +4 -0
  180. package/scripts/buildchain-cli-help.mjs +7 -16
  181. package/scripts/buildchain-contract-lock.mjs +0 -6
  182. package/scripts/check-action-bundles.mjs +3 -4
  183. package/scripts/check-internal-architecture.mjs +7 -6
  184. package/scripts/check-inventory.mjs +30 -25
  185. package/scripts/check-v4-public-dogfood-contract.mjs +270 -0
  186. package/scripts/create-release-bundle.mjs +8 -4
  187. package/scripts/dev-alpha-candidate-patrol.mjs +1 -22
  188. package/scripts/dev-delivery-proof.mjs +2 -64
  189. package/scripts/dev-delivery-warrant.mjs +61 -86
  190. package/scripts/dev-pr-auto-merge.mjs +4 -30
  191. package/scripts/dev-pr-delivery-warrant.mjs +0 -55
  192. package/scripts/dispatch-artifact-signing-authority.mjs +7 -4
  193. package/scripts/generate-buildchain-kfd-witnesses.mjs +94 -88
  194. package/scripts/generate-channel-build-workflow.mjs +54 -24
  195. package/scripts/generate-channel-promotion-workflow.mjs +15 -6
  196. package/scripts/generate-site-bundle.mjs +8 -27
  197. package/scripts/git-fetch-process-tree.mjs +34 -1
  198. package/scripts/init-repo.mjs +64 -159
  199. package/scripts/inspect-artifact-signing-requests.mjs +0 -6
  200. package/scripts/locked-source-checkout.mjs +3 -4
  201. package/scripts/maintainability-metrics.mjs +8 -2
  202. package/scripts/npm-publish-dry-run.mjs +2 -2
  203. package/scripts/npm-publish-transaction.mjs +2 -2
  204. package/scripts/publication-commit-evidence.mjs +23 -69
  205. package/scripts/release-candidate-resolver.mjs +11 -17
  206. package/scripts/release-tail.mjs +3 -49
  207. package/scripts/resume-from-candidate-run.mjs +9 -123
  208. package/scripts/run-lifecycle-core.mjs +12 -13
  209. package/scripts/seal-artifact-signing-requests.mjs +17 -21
  210. package/scripts/site-capability-metadata.mjs +3 -20
  211. package/scripts/stable-candidate-qualification.mjs +10 -10
  212. package/scripts/v4-architecture.mjs +12 -2
  213. package/scripts/v4-bridge-bootstrap.mjs +141 -0
  214. package/scripts/v4-bridge-evidence.mjs +141 -0
  215. package/scripts/v4-host-adapter.mjs +182 -0
  216. package/scripts/v4-platform-stage-checkpoint-rehearsal.mjs +207 -0
  217. package/scripts/v4-stage-capsule-qualification.mjs +528 -0
  218. package/scripts/v4-stage-capsule-resume-rehearsal.mjs +57 -0
  219. package/scripts/v4-warrant-shadow-plan.mjs +601 -0
  220. package/scripts/verify-golden-path.mjs +5 -5
  221. package/scripts/web-surface-cloudfront-rewrite.mjs +15 -15
  222. package/scripts/web-surface-core.mjs +2 -8
  223. package/scripts/workflow-call-contract.mjs +5 -184
  224. package/contracts/dev-delivery-authority-v2.schema.json +0 -253
  225. package/contracts/fixtures/kfd-adopter-release-v1/kfd-4-perspective.json +0 -16
  226. package/contracts/fixtures/kfd-adopter-release-v1/kfd-4-replay.json +0 -57
  227. package/contracts/fixtures/next-development-transition-v1/anchored-manual-waiting.json +0 -47
  228. package/contracts/fixtures/next-development-transition-v1/semver-auto-planned.json +0 -47
  229. package/contracts/fixtures/next-development-transition-v1/version-model-cases.json +0 -40
  230. package/contracts/next-development-request-v1.schema.json +0 -66
  231. package/contracts/next-development-transition-v1.schema.json +0 -292
  232. package/contracts/publication-rehearsal-capsule-v1.schema.json +0 -173
  233. package/dist/site/schemas/dev-delivery-authority-v2.schema.json +0 -442
  234. package/dist/site/schemas/publication-rehearsal-capsule-v1.schema.json +0 -269
  235. package/dist/site/schemas/release-tail-capabilities-v1.schema.json +0 -353
  236. package/dist/site/schemas/release-tail-provider-bindings-v1.schema.json +0 -94
  237. package/docs/dev-delivery-qualification-landing-adr.md +0 -137
  238. package/docs/next-development-transition.md +0 -119
  239. package/docs/publication-rehearsal.md +0 -94
  240. package/packages/core/buildchain-compatibility-proof.js +0 -631
  241. package/packages/core/dev-delivery-authority.js +0 -996
  242. package/packages/core/dev-delivery-native-proof.js +0 -418
  243. package/packages/core/dev-delivery-warrant-shadow.js +0 -502
  244. package/packages/core/next-development-candidate-reservation.js +0 -186
  245. package/packages/core/next-development-controller.js +0 -726
  246. package/packages/core/next-development-projection.js +0 -288
  247. package/packages/core/next-development-transition.js +0 -738
  248. package/packages/core/publication-rehearsal-projection.js +0 -173
  249. package/packages/core/publication-rehearsal-runtime.js +0 -921
  250. package/scripts/aws-macos-jit-instance-rehydrate.mjs +0 -260
  251. package/scripts/aws-macos-jit-source-rebind.mjs +0 -724
  252. package/scripts/dev-delivery-authority.mjs +0 -368
  253. package/scripts/dev-delivery-native-run.mjs +0 -235
  254. package/scripts/dev-delivery-two-phase-resume.mjs +0 -90
  255. package/scripts/dev-delivery-two-phase.mjs +0 -577
  256. package/scripts/generate-next-development-guidance.mjs +0 -49
  257. package/scripts/materialize-self-release-candidate-version.mjs +0 -137
  258. package/scripts/next-development-self-dogfood-harness.mjs +0 -409
  259. package/scripts/next-development-self-dogfood.mjs +0 -532
  260. package/scripts/next-development-transition.mjs +0 -47
  261. package/scripts/release-candidate-tail-reseal.mjs +0 -426
  262. 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() + 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],