@empire-builder-kit/nx 1.0.0-rc.37 → 1.0.0-rc.39

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 (637) hide show
  1. package/README.md +18 -0
  2. package/executors.json +5 -0
  3. package/generators.json +10 -0
  4. package/package.json +20 -3
  5. package/src/aws-authority/index.d.ts +1 -0
  6. package/src/aws-authority/index.js +1 -0
  7. package/src/aws-authority/lambda-policy-ordering.d.ts +38 -0
  8. package/src/aws-authority/lambda-policy-ordering.js +56 -0
  9. package/src/aws-authority/stage-authority.d.ts +11 -3
  10. package/src/aws-authority/stage-authority.js +615 -29
  11. package/src/blueprints/external-sandbox.js +21 -9
  12. package/src/blueprints/manifest.d.ts +1 -1
  13. package/src/blueprints/resolver.js +28 -15
  14. package/src/cli/bootstrap.d.ts +1 -1
  15. package/src/cli/deploy-runtime.d.ts +6 -0
  16. package/src/cli/deploy-runtime.js +58 -0
  17. package/src/cli/dev-command.d.ts +16 -4
  18. package/src/cli/dev-command.js +63 -0
  19. package/src/cli/main.d.ts +7 -1
  20. package/src/cli/main.js +128 -20
  21. package/src/cli/output.d.ts +1 -1
  22. package/src/developer-agent/context.js +41 -9
  23. package/src/developer-agent/generator-planning.js +16 -2
  24. package/src/developer-agent/git-inspection.d.ts +6 -2
  25. package/src/developer-agent/git-inspection.js +78 -6
  26. package/src/developer-agent/model.d.ts +4 -2
  27. package/src/developer-agent/operation-registry.d.ts +5 -0
  28. package/src/developer-agent/operation-registry.js +179 -23
  29. package/src/developer-agent/preview-changes.d.ts +2 -0
  30. package/src/developer-agent/preview-changes.js +14 -2
  31. package/src/developer-agent/preview-source.js +3 -0
  32. package/src/developer-agent/validation.js +20 -8
  33. package/src/developer-agent/workspace-inspection.js +37 -3
  34. package/src/executors/deployment-plan/deployment-plan.d.ts +2 -0
  35. package/src/executors/deployment-plan/deployment-plan.js +51 -4
  36. package/src/executors/dev-doctor/dev-doctor.js +13 -6
  37. package/src/executors/dev-task-cleanup/dev-task-cleanup.d.ts +23 -0
  38. package/src/executors/dev-task-cleanup/dev-task-cleanup.js +145 -0
  39. package/src/executors/dev-task-cleanup/schema.json +9 -0
  40. package/src/executors/dev-task-cleanup/task-stack-absence.d.ts +27 -0
  41. package/src/executors/dev-task-cleanup/task-stack-absence.js +281 -0
  42. package/src/executors/dev-task-cleanup/task-stack-checkpoint.d.ts +12 -0
  43. package/src/executors/dev-task-cleanup/task-stack-checkpoint.js +92 -0
  44. package/src/executors/fleet/fleet.js +1 -1
  45. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js +28 -1
  46. package/src/executors/local-deploy/local-deploy.d.ts +8 -1
  47. package/src/executors/local-deploy/local-deploy.js +97 -24
  48. package/src/executors/local-deploy/schema.json +8 -0
  49. package/src/executors/router-waf-rehearsal/router-waf-rehearsal.js +30 -18
  50. package/src/executors/sst-lifecycle/governed-native-operation.d.ts +2 -0
  51. package/src/executors/sst-lifecycle/governed-native-operation.js +9 -0
  52. package/src/executors/sst-lifecycle/run-sst-command.d.ts +5 -0
  53. package/src/executors/sst-lifecycle/run-sst-command.js +220 -32
  54. package/src/executors/sst-lifecycle/sst-environment-source.d.ts +8 -0
  55. package/src/executors/sst-lifecycle/sst-environment-source.js +54 -0
  56. package/src/executors/sst-lifecycle/task-unlock.d.ts +15 -0
  57. package/src/executors/sst-lifecycle/task-unlock.js +126 -0
  58. package/src/foundation/capability-plan.d.ts +43 -0
  59. package/src/foundation/capability-plan.js +168 -0
  60. package/src/foundation/discovery.d.ts +14 -11
  61. package/src/foundation/discovery.js +32 -6
  62. package/src/foundation/index.d.ts +1 -0
  63. package/src/foundation/index.js +1 -0
  64. package/src/foundation/local-database-contract.d.ts +20 -0
  65. package/src/foundation/local-database-contract.js +262 -13
  66. package/src/foundation/local-private-smoke-access.d.ts +20 -0
  67. package/src/foundation/local-private-smoke-access.js +197 -0
  68. package/src/foundation/preflight.js +37 -18
  69. package/src/foundation/private-smoke-access.js +10 -2
  70. package/src/foundation/private-smoke-admission.d.ts +3 -1
  71. package/src/foundation/private-smoke-admission.js +29 -8
  72. package/src/foundation/private-smoke-control-plane.js +17 -6
  73. package/src/foundation/provision-database-bindings.d.ts +5 -0
  74. package/src/foundation/provision-database-bindings.js +41 -8
  75. package/src/foundation/provision-logical-database.js +13 -8
  76. package/src/foundation/requirements.d.ts +3 -3
  77. package/src/foundation/requirements.js +24 -12
  78. package/src/foundation/router-waf.d.ts +1 -0
  79. package/src/foundation/router-waf.js +14 -1
  80. package/src/generators/blueprint/blueprint.d.ts +5 -0
  81. package/src/generators/blueprint/blueprint.js +102 -0
  82. package/src/generators/blueprint/files.d.ts +6 -0
  83. package/src/generators/blueprint/files.js +217 -0
  84. package/src/generators/blueprint/schema.d.ts +4 -0
  85. package/src/generators/blueprint/schema.json +18 -0
  86. package/src/generators/formatting.js +24 -1
  87. package/src/generators/logging-registry.d.ts +2 -0
  88. package/src/generators/logging-registry.js +22 -0
  89. package/src/generators/preset/workspace-files-adopter-skills.d.ts +7 -0
  90. package/src/generators/preset/workspace-files-adopter-skills.js +301 -0
  91. package/src/generators/preset/workspace-files-ci-install.d.ts +2 -0
  92. package/src/generators/preset/workspace-files-ci-install.js +196 -0
  93. package/src/generators/preset/workspace-files-developer-agent.js +40 -13
  94. package/src/generators/preset/workspace-files-performance-load.js +8 -0
  95. package/src/generators/preset/workspace-files-stage-authority.js +40 -1
  96. package/src/generators/preset/workspace-files-thin-deploy.js +66 -34
  97. package/src/generators/preset/workspace-files-thin-docs.js +64 -18
  98. package/src/generators/preset/workspace-files.d.ts +4 -0
  99. package/src/generators/preset/workspace-files.js +159 -91
  100. package/src/generators/repository-policy/repository-policy.js +37 -0
  101. package/src/generators/slice/built-in-plan-api-contract-files.js +42 -7
  102. package/src/generators/slice/built-in-plan-api-files.d.ts +1 -1
  103. package/src/generators/slice/built-in-plan-api-files.js +47 -389
  104. package/src/generators/slice/built-in-plan-async-work-files.js +19 -1912
  105. package/src/generators/slice/built-in-plan-authorization-files.js +92 -329
  106. package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js +36 -2
  107. package/src/generators/slice/built-in-plan-authorization-storage.d.ts +3 -0
  108. package/src/generators/slice/built-in-plan-authorization-storage.js +119 -0
  109. package/src/generators/slice/built-in-plan-background-work-files.d.ts +1 -1
  110. package/src/generators/slice/built-in-plan-background-work-files.js +15 -5
  111. package/src/generators/slice/built-in-plan-data-deletion-files.js +2 -830
  112. package/src/generators/slice/built-in-plan-data-files.d.ts +1 -1
  113. package/src/generators/slice/built-in-plan-data-files.js +61 -1164
  114. package/src/generators/slice/built-in-plan-data-lifecycle-files.js +53 -28
  115. package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js +18 -2
  116. package/src/generators/slice/built-in-plan-data-retention-job-files.js +7 -2446
  117. package/src/generators/slice/built-in-plan-data-retention-launcher-files.js +30 -6
  118. package/src/generators/slice/built-in-plan-data-rights-files.js +6 -4482
  119. package/src/generators/slice/built-in-plan-database-lifecycle-files.js +4 -15
  120. package/src/generators/slice/built-in-plan-foundation-files.d.ts +2 -1
  121. package/src/generators/slice/built-in-plan-foundation-files.js +34 -10
  122. package/src/generators/slice/built-in-plan-frontend-files.js +2 -2
  123. package/src/generators/slice/built-in-plan-infrastructure-files.d.ts +1 -1
  124. package/src/generators/slice/built-in-plan-infrastructure-files.js +180 -522
  125. package/src/generators/slice/built-in-plan-key-value-cleanup.d.ts +4 -0
  126. package/src/generators/slice/built-in-plan-key-value-cleanup.js +100 -0
  127. package/src/generators/slice/built-in-plan-key-value-consumer.d.ts +4 -0
  128. package/src/generators/slice/built-in-plan-key-value-consumer.js +151 -0
  129. package/src/generators/slice/built-in-plan-key-value-deletion.d.ts +2 -0
  130. package/src/generators/slice/built-in-plan-key-value-deletion.js +377 -0
  131. package/src/generators/slice/built-in-plan-key-value-delivery.d.ts +2 -0
  132. package/src/generators/slice/built-in-plan-key-value-delivery.js +120 -0
  133. package/src/generators/slice/built-in-plan-key-value-export.d.ts +2 -0
  134. package/src/generators/slice/built-in-plan-key-value-export.js +595 -0
  135. package/src/generators/slice/built-in-plan-key-value-files.d.ts +2 -0
  136. package/src/generators/slice/built-in-plan-key-value-files.js +31 -0
  137. package/src/generators/slice/built-in-plan-key-value-holds.d.ts +2 -0
  138. package/src/generators/slice/built-in-plan-key-value-holds.js +189 -0
  139. package/src/generators/slice/built-in-plan-key-value-infrastructure.d.ts +2 -0
  140. package/src/generators/slice/built-in-plan-key-value-infrastructure.js +102 -0
  141. package/src/generators/slice/built-in-plan-key-value-performance.d.ts +5 -0
  142. package/src/generators/slice/built-in-plan-key-value-performance.js +530 -0
  143. package/src/generators/slice/built-in-plan-key-value-provider.d.ts +4 -0
  144. package/src/generators/slice/built-in-plan-key-value-provider.js +366 -0
  145. package/src/generators/slice/built-in-plan-key-value-records.d.ts +3 -0
  146. package/src/generators/slice/built-in-plan-key-value-records.js +232 -0
  147. package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.d.ts +2 -0
  148. package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.js +103 -0
  149. package/src/generators/slice/built-in-plan-key-value-retention-job-files.d.ts +2 -0
  150. package/src/generators/slice/built-in-plan-key-value-retention-job-files.js +160 -0
  151. package/src/generators/slice/built-in-plan-key-value-retention-maintenance.d.ts +2 -0
  152. package/src/generators/slice/built-in-plan-key-value-retention-maintenance.js +329 -0
  153. package/src/generators/slice/built-in-plan-key-value-retention-worker.d.ts +2 -0
  154. package/src/generators/slice/built-in-plan-key-value-retention-worker.js +477 -0
  155. package/src/generators/slice/built-in-plan-key-value-retention.d.ts +2 -0
  156. package/src/generators/slice/built-in-plan-key-value-retention.js +184 -0
  157. package/src/generators/slice/built-in-plan-metadata-files.d.ts +1 -1
  158. package/src/generators/slice/built-in-plan-metadata-files.js +140 -28
  159. package/src/generators/slice/built-in-plan-native-runtime-authority-files.d.ts +1 -1
  160. package/src/generators/slice/built-in-plan-native-runtime-authority-files.js +36 -19
  161. package/src/generators/slice/built-in-plan-operations-files.d.ts +1 -1
  162. package/src/generators/slice/built-in-plan-operations-files.js +89 -50
  163. package/src/generators/slice/built-in-plan-performance-files.js +84 -1010
  164. package/src/generators/slice/built-in-plan-project-files.js +116 -67
  165. package/src/generators/slice/built-in-plan-release-files.d.ts +1 -1
  166. package/src/generators/slice/built-in-plan-release-files.js +64 -15
  167. package/src/generators/slice/built-in-plan-reliability-files.js +54 -28
  168. package/src/generators/slice/built-in-plan-shared.d.ts +4 -2
  169. package/src/generators/slice/built-in-plan-shared.js +41 -19
  170. package/src/generators/slice/built-in-plan-sql-events.d.ts +2 -0
  171. package/src/generators/slice/built-in-plan-sql-events.js +257 -0
  172. package/src/generators/slice/built-in-plan-testing-files.d.ts +1 -1
  173. package/src/generators/slice/built-in-plan-testing-files.js +184 -132
  174. package/src/generators/slice/built-in-plan-testing-persistence-files.d.ts +2 -0
  175. package/src/generators/slice/built-in-plan-testing-persistence-files.js +178 -0
  176. package/src/generators/slice/built-in-plan-thin-release-files.d.ts +1 -1
  177. package/src/generators/slice/built-in-plan-thin-release-files.js +35 -2
  178. package/src/generators/slice/built-in-plan-verification-files.js +70 -0
  179. package/src/generators/slice/built-in-plan-web-files.d.ts +1 -1
  180. package/src/generators/slice/built-in-plan-web-files.js +206 -14
  181. package/src/generators/slice/built-in-plan-workload-role-files.d.ts +1 -1
  182. package/src/generators/slice/built-in-plan-workload-role-files.js +113 -274
  183. package/src/generators/slice/built-in-plan.d.ts +9 -1
  184. package/src/generators/slice/built-in-plan.js +49 -21
  185. package/src/generators/slice/data-policy-review-seed.d.ts +2 -0
  186. package/src/generators/slice/data-policy-review-seed.js +22 -0
  187. package/src/generators/slice/deployed-smoke-readiness.d.ts +2 -0
  188. package/src/generators/slice/deployed-smoke-readiness.js +214 -0
  189. package/src/generators/slice/local-source-identity.d.ts +2 -0
  190. package/src/generators/slice/local-source-identity.js +31 -0
  191. package/src/generators/slice/persistence-contract.d.ts +14 -0
  192. package/src/generators/slice/persistence-contract.js +32 -0
  193. package/src/generators/slice/slice.js +29 -24
  194. package/src/generators/sql/schema.d.ts +7 -0
  195. package/src/generators/sql/schema.json +38 -0
  196. package/src/generators/sql/sql.d.ts +6 -0
  197. package/src/generators/sql/sql.js +53 -0
  198. package/src/generators/upgrade/sql-seeded-reconciliation.d.ts +2 -0
  199. package/src/generators/upgrade/sql-seeded-reconciliation.js +170 -0
  200. package/src/generators/upgrade/upgrade.d.ts +2 -0
  201. package/src/generators/upgrade/upgrade.js +136 -9
  202. package/src/generators/workload/workload.js +51 -2
  203. package/src/local-dev/browser-verification.d.ts +37 -0
  204. package/src/local-dev/browser-verification.js +281 -0
  205. package/src/local-dev/contracts.d.ts +10 -1
  206. package/src/local-dev/contracts.js +114 -13
  207. package/src/local-dev/dev-command-core.js +24 -5
  208. package/src/local-dev/docker-credential-health.d.ts +14 -0
  209. package/src/local-dev/docker-credential-health.js +94 -0
  210. package/src/local-dev/environment-inspector.d.ts +7 -0
  211. package/src/local-dev/environment-inspector.js +42 -15
  212. package/src/local-dev/environment-state.js +2 -2
  213. package/src/local-dev/errors.d.ts +1 -1
  214. package/src/local-dev/errors.js +2 -0
  215. package/src/local-dev/fleet-client.js +2 -2
  216. package/src/local-dev/fleet-configuration.js +57 -25
  217. package/src/local-dev/fleet-inventory.js +46 -18
  218. package/src/local-dev/fleet-ipc.d.ts +7 -0
  219. package/src/local-dev/fleet-ipc.js +14 -2
  220. package/src/local-dev/fleet-launcher.d.ts +6 -0
  221. package/src/local-dev/fleet-launcher.js +14 -2
  222. package/src/local-dev/fleet-logs.js +50 -22
  223. package/src/local-dev/fleet-process.d.ts +20 -1
  224. package/src/local-dev/fleet-process.js +197 -41
  225. package/src/local-dev/fleet-runner-evidence.d.ts +5 -0
  226. package/src/local-dev/fleet-runner-evidence.js +56 -0
  227. package/src/local-dev/fleet-runtime.js +268 -229
  228. package/src/local-dev/fleet-session.d.ts +2 -0
  229. package/src/local-dev/fleet-session.js +28 -11
  230. package/src/local-dev/fleet-slice-runner-daemon.js +4 -0
  231. package/src/local-dev/fleet-state.d.ts +5 -2
  232. package/src/local-dev/fleet-state.js +25 -4
  233. package/src/local-dev/fleet-supervisor.d.ts +3 -0
  234. package/src/local-dev/fleet-supervisor.js +66 -11
  235. package/src/local-dev/fleet-web-start.d.ts +12 -0
  236. package/src/local-dev/fleet-web-start.js +48 -0
  237. package/src/local-dev/identity.js +3 -14
  238. package/src/local-dev/index.d.ts +1 -0
  239. package/src/local-dev/index.js +1 -0
  240. package/src/local-dev/native-completion.d.ts +9 -0
  241. package/src/local-dev/native-completion.js +130 -0
  242. package/src/local-dev/nx-workspace.d.ts +4 -2
  243. package/src/local-dev/nx-workspace.js +11 -6
  244. package/src/local-dev/personal-stage.d.ts +4 -5
  245. package/src/local-dev/personal-stage.js +6 -54
  246. package/src/local-dev/port-claims.d.ts +13 -0
  247. package/src/local-dev/port-claims.js +46 -0
  248. package/src/local-dev/ports.d.ts +14 -2
  249. package/src/local-dev/ports.js +78 -3
  250. package/src/local-dev/private-state.d.ts +6 -0
  251. package/src/local-dev/private-state.js +126 -34
  252. package/src/local-dev/process-group.d.ts +4 -0
  253. package/src/local-dev/process-group.js +29 -0
  254. package/src/local-dev/process-identity.d.ts +8 -0
  255. package/src/local-dev/process-identity.js +31 -1
  256. package/src/local-dev/proxy.js +11 -12
  257. package/src/local-dev/runtime-paths.js +1 -1
  258. package/src/local-dev/slice-claim.js +1 -1
  259. package/src/local-dev/slice-runner.d.ts +15 -6
  260. package/src/local-dev/slice-runner.js +189 -54
  261. package/src/local-dev/task-attachment.d.ts +17 -0
  262. package/src/local-dev/task-attachment.js +73 -0
  263. package/src/local-dev/task-authority.d.ts +10 -0
  264. package/src/local-dev/task-authority.js +27 -0
  265. package/src/local-dev/task-identity.d.ts +33 -0
  266. package/src/local-dev/task-identity.js +418 -0
  267. package/src/local-dev/task-native-writer.d.ts +18 -0
  268. package/src/local-dev/task-native-writer.js +329 -0
  269. package/src/local-dev/tls.js +3 -1
  270. package/src/local-dev/web-launch.d.ts +9 -0
  271. package/src/local-dev/web-launch.js +130 -0
  272. package/src/ownership/composition.d.ts +2 -1
  273. package/src/ownership/composition.js +1 -0
  274. package/src/performance/scenario.d.ts +22 -0
  275. package/src/performance/scenario.js +100 -92
  276. package/src/repository-policy/deployment-plan.d.ts +2 -2
  277. package/src/repository-policy/deployment-plan.js +2 -1
  278. package/src/repository-policy/policy.js +38 -3
  279. package/src/schemas/blueprint-v1.json +5 -4
  280. package/src/schemas/foundation-requirement-v1.json +5 -4
  281. package/src/schemas/testing-evidence-result-v1.json +1 -1
  282. package/src/secrets/operator.d.ts +3 -1
  283. package/src/secrets/operator.js +22 -3
  284. package/src/sst-environment-source-format.d.ts +3 -0
  285. package/src/sst-environment-source-format.js +20 -0
  286. package/src/supply-chain/blueprint-trust-git.js +13 -3
  287. package/src/supply-chain/build-output.js +15 -0
  288. package/src/supply-chain/generated-blueprint-trust-command.js +18 -1
  289. package/src/testing-evidence/fixture-scope.d.ts +2 -1
  290. package/src/testing-evidence/fixture-scope.js +4 -2
  291. package/src/testing-evidence/result.d.ts +2 -1
  292. package/src/testing-evidence/result.js +18 -4
  293. package/src/workload-roles/standard-slice.js +2 -3
  294. package/src/api-contract/baseline-update.js.map +0 -1
  295. package/src/api-contract/compatibility.js.map +0 -1
  296. package/src/api-contract/contract-graph.js.map +0 -1
  297. package/src/api-contract/evidence.js.map +0 -1
  298. package/src/api-contract/index.js.map +0 -1
  299. package/src/api-contract/model.fixtures.d.ts +0 -2
  300. package/src/api-contract/model.fixtures.js +0 -81
  301. package/src/api-contract/model.fixtures.js.map +0 -1
  302. package/src/api-contract/model.js.map +0 -1
  303. package/src/api-contract/rollout.js.map +0 -1
  304. package/src/authorization/compatibility.js.map +0 -1
  305. package/src/authorization/index.js.map +0 -1
  306. package/src/aws/child-environment.js.map +0 -1
  307. package/src/aws/identity.js.map +0 -1
  308. package/src/aws-authority/index.js.map +0 -1
  309. package/src/aws-authority/stage-authority.js.map +0 -1
  310. package/src/blueprints/execution.js.map +0 -1
  311. package/src/blueprints/external-sandbox.js.map +0 -1
  312. package/src/blueprints/index.js.map +0 -1
  313. package/src/blueprints/inputs.js.map +0 -1
  314. package/src/blueprints/manifest.js.map +0 -1
  315. package/src/blueprints/resolver.js.map +0 -1
  316. package/src/blueprints/transitions.js.map +0 -1
  317. package/src/cli/agent-command.js.map +0 -1
  318. package/src/cli/agent-runtime.js.map +0 -1
  319. package/src/cli/blueprint-authority.js.map +0 -1
  320. package/src/cli/blueprint-command.js.map +0 -1
  321. package/src/cli/bootstrap.js.map +0 -1
  322. package/src/cli/dev-command.js.map +0 -1
  323. package/src/cli/main.js.map +0 -1
  324. package/src/cli/output.js.map +0 -1
  325. package/src/cli/personal-secret-runtime.js.map +0 -1
  326. package/src/cli/secret-terminal.js.map +0 -1
  327. package/src/container-images.js.map +0 -1
  328. package/src/data-lifecycle/index.js.map +0 -1
  329. package/src/data-lifecycle/model.fixtures.d.ts +0 -2
  330. package/src/data-lifecycle/model.fixtures.js +0 -244
  331. package/src/data-lifecycle/model.fixtures.js.map +0 -1
  332. package/src/data-lifecycle/model.js.map +0 -1
  333. package/src/data-lifecycle/sensitive-artifacts.js.map +0 -1
  334. package/src/data-lifecycle/validation.js.map +0 -1
  335. package/src/database-retirement/contract.js.map +0 -1
  336. package/src/database-retirement/index.js.map +0 -1
  337. package/src/deterministic-order.js.map +0 -1
  338. package/src/developer-agent/context.js.map +0 -1
  339. package/src/developer-agent/generator-planning.js.map +0 -1
  340. package/src/developer-agent/generator-preview.js.map +0 -1
  341. package/src/developer-agent/git-inspection.js.map +0 -1
  342. package/src/developer-agent/handoff.js.map +0 -1
  343. package/src/developer-agent/index.js.map +0 -1
  344. package/src/developer-agent/model.js.map +0 -1
  345. package/src/developer-agent/operation-registry.js.map +0 -1
  346. package/src/developer-agent/ordering.js.map +0 -1
  347. package/src/developer-agent/planning.js.map +0 -1
  348. package/src/developer-agent/preview-changes.js.map +0 -1
  349. package/src/developer-agent/preview-source.js.map +0 -1
  350. package/src/developer-agent/validation.js.map +0 -1
  351. package/src/developer-agent/workspace-inspection.js.map +0 -1
  352. package/src/developer-agent/workspace-path.js.map +0 -1
  353. package/src/executors/blueprint-trust/blueprint-trust.js.map +0 -1
  354. package/src/executors/blueprint-verification/blueprint-verification.js.map +0 -1
  355. package/src/executors/deploy/deploy.js.map +0 -1
  356. package/src/executors/deployment-plan/deployment-plan.js.map +0 -1
  357. package/src/executors/dev/dev.js.map +0 -1
  358. package/src/executors/dev-doctor/dev-doctor.js.map +0 -1
  359. package/src/executors/dev-setup/dev-setup.js.map +0 -1
  360. package/src/executors/developer-context/developer-context.js.map +0 -1
  361. package/src/executors/fleet/fleet.js.map +0 -1
  362. package/src/executors/foundation-preflight/foundation-preflight.js.map +0 -1
  363. package/src/executors/foundation-profile-preflight/foundation-profile-preflight.js.map +0 -1
  364. package/src/executors/foundation-profile-preflight/production-database-safeguard.js.map +0 -1
  365. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js.map +0 -1
  366. package/src/executors/github-bootstrap/github-bootstrap.js.map +0 -1
  367. package/src/executors/infrastructure-plan/infrastructure-plan.js.map +0 -1
  368. package/src/executors/local-deploy/federated-credential-transport.js.map +0 -1
  369. package/src/executors/local-deploy/fixtures/local-deploy-state-machine.mjs +0 -53
  370. package/src/executors/local-deploy/local-approval.js.map +0 -1
  371. package/src/executors/local-deploy/local-deploy.js.map +0 -1
  372. package/src/executors/refresh/refresh.js.map +0 -1
  373. package/src/executors/remove/remove.js.map +0 -1
  374. package/src/executors/router-waf-rehearsal/router-waf-rehearsal.js.map +0 -1
  375. package/src/executors/secret-guardrails/secret-guardrails.js.map +0 -1
  376. package/src/executors/secret-initialize/secret-initialize.js.map +0 -1
  377. package/src/executors/secret-metadata/secret-metadata.js.map +0 -1
  378. package/src/executors/sst-lifecycle/generated-secret-retirement.js.map +0 -1
  379. package/src/executors/sst-lifecycle/governed-native-operation.js.map +0 -1
  380. package/src/executors/sst-lifecycle/logging-preflight.js.map +0 -1
  381. package/src/executors/sst-lifecycle/run-sst-command.js.map +0 -1
  382. package/src/executors/sst-lifecycle/secret-preflight.js.map +0 -1
  383. package/src/executors/sst-lifecycle/sst-environment-source.js.map +0 -1
  384. package/src/executors/unlock/unlock.js.map +0 -1
  385. package/src/executors/work-markers/work-markers.js.map +0 -1
  386. package/src/foundation/discovery.js.map +0 -1
  387. package/src/foundation/index.js.map +0 -1
  388. package/src/foundation/local-database-contract.js.map +0 -1
  389. package/src/foundation/logging-preflight.js.map +0 -1
  390. package/src/foundation/logging.js.map +0 -1
  391. package/src/foundation/partial-state.js.map +0 -1
  392. package/src/foundation/preflight.js.map +0 -1
  393. package/src/foundation/private-smoke-access.js.map +0 -1
  394. package/src/foundation/private-smoke-admission.js.map +0 -1
  395. package/src/foundation/private-smoke-control-plane.js.map +0 -1
  396. package/src/foundation/provision-database-bindings.js.map +0 -1
  397. package/src/foundation/provision-logical-database.js.map +0 -1
  398. package/src/foundation/requirements.js.map +0 -1
  399. package/src/foundation/router-origin-proof.js.map +0 -1
  400. package/src/foundation/router-waf-rate-rehearsal.js.map +0 -1
  401. package/src/foundation/router-waf.js.map +0 -1
  402. package/src/foundation/stages.js.map +0 -1
  403. package/src/frontend-security/index.js.map +0 -1
  404. package/src/frontend-security/security-headers.js.map +0 -1
  405. package/src/generators/feature-registry.js.map +0 -1
  406. package/src/generators/formatting.js.map +0 -1
  407. package/src/generators/function/function.js.map +0 -1
  408. package/src/generators/job/job.js.map +0 -1
  409. package/src/generators/logging-registry.js.map +0 -1
  410. package/src/generators/post-generation-install.js.map +0 -1
  411. package/src/generators/preset/dependency-overrides.js.map +0 -1
  412. package/src/generators/preset/generator.js.map +0 -1
  413. package/src/generators/preset/tool-versions.js.map +0 -1
  414. package/src/generators/preset/workspace-files-ci-acceptance.js.map +0 -1
  415. package/src/generators/preset/workspace-files-developer-agent.js.map +0 -1
  416. package/src/generators/preset/workspace-files-ecr-inspector.js.map +0 -1
  417. package/src/generators/preset/workspace-files-foundation-workload-roles.js.map +0 -1
  418. package/src/generators/preset/workspace-files-performance-cost.js.map +0 -1
  419. package/src/generators/preset/workspace-files-performance-load.js.map +0 -1
  420. package/src/generators/preset/workspace-files-stage-authority.js.map +0 -1
  421. package/src/generators/preset/workspace-files-thin-deploy.js.map +0 -1
  422. package/src/generators/preset/workspace-files-thin-docs.js.map +0 -1
  423. package/src/generators/preset/workspace-files-thin-release.js.map +0 -1
  424. package/src/generators/preset/workspace-files-workload-role-baseline.js.map +0 -1
  425. package/src/generators/preset/workspace-files.js.map +0 -1
  426. package/src/generators/repository-policy/repository-policy.js.map +0 -1
  427. package/src/generators/repository-policy/tree-policy.js.map +0 -1
  428. package/src/generators/service/service.js.map +0 -1
  429. package/src/generators/slice/built-in-plan-api-contract-files.js.map +0 -1
  430. package/src/generators/slice/built-in-plan-api-files.js.map +0 -1
  431. package/src/generators/slice/built-in-plan-async-work-files.js.map +0 -1
  432. package/src/generators/slice/built-in-plan-authorization-files.js.map +0 -1
  433. package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js.map +0 -1
  434. package/src/generators/slice/built-in-plan-background-work-files.js.map +0 -1
  435. package/src/generators/slice/built-in-plan-data-deletion-files.js.map +0 -1
  436. package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js.map +0 -1
  437. package/src/generators/slice/built-in-plan-data-files.js.map +0 -1
  438. package/src/generators/slice/built-in-plan-data-lifecycle-files.js.map +0 -1
  439. package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js.map +0 -1
  440. package/src/generators/slice/built-in-plan-data-retention-job-files.js.map +0 -1
  441. package/src/generators/slice/built-in-plan-data-retention-launcher-files.js.map +0 -1
  442. package/src/generators/slice/built-in-plan-data-rights-files.js.map +0 -1
  443. package/src/generators/slice/built-in-plan-database-lifecycle-files.js.map +0 -1
  444. package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js.map +0 -1
  445. package/src/generators/slice/built-in-plan-foundation-files.js.map +0 -1
  446. package/src/generators/slice/built-in-plan-frontend-files.js.map +0 -1
  447. package/src/generators/slice/built-in-plan-infrastructure-files.js.map +0 -1
  448. package/src/generators/slice/built-in-plan-infrastructure-safety-files.js.map +0 -1
  449. package/src/generators/slice/built-in-plan-metadata-files.js.map +0 -1
  450. package/src/generators/slice/built-in-plan-native-runtime-authority-files.js.map +0 -1
  451. package/src/generators/slice/built-in-plan-operations-files.js.map +0 -1
  452. package/src/generators/slice/built-in-plan-performance-files.js.map +0 -1
  453. package/src/generators/slice/built-in-plan-project-files.js.map +0 -1
  454. package/src/generators/slice/built-in-plan-release-files.js.map +0 -1
  455. package/src/generators/slice/built-in-plan-reliability-files.js.map +0 -1
  456. package/src/generators/slice/built-in-plan-secret-runtime-files.js.map +0 -1
  457. package/src/generators/slice/built-in-plan-shared.js.map +0 -1
  458. package/src/generators/slice/built-in-plan-testing-files.js.map +0 -1
  459. package/src/generators/slice/built-in-plan-thin-release-files.js.map +0 -1
  460. package/src/generators/slice/built-in-plan-verification-files.js.map +0 -1
  461. package/src/generators/slice/built-in-plan-web-files.js.map +0 -1
  462. package/src/generators/slice/built-in-plan-workload-role-files.js.map +0 -1
  463. package/src/generators/slice/built-in-plan.js.map +0 -1
  464. package/src/generators/slice/slice.js.map +0 -1
  465. package/src/generators/upgrade/upgrade.js.map +0 -1
  466. package/src/generators/workload/frozen-container.js.map +0 -1
  467. package/src/generators/workload/performance-registration.js.map +0 -1
  468. package/src/generators/workload/reliability-registration.js.map +0 -1
  469. package/src/generators/workload/service-performance-files.js.map +0 -1
  470. package/src/generators/workload/workload.js.map +0 -1
  471. package/src/git-policy/action-pins.js.map +0 -1
  472. package/src/git-policy/github-bootstrap.js.map +0 -1
  473. package/src/git-policy/index.js.map +0 -1
  474. package/src/git-policy/routing.js.map +0 -1
  475. package/src/index.js.map +0 -1
  476. package/src/infrastructure-change/convergence.js.map +0 -1
  477. package/src/infrastructure-change/drift.js.map +0 -1
  478. package/src/infrastructure-change/index.js.map +0 -1
  479. package/src/infrastructure-change/local-capability.js.map +0 -1
  480. package/src/infrastructure-change/model.js.map +0 -1
  481. package/src/infrastructure-change/normalize.js.map +0 -1
  482. package/src/infrastructure-change/plan.js.map +0 -1
  483. package/src/infrastructure-change/risk.js.map +0 -1
  484. package/src/infrastructure-change/summary.js.map +0 -1
  485. package/src/local-dev/context-discovery.js.map +0 -1
  486. package/src/local-dev/contract-validation.js.map +0 -1
  487. package/src/local-dev/contracts.js.map +0 -1
  488. package/src/local-dev/control-contract.js.map +0 -1
  489. package/src/local-dev/dev-command-core.js.map +0 -1
  490. package/src/local-dev/effects.js.map +0 -1
  491. package/src/local-dev/environment-inspector.js.map +0 -1
  492. package/src/local-dev/environment-state.js.map +0 -1
  493. package/src/local-dev/errors.js.map +0 -1
  494. package/src/local-dev/fleet-client.js.map +0 -1
  495. package/src/local-dev/fleet-configuration.js.map +0 -1
  496. package/src/local-dev/fleet-inventory.js.map +0 -1
  497. package/src/local-dev/fleet-ipc.js.map +0 -1
  498. package/src/local-dev/fleet-launcher.js.map +0 -1
  499. package/src/local-dev/fleet-lock.js.map +0 -1
  500. package/src/local-dev/fleet-logs.js.map +0 -1
  501. package/src/local-dev/fleet-process.js.map +0 -1
  502. package/src/local-dev/fleet-runtime.js.map +0 -1
  503. package/src/local-dev/fleet-session.js.map +0 -1
  504. package/src/local-dev/fleet-slice-runner-daemon.js.map +0 -1
  505. package/src/local-dev/fleet-startup.js.map +0 -1
  506. package/src/local-dev/fleet-state.js.map +0 -1
  507. package/src/local-dev/fleet-supervisor-daemon.js.map +0 -1
  508. package/src/local-dev/fleet-supervisor.js.map +0 -1
  509. package/src/local-dev/gateway-daemon.js.map +0 -1
  510. package/src/local-dev/gateway.js.map +0 -1
  511. package/src/local-dev/identity.js.map +0 -1
  512. package/src/local-dev/index.js.map +0 -1
  513. package/src/local-dev/local-context.js.map +0 -1
  514. package/src/local-dev/nx-workspace.js.map +0 -1
  515. package/src/local-dev/personal-secret-ledger.js.map +0 -1
  516. package/src/local-dev/personal-stage.js.map +0 -1
  517. package/src/local-dev/portless.js.map +0 -1
  518. package/src/local-dev/ports.js.map +0 -1
  519. package/src/local-dev/private-state.js.map +0 -1
  520. package/src/local-dev/process-identity.js.map +0 -1
  521. package/src/local-dev/proxy.js.map +0 -1
  522. package/src/local-dev/runtime-paths.js.map +0 -1
  523. package/src/local-dev/secret-slice-claim.js.map +0 -1
  524. package/src/local-dev/slice-claim.js.map +0 -1
  525. package/src/local-dev/slice-runner.js.map +0 -1
  526. package/src/local-dev/tls.js.map +0 -1
  527. package/src/ownership/composition.js.map +0 -1
  528. package/src/ownership/foundation-record.js.map +0 -1
  529. package/src/ownership/hash.js.map +0 -1
  530. package/src/ownership/index.js.map +0 -1
  531. package/src/ownership/json-ownership.js.map +0 -1
  532. package/src/ownership/record.js.map +0 -1
  533. package/src/ownership/workspace-record.js.map +0 -1
  534. package/src/performance/cost-collection.js.map +0 -1
  535. package/src/performance/cost-controls.js.map +0 -1
  536. package/src/performance/evidence.js.map +0 -1
  537. package/src/performance/index.js.map +0 -1
  538. package/src/performance/load-safety.js.map +0 -1
  539. package/src/performance/model.js.map +0 -1
  540. package/src/performance/pr-artifact-budget.js.map +0 -1
  541. package/src/performance/runner.js.map +0 -1
  542. package/src/performance/scenario-endpoint.js.map +0 -1
  543. package/src/performance/scenario.js.map +0 -1
  544. package/src/performance/test-fixtures.d.ts +0 -7
  545. package/src/performance/test-fixtures.js +0 -167
  546. package/src/performance/test-fixtures.js.map +0 -1
  547. package/src/performance/unit-cost.js.map +0 -1
  548. package/src/release/index.js.map +0 -1
  549. package/src/release/lifecycle.js.map +0 -1
  550. package/src/release/manifest.js.map +0 -1
  551. package/src/release/rollout.js.map +0 -1
  552. package/src/release/source-authority.js.map +0 -1
  553. package/src/repository-policy/aurora-preflight.js.map +0 -1
  554. package/src/repository-policy/capacity-migration.js.map +0 -1
  555. package/src/repository-policy/deployment-plan.js.map +0 -1
  556. package/src/repository-policy/foundation-profile.js.map +0 -1
  557. package/src/repository-policy/index.js.map +0 -1
  558. package/src/repository-policy/policy.js.map +0 -1
  559. package/src/secrets/adapters.js.map +0 -1
  560. package/src/secrets/aws-control-plane.js.map +0 -1
  561. package/src/secrets/declaration-verification.js.map +0 -1
  562. package/src/secrets/generated-aws-control-plane.js.map +0 -1
  563. package/src/secrets/guardrails.js.map +0 -1
  564. package/src/secrets/index.js.map +0 -1
  565. package/src/secrets/metadata.js.map +0 -1
  566. package/src/secrets/model.js.map +0 -1
  567. package/src/secrets/operator.js.map +0 -1
  568. package/src/secrets/permissions.js.map +0 -1
  569. package/src/secrets/personal-command.js.map +0 -1
  570. package/src/secrets/personal-ledger.js.map +0 -1
  571. package/src/secrets/registry.js.map +0 -1
  572. package/src/secrets/verification.js.map +0 -1
  573. package/src/secrets/workload-access.js.map +0 -1
  574. package/src/sst-environment-source-format.js.map +0 -1
  575. package/src/supply-chain/action-pins.js.map +0 -1
  576. package/src/supply-chain/blueprint-trust-git.js.map +0 -1
  577. package/src/supply-chain/blueprint-trust-process.js.map +0 -1
  578. package/src/supply-chain/blueprint-trust.js.map +0 -1
  579. package/src/supply-chain/blueprint-verification-authority.js.map +0 -1
  580. package/src/supply-chain/blueprint-verification-execution.js.map +0 -1
  581. package/src/supply-chain/build-output-bounds.js.map +0 -1
  582. package/src/supply-chain/build-output.js.map +0 -1
  583. package/src/supply-chain/common.js.map +0 -1
  584. package/src/supply-chain/container-artifact-contract.js.map +0 -1
  585. package/src/supply-chain/container-release.js.map +0 -1
  586. package/src/supply-chain/ecr-applicability.js.map +0 -1
  587. package/src/supply-chain/ecr-scanning.js.map +0 -1
  588. package/src/supply-chain/ecs-deployed-image.js.map +0 -1
  589. package/src/supply-chain/errors.js.map +0 -1
  590. package/src/supply-chain/generated-blueprint-trust-command.js.map +0 -1
  591. package/src/supply-chain/generated-command.js.map +0 -1
  592. package/src/supply-chain/generated-container-release-command.js.map +0 -1
  593. package/src/supply-chain/generated-ecr-collector-command.js.map +0 -1
  594. package/src/supply-chain/generated-files.js.map +0 -1
  595. package/src/supply-chain/generated-scanner-command.js.map +0 -1
  596. package/src/supply-chain/index.js.map +0 -1
  597. package/src/supply-chain/inventory.js.map +0 -1
  598. package/src/supply-chain/license-expression.js.map +0 -1
  599. package/src/supply-chain/pnpm-toolchain-authority.js.map +0 -1
  600. package/src/supply-chain/policy.js.map +0 -1
  601. package/src/supply-chain/publication.js.map +0 -1
  602. package/src/supply-chain/sbom.js.map +0 -1
  603. package/src/supply-chain/scanner.js.map +0 -1
  604. package/src/supply-chain/vendored-source.js.map +0 -1
  605. package/src/testing-evidence/fixture-scope.js.map +0 -1
  606. package/src/testing-evidence/index.js.map +0 -1
  607. package/src/testing-evidence/quarantine.js.map +0 -1
  608. package/src/testing-evidence/result.js.map +0 -1
  609. package/src/testing-evidence/runner-adapter.js.map +0 -1
  610. package/src/testing-evidence/sensitive-artifacts.js.map +0 -1
  611. package/src/validation.js.map +0 -1
  612. package/src/work-markers/index.js.map +0 -1
  613. package/src/work-markers/work-markers.js.map +0 -1
  614. package/src/workload-roles/account-baseline.js.map +0 -1
  615. package/src/workload-roles/authority.js.map +0 -1
  616. package/src/workload-roles/aws-adapter.js.map +0 -1
  617. package/src/workload-roles/aws-internal-handler.js.map +0 -1
  618. package/src/workload-roles/aws-s3-state.js.map +0 -1
  619. package/src/workload-roles/aws-sdk-control-plane.js.map +0 -1
  620. package/src/workload-roles/boundary.js.map +0 -1
  621. package/src/workload-roles/convergence.js.map +0 -1
  622. package/src/workload-roles/effective-policy.js.map +0 -1
  623. package/src/workload-roles/handler.js.map +0 -1
  624. package/src/workload-roles/history.js.map +0 -1
  625. package/src/workload-roles/index.js.map +0 -1
  626. package/src/workload-roles/injection.js.map +0 -1
  627. package/src/workload-roles/manifest.js.map +0 -1
  628. package/src/workload-roles/provisioner.js.map +0 -1
  629. package/src/workload-roles/registration.js.map +0 -1
  630. package/src/workload-roles/stage-boundary.js.map +0 -1
  631. package/src/workload-roles/standard-slice.js.map +0 -1
  632. package/src/workspace-deployment/affected-lifecycle.js.map +0 -1
  633. package/src/workspace-deployment/identity.js.map +0 -1
  634. package/src/workspace-deployment/index.js.map +0 -1
  635. package/src/workspace-deployment/migration-evidence.js.map +0 -1
  636. package/src/workspace-deployment/migration.js.map +0 -1
  637. package/src/workspace-deployment/ownership.js.map +0 -1
