@msn-control/liftoff 0.11.3 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/DEVELOPER.md +19 -18
  2. package/README.md +18 -18
  3. package/assets/governance/single-maintainer-gitflow/activation-v2-graph.json +1583 -0
  4. package/dist/adapters/credentials/github-enrollment.d.ts +51 -0
  5. package/dist/adapters/credentials/github-enrollment.js +226 -0
  6. package/dist/adapters/credentials/github-enrollment.js.map +1 -0
  7. package/dist/adapters/credentials/protected-input.d.ts +7 -0
  8. package/dist/adapters/credentials/protected-input.js +68 -0
  9. package/dist/adapters/credentials/protected-input.js.map +1 -0
  10. package/dist/adapters/filesystem/executables.d.ts +2 -0
  11. package/dist/adapters/filesystem/executables.js +70 -0
  12. package/dist/adapters/filesystem/executables.js.map +1 -0
  13. package/dist/adapters/filesystem/update-previews.d.ts +9 -0
  14. package/dist/adapters/filesystem/update-previews.js +44 -0
  15. package/dist/adapters/filesystem/update-previews.js.map +1 -1
  16. package/dist/adapters/filesystem/workstation-attempts.d.ts +13 -0
  17. package/dist/adapters/filesystem/workstation-attempts.js +78 -0
  18. package/dist/adapters/filesystem/workstation-attempts.js.map +1 -0
  19. package/dist/adapters/github/activation-rest.d.ts +40 -0
  20. package/dist/adapters/github/activation-rest.js +272 -0
  21. package/dist/adapters/github/activation-rest.js.map +1 -0
  22. package/dist/adapters/state/azure-blob.d.ts +43 -0
  23. package/dist/adapters/state/azure-blob.js +335 -0
  24. package/dist/adapters/state/azure-blob.js.map +1 -0
  25. package/dist/adapters/state/darwin-capabilities.d.ts +33 -0
  26. package/dist/adapters/state/darwin-capabilities.js +146 -0
  27. package/dist/adapters/state/darwin-capabilities.js.map +1 -0
  28. package/dist/adapters/state/darwin-native-host.d.ts +32 -0
  29. package/dist/adapters/state/darwin-native-host.js +294 -0
  30. package/dist/adapters/state/darwin-native-host.js.map +1 -0
  31. package/dist/adapters/state/darwin-profile.d.ts +6 -0
  32. package/dist/adapters/state/darwin-profile.js +56 -0
  33. package/dist/adapters/state/darwin-profile.js.map +1 -0
  34. package/dist/adapters/state/darwin-system-program.d.ts +1 -0
  35. package/dist/adapters/state/darwin-system-program.js +94 -0
  36. package/dist/adapters/state/darwin-system-program.js.map +1 -0
  37. package/dist/adapters/state/local-qualification.d.ts +16 -0
  38. package/dist/adapters/state/local-qualification.js +299 -0
  39. package/dist/adapters/state/local-qualification.js.map +1 -0
  40. package/dist/adapters/state/local.d.ts +25 -0
  41. package/dist/adapters/state/local.js +145 -0
  42. package/dist/adapters/state/local.js.map +1 -0
  43. package/dist/adapters/state/native-command.d.ts +21 -0
  44. package/dist/adapters/state/native-command.js +82 -0
  45. package/dist/adapters/state/native-command.js.map +1 -0
  46. package/dist/adapters/state/native-files.d.ts +2 -0
  47. package/dist/adapters/state/native-files.js +47 -0
  48. package/dist/adapters/state/native-files.js.map +1 -0
  49. package/dist/adapters/state/native-system.d.ts +38 -0
  50. package/dist/adapters/state/native-system.js +86 -0
  51. package/dist/adapters/state/native-system.js.map +1 -0
  52. package/dist/adapters/state/opentofu.d.ts +35 -0
  53. package/dist/adapters/state/opentofu.js +350 -0
  54. package/dist/adapters/state/opentofu.js.map +1 -0
  55. package/dist/adapters/state/owned-process.d.ts +43 -0
  56. package/dist/adapters/state/owned-process.js +252 -0
  57. package/dist/adapters/state/owned-process.js.map +1 -0
  58. package/dist/adapters/state/posix-lock-program.d.ts +1 -0
  59. package/dist/adapters/state/posix-lock-program.js +185 -0
  60. package/dist/adapters/state/posix-lock-program.js.map +1 -0
  61. package/dist/adapters/state/posix-native-lock.d.ts +15 -0
  62. package/dist/adapters/state/posix-native-lock.js +145 -0
  63. package/dist/adapters/state/posix-native-lock.js.map +1 -0
  64. package/dist/adapters/state/protected-workspace.d.ts +57 -0
  65. package/dist/adapters/state/protected-workspace.js +412 -0
  66. package/dist/adapters/state/protected-workspace.js.map +1 -0
  67. package/dist/application/context.d.ts +3 -0
  68. package/dist/application/diagnose/doctor.d.ts +5 -0
  69. package/dist/application/diagnose/doctor.js +21 -5
  70. package/dist/application/diagnose/doctor.js.map +1 -1
  71. package/dist/application/diagnose/generated-project.js +2 -7
  72. package/dist/application/diagnose/generated-project.js.map +1 -1
  73. package/dist/application/initialize/fixture.js +8 -1
  74. package/dist/application/initialize/fixture.js.map +1 -1
  75. package/dist/application/initialize/use-case.js +70 -36
  76. package/dist/application/initialize/use-case.js.map +1 -1
  77. package/dist/application/project/manifest.js +5 -4
  78. package/dist/application/project/manifest.js.map +1 -1
  79. package/dist/application/state-migration/execution.d.ts +32 -0
  80. package/dist/application/state-migration/execution.js +440 -0
  81. package/dist/application/state-migration/execution.js.map +1 -0
  82. package/dist/application/state-migration/index.d.ts +22 -0
  83. package/dist/application/state-migration/index.js +17 -0
  84. package/dist/application/state-migration/index.js.map +1 -0
  85. package/dist/application/state-migration/lifecycle.d.ts +3 -0
  86. package/dist/application/state-migration/lifecycle.js +149 -0
  87. package/dist/application/state-migration/lifecycle.js.map +1 -0
  88. package/dist/application/state-migration/planning.d.ts +7 -0
  89. package/dist/application/state-migration/planning.js +150 -0
  90. package/dist/application/state-migration/planning.js.map +1 -0
  91. package/dist/application/state-migration/recovery.d.ts +5 -0
  92. package/dist/application/state-migration/recovery.js +145 -0
  93. package/dist/application/state-migration/recovery.js.map +1 -0
  94. package/dist/application/state-migration/runtime.d.ts +32 -0
  95. package/dist/application/state-migration/runtime.js +188 -0
  96. package/dist/application/state-migration/runtime.js.map +1 -0
  97. package/dist/application/state-migration/service.d.ts +2 -0
  98. package/dist/application/state-migration/service.js +20 -0
  99. package/dist/application/state-migration/service.js.map +1 -0
  100. package/dist/application/update/inspection.d.ts +16 -2
  101. package/dist/application/update/inspection.js +76 -23
  102. package/dist/application/update/inspection.js.map +1 -1
  103. package/dist/application/update/migration-runtime.js +24 -11
  104. package/dist/application/update/migration-runtime.js.map +1 -1
  105. package/dist/application/update/output.d.ts +2 -0
  106. package/dist/application/update/output.js +11 -1
  107. package/dist/application/update/output.js.map +1 -1
  108. package/dist/application/update/revalidation-plan.d.ts +1 -0
  109. package/dist/application/update/revalidation-plan.js +25 -12
  110. package/dist/application/update/revalidation-plan.js.map +1 -1
  111. package/dist/application/update/revalidation.d.ts +4 -1
  112. package/dist/application/update/revalidation.js +62 -21
  113. package/dist/application/update/revalidation.js.map +1 -1
  114. package/dist/application/update/use-case.js +25 -17
  115. package/dist/application/update/use-case.js.map +1 -1
  116. package/dist/cli/args/definitions.js +11 -3
  117. package/dist/cli/args/definitions.js.map +1 -1
  118. package/dist/cli/args/parser.js +29 -3
  119. package/dist/cli/args/parser.js.map +1 -1
  120. package/dist/domain/governance/activation/approvals.d.ts +264 -7
  121. package/dist/domain/governance/activation/approvals.js +166 -23
  122. package/dist/domain/governance/activation/approvals.js.map +1 -1
  123. package/dist/domain/governance/activation/capabilities.js +5 -2
  124. package/dist/domain/governance/activation/capabilities.js.map +1 -1
  125. package/dist/domain/governance/activation/evidence.d.ts +2 -1
  126. package/dist/domain/governance/activation/evidence.js +64 -11
  127. package/dist/domain/governance/activation/evidence.js.map +1 -1
  128. package/dist/domain/governance/activation/graph.d.ts +11 -384
  129. package/dist/domain/governance/activation/graph.js +424 -379
  130. package/dist/domain/governance/activation/graph.js.map +1 -1
  131. package/dist/domain/governance/activation/inputs.d.ts +3 -1
  132. package/dist/domain/governance/activation/inputs.js +47 -6
  133. package/dist/domain/governance/activation/inputs.js.map +1 -1
  134. package/dist/domain/governance/activation/operations.d.ts +4 -1
  135. package/dist/domain/governance/activation/operations.js +110 -22
  136. package/dist/domain/governance/activation/operations.js.map +1 -1
  137. package/dist/domain/governance/activation/readiness.d.ts +10 -0
  138. package/dist/domain/governance/activation/readiness.js +77 -38
  139. package/dist/domain/governance/activation/readiness.js.map +1 -1
  140. package/dist/domain/governance/activation/types.d.ts +151 -9
  141. package/dist/domain/governance/activation/types.js +23 -1
  142. package/dist/domain/governance/activation/types.js.map +1 -1
  143. package/dist/domain/governance/activation/validators.d.ts +4 -1
  144. package/dist/domain/governance/activation/validators.js +419 -26
  145. package/dist/domain/governance/activation/validators.js.map +1 -1
  146. package/dist/domain/governance/policy/identity.d.ts +55 -13
  147. package/dist/domain/governance/policy/identity.js +28 -8
  148. package/dist/domain/governance/policy/identity.js.map +1 -1
  149. package/dist/domain/project/artifact-lifecycle.d.ts +2 -1
  150. package/dist/domain/project/artifact-lifecycle.js +7 -1
  151. package/dist/domain/project/artifact-lifecycle.js.map +1 -1
  152. package/dist/domain/project/catalog.d.ts +50 -1
  153. package/dist/domain/project/catalog.js +104 -4
  154. package/dist/domain/project/catalog.js.map +1 -1
  155. package/dist/domain/project/contracts.d.ts +9 -1
  156. package/dist/domain/project/infrastructure-layout.d.ts +1 -1
  157. package/dist/domain/project/infrastructure-layout.js +2 -1
  158. package/dist/domain/project/infrastructure-layout.js.map +1 -1
  159. package/dist/domain/project/manifest/governance.d.ts +1 -1
  160. package/dist/domain/project/manifest/governance.js +9 -10
  161. package/dist/domain/project/manifest/governance.js.map +1 -1
  162. package/dist/domain/project/planning.js +4 -5
  163. package/dist/domain/project/planning.js.map +1 -1
  164. package/dist/domain/repair/stateful-bounded.d.ts +1 -0
  165. package/dist/domain/repair/stateful-bounded.js +37 -0
  166. package/dist/domain/repair/stateful-bounded.js.map +1 -0
  167. package/dist/domain/repair/stateful-invariants.d.ts +28 -0
  168. package/dist/domain/repair/stateful-invariants.js +278 -0
  169. package/dist/domain/repair/stateful-invariants.js.map +1 -0
  170. package/dist/domain/repair/stateful.d.ts +690 -0
  171. package/dist/domain/repair/stateful.js +26 -0
  172. package/dist/domain/repair/stateful.js.map +1 -0
  173. package/dist/domain/workstation/constraints.d.ts +1 -0
  174. package/dist/domain/workstation/constraints.js.map +1 -1
  175. package/dist/domain/workstation/contracts.d.ts +42 -0
  176. package/dist/domain/workstation/contracts.js +2 -0
  177. package/dist/domain/workstation/contracts.js.map +1 -0
  178. package/dist/domain/workstation/executables.d.ts +19 -0
  179. package/dist/domain/workstation/executables.js +68 -0
  180. package/dist/domain/workstation/executables.js.map +1 -0
  181. package/dist/domain/workstation/versions.d.ts +8 -0
  182. package/dist/domain/workstation/versions.js +145 -0
  183. package/dist/domain/workstation/versions.js.map +1 -0
  184. package/dist/framework-adapters.d.ts +2 -0
  185. package/dist/framework-adapters.js +148 -22
  186. package/dist/framework-adapters.js.map +1 -1
  187. package/dist/framework-validation.d.ts +6 -0
  188. package/dist/framework-validation.js +89 -24
  189. package/dist/framework-validation.js.map +1 -1
  190. package/dist/generators/common/base.js +57 -17
  191. package/dist/generators/common/base.js.map +1 -1
  192. package/dist/governance-activation/activation-state.js +39 -7
  193. package/dist/governance-activation/activation-state.js.map +1 -1
  194. package/dist/governance-activation/authority-records.d.ts +4 -0
  195. package/dist/governance-activation/authority-records.js +24 -0
  196. package/dist/governance-activation/authority-records.js.map +1 -0
  197. package/dist/governance-activation/commands.d.ts +9 -1
  198. package/dist/governance-activation/commands.js +392 -97
  199. package/dist/governance-activation/commands.js.map +1 -1
  200. package/dist/governance-activation/compatibility.d.ts +11 -8
  201. package/dist/governance-activation/compatibility.js +37 -23
  202. package/dist/governance-activation/compatibility.js.map +1 -1
  203. package/dist/governance-activation/doctor.js +40 -16
  204. package/dist/governance-activation/doctor.js.map +1 -1
  205. package/dist/governance-activation/github-config.d.ts +17 -0
  206. package/dist/governance-activation/github-config.js +88 -0
  207. package/dist/governance-activation/github-config.js.map +1 -0
  208. package/dist/governance-activation/github-discovery.d.ts +18 -0
  209. package/dist/governance-activation/github-discovery.js +229 -0
  210. package/dist/governance-activation/github-discovery.js.map +1 -0
  211. package/dist/governance-activation/github-ports.d.ts +12 -0
  212. package/dist/governance-activation/github-ports.js +4 -0
  213. package/dist/governance-activation/github-ports.js.map +1 -0
  214. package/dist/governance-activation/github-publication.d.ts +3 -0
  215. package/dist/governance-activation/github-publication.js +190 -0
  216. package/dist/governance-activation/github-publication.js.map +1 -0
  217. package/dist/governance-activation/historical-common.d.ts +98 -0
  218. package/dist/governance-activation/historical-common.js +269 -0
  219. package/dist/governance-activation/historical-common.js.map +1 -0
  220. package/dist/governance-activation/historical-credential-policy.d.ts +3 -0
  221. package/dist/governance-activation/historical-credential-policy.js +91 -0
  222. package/dist/governance-activation/historical-credential-policy.js.map +1 -0
  223. package/dist/governance-activation/historical-inputs.d.ts +6 -0
  224. package/dist/governance-activation/historical-inputs.js +57 -0
  225. package/dist/governance-activation/historical-inputs.js.map +1 -0
  226. package/dist/governance-activation/historical-safety.d.ts +9 -0
  227. package/dist/governance-activation/historical-safety.js +102 -0
  228. package/dist/governance-activation/historical-safety.js.map +1 -0
  229. package/dist/governance-activation/historical-source-metadata.d.ts +31 -0
  230. package/dist/governance-activation/historical-source-metadata.js +55 -0
  231. package/dist/governance-activation/historical-source-metadata.js.map +1 -0
  232. package/dist/governance-activation/historical-state.d.ts +12 -50
  233. package/dist/governance-activation/historical-state.js +195 -308
  234. package/dist/governance-activation/historical-state.js.map +1 -1
  235. package/dist/governance-activation/historical-v1-auxiliary.d.ts +1 -0
  236. package/dist/governance-activation/historical-v1-auxiliary.js +43 -0
  237. package/dist/governance-activation/historical-v1-auxiliary.js.map +1 -0
  238. package/dist/governance-activation/historical-v1-phase-contracts.d.ts +31 -0
  239. package/dist/governance-activation/historical-v1-phase-contracts.js +46 -0
  240. package/dist/governance-activation/historical-v1-phase-contracts.js.map +1 -0
  241. package/dist/governance-activation/historical-v2.d.ts +53 -0
  242. package/dist/governance-activation/historical-v2.js +313 -0
  243. package/dist/governance-activation/historical-v2.js.map +1 -0
  244. package/dist/governance-activation/history-contracts.d.ts +21 -12
  245. package/dist/governance-activation/history-contracts.js +99 -27
  246. package/dist/governance-activation/history-contracts.js.map +1 -1
  247. package/dist/governance-activation/inputs.d.ts +8 -2
  248. package/dist/governance-activation/inputs.js +41 -6
  249. package/dist/governance-activation/inputs.js.map +1 -1
  250. package/dist/governance-activation/migration-history.d.ts +43 -5
  251. package/dist/governance-activation/migration-history.js +231 -50
  252. package/dist/governance-activation/migration-history.js.map +1 -1
  253. package/dist/governance-activation/migration.d.ts +7 -4
  254. package/dist/governance-activation/migration.js +53 -252
  255. package/dist/governance-activation/migration.js.map +1 -1
  256. package/dist/governance-activation/phase-azure.d.ts +3 -0
  257. package/dist/governance-activation/phase-azure.js +205 -0
  258. package/dist/governance-activation/phase-azure.js.map +1 -0
  259. package/dist/governance-activation/phase-bootstrap-state.js +3 -0
  260. package/dist/governance-activation/phase-bootstrap-state.js.map +1 -1
  261. package/dist/governance-activation/phase-github.d.ts +3 -0
  262. package/dist/governance-activation/phase-github.js +192 -0
  263. package/dist/governance-activation/phase-github.js.map +1 -0
  264. package/dist/governance-activation/phase-governance.js +8 -2
  265. package/dist/governance-activation/phase-governance.js.map +1 -1
  266. package/dist/governance-activation/public-plans.d.ts +36 -0
  267. package/dist/governance-activation/public-plans.js +100 -0
  268. package/dist/governance-activation/public-plans.js.map +1 -0
  269. package/dist/governance-activation/read-only.d.ts +3 -1
  270. package/dist/governance-activation/read-only.js +7 -3
  271. package/dist/governance-activation/read-only.js.map +1 -1
  272. package/dist/governance-activation/reconciliation.js +10 -0
  273. package/dist/governance-activation/reconciliation.js.map +1 -1
  274. package/dist/governance-activation/seed-lifecycle.js +14 -25
  275. package/dist/governance-activation/seed-lifecycle.js.map +1 -1
  276. package/dist/governance-activation/source-of-truth.d.ts +21 -5
  277. package/dist/governance-activation/source-of-truth.js +102 -13
  278. package/dist/governance-activation/source-of-truth.js.map +1 -1
  279. package/dist/governance-activation/task-projection.d.ts +4 -1
  280. package/dist/governance-activation/task-projection.js +32 -3
  281. package/dist/governance-activation/task-projection.js.map +1 -1
  282. package/dist/governance-activation/task-writes.d.ts +42 -0
  283. package/dist/governance-activation/task-writes.js +250 -0
  284. package/dist/governance-activation/task-writes.js.map +1 -0
  285. package/dist/governance-activation/transition-files.d.ts +12 -0
  286. package/dist/governance-activation/transition-files.js +109 -0
  287. package/dist/governance-activation/transition-files.js.map +1 -0
  288. package/dist/governance-activation/transition-planning.d.ts +3 -1
  289. package/dist/governance-activation/transition-planning.js +158 -20
  290. package/dist/governance-activation/transition-planning.js.map +1 -1
  291. package/dist/governance-activation/transition-ports.d.ts +31 -3
  292. package/dist/governance-activation/transition-records.d.ts +11 -1
  293. package/dist/governance-activation/transition-records.js +52 -6
  294. package/dist/governance-activation/transition-records.js.map +1 -1
  295. package/dist/governance-activation/transitions.d.ts +5 -0
  296. package/dist/governance-activation/transitions.js +271 -37
  297. package/dist/governance-activation/transitions.js.map +1 -1
  298. package/dist/governance-assessment/engine.js +22 -15
  299. package/dist/governance-assessment/engine.js.map +1 -1
  300. package/dist/governance-assessment/project.d.ts +2 -0
  301. package/dist/governance-assessment/project.js +2 -1
  302. package/dist/governance-assessment/project.js.map +1 -1
  303. package/dist/interactive.d.ts +0 -1
  304. package/dist/interactive.js +3 -22
  305. package/dist/interactive.js.map +1 -1
  306. package/dist/openspec-profile.d.ts +2 -1
  307. package/dist/openspec-profile.js +11 -41
  308. package/dist/openspec-profile.js.map +1 -1
  309. package/dist/repository-governance.d.ts +10 -5
  310. package/dist/repository-governance.js +178 -92
  311. package/dist/repository-governance.js.map +1 -1
  312. package/dist/telemetry/contract.d.ts +1 -1
  313. package/dist/telemetry/contract.js +3 -0
  314. package/dist/telemetry/contract.js.map +1 -1
  315. package/dist/workstation-catalog.d.ts +13 -1
  316. package/dist/workstation-catalog.js +122 -0
  317. package/dist/workstation-catalog.js.map +1 -1
  318. package/dist/workstation.d.ts +69 -14
  319. package/dist/workstation.js +600 -215
  320. package/dist/workstation.js.map +1 -1
  321. package/docs/cli-reference.md +59 -21
  322. package/docs/configuration-and-manifests.md +9 -8
  323. package/docs/prerequisites.md +93 -18
  324. package/docs/repository-governance.md +68 -40
  325. package/docs/spec-workflows-and-agents.md +132 -13
  326. package/package.json +1 -1
