@empire-builder-kit/nx 1.0.0-rc.4 → 1.0.0-rc.41

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 (805) hide show
  1. package/README.md +44 -10
  2. package/executors.json +21 -1
  3. package/generators.json +10 -0
  4. package/package.json +31 -7
  5. package/src/aws/child-environment.d.ts +10 -0
  6. package/src/aws/child-environment.js +77 -0
  7. package/src/aws/identity.d.ts +13 -0
  8. package/src/aws/identity.js +41 -0
  9. package/src/aws-authority/index.d.ts +2 -0
  10. package/src/aws-authority/index.js +6 -0
  11. package/src/aws-authority/lambda-policy-ordering.d.ts +38 -0
  12. package/src/aws-authority/lambda-policy-ordering.js +56 -0
  13. package/src/aws-authority/stage-authority.d.ts +248 -0
  14. package/src/aws-authority/stage-authority.js +3558 -0
  15. package/src/blueprints/external-sandbox.d.ts +1 -1
  16. package/src/blueprints/external-sandbox.js +21 -9
  17. package/src/blueprints/manifest.d.ts +1 -1
  18. package/src/blueprints/resolver.js +28 -15
  19. package/src/cli/bootstrap.d.ts +1 -1
  20. package/src/cli/deploy-runtime.d.ts +30 -0
  21. package/src/cli/deploy-runtime.js +174 -0
  22. package/src/cli/dev-command.d.ts +18 -4
  23. package/src/cli/dev-command.js +71 -0
  24. package/src/cli/main.d.ts +9 -1
  25. package/src/cli/main.js +157 -24
  26. package/src/cli/output.d.ts +1 -1
  27. package/src/cli/output.js +1 -1
  28. package/src/cli/personal-secret-runtime.d.ts +12 -0
  29. package/src/cli/personal-secret-runtime.js +18 -3
  30. package/src/cli/secret-terminal.js +1 -1
  31. package/src/container-images.d.ts +1 -1
  32. package/src/container-images.js +1 -1
  33. package/src/developer-agent/context.js +41 -9
  34. package/src/developer-agent/generator-planning.js +20 -6
  35. package/src/developer-agent/git-inspection.d.ts +6 -2
  36. package/src/developer-agent/git-inspection.js +78 -6
  37. package/src/developer-agent/model.d.ts +5 -3
  38. package/src/developer-agent/model.js +4 -4
  39. package/src/developer-agent/operation-registry.d.ts +15 -0
  40. package/src/developer-agent/operation-registry.js +342 -49
  41. package/src/developer-agent/planning.d.ts +8 -1
  42. package/src/developer-agent/planning.js +39 -16
  43. package/src/developer-agent/preview-changes.d.ts +2 -0
  44. package/src/developer-agent/preview-changes.js +14 -2
  45. package/src/developer-agent/preview-source.js +3 -0
  46. package/src/developer-agent/validation.js +25 -9
  47. package/src/developer-agent/workspace-inspection.js +60 -5
  48. package/src/executors/blueprint-trust/blueprint-trust.js +6 -0
  49. package/src/executors/deployment-plan/deployment-plan.d.ts +2 -0
  50. package/src/executors/deployment-plan/deployment-plan.js +57 -2
  51. package/src/executors/dev-doctor/dev-doctor.js +13 -6
  52. package/src/executors/dev-task-cleanup/dev-task-cleanup.d.ts +23 -0
  53. package/src/executors/dev-task-cleanup/dev-task-cleanup.js +145 -0
  54. package/src/executors/dev-task-cleanup/schema.json +9 -0
  55. package/src/executors/dev-task-cleanup/task-stack-absence.d.ts +27 -0
  56. package/src/executors/dev-task-cleanup/task-stack-absence.js +281 -0
  57. package/src/executors/dev-task-cleanup/task-stack-checkpoint.d.ts +12 -0
  58. package/src/executors/dev-task-cleanup/task-stack-checkpoint.js +92 -0
  59. package/src/executors/fleet/fleet.js +1 -1
  60. package/src/executors/foundation-preflight/foundation-preflight.d.ts +1 -0
  61. package/src/executors/foundation-preflight/foundation-preflight.js +6 -2
  62. package/src/executors/foundation-preflight/schema.json +5 -0
  63. package/src/executors/foundation-profile-preflight/foundation-profile-preflight.d.ts +13 -2
  64. package/src/executors/foundation-profile-preflight/foundation-profile-preflight.js +95 -31
  65. package/src/executors/foundation-profile-preflight/production-database-safeguard.d.ts +65 -0
  66. package/src/executors/foundation-profile-preflight/production-database-safeguard.js +223 -0
  67. package/src/executors/foundation-profile-preflight/schema.json +15 -4
  68. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.d.ts +11 -1
  69. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js +70 -20
  70. package/src/executors/foundation-remove-preflight/schema.json +6 -1
  71. package/src/executors/github-bootstrap/github-bootstrap.d.ts +1 -0
  72. package/src/executors/github-bootstrap/github-bootstrap.js +3 -0
  73. package/src/executors/github-bootstrap/schema.json +7 -1
  74. package/src/executors/infrastructure-plan/infrastructure-plan.d.ts +29 -136
  75. package/src/executors/infrastructure-plan/infrastructure-plan.js +230 -3282
  76. package/src/executors/infrastructure-plan/schema.json +12 -52
  77. package/src/executors/local-deploy/federated-credential-transport.d.ts +48 -0
  78. package/src/executors/local-deploy/federated-credential-transport.js +252 -0
  79. package/src/executors/local-deploy/local-approval.d.ts +18 -0
  80. package/src/executors/local-deploy/local-approval.js +39 -0
  81. package/src/executors/local-deploy/local-deploy.d.ts +112 -0
  82. package/src/executors/local-deploy/local-deploy.js +1404 -0
  83. package/src/executors/local-deploy/schema.json +70 -0
  84. package/src/executors/refresh/refresh.js +2 -2
  85. package/src/executors/remove/remove.js +2 -2
  86. package/src/executors/router-waf-rehearsal/router-waf-rehearsal.d.ts +42 -0
  87. package/src/executors/router-waf-rehearsal/router-waf-rehearsal.js +1229 -0
  88. package/src/executors/router-waf-rehearsal/schema.json +29 -0
  89. package/src/executors/secret-initialize/schema.json +42 -0
  90. package/src/executors/secret-initialize/secret-initialize.d.ts +34 -0
  91. package/src/executors/secret-initialize/secret-initialize.js +297 -0
  92. package/src/executors/secret-metadata/schema.json +5 -0
  93. package/src/executors/secret-metadata/secret-metadata.d.ts +16 -2
  94. package/src/executors/secret-metadata/secret-metadata.js +129 -30
  95. package/src/executors/sst-lifecycle/generated-secret-retirement.d.ts +53 -0
  96. package/src/executors/sst-lifecycle/generated-secret-retirement.js +192 -0
  97. package/src/executors/sst-lifecycle/governed-native-operation.d.ts +48 -0
  98. package/src/executors/sst-lifecycle/governed-native-operation.js +163 -0
  99. package/src/executors/sst-lifecycle/logging-preflight.d.ts +5 -0
  100. package/src/executors/sst-lifecycle/logging-preflight.js +23 -13
  101. package/src/executors/sst-lifecycle/run-sst-command.d.ts +46 -6
  102. package/src/executors/sst-lifecycle/run-sst-command.js +750 -71
  103. package/src/executors/sst-lifecycle/schema.json +8 -1
  104. package/src/executors/sst-lifecycle/secret-preflight.d.ts +2 -0
  105. package/src/executors/sst-lifecycle/secret-preflight.js +13 -7
  106. package/src/executors/sst-lifecycle/sst-environment-source.d.ts +33 -0
  107. package/src/executors/sst-lifecycle/sst-environment-source.js +267 -0
  108. package/src/executors/sst-lifecycle/task-unlock.d.ts +15 -0
  109. package/src/executors/sst-lifecycle/task-unlock.js +126 -0
  110. package/src/executors/unlock/unlock.js +2 -2
  111. package/src/foundation/capability-plan.d.ts +43 -0
  112. package/src/foundation/capability-plan.js +168 -0
  113. package/src/foundation/cost-estimate.d.ts +170 -0
  114. package/src/foundation/cost-estimate.js +683 -0
  115. package/src/foundation/discovery.d.ts +14 -11
  116. package/src/foundation/discovery.js +32 -6
  117. package/src/foundation/index.d.ts +4 -0
  118. package/src/foundation/index.js +11 -0
  119. package/src/foundation/local-database-contract.d.ts +20 -0
  120. package/src/foundation/local-database-contract.js +262 -13
  121. package/src/foundation/local-private-smoke-access.d.ts +20 -0
  122. package/src/foundation/local-private-smoke-access.js +197 -0
  123. package/src/foundation/logging-preflight.js +1 -1
  124. package/src/foundation/logging.d.ts +3 -1
  125. package/src/foundation/logging.js +1 -1
  126. package/src/foundation/partial-state.d.ts +10 -0
  127. package/src/foundation/partial-state.js +21 -0
  128. package/src/foundation/preflight.js +37 -18
  129. package/src/foundation/private-smoke-access.d.ts +25 -0
  130. package/src/foundation/private-smoke-access.js +135 -0
  131. package/src/foundation/private-smoke-admission.d.ts +45 -0
  132. package/src/foundation/private-smoke-admission.js +180 -0
  133. package/src/foundation/private-smoke-control-plane.d.ts +18 -0
  134. package/src/foundation/private-smoke-control-plane.js +184 -0
  135. package/src/foundation/provision-database-bindings.d.ts +5 -0
  136. package/src/foundation/provision-database-bindings.js +41 -8
  137. package/src/foundation/provision-logical-database.js +15 -8
  138. package/src/foundation/requirements.d.ts +3 -3
  139. package/src/foundation/requirements.js +24 -12
  140. package/src/foundation/router-waf-rate-rehearsal.d.ts +97 -0
  141. package/src/foundation/router-waf-rate-rehearsal.js +210 -0
  142. package/src/foundation/router-waf.d.ts +149 -0
  143. package/src/foundation/router-waf.js +809 -0
  144. package/src/foundation/stages.d.ts +1 -0
  145. package/src/foundation/stages.js +11 -0
  146. package/src/generators/blueprint/blueprint.d.ts +5 -0
  147. package/src/generators/blueprint/blueprint.js +102 -0
  148. package/src/generators/blueprint/files.d.ts +6 -0
  149. package/src/generators/blueprint/files.js +217 -0
  150. package/src/generators/blueprint/schema.d.ts +4 -0
  151. package/src/generators/blueprint/schema.json +18 -0
  152. package/src/generators/formatting.d.ts +8 -0
  153. package/src/generators/formatting.js +141 -0
  154. package/src/generators/function/function.js +38 -17
  155. package/src/generators/logging-registry.d.ts +2 -0
  156. package/src/generators/logging-registry.js +22 -0
  157. package/src/generators/post-generation-install.js +2 -2
  158. package/src/generators/preset/dependency-overrides.d.ts +8 -0
  159. package/src/generators/preset/dependency-overrides.js +55 -0
  160. package/src/generators/preset/generator.js +43 -3
  161. package/src/generators/preset/schema.d.ts +10 -0
  162. package/src/generators/preset/schema.json +47 -0
  163. package/src/generators/preset/workspace-files-adopter-skills.d.ts +7 -0
  164. package/src/generators/preset/workspace-files-adopter-skills.js +324 -0
  165. package/src/generators/preset/workspace-files-ci-acceptance.d.ts +1 -0
  166. package/src/generators/preset/workspace-files-ci-acceptance.js +791 -0
  167. package/src/generators/preset/workspace-files-ci-install.d.ts +2 -0
  168. package/src/generators/preset/workspace-files-ci-install.js +196 -0
  169. package/src/generators/preset/workspace-files-developer-agent.d.ts +2 -0
  170. package/src/generators/preset/workspace-files-developer-agent.js +162 -44
  171. package/src/generators/preset/workspace-files-ecr-inspector.d.ts +18 -0
  172. package/src/generators/preset/workspace-files-ecr-inspector.js +298 -0
  173. package/src/generators/preset/workspace-files-foundation-workload-roles.js +5 -2
  174. package/src/generators/preset/workspace-files-performance-cost.d.ts +2 -2
  175. package/src/generators/preset/workspace-files-performance-cost.js +8 -8
  176. package/src/generators/preset/workspace-files-performance-load.d.ts +1 -1
  177. package/src/generators/preset/workspace-files-performance-load.js +39 -25
  178. package/src/generators/preset/workspace-files-shared-operation-claims.d.ts +10 -0
  179. package/src/generators/preset/workspace-files-shared-operation-claims.js +59 -0
  180. package/src/generators/preset/workspace-files-stage-authority.d.ts +6 -0
  181. package/src/generators/preset/workspace-files-stage-authority.js +529 -0
  182. package/src/generators/preset/workspace-files-thin-deploy.d.ts +65 -0
  183. package/src/generators/preset/workspace-files-thin-deploy.js +2507 -0
  184. package/src/generators/preset/workspace-files-thin-docs.d.ts +7 -0
  185. package/src/generators/preset/workspace-files-thin-docs.js +370 -0
  186. package/src/generators/preset/workspace-files-thin-release.d.ts +14 -0
  187. package/src/generators/preset/workspace-files-thin-release.js +26 -0
  188. package/src/generators/preset/workspace-files-workload-role-baseline.js +254 -42
  189. package/src/generators/preset/workspace-files.d.ts +18 -2
  190. package/src/generators/preset/workspace-files.js +1525 -609
  191. package/src/generators/repository-policy/repository-policy.js +235 -5
  192. package/src/generators/repository-policy/schema.d.ts +10 -0
  193. package/src/generators/repository-policy/schema.json +80 -4
  194. package/src/generators/repository-policy/tree-policy.d.ts +3 -0
  195. package/src/generators/repository-policy/tree-policy.js +25 -0
  196. package/src/generators/slice/built-in-plan-api-contract-files.js +49 -11
  197. package/src/generators/slice/built-in-plan-api-files.d.ts +1 -1
  198. package/src/generators/slice/built-in-plan-api-files.js +130 -414
  199. package/src/generators/slice/built-in-plan-async-work-files.js +166 -1969
  200. package/src/generators/slice/built-in-plan-authorization-files.js +102 -334
  201. package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js +975 -233
  202. package/src/generators/slice/built-in-plan-authorization-storage.d.ts +3 -0
  203. package/src/generators/slice/built-in-plan-authorization-storage.js +119 -0
  204. package/src/generators/slice/built-in-plan-background-work-files.d.ts +2 -0
  205. package/src/generators/slice/built-in-plan-background-work-files.js +99 -0
  206. package/src/generators/slice/built-in-plan-data-deletion-files.js +2 -830
  207. package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js +5 -31
  208. package/src/generators/slice/built-in-plan-data-files.d.ts +1 -1
  209. package/src/generators/slice/built-in-plan-data-files.js +176 -1200
  210. package/src/generators/slice/built-in-plan-data-lifecycle-files.js +53 -28
  211. package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js +37 -2
  212. package/src/generators/slice/built-in-plan-data-retention-job-files.js +7 -2443
  213. package/src/generators/slice/built-in-plan-data-retention-launcher-files.js +50 -8
  214. package/src/generators/slice/built-in-plan-data-rights-files.js +6 -4482
  215. package/src/generators/slice/built-in-plan-database-lifecycle-files.js +44 -25
  216. package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js +25 -2
  217. package/src/generators/slice/built-in-plan-foundation-files.d.ts +2 -1
  218. package/src/generators/slice/built-in-plan-foundation-files.js +39 -18
  219. package/src/generators/slice/built-in-plan-frontend-files.js +14 -3
  220. package/src/generators/slice/built-in-plan-infrastructure-files.d.ts +1 -1
  221. package/src/generators/slice/built-in-plan-infrastructure-files.js +933 -730
  222. package/src/generators/slice/built-in-plan-infrastructure-safety-files.js +75 -14
  223. package/src/generators/slice/built-in-plan-key-value-cleanup.d.ts +4 -0
  224. package/src/generators/slice/built-in-plan-key-value-cleanup.js +100 -0
  225. package/src/generators/slice/built-in-plan-key-value-consumer.d.ts +4 -0
  226. package/src/generators/slice/built-in-plan-key-value-consumer.js +151 -0
  227. package/src/generators/slice/built-in-plan-key-value-deletion.d.ts +2 -0
  228. package/src/generators/slice/built-in-plan-key-value-deletion.js +377 -0
  229. package/src/generators/slice/built-in-plan-key-value-delivery.d.ts +2 -0
  230. package/src/generators/slice/built-in-plan-key-value-delivery.js +137 -0
  231. package/src/generators/slice/built-in-plan-key-value-export.d.ts +2 -0
  232. package/src/generators/slice/built-in-plan-key-value-export.js +595 -0
  233. package/src/generators/slice/built-in-plan-key-value-files.d.ts +2 -0
  234. package/src/generators/slice/built-in-plan-key-value-files.js +31 -0
  235. package/src/generators/slice/built-in-plan-key-value-holds.d.ts +2 -0
  236. package/src/generators/slice/built-in-plan-key-value-holds.js +189 -0
  237. package/src/generators/slice/built-in-plan-key-value-infrastructure.d.ts +2 -0
  238. package/src/generators/slice/built-in-plan-key-value-infrastructure.js +102 -0
  239. package/src/generators/slice/built-in-plan-key-value-performance.d.ts +5 -0
  240. package/src/generators/slice/built-in-plan-key-value-performance.js +530 -0
  241. package/src/generators/slice/built-in-plan-key-value-provider.d.ts +4 -0
  242. package/src/generators/slice/built-in-plan-key-value-provider.js +366 -0
  243. package/src/generators/slice/built-in-plan-key-value-records.d.ts +3 -0
  244. package/src/generators/slice/built-in-plan-key-value-records.js +232 -0
  245. package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.d.ts +2 -0
  246. package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.js +103 -0
  247. package/src/generators/slice/built-in-plan-key-value-retention-job-files.d.ts +2 -0
  248. package/src/generators/slice/built-in-plan-key-value-retention-job-files.js +160 -0
  249. package/src/generators/slice/built-in-plan-key-value-retention-maintenance.d.ts +2 -0
  250. package/src/generators/slice/built-in-plan-key-value-retention-maintenance.js +329 -0
  251. package/src/generators/slice/built-in-plan-key-value-retention-worker.d.ts +2 -0
  252. package/src/generators/slice/built-in-plan-key-value-retention-worker.js +477 -0
  253. package/src/generators/slice/built-in-plan-key-value-retention.d.ts +2 -0
  254. package/src/generators/slice/built-in-plan-key-value-retention.js +184 -0
  255. package/src/generators/slice/built-in-plan-metadata-files.d.ts +1 -1
  256. package/src/generators/slice/built-in-plan-metadata-files.js +159 -29
  257. package/src/generators/slice/built-in-plan-native-runtime-authority-files.d.ts +2 -0
  258. package/src/generators/slice/built-in-plan-native-runtime-authority-files.js +324 -0
  259. package/src/generators/slice/built-in-plan-operations-files.d.ts +1 -1
  260. package/src/generators/slice/built-in-plan-operations-files.js +585 -97
  261. package/src/generators/slice/built-in-plan-performance-files.d.ts +2 -1
  262. package/src/generators/slice/built-in-plan-performance-files.js +220 -1074
  263. package/src/generators/slice/built-in-plan-project-files.js +141 -135
  264. package/src/generators/slice/built-in-plan-release-files.d.ts +1 -1
  265. package/src/generators/slice/built-in-plan-release-files.js +310 -70
  266. package/src/generators/slice/built-in-plan-reliability-files.d.ts +1 -1
  267. package/src/generators/slice/built-in-plan-reliability-files.js +283 -44
  268. package/src/generators/slice/built-in-plan-secret-runtime-files.d.ts +1 -1
  269. package/src/generators/slice/built-in-plan-secret-runtime-files.js +87 -76
  270. package/src/generators/slice/built-in-plan-shared.d.ts +4 -2
  271. package/src/generators/slice/built-in-plan-shared.js +41 -19
  272. package/src/generators/slice/built-in-plan-sql-events.d.ts +2 -0
  273. package/src/generators/slice/built-in-plan-sql-events.js +276 -0
  274. package/src/generators/slice/built-in-plan-testing-files.d.ts +1 -1
  275. package/src/generators/slice/built-in-plan-testing-files.js +304 -172
  276. package/src/generators/slice/built-in-plan-testing-persistence-event-files.d.ts +7 -0
  277. package/src/generators/slice/built-in-plan-testing-persistence-event-files.js +487 -0
  278. package/src/generators/slice/built-in-plan-testing-persistence-files.d.ts +2 -0
  279. package/src/generators/slice/built-in-plan-testing-persistence-files.js +180 -0
  280. package/src/generators/slice/built-in-plan-thin-release-files.d.ts +11 -0
  281. package/src/generators/slice/built-in-plan-thin-release-files.js +162 -0
  282. package/src/generators/slice/built-in-plan-verification-files.js +76 -2
  283. package/src/generators/slice/built-in-plan-web-files.d.ts +1 -1
  284. package/src/generators/slice/built-in-plan-web-files.js +223 -16
  285. package/src/generators/slice/built-in-plan-workload-role-files.d.ts +1 -1
  286. package/src/generators/slice/built-in-plan-workload-role-files.js +143 -279
  287. package/src/generators/slice/built-in-plan.d.ts +11 -1
  288. package/src/generators/slice/built-in-plan.js +83 -30
  289. package/src/generators/slice/data-policy-review-seed.d.ts +2 -0
  290. package/src/generators/slice/data-policy-review-seed.js +22 -0
  291. package/src/generators/slice/deployed-smoke-readiness.d.ts +2 -0
  292. package/src/generators/slice/deployed-smoke-readiness.js +214 -0
  293. package/src/generators/slice/local-source-identity.d.ts +2 -0
  294. package/src/generators/slice/local-source-identity.js +31 -0
  295. package/src/generators/slice/persistence-contract.d.ts +14 -0
  296. package/src/generators/slice/persistence-contract.js +32 -0
  297. package/src/generators/slice/slice.js +61 -50
  298. package/src/generators/sql/schema.d.ts +7 -0
  299. package/src/generators/sql/schema.json +38 -0
  300. package/src/generators/sql/sql.d.ts +6 -0
  301. package/src/generators/sql/sql.js +53 -0
  302. package/src/generators/upgrade/sql-seeded-reconciliation.d.ts +2 -0
  303. package/src/generators/upgrade/sql-seeded-reconciliation.js +170 -0
  304. package/src/generators/upgrade/upgrade.d.ts +15 -1
  305. package/src/generators/upgrade/upgrade.js +435 -44
  306. package/src/generators/workload/frozen-container.d.ts +1 -1
  307. package/src/generators/workload/performance-registration.d.ts +1 -0
  308. package/src/generators/workload/performance-registration.js +9 -11
  309. package/src/generators/workload/service-performance-files.d.ts +1 -0
  310. package/src/generators/workload/service-performance-files.js +27 -7
  311. package/src/generators/workload/workload.d.ts +1 -1
  312. package/src/generators/workload/workload.js +105 -29
  313. package/src/git-policy/action-pins.d.ts +5 -0
  314. package/src/git-policy/action-pins.js +5 -0
  315. package/src/git-policy/github-bootstrap.d.ts +48 -8
  316. package/src/git-policy/github-bootstrap.js +344 -176
  317. package/src/git-policy/routing.d.ts +7 -1
  318. package/src/git-policy/routing.js +62 -1
  319. package/src/index.d.ts +1 -0
  320. package/src/index.js +1 -0
  321. package/src/infrastructure-change/local-capability.d.ts +73 -0
  322. package/src/infrastructure-change/local-capability.js +114 -0
  323. package/src/infrastructure-change/model.d.ts +25 -4
  324. package/src/infrastructure-change/model.js +1 -0
  325. package/src/infrastructure-change/normalize.d.ts +4 -0
  326. package/src/infrastructure-change/normalize.js +47 -7
  327. package/src/infrastructure-change/plan.d.ts +30 -3
  328. package/src/infrastructure-change/plan.js +323 -13
  329. package/src/infrastructure-change/risk.d.ts +3 -1
  330. package/src/infrastructure-change/risk.js +96 -16
  331. package/src/local-dev/browser-verification.d.ts +37 -0
  332. package/src/local-dev/browser-verification.js +281 -0
  333. package/src/local-dev/contracts.d.ts +10 -1
  334. package/src/local-dev/contracts.js +114 -13
  335. package/src/local-dev/dev-command-core.js +24 -5
  336. package/src/local-dev/docker-credential-health.d.ts +14 -0
  337. package/src/local-dev/docker-credential-health.js +94 -0
  338. package/src/local-dev/environment-inspector.d.ts +7 -0
  339. package/src/local-dev/environment-inspector.js +42 -15
  340. package/src/local-dev/environment-state.js +2 -2
  341. package/src/local-dev/errors.d.ts +1 -1
  342. package/src/local-dev/errors.js +2 -0
  343. package/src/local-dev/fleet-client.js +2 -2
  344. package/src/local-dev/fleet-configuration.js +57 -25
  345. package/src/local-dev/fleet-inventory.js +58 -22
  346. package/src/local-dev/fleet-ipc.d.ts +7 -0
  347. package/src/local-dev/fleet-ipc.js +14 -2
  348. package/src/local-dev/fleet-launcher.d.ts +6 -0
  349. package/src/local-dev/fleet-launcher.js +16 -4
  350. package/src/local-dev/fleet-logs.js +50 -22
  351. package/src/local-dev/fleet-process.d.ts +20 -1
  352. package/src/local-dev/fleet-process.js +197 -41
  353. package/src/local-dev/fleet-runner-evidence.d.ts +5 -0
  354. package/src/local-dev/fleet-runner-evidence.js +56 -0
  355. package/src/local-dev/fleet-runtime.js +268 -229
  356. package/src/local-dev/fleet-session.d.ts +2 -0
  357. package/src/local-dev/fleet-session.js +28 -11
  358. package/src/local-dev/fleet-slice-runner-daemon.js +4 -0
  359. package/src/local-dev/fleet-state.d.ts +5 -2
  360. package/src/local-dev/fleet-state.js +25 -4
  361. package/src/local-dev/fleet-supervisor.d.ts +3 -0
  362. package/src/local-dev/fleet-supervisor.js +66 -11
  363. package/src/local-dev/fleet-web-start.d.ts +12 -0
  364. package/src/local-dev/fleet-web-start.js +48 -0
  365. package/src/local-dev/identity.js +3 -14
  366. package/src/local-dev/index.d.ts +1 -0
  367. package/src/local-dev/index.js +1 -0
  368. package/src/local-dev/native-completion.d.ts +9 -0
  369. package/src/local-dev/native-completion.js +130 -0
  370. package/src/local-dev/nx-workspace.d.ts +4 -2
  371. package/src/local-dev/nx-workspace.js +11 -6
  372. package/src/local-dev/personal-stage.d.ts +4 -5
  373. package/src/local-dev/personal-stage.js +6 -54
  374. package/src/local-dev/port-claims.d.ts +13 -0
  375. package/src/local-dev/port-claims.js +46 -0
  376. package/src/local-dev/ports.d.ts +14 -2
  377. package/src/local-dev/ports.js +78 -3
  378. package/src/local-dev/private-state.d.ts +11 -0
  379. package/src/local-dev/private-state.js +146 -40
  380. package/src/local-dev/process-group.d.ts +4 -0
  381. package/src/local-dev/process-group.js +29 -0
  382. package/src/local-dev/process-identity.d.ts +8 -0
  383. package/src/local-dev/process-identity.js +31 -1
  384. package/src/local-dev/proxy.js +11 -12
  385. package/src/local-dev/runtime-paths.js +1 -1
  386. package/src/local-dev/slice-claim.js +1 -1
  387. package/src/local-dev/slice-runner.d.ts +15 -6
  388. package/src/local-dev/slice-runner.js +189 -54
  389. package/src/local-dev/task-attachment.d.ts +17 -0
  390. package/src/local-dev/task-attachment.js +73 -0
  391. package/src/local-dev/task-authority.d.ts +10 -0
  392. package/src/local-dev/task-authority.js +27 -0
  393. package/src/local-dev/task-identity.d.ts +33 -0
  394. package/src/local-dev/task-identity.js +418 -0
  395. package/src/local-dev/task-native-writer.d.ts +18 -0
  396. package/src/local-dev/task-native-writer.js +329 -0
  397. package/src/local-dev/tls.js +8 -2
  398. package/src/local-dev/web-launch.d.ts +9 -0
  399. package/src/local-dev/web-launch.js +130 -0
  400. package/src/ownership/composition.d.ts +2 -1
  401. package/src/ownership/composition.js +1 -0
  402. package/src/performance/cost-collection.d.ts +1 -1
  403. package/src/performance/cost-collection.js +4 -2
  404. package/src/performance/cost-controls.d.ts +8 -4
  405. package/src/performance/cost-controls.js +39 -28
  406. package/src/performance/evidence.d.ts +1 -1
  407. package/src/performance/evidence.js +5 -3
  408. package/src/performance/load-safety.js +5 -3
  409. package/src/performance/model.d.ts +4 -4
  410. package/src/performance/model.js +4 -5
  411. package/src/performance/scenario.d.ts +22 -0
  412. package/src/performance/scenario.js +100 -92
  413. package/src/release/index.d.ts +0 -2
  414. package/src/release/index.js +0 -2
  415. package/src/release/source-authority.d.ts +5 -5
  416. package/src/release/source-authority.js +141 -124
  417. package/src/repository-policy/aurora-preflight.d.ts +1 -1
  418. package/src/repository-policy/aurora-preflight.js +4 -1
  419. package/src/repository-policy/capacity-migration.d.ts +3 -0
  420. package/src/repository-policy/capacity-migration.js +21 -0
  421. package/src/repository-policy/deployment-plan.d.ts +4 -1
  422. package/src/repository-policy/deployment-plan.js +9 -0
  423. package/src/repository-policy/foundation-profile.js +10 -1
  424. package/src/repository-policy/policy.d.ts +57 -3
  425. package/src/repository-policy/policy.js +497 -11
  426. package/src/schemas/blueprint-v1.json +5 -4
  427. package/src/schemas/foundation-requirement-v1.json +5 -4
  428. package/src/schemas/performance-policy-v1.json +3 -3
  429. package/src/schemas/repository-policy-v1.json +130 -6
  430. package/src/schemas/testing-evidence-result-v1.json +1 -1
  431. package/src/secrets/adapters.d.ts +7 -2
  432. package/src/secrets/adapters.js +34 -3
  433. package/src/secrets/aws-control-plane.d.ts +10 -1
  434. package/src/secrets/aws-control-plane.js +67 -0
  435. package/src/secrets/generated-aws-control-plane.d.ts +23 -0
  436. package/src/secrets/generated-aws-control-plane.js +259 -0
  437. package/src/secrets/metadata.js +38 -10
  438. package/src/secrets/model.d.ts +8 -1
  439. package/src/secrets/model.js +24 -3
  440. package/src/secrets/operator.d.ts +91 -3
  441. package/src/secrets/operator.js +463 -13
  442. package/src/secrets/personal-command.d.ts +18 -2
  443. package/src/secrets/personal-command.js +66 -12
  444. package/src/secrets/registry.d.ts +2 -1
  445. package/src/secrets/registry.js +18 -1
  446. package/src/secrets/verification.js +15 -2
  447. package/src/secrets/workload-access.js +10 -2
  448. package/src/sst-environment-source-format.d.ts +6 -0
  449. package/src/sst-environment-source-format.js +199 -0
  450. package/src/supply-chain/action-pins.js +61 -7
  451. package/src/supply-chain/blueprint-trust-git.js +85 -24
  452. package/src/supply-chain/blueprint-verification-authority.js +55 -3
  453. package/src/supply-chain/build-output-bounds.d.ts +2 -0
  454. package/src/supply-chain/build-output-bounds.js +12 -0
  455. package/src/supply-chain/build-output.d.ts +7 -1
  456. package/src/supply-chain/build-output.js +177 -24
  457. package/src/supply-chain/ecr-scanning.d.ts +5 -3
  458. package/src/supply-chain/ecr-scanning.js +11 -7
  459. package/src/supply-chain/ecs-deployed-image.d.ts +5 -3
  460. package/src/supply-chain/ecs-deployed-image.js +6 -4
  461. package/src/supply-chain/generated-blueprint-trust-command.js +18 -1
  462. package/src/supply-chain/generated-command.js +1 -0
  463. package/src/supply-chain/generated-container-release-command.js +1285 -124
  464. package/src/supply-chain/generated-ecr-collector-command.d.ts +0 -1
  465. package/src/supply-chain/generated-ecr-collector-command.js +200 -93
  466. package/src/supply-chain/generated-files.js +25 -14
  467. package/src/supply-chain/generated-scanner-command.js +2 -1
  468. package/src/supply-chain/index.d.ts +1 -1
  469. package/src/supply-chain/index.js +2 -1
  470. package/src/supply-chain/sbom.d.ts +1 -1
  471. package/src/supply-chain/sbom.js +30 -5
  472. package/src/supply-chain/scanner.js +3 -0
  473. package/src/testing-evidence/fixture-scope.d.ts +2 -1
  474. package/src/testing-evidence/fixture-scope.js +4 -2
  475. package/src/testing-evidence/result.d.ts +2 -1
  476. package/src/testing-evidence/result.js +18 -4
  477. package/src/workload-roles/account-baseline.d.ts +11 -0
  478. package/src/workload-roles/account-baseline.js +253 -16
  479. package/src/workload-roles/authority.d.ts +3 -1
  480. package/src/workload-roles/authority.js +48 -2
  481. package/src/workload-roles/aws-s3-state.js +27 -0
  482. package/src/workload-roles/boundary.d.ts +2 -1
  483. package/src/workload-roles/boundary.js +9 -2
  484. package/src/workload-roles/handler.js +52 -24
  485. package/src/workload-roles/index.d.ts +10 -17
  486. package/src/workload-roles/index.js +5 -18
  487. package/src/workload-roles/injection.js +1 -1
  488. package/src/workload-roles/provisioner.js +12 -4
  489. package/src/workload-roles/registration.d.ts +1 -0
  490. package/src/workload-roles/registration.js +5 -0
  491. package/src/workload-roles/stage-boundary.js +1 -1
  492. package/src/workload-roles/standard-slice.js +3 -3
  493. package/src/workspace-deployment/affected-lifecycle.d.ts +53 -0
  494. package/src/workspace-deployment/affected-lifecycle.js +84 -0
  495. package/src/workspace-deployment/identity.d.ts +3 -0
  496. package/src/workspace-deployment/identity.js +22 -0
  497. package/src/workspace-deployment/index.d.ts +4 -0
  498. package/src/workspace-deployment/index.js +8 -0
  499. package/src/workspace-deployment/migration-evidence.d.ts +29 -0
  500. package/src/workspace-deployment/migration-evidence.js +83 -0
  501. package/src/workspace-deployment/migration.d.ts +27 -0
  502. package/src/workspace-deployment/migration.js +109 -0
  503. package/src/workspace-deployment/ownership.d.ts +81 -0
  504. package/src/workspace-deployment/ownership.js +381 -0
  505. package/src/api-contract/baseline-update.js.map +0 -1
  506. package/src/api-contract/compatibility.js.map +0 -1
  507. package/src/api-contract/contract-graph.js.map +0 -1
  508. package/src/api-contract/evidence.js.map +0 -1
  509. package/src/api-contract/index.js.map +0 -1
  510. package/src/api-contract/model.fixtures.d.ts +0 -2
  511. package/src/api-contract/model.fixtures.js +0 -81
  512. package/src/api-contract/model.fixtures.js.map +0 -1
  513. package/src/api-contract/model.js.map +0 -1
  514. package/src/api-contract/rollout.js.map +0 -1
  515. package/src/authorization/compatibility.js.map +0 -1
  516. package/src/authorization/index.js.map +0 -1
  517. package/src/blueprints/execution.js.map +0 -1
  518. package/src/blueprints/external-sandbox.js.map +0 -1
  519. package/src/blueprints/index.js.map +0 -1
  520. package/src/blueprints/inputs.js.map +0 -1
  521. package/src/blueprints/manifest.js.map +0 -1
  522. package/src/blueprints/resolver.js.map +0 -1
  523. package/src/blueprints/transitions.js.map +0 -1
  524. package/src/cli/agent-command.js.map +0 -1
  525. package/src/cli/agent-runtime.js.map +0 -1
  526. package/src/cli/blueprint-authority.js.map +0 -1
  527. package/src/cli/blueprint-command.js.map +0 -1
  528. package/src/cli/bootstrap.js.map +0 -1
  529. package/src/cli/dev-command.js.map +0 -1
  530. package/src/cli/main.js.map +0 -1
  531. package/src/cli/output.js.map +0 -1
  532. package/src/cli/personal-secret-runtime.js.map +0 -1
  533. package/src/cli/secret-terminal.js.map +0 -1
  534. package/src/container-images.js.map +0 -1
  535. package/src/data-lifecycle/index.js.map +0 -1
  536. package/src/data-lifecycle/model.fixtures.d.ts +0 -2
  537. package/src/data-lifecycle/model.fixtures.js +0 -244
  538. package/src/data-lifecycle/model.fixtures.js.map +0 -1
  539. package/src/data-lifecycle/model.js.map +0 -1
  540. package/src/data-lifecycle/sensitive-artifacts.js.map +0 -1
  541. package/src/data-lifecycle/validation.js.map +0 -1
  542. package/src/database-retirement/contract.js.map +0 -1
  543. package/src/database-retirement/index.js.map +0 -1
  544. package/src/deterministic-order.js.map +0 -1
  545. package/src/developer-agent/context.js.map +0 -1
  546. package/src/developer-agent/generator-planning.js.map +0 -1
  547. package/src/developer-agent/generator-preview.js.map +0 -1
  548. package/src/developer-agent/git-inspection.js.map +0 -1
  549. package/src/developer-agent/handoff.js.map +0 -1
  550. package/src/developer-agent/index.js.map +0 -1
  551. package/src/developer-agent/model.js.map +0 -1
  552. package/src/developer-agent/operation-registry.js.map +0 -1
  553. package/src/developer-agent/ordering.js.map +0 -1
  554. package/src/developer-agent/planning.js.map +0 -1
  555. package/src/developer-agent/preview-changes.js.map +0 -1
  556. package/src/developer-agent/preview-source.js.map +0 -1
  557. package/src/developer-agent/validation.js.map +0 -1
  558. package/src/developer-agent/workspace-inspection.js.map +0 -1
  559. package/src/developer-agent/workspace-path.js.map +0 -1
  560. package/src/executors/blueprint-trust/blueprint-trust.js.map +0 -1
  561. package/src/executors/blueprint-verification/blueprint-verification.js.map +0 -1
  562. package/src/executors/deploy/deploy.js.map +0 -1
  563. package/src/executors/deployment-plan/deployment-plan.js.map +0 -1
  564. package/src/executors/dev/dev.js.map +0 -1
  565. package/src/executors/dev-doctor/dev-doctor.js.map +0 -1
  566. package/src/executors/dev-setup/dev-setup.js.map +0 -1
  567. package/src/executors/developer-context/developer-context.js.map +0 -1
  568. package/src/executors/fleet/fleet.js.map +0 -1
  569. package/src/executors/foundation-preflight/foundation-preflight.js.map +0 -1
  570. package/src/executors/foundation-profile-preflight/foundation-profile-preflight.js.map +0 -1
  571. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js.map +0 -1
  572. package/src/executors/github-bootstrap/github-bootstrap.js.map +0 -1
  573. package/src/executors/infrastructure-plan/infrastructure-plan.js.map +0 -1
  574. package/src/executors/refresh/refresh.js.map +0 -1
  575. package/src/executors/remove/remove.js.map +0 -1
  576. package/src/executors/secret-guardrails/secret-guardrails.js.map +0 -1
  577. package/src/executors/secret-metadata/secret-metadata.js.map +0 -1
  578. package/src/executors/sst-lifecycle/logging-preflight.js.map +0 -1
  579. package/src/executors/sst-lifecycle/run-sst-command.js.map +0 -1
  580. package/src/executors/sst-lifecycle/secret-preflight.js.map +0 -1
  581. package/src/executors/unlock/unlock.js.map +0 -1
  582. package/src/executors/work-markers/work-markers.js.map +0 -1
  583. package/src/foundation/discovery.js.map +0 -1
  584. package/src/foundation/index.js.map +0 -1
  585. package/src/foundation/local-database-contract.js.map +0 -1
  586. package/src/foundation/logging-preflight.js.map +0 -1
  587. package/src/foundation/logging.js.map +0 -1
  588. package/src/foundation/preflight.js.map +0 -1
  589. package/src/foundation/provision-database-bindings.js.map +0 -1
  590. package/src/foundation/provision-logical-database.js.map +0 -1
  591. package/src/foundation/requirements.js.map +0 -1
  592. package/src/foundation/router-origin-proof.js.map +0 -1
  593. package/src/foundation/stages.js.map +0 -1
  594. package/src/frontend-security/index.js.map +0 -1
  595. package/src/frontend-security/security-headers.js.map +0 -1
  596. package/src/generators/feature-registry.js.map +0 -1
  597. package/src/generators/function/function.js.map +0 -1
  598. package/src/generators/job/job.js.map +0 -1
  599. package/src/generators/logging-registry.js.map +0 -1
  600. package/src/generators/post-generation-install.js.map +0 -1
  601. package/src/generators/preset/generator.js.map +0 -1
  602. package/src/generators/preset/tool-versions.js.map +0 -1
  603. package/src/generators/preset/workspace-files-developer-agent.js.map +0 -1
  604. package/src/generators/preset/workspace-files-foundation-workload-roles.js.map +0 -1
  605. package/src/generators/preset/workspace-files-performance-cost.js.map +0 -1
  606. package/src/generators/preset/workspace-files-performance-load.js.map +0 -1
  607. package/src/generators/preset/workspace-files-workload-role-baseline.js.map +0 -1
  608. package/src/generators/preset/workspace-files.js.map +0 -1
  609. package/src/generators/repository-policy/repository-policy.js.map +0 -1
  610. package/src/generators/service/service.js.map +0 -1
  611. package/src/generators/slice/built-in-plan-api-contract-files.js.map +0 -1
  612. package/src/generators/slice/built-in-plan-api-files.js.map +0 -1
  613. package/src/generators/slice/built-in-plan-async-work-files.js.map +0 -1
  614. package/src/generators/slice/built-in-plan-authorization-files.js.map +0 -1
  615. package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js.map +0 -1
  616. package/src/generators/slice/built-in-plan-data-deletion-files.js.map +0 -1
  617. package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js.map +0 -1
  618. package/src/generators/slice/built-in-plan-data-files.js.map +0 -1
  619. package/src/generators/slice/built-in-plan-data-lifecycle-files.js.map +0 -1
  620. package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js.map +0 -1
  621. package/src/generators/slice/built-in-plan-data-retention-job-files.js.map +0 -1
  622. package/src/generators/slice/built-in-plan-data-retention-launcher-files.js.map +0 -1
  623. package/src/generators/slice/built-in-plan-data-rights-files.js.map +0 -1
  624. package/src/generators/slice/built-in-plan-database-lifecycle-files.js.map +0 -1
  625. package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js.map +0 -1
  626. package/src/generators/slice/built-in-plan-foundation-files.js.map +0 -1
  627. package/src/generators/slice/built-in-plan-frontend-files.js.map +0 -1
  628. package/src/generators/slice/built-in-plan-infrastructure-files.js.map +0 -1
  629. package/src/generators/slice/built-in-plan-infrastructure-safety-files.js.map +0 -1
  630. package/src/generators/slice/built-in-plan-metadata-files.js.map +0 -1
  631. package/src/generators/slice/built-in-plan-operations-files.js.map +0 -1
  632. package/src/generators/slice/built-in-plan-performance-files.js.map +0 -1
  633. package/src/generators/slice/built-in-plan-project-files.js.map +0 -1
  634. package/src/generators/slice/built-in-plan-release-files.js.map +0 -1
  635. package/src/generators/slice/built-in-plan-reliability-files.js.map +0 -1
  636. package/src/generators/slice/built-in-plan-secret-runtime-files.js.map +0 -1
  637. package/src/generators/slice/built-in-plan-shared.js.map +0 -1
  638. package/src/generators/slice/built-in-plan-testing-files.js.map +0 -1
  639. package/src/generators/slice/built-in-plan-verification-files.js.map +0 -1
  640. package/src/generators/slice/built-in-plan-web-files.js.map +0 -1
  641. package/src/generators/slice/built-in-plan-workload-role-files.js.map +0 -1
  642. package/src/generators/slice/built-in-plan.js.map +0 -1
  643. package/src/generators/slice/slice.js.map +0 -1
  644. package/src/generators/upgrade/upgrade.js.map +0 -1
  645. package/src/generators/workload/frozen-container.js.map +0 -1
  646. package/src/generators/workload/performance-registration.js.map +0 -1
  647. package/src/generators/workload/reliability-registration.js.map +0 -1
  648. package/src/generators/workload/service-performance-files.js.map +0 -1
  649. package/src/generators/workload/workload.js.map +0 -1
  650. package/src/git-policy/action-pins.js.map +0 -1
  651. package/src/git-policy/github-bootstrap.js.map +0 -1
  652. package/src/git-policy/index.js.map +0 -1
  653. package/src/git-policy/routing.js.map +0 -1
  654. package/src/index.js.map +0 -1
  655. package/src/infrastructure-change/convergence.js.map +0 -1
  656. package/src/infrastructure-change/drift.js.map +0 -1
  657. package/src/infrastructure-change/index.js.map +0 -1
  658. package/src/infrastructure-change/model.js.map +0 -1
  659. package/src/infrastructure-change/normalize.js.map +0 -1
  660. package/src/infrastructure-change/plan.js.map +0 -1
  661. package/src/infrastructure-change/risk.js.map +0 -1
  662. package/src/infrastructure-change/summary.js.map +0 -1
  663. package/src/local-dev/context-discovery.js.map +0 -1
  664. package/src/local-dev/contract-validation.js.map +0 -1
  665. package/src/local-dev/contracts.js.map +0 -1
  666. package/src/local-dev/control-contract.js.map +0 -1
  667. package/src/local-dev/dev-command-core.js.map +0 -1
  668. package/src/local-dev/effects.js.map +0 -1
  669. package/src/local-dev/environment-inspector.js.map +0 -1
  670. package/src/local-dev/environment-state.js.map +0 -1
  671. package/src/local-dev/errors.js.map +0 -1
  672. package/src/local-dev/fleet-client.js.map +0 -1
  673. package/src/local-dev/fleet-configuration.js.map +0 -1
  674. package/src/local-dev/fleet-inventory.js.map +0 -1
  675. package/src/local-dev/fleet-ipc.js.map +0 -1
  676. package/src/local-dev/fleet-launcher.js.map +0 -1
  677. package/src/local-dev/fleet-lock.js.map +0 -1
  678. package/src/local-dev/fleet-logs.js.map +0 -1
  679. package/src/local-dev/fleet-process.js.map +0 -1
  680. package/src/local-dev/fleet-runtime.js.map +0 -1
  681. package/src/local-dev/fleet-session.js.map +0 -1
  682. package/src/local-dev/fleet-slice-runner-daemon.js.map +0 -1
  683. package/src/local-dev/fleet-startup.js.map +0 -1
  684. package/src/local-dev/fleet-state.js.map +0 -1
  685. package/src/local-dev/fleet-supervisor-daemon.js.map +0 -1
  686. package/src/local-dev/fleet-supervisor.js.map +0 -1
  687. package/src/local-dev/gateway-daemon.js.map +0 -1
  688. package/src/local-dev/gateway.js.map +0 -1
  689. package/src/local-dev/identity.js.map +0 -1
  690. package/src/local-dev/index.js.map +0 -1
  691. package/src/local-dev/local-context.js.map +0 -1
  692. package/src/local-dev/nx-workspace.js.map +0 -1
  693. package/src/local-dev/personal-secret-ledger.js.map +0 -1
  694. package/src/local-dev/personal-stage.js.map +0 -1
  695. package/src/local-dev/portless.js.map +0 -1
  696. package/src/local-dev/ports.js.map +0 -1
  697. package/src/local-dev/private-state.js.map +0 -1
  698. package/src/local-dev/process-identity.js.map +0 -1
  699. package/src/local-dev/proxy.js.map +0 -1
  700. package/src/local-dev/runtime-paths.js.map +0 -1
  701. package/src/local-dev/secret-slice-claim.js.map +0 -1
  702. package/src/local-dev/slice-claim.js.map +0 -1
  703. package/src/local-dev/slice-runner.js.map +0 -1
  704. package/src/local-dev/tls.js.map +0 -1
  705. package/src/ownership/composition.js.map +0 -1
  706. package/src/ownership/foundation-record.js.map +0 -1
  707. package/src/ownership/hash.js.map +0 -1
  708. package/src/ownership/index.js.map +0 -1
  709. package/src/ownership/json-ownership.js.map +0 -1
  710. package/src/ownership/record.js.map +0 -1
  711. package/src/ownership/workspace-record.js.map +0 -1
  712. package/src/performance/cost-collection.js.map +0 -1
  713. package/src/performance/cost-controls.js.map +0 -1
  714. package/src/performance/evidence.js.map +0 -1
  715. package/src/performance/index.js.map +0 -1
  716. package/src/performance/load-safety.js.map +0 -1
  717. package/src/performance/model.js.map +0 -1
  718. package/src/performance/pr-artifact-budget.js.map +0 -1
  719. package/src/performance/runner.js.map +0 -1
  720. package/src/performance/scenario-endpoint.js.map +0 -1
  721. package/src/performance/scenario.js.map +0 -1
  722. package/src/performance/test-fixtures.d.ts +0 -7
  723. package/src/performance/test-fixtures.js +0 -169
  724. package/src/performance/test-fixtures.js.map +0 -1
  725. package/src/performance/unit-cost.js.map +0 -1
  726. package/src/release/index.js.map +0 -1
  727. package/src/release/lifecycle.js.map +0 -1
  728. package/src/release/manifest.js.map +0 -1
  729. package/src/release/rollout.js.map +0 -1
  730. package/src/release/source-authority.js.map +0 -1
  731. package/src/repository-policy/aurora-preflight.js.map +0 -1
  732. package/src/repository-policy/deployment-plan.js.map +0 -1
  733. package/src/repository-policy/foundation-profile.js.map +0 -1
  734. package/src/repository-policy/index.js.map +0 -1
  735. package/src/repository-policy/policy.js.map +0 -1
  736. package/src/secrets/adapters.js.map +0 -1
  737. package/src/secrets/aws-control-plane.js.map +0 -1
  738. package/src/secrets/declaration-verification.js.map +0 -1
  739. package/src/secrets/guardrails.js.map +0 -1
  740. package/src/secrets/index.js.map +0 -1
  741. package/src/secrets/metadata.js.map +0 -1
  742. package/src/secrets/model.js.map +0 -1
  743. package/src/secrets/operator.js.map +0 -1
  744. package/src/secrets/permissions.js.map +0 -1
  745. package/src/secrets/personal-command.js.map +0 -1
  746. package/src/secrets/personal-ledger.js.map +0 -1
  747. package/src/secrets/registry.js.map +0 -1
  748. package/src/secrets/verification.js.map +0 -1
  749. package/src/secrets/workload-access.js.map +0 -1
  750. package/src/supply-chain/action-pins.js.map +0 -1
  751. package/src/supply-chain/blueprint-trust-git.js.map +0 -1
  752. package/src/supply-chain/blueprint-trust-process.js.map +0 -1
  753. package/src/supply-chain/blueprint-trust.js.map +0 -1
  754. package/src/supply-chain/blueprint-verification-authority.js.map +0 -1
  755. package/src/supply-chain/blueprint-verification-execution.js.map +0 -1
  756. package/src/supply-chain/build-output.js.map +0 -1
  757. package/src/supply-chain/common.js.map +0 -1
  758. package/src/supply-chain/container-artifact-contract.js.map +0 -1
  759. package/src/supply-chain/container-release.js.map +0 -1
  760. package/src/supply-chain/ecr-applicability.js.map +0 -1
  761. package/src/supply-chain/ecr-scanning.js.map +0 -1
  762. package/src/supply-chain/ecs-deployed-image.js.map +0 -1
  763. package/src/supply-chain/errors.js.map +0 -1
  764. package/src/supply-chain/generated-blueprint-trust-command.js.map +0 -1
  765. package/src/supply-chain/generated-command.js.map +0 -1
  766. package/src/supply-chain/generated-container-release-command.js.map +0 -1
  767. package/src/supply-chain/generated-ecr-collector-command.js.map +0 -1
  768. package/src/supply-chain/generated-files.js.map +0 -1
  769. package/src/supply-chain/generated-scanner-command.js.map +0 -1
  770. package/src/supply-chain/index.js.map +0 -1
  771. package/src/supply-chain/inventory.js.map +0 -1
  772. package/src/supply-chain/license-expression.js.map +0 -1
  773. package/src/supply-chain/pnpm-toolchain-authority.js.map +0 -1
  774. package/src/supply-chain/policy.js.map +0 -1
  775. package/src/supply-chain/publication.js.map +0 -1
  776. package/src/supply-chain/sbom.js.map +0 -1
  777. package/src/supply-chain/scanner.js.map +0 -1
  778. package/src/supply-chain/vendored-source.js.map +0 -1
  779. package/src/testing-evidence/fixture-scope.js.map +0 -1
  780. package/src/testing-evidence/index.js.map +0 -1
  781. package/src/testing-evidence/quarantine.js.map +0 -1
  782. package/src/testing-evidence/result.js.map +0 -1
  783. package/src/testing-evidence/runner-adapter.js.map +0 -1
  784. package/src/testing-evidence/sensitive-artifacts.js.map +0 -1
  785. package/src/validation.js.map +0 -1
  786. package/src/work-markers/index.js.map +0 -1
  787. package/src/work-markers/work-markers.js.map +0 -1
  788. package/src/workload-roles/account-baseline.js.map +0 -1
  789. package/src/workload-roles/authority.js.map +0 -1
  790. package/src/workload-roles/aws-adapter.js.map +0 -1
  791. package/src/workload-roles/aws-internal-handler.js.map +0 -1
  792. package/src/workload-roles/aws-s3-state.js.map +0 -1
  793. package/src/workload-roles/aws-sdk-control-plane.js.map +0 -1
  794. package/src/workload-roles/boundary.js.map +0 -1
  795. package/src/workload-roles/convergence.js.map +0 -1
  796. package/src/workload-roles/effective-policy.js.map +0 -1
  797. package/src/workload-roles/handler.js.map +0 -1
  798. package/src/workload-roles/history.js.map +0 -1
  799. package/src/workload-roles/index.js.map +0 -1
  800. package/src/workload-roles/injection.js.map +0 -1
  801. package/src/workload-roles/manifest.js.map +0 -1
  802. package/src/workload-roles/provisioner.js.map +0 -1
  803. package/src/workload-roles/registration.js.map +0 -1
  804. package/src/workload-roles/stage-boundary.js.map +0 -1
  805. package/src/workload-roles/standard-slice.js.map +0 -1
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderKeyValueRetentionInfrastructureFiles = renderKeyValueRetentionInfrastructureFiles;
4
+ /** Framework retention uses native DynamoDB regardless of optional feature SQL. */
5
+ function renderKeyValueRetentionInfrastructureFiles(name, pascalName) {
6
+ return {
7
+ 'infra/key-value-retention.ts': `export function createKeyValueRetentionInfrastructure(input: {
8
+ keyValue: { environment: Record<string, any>; dataPermissions: any[] };
9
+ workspace: string;
10
+ eventBusArn: any;
11
+ alertTopicArn: any;
12
+ schedule: { scheduleExpression: string; state: 'ENABLED' | 'DISABLED' };
13
+ scheduleName: string;
14
+ managedLogGroup(logicalName: string, component: string, alertTopicArn: any): any;
15
+ lambdaLogging(logGroupName: any): any;
16
+ register(stateMachineArn: any): any;
17
+ }) {
18
+ // Personal hot fleets do not create protected retention orchestration.
19
+ // They still exercise the native data/approval APIs.
20
+ if ($dev) return {};
21
+ const environment = { ...input.keyValue.environment, EBK_WORKSPACE: input.workspace,
22
+ EBK_WORKLOAD_IDENTITY: '${name}:data-retention-job' };
23
+ const workerLogs = input.managedLogGroup('${pascalName}DataRetentionWorkerLogs', 'job-data-retention', input.alertTopicArn);
24
+ const maintenanceLogs = input.managedLogGroup('${pascalName}DataRetentionMaintenanceLogs', 'job-data-retention-maintenance', input.alertTopicArn);
25
+ const workflowLogs = input.managedLogGroup('${pascalName}DataRetentionWorkflowLogs', 'job-data-retention-orchestration', input.alertTopicArn);
26
+ const worker = new sst.aws.Function('${pascalName}DataRetentionWorker', {
27
+ handler: 'jobs/data-retention/src/run.handler', dev: false, timeout: '5 minutes',
28
+ environment, permissions: [...input.keyValue.dataPermissions,
29
+ { actions: ['events:PutEvents'], resources: [input.eventBusArn] }],
30
+ ...input.lambdaLogging(workerLogs.logGroup.name),
31
+ });
32
+ const maintenance = new sst.aws.Function('${pascalName}DataRetentionMaintenance', {
33
+ handler: 'jobs/data-retention/src/maintenance.handler', dev: false, timeout: '5 minutes',
34
+ environment, permissions: input.keyValue.dataPermissions,
35
+ // Conditional record/run/checkpoint transactions coordinate overlap. Do
36
+ // not require spare account-level reserved concurrency on a fresh account.
37
+ ...input.lambdaLogging(maintenanceLogs.logGroup.name),
38
+ });
39
+ const partition = aws.getPartitionOutput({}).partition;
40
+ const account = aws.getCallerIdentityOutput({}).accountId;
41
+ const region = aws.getRegionOutput({}).name;
42
+ const workflowName = '${name}-' + $app.stage + '-data-retention';
43
+ const workflowArn = $interpolate\`arn:\${partition}:states:\${region}:\${account}:stateMachine:\${workflowName}\`;
44
+ // The normal Slice-level IAM transform supplies the mandatory stage path and
45
+ // boundary. This runtime role invokes only this handler, not arbitrary Lambdas.
46
+ const role = new aws.iam.Role('${pascalName}DataRetentionRole', {
47
+ assumeRolePolicy: $jsonStringify({ Version: '2012-10-17', Statement: [{ Effect: 'Allow',
48
+ Principal: { Service: 'states.amazonaws.com' }, Action: 'sts:AssumeRole',
49
+ Condition: { StringEquals: { 'aws:SourceAccount': account }, ArnEquals: { 'aws:SourceArn': workflowArn } } }] }),
50
+ inlinePolicies: [{ name: 'runtime', policy: $jsonStringify({ Version: '2012-10-17', Statement: [
51
+ { Effect: 'Allow', Action: ['lambda:InvokeFunction'], Resource: [worker.arn] },
52
+ // CloudWatch's log-delivery control APIs do not support resource scoping.
53
+ { Effect: 'Allow', Action: ['logs:CreateLogDelivery', 'logs:GetLogDelivery', 'logs:UpdateLogDelivery',
54
+ 'logs:DeleteLogDelivery', 'logs:ListLogDeliveries', 'logs:PutResourcePolicy', 'logs:DescribeResourcePolicies', 'logs:DescribeLogGroups'], Resource: '*' },
55
+ ] }) }],
56
+ });
57
+ const stateMachine = new aws.sfn.StateMachine('${pascalName}DataRetention', {
58
+ name: workflowName, type: 'STANDARD', roleArn: role.arn,
59
+ loggingConfiguration: { includeExecutionData: false, level: 'ERROR', logDestination: $interpolate\`\${workflowLogs.logGroup.arn}:*\` },
60
+ definition: $jsonStringify({ StartAt: 'Initialize', TimeoutSeconds: 2700, States: {
61
+ Initialize: { Type: 'Pass', Parameters: { 'command.$': '$', attempt: 1 }, Next: 'RunDataRetention' },
62
+ RunDataRetention: { Type: 'Task', Resource: worker.arn, InputPath: '$.command', ResultPath: '$.page', TimeoutSeconds: 250,
63
+ Retry: [{ ErrorEquals: ['Lambda.ServiceException', 'Lambda.AWSLambdaException', 'Lambda.SdkClientException', 'Lambda.TooManyRequestsException'],
64
+ IntervalSeconds: 2, BackoffRate: 2, MaxAttempts: 2 }], Next: 'CheckCompletion' },
65
+ CheckCompletion: { Type: 'Choice', Choices: [
66
+ { And: [{ Variable: '$.page.complete', BooleanEquals: true },
67
+ { Variable: '$.page.evidence.kind', StringEquals: 'data-lifecycle-evidence' },
68
+ { Variable: '$.page.evidence.outcome', StringEquals: 'succeeded' }], Next: 'DataRetentionSucceeded' },
69
+ { And: [{ Variable: '$.page.complete', BooleanEquals: false },
70
+ { Variable: '$.page.checkpointComplete', BooleanEquals: false },
71
+ { Variable: '$.attempt', NumericLessThan: 100 }], Next: 'NextPage' },
72
+ ], Default: 'DataRetentionFailed' },
73
+ NextPage: { Type: 'Pass', Parameters: { 'command.$': '$.command', 'attempt.$': 'States.MathAdd($.attempt, 1)' }, Next: 'RunDataRetention' },
74
+ DataRetentionSucceeded: { Type: 'Succeed', OutputPath: '$.page' },
75
+ DataRetentionFailed: { Type: 'Fail', Error: 'IncompleteRetention', Cause: 'Native retention did not return bounded completed evidence; inspect the retained run.' },
76
+ } }),
77
+ });
78
+ const registration = input.register(stateMachine.arn);
79
+ const failureAlarm = new aws.cloudwatch.MetricAlarm('${pascalName}DataRetentionFailure', {
80
+ name: '${name}-' + $app.stage + '-retention-job-failure', alarmActions: [input.alertTopicArn],
81
+ alarmDescription: JSON.stringify({ schemaVersion: 1, slice: '${name}', owner: '${name}-product', route: '${name}-on-call',
82
+ businessSymptom: 'The native retention Job terminated unsuccessfully.', id: 'retention-job-failure', runbook: 'jobs/data-retention/README.md' }),
83
+ comparisonOperator: 'GreaterThanOrEqualToThreshold', evaluationPeriods: 1, threshold: 1, treatMissingData: 'notBreaching',
84
+ metricQueries: [...['ExecutionsFailed', 'ExecutionsTimedOut', 'ExecutionsAborted'].map((metricName, index) => ({
85
+ id: 'm' + index, metric: { dimensions: { StateMachineArn: stateMachine.arn }, metricName, namespace: 'AWS/States', period: 60, stat: 'Sum' }, returnData: false })),
86
+ { expression: 'm0+m1+m2', id: 'failures', label: 'Retention terminal execution failures', returnData: true }],
87
+ });
88
+ const rule = new aws.cloudwatch.EventRule('${pascalName}DataRetentionMaintenanceSchedule', {
89
+ name: input.scheduleName, ...input.schedule,
90
+ });
91
+ const permission = new aws.lambda.Permission('${pascalName}DataRetentionMaintenanceSchedulePermission', {
92
+ action: 'lambda:InvokeFunction', function: maintenance.arn, principal: 'events.amazonaws.com', sourceArn: rule.arn,
93
+ });
94
+ const target = new aws.cloudwatch.EventTarget('${pascalName}DataRetentionMaintenanceTarget', {
95
+ arn: maintenance.arn, rule: rule.name, targetId: 'DataRetentionMaintenance',
96
+ }, { dependsOn: [permission] });
97
+ return { dataRetention: { worker, workerLogs, workflowLogs, role, stateMachine, registration, failureAlarm },
98
+ dataRetentionMaintenance: { maintenance, maintenanceLogs, rule, permission, target } };
99
+ }
100
+ `,
101
+ };
102
+ }
103
+ //# sourceMappingURL=built-in-plan-key-value-retention-infrastructure.js.map
@@ -0,0 +1,2 @@
1
+ /** Native DynamoDB retention packaging, independent of feature-owned optional SQL. */
2
+ export declare function renderKeyValueRetentionJobFiles(name: string, runtimeVersion: string): Readonly<Record<string, string>>;
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderKeyValueRetentionJobFiles = renderKeyValueRetentionJobFiles;
4
+ const built_in_plan_shared_js_1 = require("./built-in-plan-shared.js");
5
+ /** Native DynamoDB retention packaging, independent of feature-owned optional SQL. */
6
+ function renderKeyValueRetentionJobFiles(name, runtimeVersion) {
7
+ return {
8
+ 'jobs/data-retention/package.json': (0, built_in_plan_shared_js_1.json)({
9
+ name: `@${name}/job-data-retention`,
10
+ private: true,
11
+ type: 'module',
12
+ version: '0.0.0',
13
+ scripts: {
14
+ build: 'tsc -p tsconfig.build.json',
15
+ lint: 'eslint .',
16
+ test: 'vitest run',
17
+ typecheck: 'tsc --noEmit -p tsconfig.json',
18
+ verify: 'pnpm run lint && pnpm run typecheck && pnpm test && pnpm run build',
19
+ },
20
+ dependencies: {
21
+ '@aws-sdk/client-dynamodb': built_in_plan_shared_js_1.PRODUCT_VERSIONS.awsDynamoDb,
22
+ '@aws-sdk/client-eventbridge': built_in_plan_shared_js_1.PRODUCT_VERSIONS.awsEventBridge,
23
+ '@empire-builder-kit/runtime': runtimeVersion,
24
+ },
25
+ devDependencies: {
26
+ '@types/node': built_in_plan_shared_js_1.PRODUCT_VERSIONS.typesNode,
27
+ typescript: '~5.9.2',
28
+ vitest: built_in_plan_shared_js_1.PRODUCT_VERSIONS.vitest,
29
+ },
30
+ }),
31
+ 'jobs/data-retention/README.md': `# Data retention Job
32
+
33
+ The Slice's data-retention target starts its registered Step Functions workflow.
34
+ SST packages the native Lambda handlers from this source; no SQL connection,
35
+ container image, Fargate task or VPC is required for DynamoDB-default retention.
36
+ Adding relational storage does not move these existing records into SQL.
37
+
38
+ Run \`pnpm nx run ${name}:data-retention -- --report --stage=development\`
39
+ from the workspace. The launcher records the caller checkout's HEAD by default;
40
+ an explicitly supplied EBK_SOURCE_COMMIT must be a full commit SHA. This is
41
+ caller provenance, not proof of deployed code or permission to apply retention.
42
+ The deployed worker still requires its exact workload identity and approved run.
43
+
44
+ Report reads at most 1,000 records per invocation in consistent pages of 50.
45
+ It checkpoints progress across larger tables, freezes at most 10,000 selected
46
+ deletion candidates per report and returns a bounded run reference. Healthy
47
+ records do not consume that candidate limit. Each workflow execution remains
48
+ bounded to 100 worker attempts and 45 minutes. To continue an interrupted or
49
+ budget-exhausted report, use
50
+ \`pnpm nx run ${name}:data-retention -- --report --stage=development --run-ref=<run-uuid>\`
51
+ from the same source commit. The worker reloads the original selection time,
52
+ correlation and policy binding; the new invocation cannot expand the selection.
53
+ Failures print the original \`EBK_SOURCE_COMMIT=<commit>\` command binding.
54
+ Keep that checkout and its artifacts; setting this variable is not permission
55
+ to substitute different deployed code. Report replay is refused after review
56
+ or execution begins, so a report cannot overwrite retained apply evidence.
57
+ Missing, expired or changed checkpoints are refused, not restarted. Only a
58
+ completed report can be reviewed. A later report
59
+ handles any remaining due records after the approved batch is applied.
60
+ Reporting never deletes domain data.
61
+ The authenticated API requests review; apply requires a different direct human's
62
+ approval of that exact report. Each apply invocation handles at most 100 records.
63
+ The workflow continues from the persisted checkpoint until complete=true; only
64
+ that final result is accepted evidence. Failure preserves the same run for
65
+ governed retry. Changed candidates require a new report and approval.
66
+
67
+ The seeded adapter owns record selection. Keep it aligned with data/policy.json.
68
+ Never log raw identifiers, record content or credentials. Native deletion checks
69
+ holds and atomically commits the record change, audit, ledger and event intent.
70
+ Delivery is at least once; downstream inboxes deduplicate events.
71
+ An active delivery lease returns a pending checkpoint without completed apply
72
+ evidence. The same approved run continues after acknowledgement or lease expiry.
73
+ Workflow event intents retain their publication acknowledgement without TTL
74
+ until the matching completion receipt commits. That transaction starts the
75
+ ordinary seven-day delivered-intent TTL; an interrupted completion or a long
76
+ maintenance pause cannot discard its delivery proof. A deletion ledger alone
77
+ does not prove publication.
78
+
79
+ Control maintenance is independent of domain retention: its scheduled Lambda
80
+ checks the exact ${name}:retention-maintenance authority, active control holds,
81
+ 400-day control retention and bounded resumable work.
82
+ Control-hold inspection checkpoints up to 1,000 entries per invocation; pruning
83
+ does not begin until that inspection completes. Each pruning pass handles at
84
+ most another 1,000 control records within the same time budget. Old export-rate
85
+ metadata is removed only after every request is outside the 400-day control
86
+ retention window, using an exact version check so concurrent requests survive.
87
+ Pending deletion completion has its own transactional work records, not a scan
88
+ of historical approvals. Its stored authorization can finish an already-committed
89
+ deletion after a policy update; starting a deletion still requires current policy.
90
+ Completion failures retain content-free failure markers and fail the worker;
91
+ inspect those pending records and retry reconciliation, never erase them as
92
+ ordinary historical metadata.
93
+ Explicit pauses/cadence in operations/background-work.json survive generation. Database capacity does not
94
+ silently enable or disable this work. Incomplete maintenance is not success and
95
+ continues from its checkpoint on the next enabled scheduled invocation.
96
+
97
+ Run this project's test/typecheck/build for an affected worker edit. These checks
98
+ do not replace the generated adopter's fleet, AWS or release acceptance.
99
+ `,
100
+ 'jobs/data-retention/src/retention-contract.spec.ts': `import { afterEach, describe, expect, it, vi } from 'vitest';
101
+ import { selectRetentionCandidate } from './adapter.js';
102
+ import { authorizeRetentionMaintenance } from './maintenance.js';
103
+ import { authorizeRetentionOperation } from './run.js';
104
+ import { runNativeRetention } from '../../../data/retention-worker.js';
105
+ import { RETENTION_DAYS } from '../../../data/retention-state.js';
106
+ import { productRecordReference } from '../../../data/pseudonymous-reference.js';
107
+
108
+ // Refusal tests must finish before any provider request, even with valid table configuration.
109
+ const io = vi.hoisted(() => ({ dataStore: vi.fn(() => { throw new Error('Unexpected provider access'); }) }));
110
+ vi.mock('../../../data/key-value.js', () => io);
111
+ const recordId = '11111111-1111-4111-8111-111111111111';
112
+ const runId = '22222222-2222-4222-8222-222222222222';
113
+ const at = '2026-09-12T12:00:00.000Z';
114
+ const dueAt = new Date(Date.parse(at) + RETENTION_DAYS * 86_400_000).toISOString();
115
+ const row = { id: recordId, version: 1, value: { id: recordId, name: 'fixture', ownerId: 'owner',
116
+ runScope: 'retention-test', createdAt: at, lastActivityAt: at, testExpiresAt: null } };
117
+ function identity() {
118
+ vi.stubEnv('EBK_STAGE', 'development-task-fixture');
119
+ vi.stubEnv('EBK_WORKLOAD_IDENTITY', '${name}:data-retention-job');
120
+ }
121
+ afterEach(() => { vi.unstubAllEnvs(); vi.clearAllMocks(); });
122
+ describe('native retention contract', () => {
123
+ it('selects due records by last activity, with exact identity and version', () => {
124
+ expect(selectRetentionCandidate(row, at)).toBeNull();
125
+ expect(selectRetentionCandidate(row, dueAt)).toEqual({ categoryId: 'product-record', locationId: 'primary-database',
126
+ recordId, recordVersion: 1, recordRef: productRecordReference(recordId), dueAt });
127
+ });
128
+ it('keeps test-run records in the separate protected cleanup path', () => {
129
+ expect(selectRetentionCandidate({ ...row, value: { ...row.value, testExpiresAt: dueAt } }, dueAt)).toBeNull();
130
+ });
131
+ it('refuses malformed or substituted record identity', () => {
132
+ expect(() => selectRetentionCandidate({ ...row, id: 'different' }, dueAt)).toThrow();
133
+ });
134
+ it('authorizes report, apply and maintenance as the exact generated machine workload', async () => {
135
+ identity();
136
+ for (const mode of ['report', 'apply'] as const) {
137
+ const principal = await authorizeRetentionOperation(mode, at, runId);
138
+ expect(principal.actor.id).toBe('${name}:data-retention-job');
139
+ }
140
+ expect((await authorizeRetentionMaintenance(at)).actor.id).toBe('${name}:data-retention-job');
141
+ expect(io.dataStore).not.toHaveBeenCalled();
142
+ });
143
+ it('rejects a substituted workload before provider access', async () => {
144
+ identity(); vi.stubEnv('EBK_WORKLOAD_IDENTITY', 'other:data-retention-job');
145
+ await expect(authorizeRetentionOperation('report', at, runId)).rejects.toThrow();
146
+ await expect(authorizeRetentionMaintenance(at)).rejects.toThrow();
147
+ expect(io.dataStore).not.toHaveBeenCalled();
148
+ });
149
+ it.each(['stage', 'sourceCommit', 'slice', 'approvalRequestId'] as const)('rejects a mismatched %s before provider access', async (field) => {
150
+ identity();
151
+ const command = { mode: 'report' as const, runId, approvalRequestId: '', asOf: at, correlationId: runId,
152
+ slice: '${name}', stage: 'development-task-fixture', sourceCommit: 'a'.repeat(40), [field]: 'invalid' };
153
+ await expect(runNativeRetention(command)).rejects.toThrow();
154
+ expect(io.dataStore).not.toHaveBeenCalled();
155
+ });
156
+ });
157
+ `,
158
+ };
159
+ }
160
+ //# sourceMappingURL=built-in-plan-key-value-retention-job-files.js.map
@@ -0,0 +1,2 @@
1
+ /** Control retention is independent of domain retention, database choice and schedule cadence. */
2
+ export declare function renderKeyValueRetentionMaintenanceFiles(name: string, pascalName: string): Readonly<Record<string, string>>;
@@ -0,0 +1,329 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderKeyValueRetentionMaintenanceFiles = renderKeyValueRetentionMaintenanceFiles;
4
+ const built_in_plan_shared_js_1 = require("./built-in-plan-shared.js");
5
+ /** Control retention is independent of domain retention, database choice and schedule cadence. */
6
+ function renderKeyValueRetentionMaintenanceFiles(name, pascalName) {
7
+ const prefix = (0, built_in_plan_shared_js_1.lowerCamelIdentifier)(pascalName);
8
+ return {
9
+ 'jobs/data-retention/src/maintenance.ts': `import { randomUUID } from 'node:crypto';
10
+ import {
11
+ createAuthorizationEvaluator, defineCoarseAdmission, digestApprovalRequest, expireApprovalRequest,
12
+ toAuthorizationAuditRecord, type ApprovalRequest, type AuthorizationPrincipal,
13
+ } from '@empire-builder-kit/runtime/authorization';
14
+ import {
15
+ evaluateDataLifecycleHolds, normalizeDataLifecycleRuntimeHold, parseDataLifecycleChangeEvent, DATA_LIFECYCLE_SAFE_REFERENCE_PATTERN,
16
+ transitionDataLifecycleDeletion, type DataLifecycleDeletionRequestV1, type DataLifecycleRuntimeHoldV1,
17
+ } from '@empire-builder-kit/runtime/data-lifecycle';
18
+ import type { KeyValueChange, KeyValueRecord } from '@empire-builder-kit/runtime/key-value';
19
+ import { createLogger } from '@empire-builder-kit/runtime/logging';
20
+ import { ${prefix}AuthorizationActions, ${prefix}AuthorizationPolicy } from '../../../authorization/policy.js';
21
+ import { dataStore } from '../../../data/key-value.js';
22
+ import { canonicalDataRightsNow, dataRightsSubjectReference, plusDataRightsDays } from '../../../data/data-rights-shared.js';
23
+ import { ${pascalName}ControlMetadataRuntimePolicy } from '../../../data/runtime-policy.cjs';
24
+ import { requireRetainedRetentionPlan, retentionApprovalInput, retentionStage, RETENTION_RUNS, type RetentionRun } from '../../../data/retention-state.js';
25
+
26
+ const TENANT = 'application';
27
+ const WORKLOAD = '${name}:data-retention-job';
28
+ const CHECKPOINTS = 'data-maintenance-checkpoints';
29
+ const CHECKPOINT = 'lifecycle-control';
30
+ const COLLECTIONS = [
31
+ 'authorization-audit', 'data-lifecycle-audit', 'data-lifecycle-ledger',
32
+ 'record-deletions', 'record-exports', 'delegation-grants', 'approval-requests',
33
+ 'data-lifecycle-holds', 'record-mutations', 'data-retention-receipts',
34
+ 'data-retention-candidates', 'data-retention-executions', 'data-retention-snapshots', RETENTION_RUNS,
35
+ 'data-lifecycle-downstream-copies', 'data-lifecycle-receipts', 'export-rate',
36
+ ] as const;
37
+ type Collection = typeof COLLECTIONS[number];
38
+ type Row = KeyValueRecord & { id: string };
39
+ type Value = Record<string, unknown>;
40
+ interface Checkpoint { schemaVersion: 1; collection: number; afterId: string | null }
41
+ function object(value: unknown): Value {
42
+ if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('Control metadata is malformed.');
43
+ return value as Value;
44
+ }
45
+ function timestamp(value: unknown): string {
46
+ if (typeof value !== 'string') throw new Error('Control metadata timestamp is missing.');
47
+ return canonicalDataRightsNow(value);
48
+ }
49
+ function past(value: unknown, at: string, days = 0): boolean {
50
+ return plusDataRightsDays(timestamp(value), days) <= at;
51
+ }
52
+ function approval(value: unknown, id: string): ApprovalRequest {
53
+ const result = object(value) as unknown as ApprovalRequest;
54
+ if (result.schemaVersion !== 1 || result.id !== id || result.slice !== '${name}' ||
55
+ !Number.isSafeInteger(result.revision) || result.revision < 0 ||
56
+ !['pending', 'approved', 'executing', 'executed', 'expired', 'rejected'].includes(result.status))
57
+ throw new Error('Control approval does not match its stored identity.');
58
+ timestamp(result.requestedAt); timestamp(result.expiresAt);
59
+ return result;
60
+ }
61
+ const remove = (collection: Collection, row: Row): KeyValueChange => ({ action: 'delete', collection, id: row.id, expectedVersion: row.version });
62
+ const check = (collection: string, id: string, version: number): KeyValueChange => ({ action: 'check', collection, id, expectedVersion: version });
63
+ const put = (collection: string, row: Row, value: unknown): KeyValueChange => ({ action: 'put', collection, id: row.id, expectedVersion: row.version, value });
64
+
65
+ export async function authorizeRetentionMaintenance(at: string): Promise<AuthorizationPrincipal> {
66
+ timestamp(at); retentionStage();
67
+ if (process.env.EBK_WORKLOAD_IDENTITY !== WORKLOAD) throw new Error('Retention maintenance workload identity is invalid.');
68
+ const principal: AuthorizationPrincipal = { actor: { id: WORKLOAD, type: 'service' }, audience: WORKLOAD,
69
+ authority: { machineIdentityId: WORKLOAD, mode: 'machine' }, kind: 'agent', roles: [], scopes: [], subject: { id: WORKLOAD, type: 'service' } };
70
+ await createAuthorizationEvaluator({ admission: defineCoarseAdmission({ anyOf: [{ kinds: ['agent'], subjectTypes: ['service'] }] }),
71
+ policy: ${prefix}AuthorizationPolicy, requiredPolicyVersion: ${prefix}AuthorizationPolicy.version }).authorize({
72
+ action: ${prefix}AuthorizationActions.retentionMaintenance,
73
+ context: { facts: { operationId: CHECKPOINT }, now: at, stage: retentionStage() }, principal,
74
+ resource: { attributes: { collection: true }, type: 'slice' },
75
+ });
76
+ return principal;
77
+ }
78
+ function declaredHolds(holds: readonly DataLifecycleRuntimeHoldV1[], at: string) {
79
+ // Native record-hold commands own product-record holds. Control-metadata
80
+ // holds are explicit policy declarations, not inferred from domain ownership.
81
+ for (const hold of holds) {
82
+ if (hold.categoryId !== 'lifecycle-control-metadata') continue;
83
+ if (evaluateDataLifecycleHolds({ categoryId: hold.categoryId, holds: [hold], now: at,
84
+ operation: 'deletion', scopeRef: hold.scopeRef }).blocked)
85
+ throw new Error('Retention maintenance is blocked by an active control-metadata hold.');
86
+ }
87
+ }
88
+ async function terminalRun(runId: string, at: string) {
89
+ const row = await dataStore().get(TENANT, RETENTION_RUNS, runId);
90
+ if (!row) return null;
91
+ const value = object(row.value) as unknown as RetentionRun;
92
+ if (value.kind !== 'data-retention-run' || value.schemaVersion !== 1 || value.slice !== '${name}' || value.stage !== retentionStage())
93
+ throw new Error('Retention metadata belongs to a different Slice or stage.');
94
+ requireRetainedRetentionPlan(value.plan, runId);
95
+ if (!['reported', 'completed', 'approval-pending', 'approval-approved', 'approval-rejected', 'expired', 'applying', 'retry-required'].includes(value.status))
96
+ throw new Error('Retention metadata status is invalid.');
97
+ const expected = { reported: null, completed: 'executed', 'approval-pending': 'pending', 'approval-approved': 'approved',
98
+ 'approval-rejected': 'rejected', expired: 'expired', applying: 'executing', 'retry-required': 'executing' };
99
+ if ((value.approval?.status ?? null) !== expected[value.status] || value.approval &&
100
+ (value.approval.requestDigest !== digestApprovalRequest(retentionApprovalInput(value.plan)) || value.approval.resource.id !== runId))
101
+ throw new Error('Retention metadata approval binding is invalid.');
102
+ if (value.expiresAt !== plusDataRightsDays(timestamp(value.createdAt), 400)) throw new Error('Retention metadata expiry is invalid.');
103
+ const eligible = past(value.expiresAt, at) && ['reported', 'completed', 'approval-rejected', 'expired'].includes(value.status);
104
+ if (value.status === 'completed' && (value.approval?.status !== 'executed' || !value.approval.execution?.completedAt))
105
+ throw new Error('Retention completion metadata is inconsistent.');
106
+ return { row: { ...row, id: runId }, value, eligible };
107
+ }
108
+ async function hasRunChild(collection: 'data-retention-candidates' | 'data-retention-receipts', runId: string) {
109
+ const page = await dataStore().list(TENANT, collection, { limit: 1, afterId: runId });
110
+ return page.records[0]?.id.startsWith(runId + ':') ?? false;
111
+ }
112
+ /** Returns only conditional control-record changes; never domain or external-object effects. */
113
+ async function changesFor(collection: Collection, row: Row, at: string): Promise<KeyValueChange[]> {
114
+ const value = object(row.value), store = dataStore();
115
+ switch (collection) {
116
+ case 'export-rate': {
117
+ if (!Array.isArray(value.requestedAt) || value.requestedAt.length > 100 ||
118
+ value.requestedAt.some(at => typeof at !== 'string')) throw new Error('Export rate metadata is malformed.');
119
+ // Version-bound deletion cannot erase a concurrently renewed limiter.
120
+ return value.requestedAt.every(requestedAt => past(requestedAt, at, 400)) ? [remove(collection, row)] : [];
121
+ }
122
+ case 'data-lifecycle-receipts': {
123
+ const { expiresAt, ...event } = value;
124
+ const retained = parseDataLifecycleChangeEvent(event);
125
+ if (retained.categoryId !== 'product-record' || expiresAt !== plusDataRightsDays(retained.occurredAt, 400))
126
+ throw new Error('Lifecycle receipt scope or expiry differs.');
127
+ return past(expiresAt, at) ? [remove(collection, row)] : [];
128
+ }
129
+ case 'data-lifecycle-downstream-copies': {
130
+ if (value.copyId !== '${name}-lifecycle-consumer' || value.recipient !== '${name}' ||
131
+ value.purpose !== 'lifecycle-reconciliation' || typeof value.sourceSlice !== 'string' ||
132
+ !/^[a-z][a-z0-9-]{0,62}$/.test(value.sourceSlice) || typeof value.pseudonymousKey !== 'string' ||
133
+ !DATA_LIFECYCLE_SAFE_REFERENCE_PATTERN.test(value.pseudonymousKey) || !['correction', 'deletion'].includes(String(value.action)) ||
134
+ value.status !== (value.action === 'deletion' ? 'deleted' : 'reconciled') ||
135
+ !Array.isArray(value.holdRefs) || value.holdRefs.some(ref => typeof ref !== 'string' || !ref) ||
136
+ value.expiresAt !== plusDataRightsDays(timestamp(value.updatedAt), 400))
137
+ throw new Error('Lifecycle downstream copy scope or expiry differs.');
138
+ return value.holdRefs.length === 0 && past(value.expiresAt, at) ? [remove(collection, row)] : [];
139
+ }
140
+ case 'authorization-audit':
141
+ if (value.slice !== '${name}' || value.stage !== retentionStage()) throw new Error('Authorization audit scope differs.');
142
+ return past(value.timestamp, at, 400) ? [remove(collection, row)] : [];
143
+ case 'data-lifecycle-audit':
144
+ if (value.slice !== '${name}' || value.stage !== retentionStage() || value.expiresAt !== plusDataRightsDays(timestamp(object(value.audit).timestamp), 400))
145
+ throw new Error('Lifecycle audit scope or expiry differs.');
146
+ return past(value.expiresAt, at) ? [remove(collection, row)] : [];
147
+ case 'data-lifecycle-ledger':
148
+ if (value.expiresAt !== plusDataRightsDays(timestamp(value.effectiveAt), 400)) throw new Error('Lifecycle ledger expiry differs.');
149
+ return past(value.expiresAt, at) ? [remove(collection, row)] : [];
150
+ case 'record-mutations':
151
+ // Pending outbox records have no TTL and are owned by the dispatcher.
152
+ // This is only bounded, content-free API retry metadata.
153
+ if (value.expiresAt !== plusDataRightsDays(timestamp(value.occurredAt), 400)) throw new Error('Record retry expiry differs.');
154
+ return past(value.expiresAt, at) ? [remove(collection, row)] : [];
155
+ case 'delegation-grants': {
156
+ if (value.id !== row.id || value.slice !== '${name}' || row.version !== Number(value.revision) + 1) throw new Error('Delegation metadata identity differs.');
157
+ return past(value.expiresAt, at) && past(value.issuedAt, at, 400) ? [remove(collection, row)] : [];
158
+ }
159
+ case 'approval-requests': {
160
+ const current = approval(value, row.id);
161
+ if (row.version !== current.revision + 1) throw new Error('Approval metadata revision differs.');
162
+ const expired = expireApprovalRequest(current, at);
163
+ if (expired !== current) return [put(collection, row, expired)];
164
+ return current.status !== 'executing' && past(current.expiresAt, at, 400) ? [remove(collection, row)] : [];
165
+ }
166
+ case 'data-lifecycle-holds': {
167
+ const hold = normalizeDataLifecycleRuntimeHold(value as unknown as DataLifecycleRuntimeHoldV1, 0);
168
+ if (hold.holdId !== row.id) throw new Error('Hold metadata identity differs.');
169
+ if (hold.categoryId !== 'product-record') throw new Error('Stored control holds are unsupported; declare control-metadata holds in data/policy.json.');
170
+ return hold.status === 'released' && past(hold.expiresAt, at, 400) ? [remove(collection, row)] : [];
171
+ }
172
+ case 'record-deletions': {
173
+ const current = approval(value.approval, row.id);
174
+ const lifecycle = object(value.lifecycle) as unknown as DataLifecycleDeletionRequestV1;
175
+ if (value.kind !== 'record-deletion' || value.schemaVersion !== 1 || current.action !== '${name}:record-delete' || lifecycle.kind !== 'data-deletion')
176
+ throw new Error('Deletion control identity differs.');
177
+ const expired = expireApprovalRequest(current, at);
178
+ if (expired !== current) {
179
+ if (!['requested', 'verified', 'held'].includes(lifecycle.status)) throw new Error('Unstarted deletion approval has active effects.');
180
+ return [put(collection, row, { ...value, approval: expired,
181
+ lifecycle: transitionDataLifecycleDeletion(lifecycle, { type: 'reject', at, reasonCode: 'approval-expired' }) })];
182
+ }
183
+ const terminal = ['expired', 'rejected'].includes(current.status) && lifecycle.status === 'rejected' ||
184
+ current.status === 'executed' && lifecycle.status === 'completed' && lifecycle.primaryStatus === 'completed' && lifecycle.downstreamCopies.every(copy => copy.status === 'completed');
185
+ return terminal && past(lifecycle.updatedAt, at, 400) ? [remove(collection, row)] : [];
186
+ }
187
+ case 'record-exports': {
188
+ // The dedicated export cleanup owns object/version deletion, approval
189
+ // expiry and the outstanding-capacity binding. Never bypass that worker.
190
+ const current = approval(value.approval, row.id), lifecycle = object(value.lifecycle);
191
+ if (value.kind !== 'record-export' || value.schemaVersion !== 1 || current.action !== '${name}:record-export' || lifecycle.kind !== 'data-export')
192
+ throw new Error('Export control identity differs.');
193
+ if (value.cleanupState !== 'completed' || !['completed', 'rejected'].includes(String(lifecycle.status)) || !past(lifecycle.updatedAt, at, 400)) return [];
194
+ if (!Array.isArray(value.versions) || value.versions.length !== 0 || !['executed', 'expired', 'rejected'].includes(current.status))
195
+ throw new Error('Export control lacks completed cleanup evidence.');
196
+ const capacity = await store.get(TENANT, 'export-capacity', 'outstanding');
197
+ const ids = capacity ? object(capacity.value).ids : [];
198
+ if (!Array.isArray(ids)) throw new Error('Export capacity metadata is invalid.');
199
+ if (ids.includes(row.id)) return [];
200
+ return [check('export-capacity', 'outstanding', capacity?.version ?? 0), remove(collection, row)];
201
+ }
202
+ case 'data-retention-receipts': {
203
+ if (value.kind !== 'retention-receipt' || typeof value.eventId !== 'string' || row.id !== value.runId + ':' + value.eventId || typeof value.runId !== 'string' ||
204
+ value.expiresAt !== plusDataRightsDays(timestamp(value.appliedAt), 400)) throw new Error('Retention receipt binding differs.');
205
+ if (!past(value.expiresAt, at)) return [];
206
+ const retained = await terminalRun(value.runId, at);
207
+ if (!retained?.eligible || retained.value.status !== 'completed') return [];
208
+ if (value.publishedAt === null) throw new Error('Completed retention run retains unpublished delivery.');
209
+ if (!past(value.publishedAt, at)) throw new Error('Retention publication time is invalid.');
210
+ if (value.planDigest !== digestApprovalRequest(retentionApprovalInput(retained.value.plan))) throw new Error('Retention receipt plan binding differs.');
211
+ return [check(RETENTION_RUNS, value.runId, retained.row.version), remove(collection, row)];
212
+ }
213
+ case 'data-retention-candidates': {
214
+ if (typeof value.runId !== 'string' || value.slice !== '${name}' || value.stage !== retentionStage() || !row.id.startsWith(value.runId + ':'))
215
+ throw new Error('Retention candidate metadata scope differs.');
216
+ if (!past(value.expiresAt, at)) return [];
217
+ const retained = await terminalRun(value.runId, at);
218
+ if (retained) return retained.eligible && !await hasRunChild('data-retention-receipts', value.runId)
219
+ ? [check(RETENTION_RUNS, value.runId, retained.row.version), remove(collection, row)] : [];
220
+ const snapshot = await store.get(TENANT, 'data-retention-snapshots', value.runId);
221
+ const building = snapshot ? object(snapshot.value) : null;
222
+ if (!snapshot || building?.status !== 'building') return [];
223
+ if (building.kind !== 'retention-snapshot' || building.runId !== value.runId || building.slice !== '${name}' || building.stage !== retentionStage() ||
224
+ building.expiresAt !== plusDataRightsDays(timestamp(building.createdAt), 400) || value.expiresAt !== building.expiresAt)
225
+ throw new Error('Unfinished retention snapshot binding differs.');
226
+ if (!past(building.expiresAt, at)) return [];
227
+ return [check(RETENTION_RUNS, value.runId, 0), check('data-retention-snapshots', value.runId, snapshot.version), remove(collection, row)];
228
+ }
229
+ case 'data-retention-executions': {
230
+ if (value.kind !== 'retention-execution' || value.runId !== row.id) throw new Error('Retention execution identity differs.');
231
+ const retained = await terminalRun(row.id, at);
232
+ if (!retained?.eligible || retained.value.status !== 'completed' || await hasRunChild('data-retention-receipts', row.id)) return [];
233
+ if (value.completedAt !== retained.value.approval?.execution?.completedAt || object(value.checkpoint).complete !== true ||
234
+ value.planDigest !== digestApprovalRequest(retentionApprovalInput(retained.value.plan)) || value.approvalId !== retained.value.approval?.id)
235
+ throw new Error('Retention execution lacks final completion evidence.');
236
+ return [check(RETENTION_RUNS, row.id, retained.row.version), remove(collection, row)];
237
+ }
238
+ case 'data-retention-snapshots': {
239
+ if (value.kind !== 'retention-snapshot' || value.runId !== row.id || value.stage !== retentionStage() || value.slice !== '${name}' ||
240
+ value.expiresAt !== plusDataRightsDays(timestamp(value.createdAt), 400)) throw new Error('Retention snapshot scope or expiry differs.');
241
+ if (!past(value.expiresAt, at) || await hasRunChild('data-retention-candidates', row.id) || await hasRunChild('data-retention-receipts', row.id)) return [];
242
+ const retained = await terminalRun(row.id, at);
243
+ if (retained ? !retained.eligible : value.status !== 'building') return [];
244
+ return [check(RETENTION_RUNS, row.id, retained?.row.version ?? 0), remove(collection, row)];
245
+ }
246
+ case RETENTION_RUNS: {
247
+ const retained = await terminalRun(row.id, at);
248
+ if (!retained || retained.row.version !== row.version) throw new Error('Retention run changed during maintenance.');
249
+ const current = retained.value.approval;
250
+ if (current && ['approval-pending', 'approval-approved'].includes(retained.value.status)) {
251
+ const expired = expireApprovalRequest(approval(current, current.id), at);
252
+ if (expired !== current) return [put(collection, row, { ...retained.value, approval: expired, status: 'expired', updatedAt: at })];
253
+ }
254
+ if (!retained.eligible || await hasRunChild('data-retention-candidates', row.id) || await hasRunChild('data-retention-receipts', row.id)) return [];
255
+ const execution = await store.get(TENANT, 'data-retention-executions', row.id);
256
+ const snapshot = await store.get(TENANT, 'data-retention-snapshots', row.id);
257
+ if (execution || snapshot) return [];
258
+ return [check('data-retention-executions', row.id, 0), check('data-retention-snapshots', row.id, 0), remove(collection, row)];
259
+ }
260
+ }
261
+ }
262
+
263
+ export async function runRetentionMaintenance(options: { budgetMs?: number; maxItems?: number } = {}) {
264
+ const at = new Date().toISOString();
265
+ const principal = await authorizeRetentionMaintenance(at);
266
+ const budget = options.budgetMs ?? 240_000, maximum = options.maxItems ?? 1000;
267
+ if (!Number.isSafeInteger(budget) || budget < 1 || budget > 240_000 || !Number.isSafeInteger(maximum) || maximum < 1 || maximum > 1000)
268
+ throw new Error('Retention maintenance requires bounded work.');
269
+ const deadline = Date.now() + budget, store = dataStore();
270
+ declaredHolds(${pascalName}ControlMetadataRuntimePolicy.declaredHolds, at);
271
+ const loaded = await store.get(TENANT, CHECKPOINTS, CHECKPOINT);
272
+ let version = loaded?.version ?? 0;
273
+ let cursor: Checkpoint = loaded ? object(loaded.value) as unknown as Checkpoint : { schemaVersion: 1, collection: 0, afterId: null };
274
+ if (cursor.schemaVersion !== 1 || !Number.isInteger(cursor.collection) || cursor.collection < 0 || cursor.collection >= COLLECTIONS.length ||
275
+ (cursor.afterId !== null && (typeof cursor.afterId !== 'string' || !/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(cursor.afterId))))
276
+ throw new Error('Retention maintenance checkpoint is invalid.');
277
+ const invocation = randomUUID();
278
+ const audit = toAuthorizationAuditRecord({ action: ${prefix}AuthorizationActions.retentionMaintenance,
279
+ context: { facts: { operationId: CHECKPOINT }, now: at, stage: retentionStage() }, principal, resource: { attributes: { collection: true }, type: 'slice' } },
280
+ { decision: 'allow', obligations: [], policyVersion: ${prefix}AuthorizationPolicy.version },
281
+ { correlationId: invocation, pseudonymousSubjectId: dataRightsSubjectReference(WORKLOAD), slice: '${name}', stage: retentionStage(), timestamp: at });
282
+ await store.commit({ tenantId: TENANT, changes: [
283
+ { action: 'put', collection: CHECKPOINTS, id: CHECKPOINT, expectedVersion: version, value: cursor },
284
+ { action: 'put', collection: 'authorization-audit', id: invocation, expectedVersion: 0, value: audit },
285
+ ] }); version++;
286
+ // The committed policy above is the complete control-hold authority for this
287
+ // deployment, on every invocation and regardless of cursor. Record-hold APIs
288
+ // cannot create control holds. Their history is pruned below, not scanned as
289
+ // a mutable global authority snapshot before unrelated control work.
290
+ let scanned = 0, deleted = 0, reconciled = 0, complete = false;
291
+ while (scanned < maximum && Date.now() < deadline) {
292
+ const collection = COLLECTIONS[cursor.collection];
293
+ const page = await store.list(TENANT, collection, { limit: Math.min(50, maximum - scanned), ...(cursor.afterId ? { afterId: cursor.afterId } : {}) });
294
+ let afterId = cursor.afterId;
295
+ for (const row of page.records) {
296
+ if (Date.now() >= deadline) break;
297
+ if (afterId && row.id <= afterId) throw new Error('Control inventory did not advance.');
298
+ const changes = await changesFor(collection, row, at);
299
+ if (changes.length) {
300
+ await store.commit({ tenantId: TENANT, changes: [check(CHECKPOINTS, CHECKPOINT, version), ...changes] });
301
+ deleted += changes.filter(change => change.action === 'delete').length;
302
+ reconciled += changes.filter(change => change.action === 'put').length;
303
+ }
304
+ afterId = row.id; scanned++;
305
+ }
306
+ const consumed = page.records.length === 0 || afterId === page.records.at(-1)?.id;
307
+ if (page.nextId && (page.records.length === 0 || page.nextId !== page.records.at(-1)?.id)) throw new Error('Control inventory cursor is invalid.');
308
+ if (consumed && !page.nextId) {
309
+ if (cursor.collection + 1 === COLLECTIONS.length) { cursor = { schemaVersion: 1, collection: 0, afterId: null }; complete = true; }
310
+ else cursor = { schemaVersion: 1, collection: cursor.collection + 1, afterId: null };
311
+ } else cursor = { ...cursor, afterId };
312
+ await store.commit({ tenantId: TENANT, changes: [{ action: 'put', collection: CHECKPOINTS, id: CHECKPOINT, expectedVersion: version, value: cursor }] }); version++;
313
+ if (complete || !consumed) break;
314
+ }
315
+ return { complete, scanned, deleted, reconciled };
316
+ }
317
+ export async function handler(_event: unknown, context?: { getRemainingTimeInMillis(): number }) {
318
+ const logger = createLogger({ component: 'job-data-retention-maintenance', feature: 'data-lifecycle', operation: 'retention-maintenance',
319
+ slice: '${name}', stage: process.env.EBK_STAGE ?? 'unknown', workspace: process.env.EBK_WORKSPACE ?? '${name}' });
320
+ try {
321
+ const result = await runRetentionMaintenance({ budgetMs: Math.min(240_000, (context?.getRemainingTimeInMillis() ?? 250_000) - 10_000) });
322
+ logger.info('Native control maintenance completed', { attributes: result, outcome: result.complete ? 'success' : 'unknown' });
323
+ return result;
324
+ } catch (error) { logger.error('Native control maintenance failed', { outcome: 'failure' }); throw error; }
325
+ }
326
+ `,
327
+ };
328
+ }
329
+ //# sourceMappingURL=built-in-plan-key-value-retention-maintenance.js.map
@@ -0,0 +1,2 @@
1
+ /** Native bounded retention execution; no database credential, SQL adapter, or container prerequisite. */
2
+ export declare function renderKeyValueRetentionWorkerFiles(name: string, pascalName: string): Readonly<Record<string, string>>;