@@ -217,6 +217,8 @@ const required = (name, pattern) => {
217
217
  const root = process.env.EBK_STAGING_RECEIPT_ROOT?.trim() ?? '';
218
218
  if (!root) throw new Error('Staging deployment receipt root is absent.');
219
219
  const expectedHasSlices = required('EBK_EXPECTED_HAS_SLICES', /^(?:true|false)$/) === 'true';
220
+ const expectedHasContainers = required('EBK_EXPECTED_HAS_CONTAINERS', /^(?:true|false)$/) === 'true';
221
+ if (expectedHasContainers && !expectedHasSlices) throw new Error('Container work requires a selected Slice.');
220
222
  const sourceCommit = required('EBK_STAGING_SOURCE_COMMIT', commit);
221
223
  const expectedAccount = required('EBK_EXPECTED_STAGING_ACCOUNT_ID', /^[0-9]{12}$/);
222
224
  const expectedProfile = required('EBK_EXPECTED_DEPLOYMENT_PROFILE', /^(?:production-isolated|fully-isolated)$/);
@@ -244,6 +246,9 @@ if (
244
246
  promotion?.kind !== 'ebk-staging-deployment-promotion' ||
245
247
  promotion.schemaVersion !== 1 ||
246
248
  promotion.hasSlices !== expectedHasSlices ||
249
+ typeof promotion.hasContainers !== 'boolean' ||
250
+ (promotion.hasContainers && !promotion.hasSlices) ||
251
+ (expectedHasContainers && !promotion.hasContainers) ||
247
252
  promotion.stage !== 'staging' ||
248
253
  promotion.account !== expectedAccount ||
249
254
  promotion.deploymentProfile !== expectedProfile ||
@@ -258,10 +263,12 @@ if (
258
263
  !integer.test(promotion.candidate?.producerRunId ?? '') ||
259
264
  !integer.test(promotion.candidate?.producerRunAttempt ?? '') ||
260
265
  promotion.candidate?.sourceCommit !== sourceCommit ||
261
- !/^[a-f0-9]{64}$/.test(promotion.candidate?.materialDigest ?? '') ||
262
- !integer.test(promotion.container?.artifactId ?? '') ||
266
+ !/^[a-f0-9]{64}$/.test(promotion.candidate?.materialDigest ?? '')
267
+ : promotion.candidate !== null) ||
268
+ (promotion.hasContainers
269
+ ? !integer.test(promotion.container?.artifactId ?? '') ||
263
270
  !digest.test(promotion.container?.artifactDigest ?? '')
264
- : promotion.candidate !== null || promotion.container !== null)
271
+ : promotion.container !== null)
265
272
  ) {
266
273
  throw new Error('Staging deployment receipt and candidate promotion binding disagree.');
267
274
  }