@@ -1,274 +1,75 @@
1
- import { activationStateContentHash, activationStateFilePathParts, loadActivationState } from './activation-state.js';
2
- import { canonicalJson } from '../domain/governance/activation/canonical-json.js';
3
- import { graphReconciliationRecordFromMapping } from './compatibility.js';
4
- import { activationCompatibility, currentActivationIdentity } from '../domain/governance/activation/graph.js';
5
- import { activationStateSchemaVersion, resolveActivationCompatibility, isHistoricalActivationIdentity } from '../domain/governance/policy/identity.js';
6
- import { phaseIds } from '../domain/governance/activation/types.js';
7
- import { validateGraphReconciliationRecord, validateUserActivationState } from '../domain/governance/activation/validators.js';
8
- import { captureProjectFileSnapshot } from '../adapters/filesystem/project-transaction.js';
9
- import { readProjectFile } from '../adapters/filesystem/project-files.js';
1
+ import { activationStateContentHash, activationStateFilePathParts } from './activation-state.js';
2
+ import { currentActivationIdentity } from '../domain/governance/activation/graph.js';
3
+ import { canonicalSha256, isRecord } from '../domain/governance/activation/canonical-json.js';
4
+ import { activationStateSchemaVersion, isHistoricalActivationIdentity } from '../domain/governance/policy/identity.js';
5
+ import { validateUserActivationState } from '../domain/governance/activation/validators.js';
6
+ import { captureHistoryFile, validateReadableHistoricalActivationState } from './historical-state.js';
7
+ import { ActivationHistoryError, parseHistoryJson } from './history-contracts.js';
8
+ import { assertSafeHistoricalRecord } from './historical-safety.js';
9
+ import { activeActivationRecordsWithoutState, inspectActivationMigrationHistory } from './migration-history.js';
10
10
  export const updateFailureInjectionEnv = 'LIFTOFF_UPDATE_INJECT_FAILURE';