@@ -276,11 +283,13 @@ if (expectedHasSlices) Object.assign(outputs, {
276
283
  artifact_digest: promotion.candidate.artifactDigest,
277
284
  artifact_id: promotion.candidate.artifactId,
278
285
  candidate_material_digest: promotion.candidate.materialDigest,
279
- container_artifact_digest: promotion.container.artifactDigest,
280
- container_artifact_id: promotion.container.artifactId,
281
286
  producer_run_attempt: promotion.candidate.producerRunAttempt,
282
287
  producer_run_id: promotion.candidate.producerRunId,
283
288
  });
289
+ if (expectedHasContainers) Object.assign(outputs, {
290
+ container_artifact_digest: promotion.container.artifactDigest,
291
+ container_artifact_id: promotion.container.artifactId,
292
+ });
284
293
  for (const [name, value] of Object.entries(outputs)) appendFileSync(process.env.GITHUB_OUTPUT, name + '=' + value + '\\n');`;
285
294
  }
286
295
  /** @internal Shared verbatim with the generated workflow and executable tests. */
@@ -333,6 +342,8 @@ const required = (name, pattern) => {
333
342
  };
334
343
  const sourceCommit = required('EBK_RELEASE_SOURCE_COMMIT', /^[a-f0-9]{40,64}$/);
335
344
  const hasSlices = required('EBK_HAS_SLICES', /^(?:true|false)$/) === 'true';
345
+ const hasContainers = required('EBK_HAS_CONTAINERS', /^(?:true|false)$/) === 'true';
346
+ if (hasContainers && !hasSlices) throw new Error('Container work requires a selected Slice.');
336
347
  const account = required('EBK_POLICY_ACCOUNT_ID', /^[0-9]{12}$/);
337
348
  const deploymentProfile = required('EBK_DEPLOYMENT_PROFILE', /^(?:production-isolated|fully-isolated)$/);
338
349
  const region = required('EBK_POLICY_REGION', /^[a-z]{2}(?:-gov)?-[a-z]+(?:-[a-z]+)*-[0-9]$/);
@@ -361,15 +372,6 @@ if (hasSlices) {
361
372
  const producerRunAttempt = required('EBK_CANDIDATE_PRODUCER_RUN_ATTEMPT', /^[1-9][0-9]*$/);
362
373
  const artifactId = required('EBK_CANDIDATE_ARTIFACT_ID', /^[1-9][0-9]*$/);
363
374
  const artifactDigest = required('EBK_CANDIDATE_ARTIFACT_DIGEST', /^sha256:[a-f0-9]{64}$/);
364
- const containerArtifactId = required('EBK_CONTAINER_ARTIFACT_ID', /^[1-9][0-9]*$/);
365
- // actions/upload-artifact emits the bare SHA-256 hex in artifact-digest while
366
- // the artifacts API and the promotion compare the sha256:<hex> registry form
367
- // (EBK-INT-2026-073). Normalize before the exact validation.
368
- const containerArtifactDigestRaw = process.env.EBK_CONTAINER_ARTIFACT_DIGEST?.trim() ?? '';
369
- process.env.EBK_CONTAINER_ARTIFACT_DIGEST = /^[a-f0-9]{64}$/.test(containerArtifactDigestRaw)
370
- ? 'sha256:' + containerArtifactDigestRaw
371
- : containerArtifactDigestRaw;
372
- const containerArtifactDigest = required('EBK_CONTAINER_ARTIFACT_DIGEST', /^sha256:[a-f0-9]{64}$/);
373
375
  const root = '.ebk/evidence/release-candidate/packages';
374
376
  const projects = readdirSync(root, { withFileTypes: true })
375
377
  .filter((entry) => entry.isDirectory())
@@ -385,10 +387,19 @@ if (hasSlices) {
385
387
  return { manifestDigest: createHash('sha256').update(bytes).digest('hex'), project };
386
388
  });
387
389
  candidate = { artifactDigest, artifactId, materialDigest: createHash('sha256').update(JSON.stringify(entries)).digest('hex'), producerRunAttempt, producerRunId, sourceCommit };
388
- container = { artifactDigest: containerArtifactDigest, artifactId: containerArtifactId };
389
- } else if (Object.values(candidateEnvironment).some(Boolean) || Object.values(containerEnvironment).some(Boolean)) {
390
+ } else if (Object.values(candidateEnvironment).some(Boolean)) {
390
391
  throw new Error('A staging promotion without Slices must not carry Slice release material.');
391
392
  }
393
+ if (hasContainers) {
394
+ const artifactId = required('EBK_CONTAINER_ARTIFACT_ID', /^[1-9][0-9]*$/);
395
+ // The upload action returns bare hex; the artifacts API uses sha256:<hex>.
396
+ const raw = containerEnvironment.artifactDigest;
397
+ process.env.EBK_CONTAINER_ARTIFACT_DIGEST = /^[a-f0-9]{64}$/.test(raw) ? 'sha256:' + raw : raw;
398
+ const artifactDigest = required('EBK_CONTAINER_ARTIFACT_DIGEST', /^sha256:[a-f0-9]{64}$/);
399
+ container = { artifactDigest, artifactId };
400
+ } else if (Object.values(containerEnvironment).some(Boolean)) {
401
+ throw new Error('A staging promotion without OCI artifacts must not carry container material.');
402
+ }
392
403
  const promotion = {
393
404
  account,
394
405
  candidate,
@@ -396,6 +407,7 @@ const promotion = {
396
407
  deploymentProfile,
397
408
  deployment: { receiptDigest: createHash('sha256').update(receiptBytes).digest('hex'), runAttempt: deploymentRunAttempt, runId: deploymentRunId },
398
409
  hasSlices,
410
+ hasContainers,
399
411
  kind: 'ebk-staging-deployment-promotion',
400
412
  region,
401
413
  schemaVersion: 1,
@@ -529,6 +541,9 @@ jobs:
529
541
  probe_url: \${{ steps.route.outputs.probe_url }}
530
542
  account_id: \${{ steps.account.outputs.account_id }}
531
543
  has_slices: \${{ steps.policy.outputs.has_slices }}
544
+ has_containers: \${{ steps.policy.outputs.has_containers }}
545
+ container_projects: \${{ steps.policy.outputs.container_projects }}
546
+ container_matrix: \${{ steps.policy.outputs.container_matrix }}
532
547
  ordered_projects: \${{ steps.policy.outputs.ordered_projects }}
533
548
  oidc_audience: \${{ steps.account.outputs.audience }}
534
549
  partition: \${{ steps.account.outputs.partition }}
@@ -879,6 +894,7 @@ ${indentedScript(`set -euo pipefail\n${canonicalStageAuthorityDerivationScript()
879
894
  EBK_STAGING_DEPLOYMENT_RUN_ATTEMPT: \${{ steps.staging-receipt.outputs.run_attempt }}
880
895
  EBK_STAGING_DEPLOYMENT_RUN_ID: \${{ steps.staging-receipt.outputs.run_id }}
881
896
  EBK_EXPECTED_HAS_SLICES: \${{ needs.prepare.outputs.has_slices }}
897
+ EBK_EXPECTED_HAS_CONTAINERS: \${{ needs.prepare.outputs.has_containers }}
882
898
  EBK_EXPECTED_DEPLOYMENT_PROFILE: \${{ needs.prepare.outputs.profile }}
883
899
  EBK_EXPECTED_DEPLOYMENT_REGION: \${{ needs.prepare.outputs.region }}
884
900
  EBK_EXPECTED_STAGING_ACCOUNT_ID: \${{ needs.prepare.outputs.staging_account_id }}
@@ -900,8 +916,6 @@ ${indentedScript(stagingPromotionReceiptValidationScript(), 10)}
900
916
  candidate_run_attempt="$(jq -r '.candidate.producerRunAttempt' "$promotion")"
901
917
  candidate_artifact_id="$(jq -r '.candidate.artifactId' "$promotion")"
902
918
  candidate_artifact_digest="$(jq -r '.candidate.artifactDigest' "$promotion")"
903
- container_artifact_id="$(jq -r '.container.artifactId' "$promotion")"
904
- container_artifact_digest="$(jq -r '.container.artifactDigest' "$promotion")"
905
919
  candidate_run="$(gh api "/repos/$GH_REPO/actions/runs/$candidate_run_id")"
906
920
  printf '%s' "$candidate_run" | jq -e \
907
921
  --arg source "$EBK_STAGING_SOURCE_COMMIT" \
@@ -913,6 +927,10 @@ ${indentedScript(stagingPromotionReceiptValidationScript(), 10)}
913
927
  --arg digest "$candidate_artifact_digest" \
914
928
  --arg name "release-candidate-$EBK_STAGING_SOURCE_COMMIT" \
915
929
  '[.artifacts[] | select((.id | tostring) == $id and .name == $name and .digest == $digest and .expired == false)] | length == 1' >/dev/null
930
+ fi
931
+ if [ "$EBK_EXPECTED_HAS_CONTAINERS" = true ]; then
932
+ container_artifact_id="$(jq -r '.container.artifactId' "$promotion")"
933
+ container_artifact_digest="$(jq -r '.container.artifactDigest' "$promotion")"
916
934
  staging_artifacts="$(gh api "/repos/$GH_REPO/actions/runs/$EBK_STAGING_DEPLOYMENT_RUN_ID/artifacts?per_page=100")"
917
935
  printf '%s' "$staging_artifacts" | jq -e \
918
936
  --arg id "$container_artifact_id" \
@@ -929,7 +947,7 @@ ${indentedScript(stagingPromotionReceiptValidationScript(), 10)}
929
947
  needs.prepare.result == 'success' &&
930
948
  needs.immutable-artifacts.result == 'success' &&
931
949
  needs.prepare.outputs.action == 'deploy' &&
932
- needs.prepare.outputs.has_slices == 'true' &&
950
+ needs.prepare.outputs.has_containers == 'true' &&
933
951
  (
934
952
  needs.prepare.outputs.stage == 'staging' ||
935
953
  (needs.prepare.outputs.stage == 'production' && needs.prepare.outputs.profile == 'starter')
@@ -939,7 +957,7 @@ ${indentedScript(stagingPromotionReceiptValidationScript(), 10)}
939
957
  # One job per Slice and architecture: Slices build in parallel instead of
940
958
  # looping on one runner per architecture.
941
959
  matrix:
942
- project: \${{ fromJson(needs.prepare.outputs.slice_matrix) }}
960
+ project: \${{ fromJson(needs.prepare.outputs.container_matrix) }}
943
961
  # architecture is an original axis: include entries only decorate the
944
962
  # matching combination. Include-only keys would be merged into every
945
963
  # project and the later entry would overwrite the earlier one, so every
@@ -972,8 +990,9 @@ ${indentedScript(stagingPromotionReceiptValidationScript(), 10)}
972
990
  EBK_RELEASE_SOURCE_COMMIT: \${{ needs.immutable-artifacts.outputs.source_commit }}
973
991
  EBK_SOURCE_COMMIT: \${{ inputs.source_commit || github.sha }}
974
992
  EBK_STAGE: \${{ needs.prepare.outputs.stage }}
975
- EBK_SLICE_PROJECTS: \${{ needs.prepare.outputs.slice_projects }}
993
+ EBK_SLICE_PROJECTS: \${{ needs.prepare.outputs.container_projects }}
976
994
  EBK_SLICE_PROJECT: \${{ matrix.project.project }}
995
+ EBK_CONTAINER_PROJECTS: \${{ needs.prepare.outputs.container_projects }}
977
996
  steps:
978
997
  - name: Check out immutable container source
979
998
  uses: ${actionPins.checkout}
@@ -1080,7 +1099,7 @@ ${indentedScript(exactStageDeployerGuardScript('Container build', '$EBK_POLICY_A
1080
1099
  case "$EBK_SLICE_PROJECT" in
1081
1100
  ''|-*|*-|*[!a-z0-9-]*) echo 'Container build Slice project must be an exact normalized Slice name'; exit 1 ;;
1082
1101
  esac
1083
- case ",$EBK_SLICE_PROJECTS," in
1102
+ case ",$EBK_CONTAINER_PROJECTS," in
1084
1103
  *",$EBK_SLICE_PROJECT,"*) ;;
1085
1104
  *) echo 'Container build Slice project is not in the committed deployment plan'; exit 1 ;;
1086
1105
  esac
@@ -1108,7 +1127,7 @@ ${indentedScript(exactStageDeployerGuardScript('Container build', '$EBK_POLICY_A
1108
1127
  needs.immutable-artifacts.result == 'success' &&
1109
1128
  needs.container-platform.result == 'success' &&
1110
1129
  needs.prepare.outputs.action == 'deploy' &&
1111
- needs.prepare.outputs.has_slices == 'true'
1130
+ needs.prepare.outputs.has_containers == 'true'
1112
1131
  runs-on: ubuntu-latest
1113
1132
  environment: \${{ needs.prepare.outputs.stage }}
1114
1133
  permissions:
@@ -1130,7 +1149,7 @@ ${indentedScript(exactStageDeployerGuardScript('Container build', '$EBK_POLICY_A
1130
1149
  EBK_RELEASE_SOURCE_COMMIT: \${{ needs.immutable-artifacts.outputs.source_commit }}
1131
1150
  EBK_SOURCE_COMMIT: \${{ inputs.source_commit || github.sha }}
1132
1151
  EBK_STAGE: \${{ needs.prepare.outputs.stage }}
1133
- EBK_SLICE_PROJECTS: \${{ needs.prepare.outputs.slice_projects }}
1152
+ EBK_SLICE_PROJECTS: \${{ needs.prepare.outputs.container_projects }}
1134
1153
  steps:
1135
1154
  - name: Check out immutable container source
1136
1155
  uses: ${actionPins.checkout}
@@ -1244,7 +1263,7 @@ ${indentedScript(exactStageDeployerGuardScript('Container assembly', '$EBK_POLIC
1244
1263
  needs.prepare.outputs.action == 'deploy' &&
1245
1264
  needs.prepare.outputs.stage == 'production' &&
1246
1265
  needs.prepare.outputs.profile != 'starter' &&
1247
- needs.prepare.outputs.has_slices == 'true'
1266
+ needs.prepare.outputs.has_containers == 'true'
1248
1267
  runs-on: ubuntu-latest
1249
1268
  environment: production
1250
1269
  permissions:
@@ -1267,7 +1286,7 @@ ${indentedScript(exactStageDeployerGuardScript('Container assembly', '$EBK_POLIC
1267
1286
  EBK_RELEASE_SOURCE_COMMIT: \${{ needs.immutable-artifacts.outputs.source_commit }}
1268
1287
  EBK_SOURCE_COMMIT: \${{ inputs.source_commit || github.sha }}
1269
1288
  EBK_STAGE: production
1270
- EBK_SLICE_PROJECTS: \${{ needs.prepare.outputs.slice_projects }}
1289
+ EBK_SLICE_PROJECTS: \${{ needs.prepare.outputs.container_projects }}
1271
1290
  steps:
1272
1291
  - name: Check out immutable production source
1273
1292
  uses: ${actionPins.checkout}
@@ -1425,7 +1444,7 @@ ${indentedScript(exactStageDeployerGuardScript('Container promotion', '$AWS_EXPE
1425
1444
  ) || (
1426
1445
  needs.immutable-artifacts.result == 'success' &&
1427
1446
  (
1428
- needs.prepare.outputs.has_slices != 'true' ||
1447
+ needs.prepare.outputs.has_containers != 'true' ||
1429
1448
  needs.prepare.outputs.stage == 'development' ||
1430
1449
  (
1431
1450
  (
@@ -1526,7 +1545,7 @@ ${indentedScript(exactStageDeployerGuardScript('Container promotion', '$AWS_EXPE
1526
1545
  - name: Restore exact current-stage container binding
1527
1546
  if: >-
1528
1547
  needs.prepare.outputs.action == 'deploy' &&
1529
- needs.prepare.outputs.has_slices == 'true' &&
1548
+ needs.prepare.outputs.has_containers == 'true' &&
1530
1549
  (
1531
1550
  needs.prepare.outputs.stage == 'staging' ||
1532
1551
  (needs.prepare.outputs.stage == 'production' && needs.prepare.outputs.profile == 'starter')
@@ -1541,7 +1560,7 @@ ${indentedScript(exactStageDeployerGuardScript('Container promotion', '$AWS_EXPE
1541
1560
  - name: Restore exact promoted production container binding
1542
1561
  if: >-
1543
1562
  needs.prepare.outputs.action == 'deploy' &&
1544
- needs.prepare.outputs.has_slices == 'true' &&
1563
+ needs.prepare.outputs.has_containers == 'true' &&
1545
1564
  needs.prepare.outputs.stage == 'production' &&
1546
1565
  needs.prepare.outputs.profile != 'starter'
1547
1566
  uses: ${actionPins.downloadArtifact}
@@ -1554,14 +1573,15 @@ ${indentedScript(exactStageDeployerGuardScript('Container promotion', '$AWS_EXPE
1554
1573
  - name: Verify exact predeploy container binding inventory
1555
1574
  if: >-
1556
1575
  needs.prepare.outputs.action == 'deploy' &&
1557
- needs.prepare.outputs.has_slices == 'true' &&
1576
+ needs.prepare.outputs.has_containers == 'true' &&
1558
1577
  needs.prepare.outputs.stage != 'development'
1559
1578
  env:
1560
1579
  ACTIONS_ID_TOKEN_REQUEST_TOKEN: ''
1561
1580
  ACTIONS_ID_TOKEN_REQUEST_URL: ''
1581
+ EBK_CONTAINER_PROJECTS: \${{ needs.prepare.outputs.container_projects }}
1562
1582
  run: |
1563
1583
  set -euo pipefail
1564
- IFS=',' read -r -a projects <<< "$EBK_SLICE_PROJECTS"
1584
+ IFS=',' read -r -a projects <<< "$EBK_CONTAINER_PROJECTS"
1565
1585
  for project in "\${projects[@]}"; do
1566
1586
  test -n "$project" || continue
1567
1587
  test -f ".ebk/evidence/container-release/$EBK_STAGE/packages/$project/binding.json" || {
@@ -1731,6 +1751,7 @@ ${indentedScript(exactStageDeployerGuardScript('Smoke access cleanup', '$EBK_POL
1731
1751
  EBK_CONTAINER_ARTIFACT_DIGEST: \${{ needs.container-assemble.outputs.artifact_digest }}
1732
1752
  EBK_CONTAINER_ARTIFACT_ID: \${{ needs.container-assemble.outputs.artifact_id }}
1733
1753
  EBK_HAS_SLICES: \${{ needs.prepare.outputs.has_slices }}
1754
+ EBK_HAS_CONTAINERS: \${{ needs.prepare.outputs.has_containers }}
1734
1755
  run: |
1735
1756
  node --input-type=module <<'NODE'
1736
1757
  ${indentedScript(stagingPromotionSealScript(), 10)}
@@ -2008,7 +2029,7 @@ function renderTrunkPromotionJobs(options) {
2008
2029
  always() &&
2009
2030
  needs.prepare.result == 'success' &&
2010
2031
  needs.immutable-artifacts.result == 'success' &&
2011
- needs.container-assemble.result == 'success' &&
2032
+ (needs.prepare.outputs.has_containers != 'true' || needs.container-assemble.result == 'success') &&
2012
2033
  needs.execute.result == 'success' &&
2013
2034
  ${trunkPromotionGate}
2014
2035
  runs-on: ubuntu-latest
@@ -2039,6 +2060,7 @@ ${trunkPromotionGate}
2039
2060
  EBK_SOURCE_COMMIT: \${{ inputs.source_commit || github.sha }}
2040
2061
  EBK_STAGE: production
2041
2062
  EBK_SLICE_PROJECTS: \${{ needs.prepare.outputs.slice_projects }}
2063
+ EBK_CONTAINER_PROJECTS: \${{ needs.prepare.outputs.container_projects }}
2042
2064
  steps:
2043
2065
  ${checkoutAndInstall('Verify managed workspace integrity before container authority')}
2044
2066
  - id: staging-receipt
@@ -2081,6 +2103,7 @@ ${checkoutAndInstall('Verify managed workspace integrity before container author
2081
2103
  EBK_STAGING_DEPLOYMENT_RUN_ATTEMPT: \${{ github.run_attempt }}
2082
2104
  EBK_STAGING_DEPLOYMENT_RUN_ID: \${{ github.run_id }}
2083
2105
  EBK_EXPECTED_HAS_SLICES: \${{ needs.prepare.outputs.has_slices }}
2106
+ EBK_EXPECTED_HAS_CONTAINERS: \${{ needs.prepare.outputs.has_containers }}
2084
2107
  EBK_EXPECTED_DEPLOYMENT_PROFILE: \${{ needs.prepare.outputs.profile }}
2085
2108
  EBK_EXPECTED_DEPLOYMENT_REGION: \${{ needs.prepare.outputs.region }}
2086
2109
  EBK_EXPECTED_STAGING_ACCOUNT_ID: \${{ needs.prepare.outputs.staging_account_id }}
@@ -2122,6 +2145,7 @@ ${indentedScript(stagingPromotionReceiptValidationScript(), 10)}
2122
2145
  path: .ebk/evidence/release-candidate
2123
2146
  run-id: \${{ steps.staging.outputs.producer_run_id }}
2124
2147
  - name: Restore this run's staging container bundle
2148
+ if: needs.prepare.outputs.has_containers == 'true'
2125
2149
  uses: ${actionPins.downloadArtifact}
2126
2150
  env:
2127
2151
  ACTIONS_ID_TOKEN_REQUEST_TOKEN: ''
@@ -2132,6 +2156,7 @@ ${indentedScript(stagingPromotionReceiptValidationScript(), 10)}
2132
2156
  path: .ebk/evidence/container-release
2133
2157
  ${revalidateTip}
2134
2158
  - name: Assume exact staging registry pull role
2159
+ if: needs.prepare.outputs.has_containers == 'true'
2135
2160
  uses: ${actionPins.configureAwsCredentials}
2136
2161
  with:
2137
2162
  audience: \${{ needs.prepare.outputs.oidc_audience }}
@@ -2139,6 +2164,7 @@ ${revalidateTip}
2139
2164
  role-session-name: ebk-staging-container-pull-\${{ github.run_id }}-\${{ github.run_attempt }}
2140
2165
  role-to-assume: \${{ secrets.AWS_STAGING_PROMOTION_PULL_ROLE_ARN }}
2141
2166
  - name: Authenticate exact staging source registry
2167
+ if: needs.prepare.outputs.has_containers == 'true'
2142
2168
  env:
2143
2169
  AWS_STAGING_PROMOTION_PULL_ROLE_ARN: \${{ secrets.AWS_STAGING_PROMOTION_PULL_ROLE_ARN }}
2144
2170
  EBK_STAGING_ACCOUNT_ID: \${{ vars.AWS_STAGING_PROMOTION_EXPECTED_ACCOUNT_ID }}
@@ -2156,6 +2182,7 @@ ${indentedScript(exactStagingPromotionPullGuardScript(), 10)}
2156
2182
  "$EBK_STAGING_ACCOUNT_ID.dkr.ecr.$EBK_STAGING_REGION.amazonaws$registry_suffix"
2157
2183
  ${revalidateTip}
2158
2184
  - name: Assume the production deployment role for container promotion
2185
+ if: needs.prepare.outputs.has_containers == 'true'
2159
2186
  uses: ${actionPins.configureAwsCredentials}
2160
2187
  with:
2161
2188
  audience: \${{ needs.prepare.outputs.oidc_audience }}
@@ -2163,6 +2190,7 @@ ${revalidateTip}
2163
2190
  role-session-name: ebk-production-container-push-\${{ github.run_id }}-\${{ github.run_attempt }}
2164
2191
  role-to-assume: \${{ env.AWS_DEPLOY_ROLE_ARN }}
2165
2192
  - name: Promote exact staging indexes without rebuilding
2193
+ if: needs.prepare.outputs.has_containers == 'true'
2166
2194
  env:
2167
2195
  EBK_STAGING_PROMOTION_EXPECTED_ACCOUNT_ID: \${{ vars.AWS_STAGING_PROMOTION_EXPECTED_ACCOUNT_ID }}
2168
2196
  EBK_STAGING_PROMOTION_REGION: \${{ vars.AWS_STAGING_PROMOTION_REGION }}
@@ -2171,7 +2199,7 @@ ${revalidateTip}
2171
2199
  [ "$AWS_EXPECTED_ACCOUNT_ID" = "$EBK_POLICY_PRODUCTION_ACCOUNT_ID" ]
2172
2200
  [ "$AWS_REGION" = "$EBK_POLICY_REGION" ]
2173
2201
  ${indentedScript(exactStageDeployerGuardScript('Container promotion', '$AWS_EXPECTED_ACCOUNT_ID'), 10)}
2174
- IFS=',' read -r -a projects <<< "$EBK_SLICE_PROJECTS"
2202
+ IFS=',' read -r -a projects <<< "$EBK_CONTAINER_PROJECTS"
2175
2203
  for project in "\${projects[@]}"; do
2176
2204
  test -n "$project" || continue
2177
2205
  # Repository-relative for the container release tool (EBK-INT-2026-077).
@@ -2181,6 +2209,7 @@ ${indentedScript(exactStageDeployerGuardScript('Container promotion', '$AWS_EXPE
2181
2209
  done
2182
2210
  - id: retain
2183
2211
  name: Retain production target container binding
2212
+ if: needs.prepare.outputs.has_containers == 'true'
2184
2213
  uses: ${actionPins.uploadArtifact}
2185
2214
  with:
2186
2215
  name: container-release-production-\${{ github.run_id }}-\${{ github.run_attempt }}
@@ -2242,6 +2271,7 @@ ${checkoutAndInstall('Verify managed workspace integrity before AWS authority')}
2242
2271
  path: .ebk/evidence/release-candidate
2243
2272
  run-id: \${{ needs.promote-production.outputs.candidate_producer_run_id }}
2244
2273
  - name: Restore exact promoted production container binding
2274
+ if: needs.prepare.outputs.has_containers == 'true'
2245
2275
  uses: ${actionPins.downloadArtifact}
2246
2276
  env:
2247
2277
  ACTIONS_ID_TOKEN_REQUEST_TOKEN: ''
@@ -2250,12 +2280,14 @@ ${checkoutAndInstall('Verify managed workspace integrity before AWS authority')}
2250
2280
  name: container-release-production-\${{ github.run_id }}-\${{ github.run_attempt }}
2251
2281
  path: .ebk/evidence/container-release
2252
2282
  - name: Verify exact predeploy container binding inventory
2283
+ if: needs.prepare.outputs.has_containers == 'true'
2253
2284
  env:
2254
2285
  ACTIONS_ID_TOKEN_REQUEST_TOKEN: ''
2255
2286
  ACTIONS_ID_TOKEN_REQUEST_URL: ''
2287
+ EBK_CONTAINER_PROJECTS: \${{ needs.prepare.outputs.container_projects }}
2256
2288
  run: |
2257
2289
  set -euo pipefail
2258
- IFS=',' read -r -a projects <<< "$EBK_SLICE_PROJECTS"
2290
+ IFS=',' read -r -a projects <<< "$EBK_CONTAINER_PROJECTS"
2259
2291
  for project in "\${projects[@]}"; do
2260
2292
  test -n "$project" || continue
2261
2293
  test -f ".ebk/evidence/container-release/$EBK_STAGE/packages/$project/binding.json" || {
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.renderThinLifecycleDocumentation = renderThinLifecycleDocumentation;
4
4
  const index_js_1 = require("../../repository-policy/index.js");
5
+ const tool_versions_js_1 = require("./tool-versions.js");
5
6
  function renderThinLifecycleDocumentation(options) {
6
7
  const stages = (0, index_js_1.activeDeploymentStages)(options.deploymentProfile);
7
8
  const stageList = stages.join(', ');
@@ -16,9 +17,19 @@ refresh, removal, and provider diagnostics.
16
17
 
17
18
  The committed \`${options.deploymentProfile}\` profile activates: ${stageList}.
18
19
 
19
- Start with \`pnpm verify\`, configure the exact temporary AWS profile and stage
20
- deployment role described in \`docs/stage-deployment-authority.md\`, then deploy
21
- development through the root \`deploy-local\` target. Do not invoke SST directly.
20
+ For ordinary feature work, run affected tests, typecheck, lint, and ownership
21
+ checks. Run \`pnpm verify\` at a milestone, not before each development edit.
22
+ Configure the exact temporary AWS profile and stage deployment role described
23
+ in \`docs/stage-deployment-authority.md\` before deploying development through
24
+ \`ebk deploy development --profile=<profile> --expectedRoleArn=<role-arn>\`
25
+ (the root \`deploy-local\` target). Do not invoke SST directly.
26
+
27
+ Standard Slices include a Python infrastructure provisioner: install \`uv\`
28
+ ${tool_versions_js_1.WORKSPACE_UV_VERSION} (Python 3.12 or newer) on PATH before \`ebk dev up\` or
29
+ \`ebk deploy\`. Each Standard Slice stops before its SST child starts when
30
+ \`uv --version\` fails; a full \`ebk deploy\` may already have deployed
31
+ Foundation.
32
+ Source-only feature checks do not require it.
22
33
  `,
23
34
  'docs/git-workflow.md': `# Protected Git workflow
24
35
 
@@ -99,15 +110,21 @@ secret; do not add repository-scope fallbacks.
99
110
 
100
111
  ## Production capacity
101
112
 
102
- The shared Foundation has three capacity profiles, independent of deployment topology:
103
- - \`cost-optimized\`: 0–2 ACUs, five-minute idle auto-pause; new starter default.
113
+ Foundation provisions Aurora only when SQL is declared. DynamoDB remains the framework core.
114
+ Aurora has three capacity profiles, independent of deployment topology:
115
+ - \`cost-optimized\`: 0–2 ACUs, five-minute idle auto-pause; default for all new deployment profiles.
104
116
  - \`balanced\`: 0.5–4 ACUs, always warm.
105
- - \`standard\`: 2–16 ACUs, always warm; isolated repository default.
117
+ - \`standard\`: 2–16 ACUs, always warm.
106
118
 
107
- All retain 30-day backups, deletion protection, encryption, and managed NAT.
119
+ Existing explicit capacity choices survive upgrades. Provisioned production Aurora
120
+ retains 30-day backups, deletion protection and encryption in all three profiles.
121
+ Undeclared SQL does not provision Aurora or SQL-only networking.
108
122
  Pause can delay first requests (typically 15 seconds, sometimes 30 seconds or
109
123
  longer); open connections or polling can prevent it. Storage/NAT still cost money.
110
124
  Validate cold-resume retries, migration timeouts, and the shared capacity ceiling.
125
+ Choose balanced when measured cold-resume latency is unacceptable; choose standard
126
+ when measured capacity and concurrency justify the larger warm range. Capacity
127
+ selection never changes background-work cadence or an explicit maintenance pause.
111
128
 
112
129
  Existing warm \`cost-optimized\` users must use the new generator to report
113
130
  \`pnpm nx g @empire-builder-kit/nx:repository-policy --profile=balanced\`, then
@@ -122,6 +139,15 @@ removal, unlock, discovery, and secret resolution.
122
139
 
123
140
  ## Native lifecycle
124
141
 
142
+ Use \`ebk deploy development --profile=<profile> --expectedRoleArn=<role-arn>\`.
143
+ Add Slice names, for example \`ebk deploy development billing\` with the same
144
+ authority options, for focused deployment after Foundation. Other Slices are
145
+ not redeployed; required peers must already exist. Omit Slice names for the
146
+ complete stage. Explicit selection is local-only and its \`selectedSlices\`
147
+ receipt is not full-stage acceptance or a protected affected-deployment baseline.
148
+ \`ebk deploy --help\` lists options; it preserves native TTY/output and does not
149
+ accept arbitrary Nx/SST flags or a noninteractive confirmation.
150
+
125
151
  The root \`${options.name}:deploy-local\` target orders Foundation before every
126
152
  eligible Product Slice. Each project runs its public Nx \`deploy\` target, which
127
153
  uses pinned native \`sst deploy\`; successful Slice infrastructure is followed
@@ -169,7 +195,7 @@ mutation remains denied. EBK does not claim a postdeployment trust attestor. In
169
195
  commercial AWS, CloudFront, CloudFront-scope WAF, edge WAF log delivery, and
170
196
  edge ACM use the us-east-1 control plane. CloudWatch Logs cannot scope the
171
197
  generated WAF \`PutResourcePolicy\` payload through IAM; reviewed generated
172
- source and the edge Region are its controls. RC.31 does not claim Router edge support in noncommercial
198
+ source and the edge Region are its controls. This prerelease does not claim Router edge support in noncommercial
173
199
  partitions: CloudFront is unavailable in GovCloud, and the China-partition edge
174
200
  control plane is not yet proven.
175
201
 
@@ -186,9 +212,10 @@ it. Post-deployment evidence may attest the native bootstrap resources.
186
212
  `,
187
213
  'packages/foundation/README.md': `# Standard Foundation
188
214
 
189
- Foundation owns the shared network, Router/WAF, Aurora, Cognito, events,
190
- observability, configuration, and container-compute resources for each active
191
- canonical stage. The \`${options.deploymentProfile}\` profile activates:
215
+ Foundation owns shared Router/WAF, Cognito, events, observability, and
216
+ configuration resources for each active canonical stage. It provisions Aurora
217
+ only when SQL is declared; network and container-compute resources depend on
218
+ declared workloads. The \`${options.deploymentProfile}\` profile activates:
192
219
  ${stageList}.
193
220
 
194
221
  Deploy it through the workspace root \`deploy-local\` target or the protected
@@ -209,7 +236,7 @@ The resolved ${rehearsalStage} stage is rehearsed with
209
236
  Use temporary IAM Identity Center credentials and the stable stage deployment
210
237
  role. Development accepts a dirty tree and requires no acknowledgement:
211
238
 
212
- \`pnpm nx run ${options.name}:deploy-local -- --stage=development --profile=<profile> --expectedRoleArn=<role-arn>\`
239
+ \`ebk deploy development --profile=<profile> --expectedRoleArn=<role-arn>\`
213
240
 
214
241
  Local staging, when active, requires a clean commit and an interactive
215
242
  \`approve:deploy:staging:<source-commit>\` response. Starter production requires
@@ -233,6 +260,24 @@ committed stage role, refreshes its invocation-private temporary credentials
233
260
  immediately before SST, and removes them on every exit. A failed child stops
234
261
  immediately.
235
262
 
263
+ After all Slice registrations are absent, \`foundation:remove\` runs native
264
+ SST removal directly, without a separate refresh or local retry checkpoint.
265
+ Temporary smoke admission uses a separate, normally empty Cloud Control IP set;
266
+ the baseline allowlist identities and addresses remain untouched. Its AWS service
267
+ handler resolves the current WAF lock token during deletion. A failed or
268
+ interrupted removal remains failed. Resolve its native diagnostic and any lock
269
+ through the governed unlock target, then retry the same remove target, including
270
+ from a fresh checkout. Ownership, caller and production removal safeguards run
271
+ on every invocation. Refresh stays separate and never continues into removal or
272
+ deployment; do not bypass its diagnostics, edit state, or use deprecated SST
273
+ components.
274
+
275
+ For an older deployment whose smoke helper edited the baseline IP set, reconcile
276
+ that existing provider state with an explicit governed refresh while Foundation
277
+ is intact. The new smoke set does not retroactively repair old lock tokens.
278
+ Partially removed old stacks require an evidence-backed recovery assessment;
279
+ do not redeploy a maintenance-held stage merely to apply this upgrade.
280
+
236
281
  ## Router WAF rehearsal
237
282
 
238
283
  ${options.deploymentProfile === 'starter'
@@ -285,12 +330,13 @@ receipt binds the derived account and Region.
285
330
 
286
331
  ## Production safeguards
287
332
 
288
- Production keeps the committed Aurora capacity profile, 30-day backup
289
- retention, deletion protection, WAF blocking rehearsal, migration preflight,
290
- and application smoke checks. Any change to these controls must be a committed
291
- policy change and must remain permitted by the stage authority's explicit
292
- guardrails. AWS exposes SNS topic and SQS queue policy updates through the same
293
- Set*Attributes actions required during native creation and provides no
333
+ Production keeps WAF blocking rehearsal and application smoke checks. When SQL
334
+ is declared, production also keeps the committed Aurora capacity profile,
335
+ 30-day backup retention, deletion protection, and migration preflight. Any
336
+ change to these controls must be a committed policy change and must remain
337
+ permitted by the stage authority's explicit guardrails. AWS exposes SNS topic
338
+ and SQS queue policy updates through the same Set*Attributes actions required
339
+ during native creation and provides no
294
340
  attribute-name IAM condition. The stable stage role therefore contains those
295
341
  calls by exact account, Region, and generated stage-name pattern; hard stage
296
342
  separation requires an isolated profile. CloudFront KeyValueStore data-plane
@@ -1,6 +1,10 @@
1
1
  import { type FoundationOwnershipRecord, type WorkspaceOwnershipRecord } from '../../ownership/index.js';
2
2
  import { type DeliveryLane, type ProductionApprovalMode, type ConfiguredDeploymentAccounts, type DeploymentProfile } from '../../repository-policy/index.js';
3
3
  export interface WorkspaceFileOptions {
4
+ /** Prior managed declaration: upgrades retain every already-declared resource. */
5
+ foundationDescriptor?: unknown;
6
+ /** Validated requirements are unioned before any generated file is written. */
7
+ foundationRequirements?: readonly unknown[];
4
8
  /** trunk (starter only) protects main alone and delivers production from
5
9
  * every merged main push; protected-pair keeps develop and main. */
6
10
  deliveryLane?: DeliveryLane;