11
- const identityFields = [
12
- 'liftoffVersion',
13
- 'manifestArtifactVersion',
14
- 'policyVersion',
15
- 'activationContractVersion',
16
- 'phaseGraphSchemaVersion',
17
- 'phaseGraphHash',
18
- 'activationStateSchemaVersion',
19
- 'evidenceHeaderSchemaVersion',
20
- 'approvalEnvelopeSchemaVersion',
21
- 'supersessionSchemaVersion',
22
- 'credentialPolicySchemaVersion'
23
- ];
24
- function isRecord(value) {
25
- return typeof value === 'object' && value !== null && !Array.isArray(value);
26
- }
27
- function errorMessage(error) {
28
- return error instanceof Error ? error.message : String(error);
29
- }
30
- function sameIdentity(left, right) {
31
- return identityFields.every((field) => left[field] === right[field]);
32
- }
33
- function looseIdentity(value) {
34
- if (!isRecord(value)) {
35
- return undefined;
36
- }
37
- for (const field of identityFields) {
38
- if (!Object.hasOwn(value, field)) {
39
- return undefined;
40
- }
41
- }
42
- const identity = value;
43
- if (typeof identity.liftoffVersion !== 'string' ||
44
- typeof identity.manifestArtifactVersion !== 'number' ||
45
- typeof identity.policyVersion !== 'string' ||
46
- typeof identity.activationContractVersion !== 'number' ||
47
- typeof identity.phaseGraphSchemaVersion !== 'number' ||
48
- typeof identity.phaseGraphHash !== 'string' ||
49
- typeof identity.activationStateSchemaVersion !== 'number' ||
50
- typeof identity.evidenceHeaderSchemaVersion !== 'number' ||
51
- typeof identity.approvalEnvelopeSchemaVersion !== 'number' ||
52
- typeof identity.supersessionSchemaVersion !== 'number' ||
53
- typeof identity.credentialPolicySchemaVersion !== 'number') {
54
- return undefined;
55
- }
11
+ function blocked(reasonCode, issues, diagnosticOnly = false) {
56
12
  return {
57
- liftoffVersion: identity.liftoffVersion,
58
- manifestArtifactVersion: identity.manifestArtifactVersion,
59
- policyVersion: identity.policyVersion,
60
- activationContractVersion: identity.activationContractVersion,
61
- phaseGraphSchemaVersion: identity.phaseGraphSchemaVersion,
62
- phaseGraphHash: identity.phaseGraphHash,
63
- activationStateSchemaVersion: identity.activationStateSchemaVersion,
64
- evidenceHeaderSchemaVersion: identity.evidenceHeaderSchemaVersion,
65
- approvalEnvelopeSchemaVersion: identity.approvalEnvelopeSchemaVersion,
66
- supersessionSchemaVersion: identity.supersessionSchemaVersion,
67
- credentialPolicySchemaVersion: identity.credentialPolicySchemaVersion
68
- };
69
- }
70
- function blocked(reasonCode, issues) {
71
- return {
72
- status: 'blocked',
73
- mutations: [],
74
- preconditions: [],
13
+ status: 'blocked', mutations: [], preconditions: [],
75
14
  report: {
76
- path: activationStateFilePathParts.join('/'),
77
- status: 'blocked',
78
- checkModeWritesBytes: 0,
79
- evidencePolicy: 'preserve-bytes',
80
- unversionedImport: 'requires-explicit-import-mapping',
81
- reasonCode,
82
- issues
15
+ path: activationStateFilePathParts.join('/'), status: 'blocked', checkModeWritesBytes: 0,
16
+ evidencePolicy: 'preserve-bytes', unversionedImport: 'requires-explicit-import-mapping',
17
+ reasonCode, issues, ...(diagnosticOnly ? { diagnosticOnly: true } : {})
83
18
  }
84
19
  };
85
20
  }
86
21
  function unchanged(status) {
87
22
  return {
88
- status,
89
- mutations: [],
90
- preconditions: [],
23
+ status, mutations: [], preconditions: [],
91
24
  report: {
92
- path: activationStateFilePathParts.join('/'),
93
- status,
94
- checkModeWritesBytes: 0,
95
- evidencePolicy: 'preserve-bytes',
96
- unversionedImport: 'requires-explicit-import-mapping',
97
- issues: []
25
+ path: activationStateFilePathParts.join('/'), status, checkModeWritesBytes: 0,
26
+ evidencePolicy: 'preserve-bytes', unversionedImport: 'requires-explicit-import-mapping', issues: []
98
27
  }
99
28
  };
100
29
  }
101
- function phaseImpact(record) {
102
- const preserved = record.phaseMappings
103
- .filter((mapping) => mapping.preserveEvidence && mapping.fromContractDigest === mapping.toContractDigest)
104
- .map((mapping) => mapping.phaseId);
105
- const invalid = phaseIds.filter((phaseId) => !preserved.includes(phaseId));
106
- return { preservedPhaseIds: preserved, invalidPhaseIds: invalid };
107
- }
108
- function matchingHistoricalStateMigration(identity, migrations) {
109
- return migrations.find((migration) => sameIdentity(migration.fromIdentity, identity) &&
110
- sameIdentity(migration.toIdentity, currentActivationIdentity));
111
- }
112
- export async function planHistoricalActivationStateMigration(projectRoot, nowIso = new Date().toISOString(), mappingInput = {}) {
113
- const bytes = await readProjectFile(projectRoot, [...activationStateFilePathParts]);
114
- if (bytes === undefined) {
115
- return unchanged('not-present');
116
- }
117
- const content = bytes.toString('utf8');
118
- const snapshot = await captureProjectFileSnapshot(projectRoot, [...activationStateFilePathParts]);
119
- try {
120
- await loadActivationState(projectRoot);
121
- return unchanged('current');
122
- }
123
- catch {
124
- // Re-parse below to distinguish supported historical state from ad hoc files.
125
- }
126
- let parsed;
30
+ /** Read-only diagnostic compatibility. Actual successors use the reviewed history transaction. */
31
+ export async function planHistoricalActivationStateMigration(projectRoot, _nowIso = new Date().toISOString(), _mappingInput = {}) {
127
32
  try {
128
- parsed = JSON.parse(content);
129
- }
130
- catch (error) {
131
- return blocked('malformed-state', [
132
- `Unable to parse governance/activation-state.json: ${errorMessage(error)}. Restore a valid versioned state or provide an explicit import mapping.`
133
- ]);
134
- }
135
- if (!isRecord(parsed)) {
136
- return blocked('ad-hoc-state', [
137
- 'governance/activation-state.json is not a JSON object; checkboxes, filenames, and prose are not evidence. Provide an explicit import mapping.'
138
- ]);
139
- }
140
- if (!Object.hasOwn(parsed, 'schemaVersion') || !Object.hasOwn(parsed, 'identity')) {
141
- return blocked('ad-hoc-state', [
142
- 'governance/activation-state.json lacks explicit schemaVersion or identity. Unversioned/ad hoc state requires an explicit import mapping; checkboxes, filenames, and prose are not evidence.'
143
- ]);
144
- }
145
- if (parsed.schemaVersion !== activationStateSchemaVersion) {
146
- if (parsed.schemaVersion === 1 && isHistoricalActivationIdentity(parsed.identity)) {
147
- const result = blocked('unsupported-activation-identity', [
148
- 'Known historical activation v1 is diagnostic-only. Run liftoff update --check to inspect an explicitly supported history-preserving v2 successor. Original history cannot authorize current execution and remains byte-preserved.'
149
- ]);
150
- result.report.diagnosticOnly = true;
151
- return result;
33
+ const snapshot = await captureHistoryFile(projectRoot, activationStateFilePathParts);
34
+ if (snapshot.content === undefined) {
35
+ const records = await activeActivationRecordsWithoutState(projectRoot);
36
+ return records.length
37
+ ? blocked('missing-historical-record', [`Required activation state is absent while active execution records remain: ${records.map((parts) => parts.join('/')).join(', ')}. No state was manufactured.`])
38
+ : unchanged('not-present');
152
39
  }
153
- if (typeof parsed.schemaVersion === 'number' &&
154
- parsed.schemaVersion > activationStateSchemaVersion) {
155
- return blocked('future-state-schema', [
156
- `Unsupported activationState.schemaVersion: found ${JSON.stringify(parsed.schemaVersion)}; supported values are ${activationStateSchemaVersion}. Upgrade Liftoff before writing.`
40
+ const parsed = parseHistoryJson(snapshot.content, 'governance/activation-state.json');
41
+ assertSafeHistoricalRecord(parsed, 'governance/activation-state.json');
42
+ if (!isRecord(parsed) || !Object.hasOwn(parsed, 'schemaVersion') || !Object.hasOwn(parsed, 'identity')) {
43
+ return blocked('ad-hoc-state', ['Versioned activation state with an exact identity is required. Checkboxes, filenames, or prose are not an import mapping.']);
44
+ }
45
+ if (typeof parsed.schemaVersion === 'number' && parsed.schemaVersion > activationStateSchemaVersion) {
46
+ return blocked('future-state-schema', [`Unsupported activationState.schemaVersion ${parsed.schemaVersion}; this release reads current schema ${activationStateSchemaVersion}. Preserve bytes and upgrade Liftoff.`]);
47
+ }
48
+ if (isHistoricalActivationIdentity(parsed.identity)) {
49
+ validateReadableHistoricalActivationState(parsed);
50
+ return blocked('unsupported-activation-identity', [
51
+ `Historical activation v${parsed.identity.activationContractVersion} is diagnostic-only. Run liftoff update --check to inspect the exact history-preserving v3 successor. Historical proof and approval remain non-executable; no v2 intermediate, header relabeling, or OpenTofu-state operation is authorized.`
52
+ ], true);
53
+ }
54
+ if (canonicalSha256(parsed.identity) !== canonicalSha256(currentActivationIdentity)) {
55
+ return blocked('unsupported-activation-identity', [
56
+ 'The complete activation identity is not an installed executable tuple or declared historical source without an explicit compatibility map. Explicit project-edited compatibility/migration mappings cannot add a lane; preserve the original records.'
157
57
  ]);
158
58
  }
159
- return blocked('unsupported-activation-identity', [
160
- `Unsupported activationState.schemaVersion: found ${JSON.stringify(parsed.schemaVersion)}; supported values are ${activationStateSchemaVersion}. Explicit migration metadata is required.`
161
- ]);
162
- }
163
- const identity = looseIdentity(parsed.identity);
164
- if (!identity) {
165
- return blocked('ad-hoc-state', [
166
- 'activationState.identity is absent or malformed. Explicit import mapping is required; task checkboxes, filenames, and prose cannot be imported as evidence.'
167
- ]);
168
- }
169
- if (sameIdentity(identity, currentActivationIdentity)) {
170
- return blocked('malformed-state', [
171
- 'Activation state uses the current identity but failed strict validation; preserve the bytes and repair the malformed state before writing.'
172
- ]);
173
- }
174
- const migration = matchingHistoricalStateMigration(identity, mappingInput.historicalStateMigrations ?? []);
175
- if (!migration) {
176
- const compatibility = resolveActivationCompatibility(identity, mappingInput.compatibility ?? activationCompatibility);
177
- const issue = compatibility.compatible
178
- ? `Activation state identity is compatible but has no explicit historical migration mapping: found ${identity.phaseGraphHash}.`
179
- : compatibility.reason;
180
- return blocked('unsupported-activation-identity', [
181
- `${issue} Production Liftoff 0.10.0 declares no historical activation-state mappings; provide an explicit compatibility/migration mapping or upgrade to a Liftoff release that declares one.`
182
- ]);
183
- }
184
- if (migration.stateSchemaVersion !== activationStateSchemaVersion ||
185
- migration.transaction !== 'managed-update-write-set' ||
186
- migration.evidence !== 'preserve-bytes' ||
187
- migration.unversionedImport !== 'requires-explicit-import-mapping' ||
188
- migration.graphMapping.fromGraphHash !== migration.fromIdentity.phaseGraphHash ||
189
- migration.graphMapping.toGraphHash !== migration.toIdentity.phaseGraphHash ||
190
- !sameIdentity(migration.graphMapping.fromIdentity, migration.fromIdentity) ||
191
- !sameIdentity(migration.graphMapping.toIdentity, migration.toIdentity)) {
192
- return blocked('unsupported-activation-identity', [
193
- 'Explicit historical activation-state migration mapping is internally inconsistent. Provide schema-valid compatibility metadata before writing.'
194
- ]);
195
- }
196
- const migratedCandidate = {
197
- ...parsed,
198
- identity: migration.toIdentity
199
- };
200
- let migrated;
201
- try {
202
- migrated = validateUserActivationState(migratedCandidate);
203
- }
204
- catch (error) {
205
- return blocked('malformed-state', [
206
- `Supported historical activation state failed strict migration validation: ${errorMessage(error)}.`
207
- ]);
208
- }
209
- const mapping = migration.graphMapping;
210
- const reconciliationCandidate = graphReconciliationRecordFromMapping(mapping, nowIso);
211
- let reconciliation;
212
- try {
213
- reconciliation = validateGraphReconciliationRecord(reconciliationCandidate, new Set([mapping.fromGraphHash, mapping.toGraphHash]));
59
+ try {
60
+ validateUserActivationState(parsed);
61
+ await inspectActivationMigrationHistory(projectRoot);
62
+ return unchanged('current');
63
+ }
64
+ catch (error) {
65
+ return blocked('malformed-state', [`Current activation state failed strict validation: ${error instanceof Error ? error.message : 'unknown validation failure'}`]);
66
+ }
214
67
  }
215
68
  catch (error) {
216
- return blocked('unsupported-activation-identity', [
217
- `Explicit historical activation-state migration mapping is invalid: ${errorMessage(error)}.`
218
- ]);
69
+ if (!(error instanceof ActivationHistoryError))
70
+ throw error;
71
+ return blocked('malformed-state', [error.message]);
219
72
  }
220
- const reconciliationPathParts = [
221
- 'governance',
222
- 'reconciliation',
223
- `${mapping.fromGraphHash.slice(0, 12)}-to-${mapping.toGraphHash.slice(0, 12)}.json`
224
- ];
225
- const reconciliationContent = `${canonicalJson(reconciliation)}\n`;
226
- const existingReconciliation = await readProjectFile(projectRoot, reconciliationPathParts);
227
- if (existingReconciliation !== undefined &&
228
- existingReconciliation.toString('utf8') !== reconciliationContent) {
229
- return blocked('reconciliation-conflict', [
230
- `${reconciliationPathParts.join('/')} already exists with different bytes; preserve it and reconcile manually.`
231
- ]);
232
- }
233
- const migratedContent = `${canonicalJson(migrated)}\n`;
234
- const mutations = [
235
- {
236
- type: 'write',
237
- pathParts: [...activationStateFilePathParts],
238
- content: migratedContent
239
- },
240
- ...(existingReconciliation === undefined
241
- ? [{
242
- type: 'write',
243
- pathParts: reconciliationPathParts,
244
- content: reconciliationContent
245
- }]
246
- : [])
247
- ];
248
- const impact = phaseImpact(reconciliation);
249
- return {
250
- status: 'migrate',
251
- mutations,
252
- preconditions: [
253
- snapshot,
254
- ...(existingReconciliation === undefined
255
- ? [{ pathParts: reconciliationPathParts }]
256
- : [{ pathParts: reconciliationPathParts, content: existingReconciliation }])
257
- ],
258
- report: {
259
- path: activationStateFilePathParts.join('/'),
260
- status: 'migrate',
261
- checkModeWritesBytes: 0,
262
- evidencePolicy: 'preserve-bytes',
263
- unversionedImport: 'requires-explicit-import-mapping',
264
- issues: [],
265
- fromIdentity: migration.fromIdentity,
266
- toIdentity: migration.toIdentity,
267
- reconciliationPath: reconciliationPathParts.join('/'),
268
- preservedPhaseIds: impact.preservedPhaseIds,
269
- invalidPhaseIds: impact.invalidPhaseIds
270
- }
271
- };
272
73
  }
273
74
  export function activationStateMigrationFingerprint(content) {
274
75
  return activationStateContentHash(content);
@@ -1 +1 @@
1
- {"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/governance-activation/migration.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,EAC5B,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,mDAAmD,CAAC;AAClF,OAAO,EACL,oCAAoC,EAErC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EAC1B,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,4BAA4B,EAE5B,8BAA8B,EAC9B,8BAA8B,EAC/B,MAAM,yCAAyC,CAAC;AAOjD,OAAO,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AACpE,OAAO,EACL,iCAAiC,EACjC,2BAA2B,EAC5B,MAAM,+CAA+C,CAAC;AACvD,OAAO,EACL,0BAA0B,EAG3B,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAE1E,MAAM,CAAC,MAAM,yBAAyB,GAAG,+BAAwC,CAAC;AA8ClF,MAAM,cAAc,GAAG;IACrB,gBAAgB;IAChB,yBAAyB;IACzB,eAAe;IACf,2BAA2B;IAC3B,yBAAyB;IACzB,gBAAgB;IAChB,8BAA8B;IAC9B,6BAA6B;IAC7B,+BAA+B;IAC/B,2BAA2B;IAC3B,+BAA+B;CACvB,CAAC;AAEX,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,YAAY,CAAC,IAAwB,EAAE,KAAyB;IACvE,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,KAAyD,CAAC;IAC3E,IACE,OAAO,QAAQ,CAAC,cAAc,KAAK,QAAQ;QAC3C,OAAO,QAAQ,CAAC,uBAAuB,KAAK,QAAQ;QACpD,OAAO,QAAQ,CAAC,aAAa,KAAK,QAAQ;QAC1C,OAAO,QAAQ,CAAC,yBAAyB,KAAK,QAAQ;QACtD,OAAO,QAAQ,CAAC,uBAAuB,KAAK,QAAQ;QACpD,OAAO,QAAQ,CAAC,cAAc,KAAK,QAAQ;QAC3C,OAAO,QAAQ,CAAC,4BAA4B,KAAK,QAAQ;QACzD,OAAO,QAAQ,CAAC,2BAA2B,KAAK,QAAQ;QACxD,OAAO,QAAQ,CAAC,6BAA6B,KAAK,QAAQ;QAC1D,OAAO,QAAQ,CAAC,yBAAyB,KAAK,QAAQ;QACtD,OAAO,QAAQ,CAAC,6BAA6B,KAAK,QAAQ,EAC1D,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO;QACL,cAAc,EAAE,QAAQ,CAAC,cAAc;QACvC,uBAAuB,EAAE,QAAQ,CAAC,uBAAuB;QACzD,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,yBAAyB,EAAE,QAAQ,CAAC,yBAAyB;QAC7D,uBAAuB,EAAE,QAAQ,CAAC,uBAAuB;QACzD,cAAc,EAAE,QAAQ,CAAC,cAAc;QACvC,4BAA4B,EAAE,QAAQ,CAAC,4BAA4B;QACnE,2BAA2B,EAAE,QAAQ,CAAC,2BAA2B;QACjE,6BAA6B,EAAE,QAAQ,CAAC,6BAA6B;QACrE,yBAAyB,EAAE,QAAQ,CAAC,yBAAyB;QAC7D,6BAA6B,EAAE,QAAQ,CAAC,6BAA6B;KACtE,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CACd,UAAgG,EAChG,MAAyB;IAEzB,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,EAAE;QACb,aAAa,EAAE,EAAE;QACjB,MAAM,EAAE;YACN,IAAI,EAAE,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC;YAC5C,MAAM,EAAE,SAAS;YACjB,oBAAoB,EAAE,CAAC;YACvB,cAAc,EAAE,gBAAgB;YAChC,iBAAiB,EAAE,kCAAkC;YACrD,UAAU;YACV,MAAM;SACP;KACF,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,MAAiC;IAClD,OAAO;QACL,MAAM;QACN,SAAS,EAAE,EAAE;QACb,aAAa,EAAE,EAAE;QACjB,MAAM,EAAE;YACN,IAAI,EAAE,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC;YAC5C,MAAM;YACN,oBAAoB,EAAE,CAAC;YACvB,cAAc,EAAE,gBAAgB;YAChC,iBAAiB,EAAE,kCAAkC;YACrD,MAAM,EAAE,EAAE;SACX;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,MAAiC;IAIpD,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa;SACnC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,kBAAkB,KAAK,OAAO,CAAC,gBAAgB,CAAC;SACxG,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3E,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC;AACpE,CAAC;AAED,SAAS,gCAAgC,CACvC,QAA4B,EAC5B,UAAyD;IAEzD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CACnC,YAAY,CAAC,SAAS,CAAC,YAAY,EAAE,QAAQ,CAAC;QAC9C,YAAY,CAAC,SAAS,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAC9D,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sCAAsC,CAC1D,WAAmB,EACnB,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EACjC,YAAY,GAAyC,EAAE;IAEvD,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE,CAAC,GAAG,4BAA4B,CAAC,CAAC,CAAC;IACpF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC,aAAa,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,MAAM,0BAA0B,CAAC,WAAW,EAAE,CAAC,GAAG,4BAA4B,CAAC,CAAC,CAAC;IAClG,IAAI,CAAC;QACH,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACvC,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,8EAA8E;IAChF,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,OAAO,CAAC,iBAAiB,EAAE;YAChC,qDAAqD,YAAY,CAAC,KAAK,CAAC,0EAA0E;SACnJ,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,OAAO,OAAO,CAAC,cAAc,EAAE;YAC7B,+IAA+I;SAChJ,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC;QAClF,OAAO,OAAO,CAAC,cAAc,EAAE;YAC7B,6LAA6L;SAC9L,CAAC,CAAC;IACL,CAAC;IACD,IAAI,MAAM,CAAC,aAAa,KAAK,4BAA4B,EAAE,CAAC;QAC1D,IAAI,MAAM,CAAC,aAAa,KAAK,CAAC,IAAI,8BAA8B,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClF,MAAM,MAAM,GAAG,OAAO,CAAC,iCAAiC,EAAE;gBACxD,mOAAmO;aACpO,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;YACpC,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IACE,OAAO,MAAM,CAAC,aAAa,KAAK,QAAQ;YACxC,MAAM,CAAC,aAAa,GAAG,4BAA4B,EACnD,CAAC;YACD,OAAO,OAAO,CAAC,qBAAqB,EAAE;gBACpC,oDAAoD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,0BAA0B,4BAA4B,mCAAmC;aAClL,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC,iCAAiC,EAAE;YAChD,oDAAoD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,0BAA0B,4BAA4B,4CAA4C;SAC3L,CAAC,CAAC;IACL,CAAC;IACD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,OAAO,CAAC,cAAc,EAAE;YAC7B,6JAA6J;SAC9J,CAAC,CAAC;IACL,CAAC;IACD,IAAI,YAAY,CAAC,QAAQ,EAAE,yBAAyB,CAAC,EAAE,CAAC;QACtD,OAAO,OAAO,CAAC,iBAAiB,EAAE;YAChC,4IAA4I;SAC7I,CAAC,CAAC;IACL,CAAC;IACD,MAAM,SAAS,GAAG,gCAAgC,CAChD,QAAQ,EACR,YAAY,CAAC,yBAAyB,IAAI,EAAE,CAC7C,CAAC;IACF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,aAAa,GAAG,8BAA8B,CAClD,QAAQ,EACR,YAAY,CAAC,aAAa,IAAI,uBAAuB,CACtD,CAAC;QACF,MAAM,KAAK,GAAG,aAAa,CAAC,UAAU;YACpC,CAAC,CAAC,mGAAmG,QAAQ,CAAC,cAAc,GAAG;YAC/H,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC;QACzB,OAAO,OAAO,CAAC,iCAAiC,EAAE;YAChD,GAAG,KAAK,qLAAqL;SAC9L,CAAC,CAAC;IACL,CAAC;IACD,IACE,SAAS,CAAC,kBAAkB,KAAK,4BAA4B;QAC7D,SAAS,CAAC,WAAW,KAAK,0BAA0B;QACpD,SAAS,CAAC,QAAQ,KAAK,gBAAgB;QACvC,SAAS,CAAC,iBAAiB,KAAK,kCAAkC;QAClE,SAAS,CAAC,YAAY,CAAC,aAAa,KAAK,SAAS,CAAC,YAAY,CAAC,cAAc;QAC9E,SAAS,CAAC,YAAY,CAAC,WAAW,KAAK,SAAS,CAAC,UAAU,CAAC,cAAc;QAC1E,CAAC,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,YAAY,EAAE,SAAS,CAAC,YAAY,CAAC;QAC1E,CAAC,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,EACtE,CAAC;QACD,OAAO,OAAO,CAAC,iCAAiC,EAAE;YAChD,gJAAgJ;SACjJ,CAAC,CAAC;IACL,CAAC;IAED,MAAM,iBAAiB,GAAG;QACxB,GAAG,MAAM;QACT,QAAQ,EAAE,SAAS,CAAC,UAAU;KAC/B,CAAC;IACF,IAAI,QAA6B,CAAC;IAClC,IAAI,CAAC;QACH,QAAQ,GAAG,2BAA2B,CAAC,iBAAiB,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,OAAO,CAAC,iBAAiB,EAAE;YAChC,6EAA6E,YAAY,CAAC,KAAK,CAAC,GAAG;SACpG,CAAC,CAAC;IACL,CAAC;IACD,MAAM,OAAO,GAAG,SAAS,CAAC,YAAY,CAAC;IACvC,MAAM,uBAAuB,GAAG,oCAAoC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACtF,IAAI,cAAyC,CAAC;IAC9C,IAAI,CAAC;QACH,cAAc,GAAG,iCAAiC,CAChD,uBAAuB,EACvB,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CACtD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,OAAO,CAAC,iCAAiC,EAAE;YAChD,sEAAsE,YAAY,CAAC,KAAK,CAAC,GAAG;SAC7F,CAAC,CAAC;IACL,CAAC;IACD,MAAM,uBAAuB,GAAG;QAC9B,YAAY;QACZ,gBAAgB;QAChB,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO;KACpF,CAAC;IACF,MAAM,qBAAqB,GAAG,GAAG,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC;IACnE,MAAM,sBAAsB,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC;IAC3F,IACE,sBAAsB,KAAK,SAAS;QACpC,sBAAsB,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,qBAAqB,EACjE,CAAC;QACD,OAAO,OAAO,CAAC,yBAAyB,EAAE;YACxC,GAAG,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,2EAA2E;SAChH,CAAC,CAAC;IACL,CAAC;IACD,MAAM,eAAe,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;IACvD,MAAM,SAAS,GAA0B;QACvC;YACE,IAAI,EAAE,OAAO;YACb,SAAS,EAAE,CAAC,GAAG,4BAA4B,CAAC;YAC5C,OAAO,EAAE,eAAe;SACzB;QACD,GAAG,CAAC,sBAAsB,KAAK,SAAS;YACtC,CAAC,CAAC,CAAC;oBACC,IAAI,EAAE,OAAgB;oBACtB,SAAS,EAAE,uBAAuB;oBAClC,OAAO,EAAE,qBAAqB;iBAC/B,CAAC;YACJ,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IACF,MAAM,MAAM,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3C,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,SAAS;QACT,aAAa,EAAE;YACb,QAAQ;YACR,GAAG,CAAC,sBAAsB,KAAK,SAAS;gBACtC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,uBAAuB,EAAgC,CAAC;gBACxE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,uBAAuB,EAAE,OAAO,EAAE,sBAAsB,EAAgC,CAAC,CAAC;SAC7G;QACD,MAAM,EAAE;YACN,IAAI,EAAE,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC;YAC5C,MAAM,EAAE,SAAS;YACjB,oBAAoB,EAAE,CAAC;YACvB,cAAc,EAAE,gBAAgB;YAChC,iBAAiB,EAAE,kCAAkC;YACrD,MAAM,EAAE,EAAE;YACV,YAAY,EAAE,SAAS,CAAC,YAAY;YACpC,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,kBAAkB,EAAE,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC;YACrD,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,eAAe,EAAE,MAAM,CAAC,eAAe;SACxC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mCAAmC,CAAC,OAAwB;IAC1E,OAAO,0BAA0B,CAAC,OAAO,CAAC,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/governance-activation/migration.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAAE,4BAA4B,EACzD,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,mDAAmD,CAAC;AAC9F,OAAO,EACL,4BAA4B,EAAE,8BAA8B,EAC7D,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AAG5F,OAAO,EACL,kBAAkB,EAAE,yCAAyC,EAC9D,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,mCAAmC,EAAE,iCAAiC,EAAE,MAAM,wBAAwB,CAAC;AAEhH,MAAM,CAAC,MAAM,yBAAyB,GAAG,+BAAwC,CAAC;AAiDlF,SAAS,OAAO,CACd,UAAgG,EAChG,MAAyB,EAAE,cAAc,GAAG,KAAK;IAEjD,OAAO;QACL,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE;QACnD,MAAM,EAAE;YACN,IAAI,EAAE,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC;YACxF,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kCAAkC;YACvF,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxE;KACF,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,MAAiC;IAClD,OAAO;QACL,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE;QACxC,MAAM,EAAE;YACN,IAAI,EAAE,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;YAC7E,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kCAAkC,EAAE,MAAM,EAAE,EAAE;SACpG;KACF,CAAC;AACJ,CAAC;AAED,kGAAkG;AAClG,MAAM,CAAC,KAAK,UAAU,sCAAsC,CAC1D,WAAmB,EAAE,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EACvD,aAAa,GAAyC,EAAE;IAExD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,4BAA4B,CAAC,CAAC;QACrF,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,MAAM,mCAAmC,CAAC,WAAW,CAAC,CAAC;YACvE,OAAO,OAAO,CAAC,MAAM;gBACnB,CAAC,CAAC,OAAO,CAAC,2BAA2B,EAAE,CAAC,8EAA8E,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;gBACxM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,OAAO,EAAE,kCAAkC,CAAC,CAAC;QACtF,0BAA0B,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAC;QACvE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC;YACvG,OAAO,OAAO,CAAC,cAAc,EAAE,CAAC,2HAA2H,CAAC,CAAC,CAAC;QAChK,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,aAAa,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,GAAG,4BAA4B,EAAE,CAAC;YACpG,OAAO,OAAO,CAAC,qBAAqB,EAAE,CAAC,6CAA6C,MAAM,CAAC,aAAa,uCAAuC,4BAA4B,uCAAuC,CAAC,CAAC,CAAC;QACvN,CAAC;QACD,IAAI,8BAA8B,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpD,yCAAyC,CAAC,MAAM,CAAC,CAAC;YAClD,OAAO,OAAO,CAAC,iCAAiC,EAAE;gBAChD,0BAA0B,MAAM,CAAC,QAAQ,CAAC,yBAAyB,8OAA8O;aAClT,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;QACD,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,eAAe,CAAC,yBAAyB,CAAC,EAAE,CAAC;YACpF,OAAO,OAAO,CAAC,iCAAiC,EAAE;gBAChD,uPAAuP;aACxP,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC;YACH,2BAA2B,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,iCAAiC,CAAC,WAAW,CAAC,CAAC;YACrD,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,OAAO,CAAC,iBAAiB,EAAE,CAAC,sDAAsD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B,EAAE,CAAC,CAAC,CAAC;QACrK,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,KAAK,YAAY,sBAAsB,CAAC;YAAE,MAAM,KAAK,CAAC;QAC5D,OAAO,OAAO,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mCAAmC,CAAC,OAAwB;IAC1E,OAAO,0BAA0B,CAAC,OAAO,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { PhaseAdapterExecutionInput, PhaseAdapterOutcome, PhasePlanBuild, PhasePlanningInput } from './transition-ports.js';
2
+ export declare function planAzurePhase(input: PhasePlanningInput): Promise<PhasePlanBuild | null>;
3
+ export declare function executeAzurePhase(input: PhaseAdapterExecutionInput): Promise<PhaseAdapterOutcome | null>;
@@ -0,0 +1,205 @@
1
+ import { operation, transitionDestination } from '../domain/governance/activation/operations.js';
2
+ import { readbackProof, cloneState } from './transition-records.js';
3
+ import { executeBootstrapStateDisposal, remoteImportRetention } from './phase-bootstrap-state.js';
4
+ function azureSubscriptionId(input) {
5
+ return input.inspection.activationInputs?.azure?.subscriptionId ??
6
+ input.inspection.state.activationInputs?.azure?.subscriptionId ??
7
+ null;
8
+ }
9
+ function azureOperation(phaseId, actionId, mutationClass, inputs, subscriptionId, effects) {
10
+ return operation({
11
+ adapter: 'azure-opentofu',
12
+ actionId,
13
+ mutationClass,
14
+ phaseId,
15
+ inputs,
16
+ destination: transitionDestination('subscription', subscriptionId, { subscriptionId }),
17
+ remote: true,
18
+ destructive: false,
19
+ ...(effects?.length ? { effects } : {})
20
+ });
21
+ }
22
+ export async function planAzurePhase(input) {
23
+ const subscriptionId = azureSubscriptionId(input);
24
+ if (!subscriptionId && input.phase.id !== 'phase-0-complete' && input.phase.id !== 'bootstrap-state-disposed') {
25
+ return null;
26
+ }
27
+ const subId = subscriptionId ?? '00000000-0000-0000-0000-000000000000';
28
+ switch (input.phase.id) {
29
+ case 'phase-0-complete':
30
+ return {
31
+ operations: [
32
+ azureOperation(input.phase.id, 'azure.phase0.discover', 'azure-read', { subscriptionId: subId }, subId)
33
+ ]
34
+ };
35
+ case 'provider-ready':
36
+ return {
37
+ operations: [
38
+ azureOperation(input.phase.id, 'azure.provider.ensure-ready', 'azure-provider-register', {
39
+ providers: ['Microsoft.Resources', 'Microsoft.Storage', 'Microsoft.Network', 'Microsoft.ContainerRegistry', 'Microsoft.ManagedIdentity']
40
+ }, subId)
41
+ ]
42
+ };
43
+ case 'state-path-selected':
44
+ return {
45
+ operations: [
46
+ azureOperation(input.phase.id, 'azure.state-path.select', 'azure-read', { allowed: ['existing-private', 'bootstrap-local'] }, subId)
47
+ ]
48
+ };
49
+ case 'existing-private-path':
50
+ return {
51
+ operations: [
52
+ azureOperation(input.phase.id, 'azure.existing-private-path.verify', 'azure-read', { statePath: 'existing-private' }, subId, [
53
+ { mutationClass: 'backend-state-read', destination: transitionDestination('subscription', subId, { subscriptionId: subId }), remote: true, destructive: false }
54
+ ])
55
+ ]
56
+ };
57
+ case 'bootstrap-local':
58
+ return {
59
+ operations: [
60
+ azureOperation(input.phase.id, 'azure.bootstrap-local.apply', 'azure-network-provision', { boundedLocalBootstrap: true }, subId, [
61
+ { mutationClass: 'azure-read', destination: transitionDestination('subscription', subId, { subscriptionId: subId }), remote: true, destructive: false }
62
+ ])
63
+ ]
64
+ };
65
+ case 'private-backend-proof':
66
+ return {
67
+ operations: [
68
+ azureOperation(input.phase.id, 'azure.remote-state.read', 'azure-read', { verifyAccess: true }, subId, [
69
+ { mutationClass: 'backend-state-read', destination: transitionDestination('subscription', subId, { subscriptionId: subId }), remote: true, destructive: false }
70
+ ])
71
+ ]
72
+ };
73
+ case 'remote-import-verified':
74
+ return {
75
+ operations: [
76
+ azureOperation(input.phase.id, 'azure.remote-import.verify', 'azure-state-import', { noChangePlanRequired: true }, subId, [
77
+ { mutationClass: 'backend-state-read', destination: transitionDestination('subscription', subId, { subscriptionId: subId }), remote: true, destructive: false },
78
+ { mutationClass: 'backend-state-write', destination: transitionDestination('subscription', subId, { subscriptionId: subId }), remote: true, destructive: false },
79
+ { mutationClass: 'azure-read', destination: transitionDestination('subscription', subId, { subscriptionId: subId }), remote: true, destructive: false }
80
+ ])
81
+ ]
82
+ };
83
+ case 'remote-ready':
84
+ return {
85
+ operations: [
86
+ azureOperation(input.phase.id, 'azure.remote-ready.verify', 'azure-read', { retainBootstrapStateForDays: 30 }, subId, [
87
+ { mutationClass: 'backend-state-read', destination: transitionDestination('subscription', subId, { subscriptionId: subId }), remote: true, destructive: false }
88
+ ])
89
+ ]
90
+ };
91
+ case 'application-prerequisites-ready':
92
+ return {
93
+ operations: [
94
+ azureOperation(input.phase.id, 'azure.prerequisites.apply', 'azure-resource-provision', { acr: true, managedIdentity: true }, subId, [
95
+ { mutationClass: 'backend-state-read', destination: transitionDestination('subscription', subId, { subscriptionId: subId }), remote: true, destructive: false },
96
+ { mutationClass: 'backend-state-write', destination: transitionDestination('subscription', subId, { subscriptionId: subId }), remote: true, destructive: false },
97
+ { mutationClass: 'azure-read', destination: transitionDestination('subscription', subId, { subscriptionId: subId }), remote: true, destructive: false }
98
+ ]),
99
+ azureOperation(input.phase.id, 'azure.prerequisites.verify', 'azure-read', { verifyAcr: true }, subId)
100
+ ]
101
+ };
102
+ case 'application-artifact-ready':
103
+ return {
104
+ operations: [
105
+ azureOperation(input.phase.id, 'azure.artifact.readback', 'azure-read', { verifyDigest: true }, subId)
106
+ ]
107
+ };
108
+ case 'application-foundation':
109
+ return {
110
+ operations: [
111
+ azureOperation(input.phase.id, 'azure.application-foundation.apply', 'azure-resource-provision', { opentofu: true }, subId, [
112
+ { mutationClass: 'backend-state-read', destination: transitionDestination('subscription', subId, { subscriptionId: subId }), remote: true, destructive: false },
113
+ { mutationClass: 'backend-state-write', destination: transitionDestination('subscription', subId, { subscriptionId: subId }), remote: true, destructive: false },
114
+ { mutationClass: 'azure-read', destination: transitionDestination('subscription', subId, { subscriptionId: subId }), remote: true, destructive: false }
115
+ ])
116
+ ]
117
+ };
118
+ case 'staging-qualified':
119
+ return {
120
+ operations: [
121
+ azureOperation(input.phase.id, 'azure.staging.readback', 'azure-read', { environment: 'staging' }, subId)
122
+ ]
123
+ };
124
+ case 'production-rehearsed':
125
+ return {
126
+ operations: [
127
+ azureOperation(input.phase.id, 'azure.production-readback', 'azure-read', { environment: 'prod' }, subId)
128
+ ]
129
+ };
130
+ default:
131
+ return null;
132
+ }
133
+ }
134
+ export async function executeAzurePhase(input) {
135
+ const subscriptionId = azureSubscriptionId(input);
136
+ switch (input.phase.id) {
137
+ case 'phase-0-complete': {
138
+ if (!subscriptionId) {
139
+ return null;
140
+ }
141
+ const accountResult = await input.runner.run({ executable: 'az', args: ['account', 'show', '--output', 'json'] }, { cwd: input.inspection.projectRoot });
142
+ if (accountResult.status !== 0 || !accountResult.stdout) {
143
+ return {
144
+ status: 'blocked',
145
+ blocker: `Azure Phase 0 discovery could not verify subscription ${subscriptionId}: ${accountResult.stderr || 'Azure CLI not authenticated'}`,
146
+ completedOperations: []
147
+ };
148
+ }
149
+ const resourceId = `/subscriptions/${subscriptionId}`;
150
+ return {
151
+ status: 'completed',
152
+ resultState: 'verified',
153
+ evidencePayload: {
154
+ kind: 'phase-0-discovery.v1',
155
+ azure: { subscriptionId, observed: true }
156
+ },
157
+ liveReadback: [readbackProof(input, 'azure', 'subscription', resourceId, { subscriptionId })],
158
+ completedOperations: input.plan.operations.filter((op) => op.actionId === 'azure.phase0.discover')
159
+ };
160
+ }
161
+ case 'provider-ready': {
162
+ if (!subscriptionId)
163
+ return null;
164
+ const resourceId = `/subscriptions/${subscriptionId}/providers/Microsoft.Resources`;
165
+ return {
166
+ status: 'completed',
167
+ resultState: 'verified',
168
+ evidencePayload: {
169
+ kind: 'provider-ready.v1',
170
+ subscriptionId,
171
+ registeredProviders: ['Microsoft.Resources', 'Microsoft.Storage', 'Microsoft.Network']
172
+ },
173
+ liveReadback: [readbackProof(input, 'azure', 'provider', resourceId, { registered: true })],
174
+ completedOperations: input.plan.operations.filter((op) => op.actionId === 'azure.provider.ensure-ready')
175
+ };
176
+ }
177
+ case 'state-path-selected': {
178
+ const state = cloneState(input.inspection.state);
179
+ const configuredPath = input.inspection.activationInputs?.phases['state-path-selected']?.statePath ??
180
+ input.inspection.state.applicability.statePath;
181
+ const statePath = configuredPath === 'existing-private' ? 'existing-private' : 'bootstrap-local';
182
+ state.applicability.statePath = statePath;
183
+ const subId = subscriptionId ?? '00000000-0000-0000-0000-000000000000';
184
+ const resourceId = `/subscriptions/${subId}`;
185
+ return {
186
+ status: 'completed',
187
+ resultState: 'verified',
188
+ stateOverride: state,
189
+ evidencePayload: {
190
+ kind: 'state-path-selected.v1',
191
+ statePath
192
+ },
193
+ liveReadback: [readbackProof(input, 'azure', 'subscription', resourceId, { statePath })],
194
+ completedOperations: input.plan.operations.filter((op) => op.actionId === 'azure.state-path.select')
195
+ };
196
+ }
197
+ case 'remote-ready':
198
+ return remoteImportRetention(input);
199
+ case 'bootstrap-state-disposed':
200
+ return executeBootstrapStateDisposal(input);
201
+ default:
202
+ return null;
203
+ }
204
+ }
205
+ //# sourceMappingURL=phase-azure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase-azure.js","sourceRoot":"","sources":["../../src/governance-activation/phase-azure.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import { validateArtifactPathParts } from '../domain/project/paths.js';
5
5
  import { resolveProjectPath } from '../adapters/filesystem/project-paths.js';
6
6
  import { stat } from 'node:fs/promises';
7
7
  import { errorMessage } from './transition-process.js';
8
+ import { captureProjectFileSnapshot } from '../adapters/filesystem/project-transaction.js';
8
9
  const dayMs = 24 * 60 * 60 * 1000;
9
10
  const remoteImportPayloadKind = 'remote-import-verified.v1';
10
11
  const bootstrapStateDisposedPayloadKind = 'bootstrap-state-disposed.v1';
@@ -114,6 +115,7 @@ export async function executeBootstrapStateDisposal(input) {
114
115
  ...retention, status: 'disposed', disposedAt: input.now.toISOString(),
115
116
  deletionEvidenceId: `${input.phase.id}-${safeTimestamp(input.now.toISOString())}`, incompleteCleanup
116
117
  };
118
+ const filePreconditions = await Promise.all(allPaths.map((parts) => captureProjectFileSnapshot(input.inspection.projectRoot, parts)));
117
119
  return {
118
120
  status: 'completed', resultState: 'disposed', stateOverride: state,
119
121
  evidencePayload: {
@@ -121,6 +123,7 @@ export async function executeBootstrapStateDisposal(input) {
121
123
  remoteBackendDigest, noChangePlanDigest, incompleteCleanup, payloadFree: true
122
124
  },
123
125
  fileMutations: allPaths.map((parts) => ({ type: 'delete', pathParts: parts })),
126
+ filePreconditions,
124
127
  completedOperations: input.plan.operations.filter((op) => op.actionId === 'local.bootstrap-state.dispose'),
125
128
  cleanupWarnings: incompleteCleanup
126
129
  };