@msn-control/liftoff 0.11.2 → 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 (339) hide show
  1. package/DEVELOPER.md +26 -24
  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 +45 -2
  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/process/shell-command.d.ts +1 -0
  23. package/dist/adapters/process/shell-command.js +5 -2
  24. package/dist/adapters/process/shell-command.js.map +1 -1
  25. package/dist/adapters/state/azure-blob.d.ts +43 -0
  26. package/dist/adapters/state/azure-blob.js +335 -0
  27. package/dist/adapters/state/azure-blob.js.map +1 -0
  28. package/dist/adapters/state/darwin-capabilities.d.ts +33 -0
  29. package/dist/adapters/state/darwin-capabilities.js +146 -0
  30. package/dist/adapters/state/darwin-capabilities.js.map +1 -0
  31. package/dist/adapters/state/darwin-native-host.d.ts +32 -0
  32. package/dist/adapters/state/darwin-native-host.js +294 -0
  33. package/dist/adapters/state/darwin-native-host.js.map +1 -0
  34. package/dist/adapters/state/darwin-profile.d.ts +6 -0
  35. package/dist/adapters/state/darwin-profile.js +56 -0
  36. package/dist/adapters/state/darwin-profile.js.map +1 -0
  37. package/dist/adapters/state/darwin-system-program.d.ts +1 -0
  38. package/dist/adapters/state/darwin-system-program.js +94 -0
  39. package/dist/adapters/state/darwin-system-program.js.map +1 -0
  40. package/dist/adapters/state/local-qualification.d.ts +16 -0
  41. package/dist/adapters/state/local-qualification.js +299 -0
  42. package/dist/adapters/state/local-qualification.js.map +1 -0
  43. package/dist/adapters/state/local.d.ts +25 -0
  44. package/dist/adapters/state/local.js +145 -0
  45. package/dist/adapters/state/local.js.map +1 -0
  46. package/dist/adapters/state/native-command.d.ts +21 -0
  47. package/dist/adapters/state/native-command.js +82 -0
  48. package/dist/adapters/state/native-command.js.map +1 -0
  49. package/dist/adapters/state/native-files.d.ts +2 -0
  50. package/dist/adapters/state/native-files.js +47 -0
  51. package/dist/adapters/state/native-files.js.map +1 -0
  52. package/dist/adapters/state/native-system.d.ts +38 -0
  53. package/dist/adapters/state/native-system.js +86 -0
  54. package/dist/adapters/state/native-system.js.map +1 -0
  55. package/dist/adapters/state/opentofu.d.ts +35 -0
  56. package/dist/adapters/state/opentofu.js +350 -0
  57. package/dist/adapters/state/opentofu.js.map +1 -0
  58. package/dist/adapters/state/owned-process.d.ts +43 -0
  59. package/dist/adapters/state/owned-process.js +252 -0
  60. package/dist/adapters/state/owned-process.js.map +1 -0
  61. package/dist/adapters/state/posix-lock-program.d.ts +1 -0
  62. package/dist/adapters/state/posix-lock-program.js +185 -0
  63. package/dist/adapters/state/posix-lock-program.js.map +1 -0
  64. package/dist/adapters/state/posix-native-lock.d.ts +15 -0
  65. package/dist/adapters/state/posix-native-lock.js +145 -0
  66. package/dist/adapters/state/posix-native-lock.js.map +1 -0
  67. package/dist/adapters/state/protected-workspace.d.ts +57 -0
  68. package/dist/adapters/state/protected-workspace.js +412 -0
  69. package/dist/adapters/state/protected-workspace.js.map +1 -0
  70. package/dist/application/context.d.ts +3 -0
  71. package/dist/application/diagnose/doctor.d.ts +5 -0
  72. package/dist/application/diagnose/doctor.js +21 -5
  73. package/dist/application/diagnose/doctor.js.map +1 -1
  74. package/dist/application/diagnose/generated-project.js +2 -7
  75. package/dist/application/diagnose/generated-project.js.map +1 -1
  76. package/dist/application/initialize/fixture.js +8 -1
  77. package/dist/application/initialize/fixture.js.map +1 -1
  78. package/dist/application/initialize/use-case.js +70 -36
  79. package/dist/application/initialize/use-case.js.map +1 -1
  80. package/dist/application/project/manifest.js +5 -4
  81. package/dist/application/project/manifest.js.map +1 -1
  82. package/dist/application/state-migration/execution.d.ts +32 -0
  83. package/dist/application/state-migration/execution.js +440 -0
  84. package/dist/application/state-migration/execution.js.map +1 -0
  85. package/dist/application/state-migration/index.d.ts +22 -0
  86. package/dist/application/state-migration/index.js +17 -0
  87. package/dist/application/state-migration/index.js.map +1 -0
  88. package/dist/application/state-migration/lifecycle.d.ts +3 -0
  89. package/dist/application/state-migration/lifecycle.js +149 -0
  90. package/dist/application/state-migration/lifecycle.js.map +1 -0
  91. package/dist/application/state-migration/planning.d.ts +7 -0
  92. package/dist/application/state-migration/planning.js +150 -0
  93. package/dist/application/state-migration/planning.js.map +1 -0
  94. package/dist/application/state-migration/recovery.d.ts +5 -0
  95. package/dist/application/state-migration/recovery.js +145 -0
  96. package/dist/application/state-migration/recovery.js.map +1 -0
  97. package/dist/application/state-migration/runtime.d.ts +32 -0
  98. package/dist/application/state-migration/runtime.js +188 -0
  99. package/dist/application/state-migration/runtime.js.map +1 -0
  100. package/dist/application/state-migration/service.d.ts +2 -0
  101. package/dist/application/state-migration/service.js +20 -0
  102. package/dist/application/state-migration/service.js.map +1 -0
  103. package/dist/application/update/command-guidance.d.ts +19 -2
  104. package/dist/application/update/command-guidance.js +20 -6
  105. package/dist/application/update/command-guidance.js.map +1 -1
  106. package/dist/application/update/guidance-context.d.ts +2 -0
  107. package/dist/application/update/guidance-context.js +35 -0
  108. package/dist/application/update/guidance-context.js.map +1 -0
  109. package/dist/application/update/inspection.d.ts +21 -4
  110. package/dist/application/update/inspection.js +88 -29
  111. package/dist/application/update/inspection.js.map +1 -1
  112. package/dist/application/update/migration-runtime.js +25 -13
  113. package/dist/application/update/migration-runtime.js.map +1 -1
  114. package/dist/application/update/output.d.ts +4 -1
  115. package/dist/application/update/output.js +14 -4
  116. package/dist/application/update/output.js.map +1 -1
  117. package/dist/application/update/preview.d.ts +10 -1
  118. package/dist/application/update/preview.js +26 -4
  119. package/dist/application/update/preview.js.map +1 -1
  120. package/dist/application/update/revalidation-plan.d.ts +1 -0
  121. package/dist/application/update/revalidation-plan.js +27 -15
  122. package/dist/application/update/revalidation-plan.js.map +1 -1
  123. package/dist/application/update/revalidation.d.ts +4 -1
  124. package/dist/application/update/revalidation.js +64 -23
  125. package/dist/application/update/revalidation.js.map +1 -1
  126. package/dist/application/update/use-case.js +50 -29
  127. package/dist/application/update/use-case.js.map +1 -1
  128. package/dist/cli/args/definitions.js +11 -3
  129. package/dist/cli/args/definitions.js.map +1 -1
  130. package/dist/cli/args/parser.js +29 -3
  131. package/dist/cli/args/parser.js.map +1 -1
  132. package/dist/domain/governance/activation/approvals.d.ts +264 -7
  133. package/dist/domain/governance/activation/approvals.js +166 -23
  134. package/dist/domain/governance/activation/approvals.js.map +1 -1
  135. package/dist/domain/governance/activation/capabilities.js +5 -2
  136. package/dist/domain/governance/activation/capabilities.js.map +1 -1
  137. package/dist/domain/governance/activation/evidence.d.ts +2 -1
  138. package/dist/domain/governance/activation/evidence.js +64 -11
  139. package/dist/domain/governance/activation/evidence.js.map +1 -1
  140. package/dist/domain/governance/activation/graph.d.ts +11 -384
  141. package/dist/domain/governance/activation/graph.js +424 -379
  142. package/dist/domain/governance/activation/graph.js.map +1 -1
  143. package/dist/domain/governance/activation/inputs.d.ts +3 -1
  144. package/dist/domain/governance/activation/inputs.js +47 -6
  145. package/dist/domain/governance/activation/inputs.js.map +1 -1
  146. package/dist/domain/governance/activation/operations.d.ts +4 -1
  147. package/dist/domain/governance/activation/operations.js +110 -22
  148. package/dist/domain/governance/activation/operations.js.map +1 -1
  149. package/dist/domain/governance/activation/readiness.d.ts +10 -0
  150. package/dist/domain/governance/activation/readiness.js +77 -38
  151. package/dist/domain/governance/activation/readiness.js.map +1 -1
  152. package/dist/domain/governance/activation/types.d.ts +151 -9
  153. package/dist/domain/governance/activation/types.js +23 -1
  154. package/dist/domain/governance/activation/types.js.map +1 -1
  155. package/dist/domain/governance/activation/validators.d.ts +4 -1
  156. package/dist/domain/governance/activation/validators.js +419 -26
  157. package/dist/domain/governance/activation/validators.js.map +1 -1
  158. package/dist/domain/governance/policy/identity.d.ts +55 -13
  159. package/dist/domain/governance/policy/identity.js +28 -8
  160. package/dist/domain/governance/policy/identity.js.map +1 -1
  161. package/dist/domain/project/artifact-lifecycle.d.ts +2 -1
  162. package/dist/domain/project/artifact-lifecycle.js +7 -1
  163. package/dist/domain/project/artifact-lifecycle.js.map +1 -1
  164. package/dist/domain/project/catalog.d.ts +50 -1
  165. package/dist/domain/project/catalog.js +104 -4
  166. package/dist/domain/project/catalog.js.map +1 -1
  167. package/dist/domain/project/contracts.d.ts +9 -1
  168. package/dist/domain/project/infrastructure-layout.d.ts +1 -1
  169. package/dist/domain/project/infrastructure-layout.js +3 -1
  170. package/dist/domain/project/infrastructure-layout.js.map +1 -1
  171. package/dist/domain/project/manifest/governance.d.ts +1 -1
  172. package/dist/domain/project/manifest/governance.js +9 -10
  173. package/dist/domain/project/manifest/governance.js.map +1 -1
  174. package/dist/domain/project/planning.js +4 -5
  175. package/dist/domain/project/planning.js.map +1 -1
  176. package/dist/domain/repair/stateful-bounded.d.ts +1 -0
  177. package/dist/domain/repair/stateful-bounded.js +37 -0
  178. package/dist/domain/repair/stateful-bounded.js.map +1 -0
  179. package/dist/domain/repair/stateful-invariants.d.ts +28 -0
  180. package/dist/domain/repair/stateful-invariants.js +278 -0
  181. package/dist/domain/repair/stateful-invariants.js.map +1 -0
  182. package/dist/domain/repair/stateful.d.ts +690 -0
  183. package/dist/domain/repair/stateful.js +26 -0
  184. package/dist/domain/repair/stateful.js.map +1 -0
  185. package/dist/domain/workstation/constraints.d.ts +1 -0
  186. package/dist/domain/workstation/constraints.js.map +1 -1
  187. package/dist/domain/workstation/contracts.d.ts +42 -0
  188. package/dist/domain/workstation/contracts.js +2 -0
  189. package/dist/domain/workstation/contracts.js.map +1 -0
  190. package/dist/domain/workstation/executables.d.ts +19 -0
  191. package/dist/domain/workstation/executables.js +68 -0
  192. package/dist/domain/workstation/executables.js.map +1 -0
  193. package/dist/domain/workstation/versions.d.ts +8 -0
  194. package/dist/domain/workstation/versions.js +145 -0
  195. package/dist/domain/workstation/versions.js.map +1 -0
  196. package/dist/framework-adapters.d.ts +2 -0
  197. package/dist/framework-adapters.js +148 -22
  198. package/dist/framework-adapters.js.map +1 -1
  199. package/dist/framework-validation.d.ts +6 -0
  200. package/dist/framework-validation.js +89 -24
  201. package/dist/framework-validation.js.map +1 -1
  202. package/dist/generators/common/base.js +57 -17
  203. package/dist/generators/common/base.js.map +1 -1
  204. package/dist/governance-activation/activation-state.js +39 -7
  205. package/dist/governance-activation/activation-state.js.map +1 -1
  206. package/dist/governance-activation/authority-records.d.ts +4 -0
  207. package/dist/governance-activation/authority-records.js +24 -0
  208. package/dist/governance-activation/authority-records.js.map +1 -0
  209. package/dist/governance-activation/commands.d.ts +9 -1
  210. package/dist/governance-activation/commands.js +392 -97
  211. package/dist/governance-activation/commands.js.map +1 -1
  212. package/dist/governance-activation/compatibility.d.ts +11 -8
  213. package/dist/governance-activation/compatibility.js +37 -23
  214. package/dist/governance-activation/compatibility.js.map +1 -1
  215. package/dist/governance-activation/doctor.js +40 -16
  216. package/dist/governance-activation/doctor.js.map +1 -1
  217. package/dist/governance-activation/github-config.d.ts +17 -0
  218. package/dist/governance-activation/github-config.js +88 -0
  219. package/dist/governance-activation/github-config.js.map +1 -0
  220. package/dist/governance-activation/github-discovery.d.ts +18 -0
  221. package/dist/governance-activation/github-discovery.js +229 -0
  222. package/dist/governance-activation/github-discovery.js.map +1 -0
  223. package/dist/governance-activation/github-ports.d.ts +12 -0
  224. package/dist/governance-activation/github-ports.js +4 -0
  225. package/dist/governance-activation/github-ports.js.map +1 -0
  226. package/dist/governance-activation/github-publication.d.ts +3 -0
  227. package/dist/governance-activation/github-publication.js +190 -0
  228. package/dist/governance-activation/github-publication.js.map +1 -0
  229. package/dist/governance-activation/historical-common.d.ts +98 -0
  230. package/dist/governance-activation/historical-common.js +269 -0
  231. package/dist/governance-activation/historical-common.js.map +1 -0
  232. package/dist/governance-activation/historical-credential-policy.d.ts +3 -0
  233. package/dist/governance-activation/historical-credential-policy.js +91 -0
  234. package/dist/governance-activation/historical-credential-policy.js.map +1 -0
  235. package/dist/governance-activation/historical-inputs.d.ts +6 -0
  236. package/dist/governance-activation/historical-inputs.js +57 -0
  237. package/dist/governance-activation/historical-inputs.js.map +1 -0
  238. package/dist/governance-activation/historical-safety.d.ts +9 -0
  239. package/dist/governance-activation/historical-safety.js +102 -0
  240. package/dist/governance-activation/historical-safety.js.map +1 -0
  241. package/dist/governance-activation/historical-source-metadata.d.ts +31 -0
  242. package/dist/governance-activation/historical-source-metadata.js +55 -0
  243. package/dist/governance-activation/historical-source-metadata.js.map +1 -0
  244. package/dist/governance-activation/historical-state.d.ts +12 -50
  245. package/dist/governance-activation/historical-state.js +195 -308
  246. package/dist/governance-activation/historical-state.js.map +1 -1
  247. package/dist/governance-activation/historical-v1-auxiliary.d.ts +1 -0
  248. package/dist/governance-activation/historical-v1-auxiliary.js +43 -0
  249. package/dist/governance-activation/historical-v1-auxiliary.js.map +1 -0
  250. package/dist/governance-activation/historical-v1-phase-contracts.d.ts +31 -0
  251. package/dist/governance-activation/historical-v1-phase-contracts.js +46 -0
  252. package/dist/governance-activation/historical-v1-phase-contracts.js.map +1 -0
  253. package/dist/governance-activation/historical-v2.d.ts +53 -0
  254. package/dist/governance-activation/historical-v2.js +313 -0
  255. package/dist/governance-activation/historical-v2.js.map +1 -0
  256. package/dist/governance-activation/history-contracts.d.ts +21 -12
  257. package/dist/governance-activation/history-contracts.js +99 -27
  258. package/dist/governance-activation/history-contracts.js.map +1 -1
  259. package/dist/governance-activation/inputs.d.ts +8 -2
  260. package/dist/governance-activation/inputs.js +41 -6
  261. package/dist/governance-activation/inputs.js.map +1 -1
  262. package/dist/governance-activation/migration-history.d.ts +43 -5
  263. package/dist/governance-activation/migration-history.js +231 -50
  264. package/dist/governance-activation/migration-history.js.map +1 -1
  265. package/dist/governance-activation/migration.d.ts +7 -4
  266. package/dist/governance-activation/migration.js +53 -252
  267. package/dist/governance-activation/migration.js.map +1 -1
  268. package/dist/governance-activation/phase-azure.d.ts +3 -0
  269. package/dist/governance-activation/phase-azure.js +205 -0
  270. package/dist/governance-activation/phase-azure.js.map +1 -0
  271. package/dist/governance-activation/phase-bootstrap-state.js +3 -0
  272. package/dist/governance-activation/phase-bootstrap-state.js.map +1 -1
  273. package/dist/governance-activation/phase-github.d.ts +3 -0
  274. package/dist/governance-activation/phase-github.js +192 -0
  275. package/dist/governance-activation/phase-github.js.map +1 -0
  276. package/dist/governance-activation/phase-governance.js +8 -2
  277. package/dist/governance-activation/phase-governance.js.map +1 -1
  278. package/dist/governance-activation/public-plans.d.ts +36 -0
  279. package/dist/governance-activation/public-plans.js +100 -0
  280. package/dist/governance-activation/public-plans.js.map +1 -0
  281. package/dist/governance-activation/read-only.d.ts +3 -1
  282. package/dist/governance-activation/read-only.js +7 -3
  283. package/dist/governance-activation/read-only.js.map +1 -1
  284. package/dist/governance-activation/reconciliation.js +10 -0
  285. package/dist/governance-activation/reconciliation.js.map +1 -1
  286. package/dist/governance-activation/seed-lifecycle.js +14 -25
  287. package/dist/governance-activation/seed-lifecycle.js.map +1 -1
  288. package/dist/governance-activation/source-of-truth.d.ts +21 -5
  289. package/dist/governance-activation/source-of-truth.js +102 -13
  290. package/dist/governance-activation/source-of-truth.js.map +1 -1
  291. package/dist/governance-activation/task-projection.d.ts +4 -1
  292. package/dist/governance-activation/task-projection.js +32 -3
  293. package/dist/governance-activation/task-projection.js.map +1 -1
  294. package/dist/governance-activation/task-writes.d.ts +42 -0
  295. package/dist/governance-activation/task-writes.js +250 -0
  296. package/dist/governance-activation/task-writes.js.map +1 -0
  297. package/dist/governance-activation/transition-files.d.ts +12 -0
  298. package/dist/governance-activation/transition-files.js +109 -0
  299. package/dist/governance-activation/transition-files.js.map +1 -0
  300. package/dist/governance-activation/transition-planning.d.ts +3 -1
  301. package/dist/governance-activation/transition-planning.js +158 -20
  302. package/dist/governance-activation/transition-planning.js.map +1 -1
  303. package/dist/governance-activation/transition-ports.d.ts +31 -3
  304. package/dist/governance-activation/transition-records.d.ts +11 -1
  305. package/dist/governance-activation/transition-records.js +52 -6
  306. package/dist/governance-activation/transition-records.js.map +1 -1
  307. package/dist/governance-activation/transitions.d.ts +5 -0
  308. package/dist/governance-activation/transitions.js +271 -37
  309. package/dist/governance-activation/transitions.js.map +1 -1
  310. package/dist/governance-assessment/engine.js +22 -15
  311. package/dist/governance-assessment/engine.js.map +1 -1
  312. package/dist/governance-assessment/project.d.ts +2 -0
  313. package/dist/governance-assessment/project.js +2 -1
  314. package/dist/governance-assessment/project.js.map +1 -1
  315. package/dist/interactive.d.ts +0 -1
  316. package/dist/interactive.js +3 -22
  317. package/dist/interactive.js.map +1 -1
  318. package/dist/openspec-profile.d.ts +2 -1
  319. package/dist/openspec-profile.js +11 -41
  320. package/dist/openspec-profile.js.map +1 -1
  321. package/dist/repository-governance.d.ts +10 -5
  322. package/dist/repository-governance.js +178 -92
  323. package/dist/repository-governance.js.map +1 -1
  324. package/dist/telemetry/contract.d.ts +1 -1
  325. package/dist/telemetry/contract.js +3 -0
  326. package/dist/telemetry/contract.js.map +1 -1
  327. package/dist/workstation-catalog.d.ts +13 -1
  328. package/dist/workstation-catalog.js +122 -0
  329. package/dist/workstation-catalog.js.map +1 -1
  330. package/dist/workstation.d.ts +69 -14
  331. package/dist/workstation.js +600 -215
  332. package/dist/workstation.js.map +1 -1
  333. package/docs/cli-reference.md +94 -23
  334. package/docs/configuration-and-manifests.md +11 -10
  335. package/docs/prerequisites.md +93 -18
  336. package/docs/repository-governance.md +68 -40
  337. package/docs/spec-workflows-and-agents.md +132 -13
  338. package/docs/troubleshooting.md +28 -0
  339. package/package.json +1 -1
@@ -0,0 +1,1583 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "versions": {
4
+ "liftoffVersion": "0.11.0",
5
+ "policyVersion": "6",
6
+ "activationContractVersion": 2,
7
+ "phaseGraphSchemaVersion": 1
8
+ },
9
+ "phases": [
10
+ {
11
+ "id": "seed-valid",
12
+ "label": "Generated bootstrap seed is strict-valid",
13
+ "dependencies": [],
14
+ "applicability": {
15
+ "kind": "always"
16
+ },
17
+ "allowedMutations": {
18
+ "local": [
19
+ "read-worktree",
20
+ "write-evidence",
21
+ "write-activation-state"
22
+ ],
23
+ "remote": [
24
+ "none"
25
+ ]
26
+ },
27
+ "evidence": {
28
+ "schema": "seed-valid.v1",
29
+ "required": true,
30
+ "headerSchemaVersion": 2,
31
+ "liveReadbackProviders": []
32
+ },
33
+ "approvalGate": {
34
+ "kind": "none",
35
+ "required": false,
36
+ "envelopeSchemaVersion": 2
37
+ },
38
+ "invalidationInputs": [
39
+ "project-files",
40
+ "policy",
41
+ "activation-identity"
42
+ ],
43
+ "rollback": {
44
+ "kind": "none",
45
+ "target": null,
46
+ "description": "No mutation is authorized by seed validation."
47
+ },
48
+ "terminalStates": [
49
+ "verified",
50
+ "failed"
51
+ ]
52
+ },
53
+ {
54
+ "id": "seed-verified",
55
+ "label": "Generated bootstrap baseline checks are verified",
56
+ "dependencies": [
57
+ {
58
+ "anyOf": [
59
+ "seed-valid"
60
+ ],
61
+ "accepts": [
62
+ "approved",
63
+ "verified",
64
+ "inapplicable",
65
+ "retained",
66
+ "disposed"
67
+ ],
68
+ "description": "Seed strict validation must pass first."
69
+ }
70
+ ],
71
+ "applicability": {
72
+ "kind": "always"
73
+ },
74
+ "allowedMutations": {
75
+ "local": [
76
+ "read-worktree",
77
+ "write-seed-tasks",
78
+ "write-evidence",
79
+ "write-activation-state"
80
+ ],
81
+ "remote": [
82
+ "none"
83
+ ]
84
+ },
85
+ "evidence": {
86
+ "schema": "seed-verified.v1",
87
+ "required": true,
88
+ "headerSchemaVersion": 2,
89
+ "liveReadbackProviders": []
90
+ },
91
+ "approvalGate": {
92
+ "kind": "none",
93
+ "required": false,
94
+ "envelopeSchemaVersion": 2
95
+ },
96
+ "invalidationInputs": [
97
+ "project-files",
98
+ "activation-identity"
99
+ ],
100
+ "rollback": {
101
+ "kind": "none",
102
+ "target": null,
103
+ "description": "A failed baseline leaves the seed active."
104
+ },
105
+ "terminalStates": [
106
+ "verified",
107
+ "failed"
108
+ ]
109
+ },
110
+ {
111
+ "id": "seed-archived",
112
+ "label": "Generated bootstrap seed is synced and archived",
113
+ "dependencies": [
114
+ {
115
+ "anyOf": [
116
+ "seed-verified"
117
+ ],
118
+ "accepts": [
119
+ "approved",
120
+ "verified",
121
+ "inapplicable",
122
+ "retained",
123
+ "disposed"
124
+ ],
125
+ "description": "Only a verified seed may be archived."
126
+ }
127
+ ],
128
+ "applicability": {
129
+ "kind": "always"
130
+ },
131
+ "allowedMutations": {
132
+ "local": [
133
+ "read-worktree",
134
+ "write-openspec-seed",
135
+ "write-evidence",
136
+ "write-activation-state"
137
+ ],
138
+ "remote": [
139
+ "none"
140
+ ]
141
+ },
142
+ "evidence": {
143
+ "schema": "seed-archived.v1",
144
+ "required": true,
145
+ "headerSchemaVersion": 2,
146
+ "liveReadbackProviders": []
147
+ },
148
+ "approvalGate": {
149
+ "kind": "none",
150
+ "required": false,
151
+ "envelopeSchemaVersion": 2
152
+ },
153
+ "invalidationInputs": [
154
+ "project-files",
155
+ "activation-identity"
156
+ ],
157
+ "rollback": {
158
+ "kind": "none",
159
+ "target": null,
160
+ "description": "Archive failures keep the seed active."
161
+ },
162
+ "terminalStates": [
163
+ "verified",
164
+ "failed"
165
+ ]
166
+ },
167
+ {
168
+ "id": "committed",
169
+ "label": "Initial repository baseline is committed",
170
+ "dependencies": [
171
+ {
172
+ "anyOf": [
173
+ "seed-archived"
174
+ ],
175
+ "accepts": [
176
+ "approved",
177
+ "verified",
178
+ "inapplicable",
179
+ "retained",
180
+ "disposed"
181
+ ],
182
+ "description": "Generated seed must be complete before commit guidance."
183
+ }
184
+ ],
185
+ "applicability": {
186
+ "kind": "always"
187
+ },
188
+ "allowedMutations": {
189
+ "local": [
190
+ "read-worktree",
191
+ "git-commit",
192
+ "write-evidence",
193
+ "write-activation-state"
194
+ ],
195
+ "remote": [
196
+ "none"
197
+ ]
198
+ },
199
+ "evidence": {
200
+ "schema": "committed.v1",
201
+ "required": true,
202
+ "headerSchemaVersion": 2,
203
+ "liveReadbackProviders": []
204
+ },
205
+ "approvalGate": {
206
+ "kind": "repository-publish",
207
+ "required": true,
208
+ "envelopeSchemaVersion": 2
209
+ },
210
+ "invalidationInputs": [
211
+ "baseline-sha",
212
+ "project-files",
213
+ "approval-envelope"
214
+ ],
215
+ "rollback": {
216
+ "kind": "none",
217
+ "target": null,
218
+ "description": "Never rewrite a committed user history automatically."
219
+ },
220
+ "terminalStates": [
221
+ "verified",
222
+ "failed"
223
+ ]
224
+ },
225
+ {
226
+ "id": "pushed",
227
+ "label": "Initial repository baseline is pushed",
228
+ "dependencies": [
229
+ {
230
+ "anyOf": [
231
+ "committed"
232
+ ],
233
+ "accepts": [
234
+ "approved",
235
+ "verified",
236
+ "inapplicable",
237
+ "retained",
238
+ "disposed"
239
+ ],
240
+ "description": "Commit evidence precedes initial push."
241
+ }
242
+ ],
243
+ "applicability": {
244
+ "kind": "always"
245
+ },
246
+ "allowedMutations": {
247
+ "local": [
248
+ "read-worktree",
249
+ "write-evidence",
250
+ "write-activation-state"
251
+ ],
252
+ "remote": [
253
+ "git-push",
254
+ "github-read"
255
+ ]
256
+ },
257
+ "evidence": {
258
+ "schema": "pushed.v1",
259
+ "required": true,
260
+ "headerSchemaVersion": 2,
261
+ "liveReadbackProviders": [
262
+ "github"
263
+ ]
264
+ },
265
+ "approvalGate": {
266
+ "kind": "repository-publish",
267
+ "required": true,
268
+ "envelopeSchemaVersion": 2
269
+ },
270
+ "invalidationInputs": [
271
+ "baseline-sha",
272
+ "approval-envelope"
273
+ ],
274
+ "rollback": {
275
+ "kind": "none",
276
+ "target": null,
277
+ "description": "Never force-push, delete, or rewrite refs."
278
+ },
279
+ "terminalStates": [
280
+ "verified",
281
+ "failed"
282
+ ]
283
+ },
284
+ {
285
+ "id": "phase-0-complete",
286
+ "label": "Read-only Phase 0 discovery is complete",
287
+ "dependencies": [
288
+ {
289
+ "anyOf": [
290
+ "pushed"
291
+ ],
292
+ "accepts": [
293
+ "approved",
294
+ "verified",
295
+ "inapplicable",
296
+ "retained",
297
+ "disposed"
298
+ ],
299
+ "description": "Remote repository identity must be resolvable."
300
+ }
301
+ ],
302
+ "applicability": {
303
+ "kind": "always"
304
+ },
305
+ "allowedMutations": {
306
+ "local": [
307
+ "write-evidence",
308
+ "write-activation-state"
309
+ ],
310
+ "remote": [
311
+ "github-read",
312
+ "azure-read"
313
+ ]
314
+ },
315
+ "evidence": {
316
+ "schema": "phase-0-complete.v1",
317
+ "required": true,
318
+ "headerSchemaVersion": 2,
319
+ "liveReadbackProviders": [
320
+ "github"
321
+ ]
322
+ },
323
+ "approvalGate": {
324
+ "kind": "none",
325
+ "required": false,
326
+ "envelopeSchemaVersion": 2
327
+ },
328
+ "invalidationInputs": [
329
+ "baseline-sha",
330
+ "policy",
331
+ "live-readback"
332
+ ],
333
+ "rollback": {
334
+ "kind": "none",
335
+ "target": null,
336
+ "description": "Discovery is read-only and can be refreshed."
337
+ },
338
+ "terminalStates": [
339
+ "verified",
340
+ "failed"
341
+ ]
342
+ },
343
+ {
344
+ "id": "activation-approved",
345
+ "label": "Governance activation plan is approved",
346
+ "dependencies": [
347
+ {
348
+ "anyOf": [
349
+ "phase-0-complete"
350
+ ],
351
+ "accepts": [
352
+ "approved",
353
+ "verified",
354
+ "inapplicable",
355
+ "retained",
356
+ "disposed"
357
+ ],
358
+ "description": "Approval reviews Phase 0 evidence."
359
+ }
360
+ ],
361
+ "applicability": {
362
+ "kind": "always"
363
+ },
364
+ "allowedMutations": {
365
+ "local": [
366
+ "write-openspec-governance",
367
+ "write-activation-state",
368
+ "write-evidence"
369
+ ],
370
+ "remote": [
371
+ "none"
372
+ ]
373
+ },
374
+ "evidence": {
375
+ "schema": "activation-approved.v1",
376
+ "required": false,
377
+ "headerSchemaVersion": 2,
378
+ "liveReadbackProviders": []
379
+ },
380
+ "approvalGate": {
381
+ "kind": "activation-plan",
382
+ "required": true,
383
+ "envelopeSchemaVersion": 2
384
+ },
385
+ "invalidationInputs": [
386
+ "baseline-sha",
387
+ "approval-envelope",
388
+ "policy"
389
+ ],
390
+ "rollback": {
391
+ "kind": "none",
392
+ "target": null,
393
+ "description": "Approval expiry returns descendants to blocked."
394
+ },
395
+ "terminalStates": [
396
+ "approved",
397
+ "failed"
398
+ ]
399
+ },
400
+ {
401
+ "id": "credential-ready",
402
+ "label": "Runner preflight credential policy is ready when required",
403
+ "dependencies": [
404
+ {
405
+ "anyOf": [
406
+ "activation-approved"
407
+ ],
408
+ "accepts": [
409
+ "approved",
410
+ "verified",
411
+ "inapplicable",
412
+ "retained",
413
+ "disposed"
414
+ ],
415
+ "description": "Credential enrollment follows approved activation scope."
416
+ }
417
+ ],
418
+ "applicability": {
419
+ "kind": "conditional",
420
+ "discriminator": "credential-required",
421
+ "when": "credentialRequired=true",
422
+ "inapplicableWhen": "credentialRequired=false",
423
+ "exclusiveWith": []
424
+ },
425
+ "allowedMutations": {
426
+ "local": [
427
+ "write-evidence",
428
+ "write-activation-state"
429
+ ],
430
+ "remote": [
431
+ "github-secret-write",
432
+ "github-read"
433
+ ]
434
+ },
435
+ "evidence": {
436
+ "schema": "credential-ready.v1",
437
+ "required": true,
438
+ "headerSchemaVersion": 2,
439
+ "liveReadbackProviders": [
440
+ "github"
441
+ ]
442
+ },
443
+ "approvalGate": {
444
+ "kind": "credential-enrollment",
445
+ "required": true,
446
+ "envelopeSchemaVersion": 2
447
+ },
448
+ "invalidationInputs": [
449
+ "credentials",
450
+ "approval-envelope",
451
+ "activation-identity"
452
+ ],
453
+ "rollback": {
454
+ "kind": "none",
455
+ "target": null,
456
+ "description": "Leaked or expired credentials block use and require rotation."
457
+ },
458
+ "terminalStates": [
459
+ "verified",
460
+ "failed",
461
+ "inapplicable"
462
+ ]
463
+ },
464
+ {
465
+ "id": "provider-ready",
466
+ "label": "Azure provider namespaces are terminal ready",
467
+ "dependencies": [
468
+ {
469
+ "anyOf": [
470
+ "activation-approved"
471
+ ],
472
+ "accepts": [
473
+ "approved",
474
+ "verified",
475
+ "inapplicable",
476
+ "retained",
477
+ "disposed"
478
+ ],
479
+ "description": "Provider readiness belongs to approved infrastructure scope."
480
+ },
481
+ {
482
+ "anyOf": [
483
+ "credential-ready"
484
+ ],
485
+ "accepts": [
486
+ "approved",
487
+ "verified",
488
+ "inapplicable",
489
+ "retained",
490
+ "disposed"
491
+ ],
492
+ "description": "Runner preflight credential readiness or inapplicability precedes provider work."
493
+ }
494
+ ],
495
+ "applicability": {
496
+ "kind": "conditional",
497
+ "discriminator": "private-staging-dast",
498
+ "when": "privateStagingDast=true",
499
+ "inapplicableWhen": "privateStagingDast=false",
500
+ "exclusiveWith": []
501
+ },
502
+ "allowedMutations": {
503
+ "local": [
504
+ "write-evidence",
505
+ "write-activation-state"
506
+ ],
507
+ "remote": [
508
+ "azure-read",
509
+ "azure-provider-register"
510
+ ]
511
+ },
512
+ "evidence": {
513
+ "schema": "provider-ready.v1",
514
+ "required": true,
515
+ "headerSchemaVersion": 2,
516
+ "liveReadbackProviders": [
517
+ "azure"
518
+ ]
519
+ },
520
+ "approvalGate": {
521
+ "kind": "infrastructure-cost",
522
+ "required": true,
523
+ "envelopeSchemaVersion": 2
524
+ },
525
+ "invalidationInputs": [
526
+ "provider-inventory",
527
+ "approval-envelope",
528
+ "policy"
529
+ ],
530
+ "rollback": {
531
+ "kind": "retain",
532
+ "target": null,
533
+ "description": "Provider registrations are retained subscription capabilities."
534
+ },
535
+ "terminalStates": [
536
+ "verified",
537
+ "failed",
538
+ "inapplicable",
539
+ "retained"
540
+ ]
541
+ },
542
+ {
543
+ "id": "state-path-selected",
544
+ "label": "Private state path is selected",
545
+ "dependencies": [
546
+ {
547
+ "anyOf": [
548
+ "provider-ready"
549
+ ],
550
+ "accepts": [
551
+ "approved",
552
+ "verified",
553
+ "inapplicable",
554
+ "retained",
555
+ "disposed"
556
+ ],
557
+ "description": "Provider readiness precedes private state path selection."
558
+ }
559
+ ],
560
+ "applicability": {
561
+ "kind": "conditional",
562
+ "discriminator": "private-staging-dast",
563
+ "when": "privateStagingDast=true",
564
+ "inapplicableWhen": "privateStagingDast=false",
565
+ "exclusiveWith": []
566
+ },
567
+ "allowedMutations": {
568
+ "local": [
569
+ "write-activation-state",
570
+ "write-evidence"
571
+ ],
572
+ "remote": [
573
+ "azure-read"
574
+ ]
575
+ },
576
+ "evidence": {
577
+ "schema": "state-path-selected.v1",
578
+ "required": true,
579
+ "headerSchemaVersion": 2,
580
+ "liveReadbackProviders": [
581
+ "azure"
582
+ ]
583
+ },
584
+ "approvalGate": {
585
+ "kind": "infrastructure-cost",
586
+ "required": true,
587
+ "envelopeSchemaVersion": 2
588
+ },
589
+ "invalidationInputs": [
590
+ "remote-state",
591
+ "provider-inventory",
592
+ "approval-envelope"
593
+ ],
594
+ "rollback": {
595
+ "kind": "none",
596
+ "target": null,
597
+ "description": "A changed path selection invalidates mutually exclusive descendants."
598
+ },
599
+ "terminalStates": [
600
+ "verified",
601
+ "failed",
602
+ "inapplicable"
603
+ ]
604
+ },
605
+ {
606
+ "id": "existing-private-path",
607
+ "label": "Existing private backend management path is verified",
608
+ "dependencies": [
609
+ {
610
+ "anyOf": [
611
+ "state-path-selected"
612
+ ],
613
+ "accepts": [
614
+ "approved",
615
+ "verified",
616
+ "inapplicable",
617
+ "retained",
618
+ "disposed"
619
+ ],
620
+ "description": "State path selection chooses this branch."
621
+ }
622
+ ],
623
+ "applicability": {
624
+ "kind": "conditional",
625
+ "discriminator": "state-path",
626
+ "when": "statePath=existing-private",
627
+ "inapplicableWhen": "statePath!=existing-private",
628
+ "exclusiveWith": [
629
+ "bootstrap-local"
630
+ ]
631
+ },
632
+ "allowedMutations": {
633
+ "local": [
634
+ "write-evidence",
635
+ "write-activation-state"
636
+ ],
637
+ "remote": [
638
+ "azure-read"
639
+ ]
640
+ },
641
+ "evidence": {
642
+ "schema": "existing-private-path.v1",
643
+ "required": true,
644
+ "headerSchemaVersion": 2,
645
+ "liveReadbackProviders": [
646
+ "azure"
647
+ ]
648
+ },
649
+ "approvalGate": {
650
+ "kind": "none",
651
+ "required": false,
652
+ "envelopeSchemaVersion": 2
653
+ },
654
+ "invalidationInputs": [
655
+ "remote-state",
656
+ "live-readback"
657
+ ],
658
+ "rollback": {
659
+ "kind": "none",
660
+ "target": null,
661
+ "description": "Existing path verification is read-only."
662
+ },
663
+ "terminalStates": [
664
+ "verified",
665
+ "failed",
666
+ "inapplicable"
667
+ ]
668
+ },
669
+ {
670
+ "id": "bootstrap-local",
671
+ "label": "Bounded local bootstrap creates access-establishing resources",
672
+ "dependencies": [
673
+ {
674
+ "anyOf": [
675
+ "provider-ready"
676
+ ],
677
+ "accepts": [
678
+ "approved",
679
+ "verified",
680
+ "inapplicable",
681
+ "retained",
682
+ "disposed"
683
+ ],
684
+ "description": "Provider readiness precedes local bootstrap."
685
+ },
686
+ {
687
+ "anyOf": [
688
+ "state-path-selected"
689
+ ],
690
+ "accepts": [
691
+ "approved",
692
+ "verified",
693
+ "inapplicable",
694
+ "retained",
695
+ "disposed"
696
+ ],
697
+ "description": "State path selection precedes local bootstrap."
698
+ }
699
+ ],
700
+ "applicability": {
701
+ "kind": "conditional",
702
+ "discriminator": "state-path",
703
+ "when": "statePath=bootstrap-local",
704
+ "inapplicableWhen": "statePath!=bootstrap-local",
705
+ "exclusiveWith": [
706
+ "existing-private-path"
707
+ ]
708
+ },
709
+ "allowedMutations": {
710
+ "local": [
711
+ "write-local-state",
712
+ "write-evidence",
713
+ "write-activation-state"
714
+ ],
715
+ "remote": [
716
+ "azure-network-provision",
717
+ "github-write"
718
+ ]
719
+ },
720
+ "evidence": {
721
+ "schema": "bootstrap-local.v1",
722
+ "required": true,
723
+ "headerSchemaVersion": 2,
724
+ "liveReadbackProviders": [
725
+ "github",
726
+ "azure"
727
+ ]
728
+ },
729
+ "approvalGate": {
730
+ "kind": "infrastructure-cost",
731
+ "required": true,
732
+ "envelopeSchemaVersion": 2
733
+ },
734
+ "invalidationInputs": [
735
+ "approval-envelope",
736
+ "provider-inventory",
737
+ "remote-state"
738
+ ],
739
+ "rollback": {
740
+ "kind": "reverse-to",
741
+ "target": "provider-ready",
742
+ "description": "Remove only repository-owned bootstrap resources in dependency order."
743
+ },
744
+ "terminalStates": [
745
+ "verified",
746
+ "failed",
747
+ "inapplicable"
748
+ ]
749
+ },
750
+ {
751
+ "id": "runner-ready",
752
+ "label": "Restricted larger runner is assigned and ready",
753
+ "dependencies": [
754
+ {
755
+ "anyOf": [
756
+ "bootstrap-local"
757
+ ],
758
+ "accepts": [
759
+ "approved",
760
+ "verified",
761
+ "inapplicable",
762
+ "retained",
763
+ "disposed"
764
+ ],
765
+ "description": "Local bootstrap must establish runner networking before runner proof."
766
+ }
767
+ ],
768
+ "applicability": {
769
+ "kind": "conditional",
770
+ "discriminator": "state-path",
771
+ "when": "statePath=bootstrap-local",
772
+ "inapplicableWhen": "statePath!=bootstrap-local",
773
+ "exclusiveWith": []
774
+ },
775
+ "allowedMutations": {
776
+ "local": [
777
+ "write-evidence",
778
+ "write-activation-state"
779
+ ],
780
+ "remote": [
781
+ "github-read",
782
+ "github-write"
783
+ ]
784
+ },
785
+ "evidence": {
786
+ "schema": "runner-ready.v1",
787
+ "required": true,
788
+ "headerSchemaVersion": 2,
789
+ "liveReadbackProviders": [
790
+ "github"
791
+ ]
792
+ },
793
+ "approvalGate": {
794
+ "kind": "infrastructure-cost",
795
+ "required": true,
796
+ "envelopeSchemaVersion": 2
797
+ },
798
+ "invalidationInputs": [
799
+ "runner-inventory",
800
+ "approval-envelope"
801
+ ],
802
+ "rollback": {
803
+ "kind": "reverse-to",
804
+ "target": "bootstrap-local",
805
+ "description": "Remove repository runner assignment before network resources."
806
+ },
807
+ "terminalStates": [
808
+ "verified",
809
+ "failed",
810
+ "inapplicable"
811
+ ]
812
+ },
813
+ {
814
+ "id": "private-backend-proof",
815
+ "label": "Private backend is reachable from runner",
816
+ "dependencies": [
817
+ {
818
+ "anyOf": [
819
+ "runner-ready"
820
+ ],
821
+ "accepts": [
822
+ "approved",
823
+ "verified",
824
+ "inapplicable",
825
+ "retained",
826
+ "disposed"
827
+ ],
828
+ "description": "Runner readiness precedes private backend proof."
829
+ }
830
+ ],
831
+ "applicability": {
832
+ "kind": "conditional",
833
+ "discriminator": "state-path",
834
+ "when": "statePath=bootstrap-local",
835
+ "inapplicableWhen": "statePath!=bootstrap-local",
836
+ "exclusiveWith": []
837
+ },
838
+ "allowedMutations": {
839
+ "local": [
840
+ "write-evidence",
841
+ "write-activation-state"
842
+ ],
843
+ "remote": [
844
+ "github-read",
845
+ "azure-read"
846
+ ]
847
+ },
848
+ "evidence": {
849
+ "schema": "private-backend-proof.v1",
850
+ "required": true,
851
+ "headerSchemaVersion": 2,
852
+ "liveReadbackProviders": [
853
+ "github",
854
+ "azure"
855
+ ]
856
+ },
857
+ "approvalGate": {
858
+ "kind": "none",
859
+ "required": false,
860
+ "envelopeSchemaVersion": 2
861
+ },
862
+ "invalidationInputs": [
863
+ "runner-inventory",
864
+ "remote-state",
865
+ "live-readback"
866
+ ],
867
+ "rollback": {
868
+ "kind": "reverse-to",
869
+ "target": "runner-ready",
870
+ "description": "Failed proof keeps remote import blocked."
871
+ },
872
+ "terminalStates": [
873
+ "verified",
874
+ "failed",
875
+ "inapplicable"
876
+ ]
877
+ },
878
+ {
879
+ "id": "remote-import-verified",
880
+ "label": "Declarative remote import and no-change plan are verified",
881
+ "dependencies": [
882
+ {
883
+ "anyOf": [
884
+ "private-backend-proof"
885
+ ],
886
+ "accepts": [
887
+ "approved",
888
+ "verified",
889
+ "inapplicable",
890
+ "retained",
891
+ "disposed"
892
+ ],
893
+ "description": "Private backend proof precedes remote import."
894
+ }
895
+ ],
896
+ "applicability": {
897
+ "kind": "conditional",
898
+ "discriminator": "state-path",
899
+ "when": "statePath=bootstrap-local",
900
+ "inapplicableWhen": "statePath!=bootstrap-local",
901
+ "exclusiveWith": []
902
+ },
903
+ "allowedMutations": {
904
+ "local": [
905
+ "write-evidence",
906
+ "write-activation-state"
907
+ ],
908
+ "remote": [
909
+ "azure-state-import"
910
+ ]
911
+ },
912
+ "evidence": {
913
+ "schema": "remote-import-verified.v1",
914
+ "required": true,
915
+ "headerSchemaVersion": 2,
916
+ "liveReadbackProviders": [
917
+ "azure"
918
+ ]
919
+ },
920
+ "approvalGate": {
921
+ "kind": "infrastructure-cost",
922
+ "required": true,
923
+ "envelopeSchemaVersion": 2
924
+ },
925
+ "invalidationInputs": [
926
+ "remote-state",
927
+ "approval-envelope"
928
+ ],
929
+ "rollback": {
930
+ "kind": "reverse-to",
931
+ "target": "private-backend-proof",
932
+ "description": "Failed import leaves local state retained for remediation."
933
+ },
934
+ "terminalStates": [
935
+ "verified",
936
+ "failed",
937
+ "inapplicable"
938
+ ]
939
+ },
940
+ {
941
+ "id": "remote-ready",
942
+ "label": "Remote state is ready and local bootstrap state is frozen",
943
+ "dependencies": [
944
+ {
945
+ "anyOf": [
946
+ "existing-private-path",
947
+ "remote-import-verified"
948
+ ],
949
+ "accepts": [
950
+ "approved",
951
+ "verified",
952
+ "inapplicable",
953
+ "retained",
954
+ "disposed"
955
+ ],
956
+ "description": "Remote readiness follows either existing private path or verified remote import."
957
+ }
958
+ ],
959
+ "applicability": {
960
+ "kind": "conditional",
961
+ "discriminator": "private-staging-dast",
962
+ "when": "privateStagingDast=true",
963
+ "inapplicableWhen": "privateStagingDast=false",
964
+ "exclusiveWith": []
965
+ },
966
+ "allowedMutations": {
967
+ "local": [
968
+ "write-evidence",
969
+ "write-activation-state"
970
+ ],
971
+ "remote": [
972
+ "azure-read"
973
+ ]
974
+ },
975
+ "evidence": {
976
+ "schema": "remote-ready.v1",
977
+ "required": true,
978
+ "headerSchemaVersion": 2,
979
+ "liveReadbackProviders": []
980
+ },
981
+ "approvalGate": {
982
+ "kind": "none",
983
+ "required": false,
984
+ "envelopeSchemaVersion": 2
985
+ },
986
+ "invalidationInputs": [
987
+ "remote-state",
988
+ "live-readback"
989
+ ],
990
+ "rollback": {
991
+ "kind": "retain",
992
+ "target": null,
993
+ "description": "Retain local bootstrap state read-only for exactly 30 days when used."
994
+ },
995
+ "terminalStates": [
996
+ "verified",
997
+ "failed",
998
+ "inapplicable",
999
+ "retained"
1000
+ ]
1001
+ },
1002
+ {
1003
+ "id": "application-foundation",
1004
+ "label": "Application infrastructure foundation is reconciled",
1005
+ "dependencies": [
1006
+ {
1007
+ "anyOf": [
1008
+ "remote-ready"
1009
+ ],
1010
+ "accepts": [
1011
+ "approved",
1012
+ "verified",
1013
+ "inapplicable",
1014
+ "retained",
1015
+ "disposed"
1016
+ ],
1017
+ "description": "Application resources wait for remote state readiness or inapplicability."
1018
+ }
1019
+ ],
1020
+ "applicability": {
1021
+ "kind": "always"
1022
+ },
1023
+ "allowedMutations": {
1024
+ "local": [
1025
+ "write-evidence",
1026
+ "write-openspec-governance",
1027
+ "write-activation-state"
1028
+ ],
1029
+ "remote": [
1030
+ "azure-resource-provision"
1031
+ ]
1032
+ },
1033
+ "evidence": {
1034
+ "schema": "application-foundation.v1",
1035
+ "required": true,
1036
+ "headerSchemaVersion": 2,
1037
+ "liveReadbackProviders": [
1038
+ "azure"
1039
+ ]
1040
+ },
1041
+ "approvalGate": {
1042
+ "kind": "infrastructure-cost",
1043
+ "required": true,
1044
+ "envelopeSchemaVersion": 2
1045
+ },
1046
+ "invalidationInputs": [
1047
+ "project-files",
1048
+ "remote-state",
1049
+ "approval-envelope"
1050
+ ],
1051
+ "rollback": {
1052
+ "kind": "reverse-to",
1053
+ "target": "remote-ready",
1054
+ "description": "Application resources are removed without unregistering providers."
1055
+ },
1056
+ "terminalStates": [
1057
+ "verified",
1058
+ "failed"
1059
+ ]
1060
+ },
1061
+ {
1062
+ "id": "workflow-source-ready",
1063
+ "label": "Workflow source and ruleset payloads are ready",
1064
+ "dependencies": [
1065
+ {
1066
+ "anyOf": [
1067
+ "application-foundation"
1068
+ ],
1069
+ "accepts": [
1070
+ "approved",
1071
+ "verified",
1072
+ "inapplicable",
1073
+ "retained",
1074
+ "disposed"
1075
+ ],
1076
+ "description": "Workflow source targets the reconciled application foundation."
1077
+ }
1078
+ ],
1079
+ "applicability": {
1080
+ "kind": "always"
1081
+ },
1082
+ "allowedMutations": {
1083
+ "local": [
1084
+ "write-workflows",
1085
+ "write-ruleset-source",
1086
+ "write-evidence",
1087
+ "write-activation-state"
1088
+ ],
1089
+ "remote": [
1090
+ "none"
1091
+ ]
1092
+ },
1093
+ "evidence": {
1094
+ "schema": "workflow-source-ready.v1",
1095
+ "required": true,
1096
+ "headerSchemaVersion": 2,
1097
+ "liveReadbackProviders": []
1098
+ },
1099
+ "approvalGate": {
1100
+ "kind": "none",
1101
+ "required": false,
1102
+ "envelopeSchemaVersion": 2
1103
+ },
1104
+ "invalidationInputs": [
1105
+ "project-files",
1106
+ "policy"
1107
+ ],
1108
+ "rollback": {
1109
+ "kind": "reverse-to",
1110
+ "target": "application-foundation",
1111
+ "description": "Remove or repair only workflow/ruleset source changes."
1112
+ },
1113
+ "terminalStates": [
1114
+ "verified",
1115
+ "failed"
1116
+ ]
1117
+ },
1118
+ {
1119
+ "id": "dev-proof",
1120
+ "label": "Development proof is green",
1121
+ "dependencies": [
1122
+ {
1123
+ "anyOf": [
1124
+ "workflow-source-ready"
1125
+ ],
1126
+ "accepts": [
1127
+ "approved",
1128
+ "verified",
1129
+ "inapplicable",
1130
+ "retained",
1131
+ "disposed"
1132
+ ],
1133
+ "description": "Workflow source must exist before proving checks."
1134
+ }
1135
+ ],
1136
+ "applicability": {
1137
+ "kind": "always"
1138
+ },
1139
+ "allowedMutations": {
1140
+ "local": [
1141
+ "write-evidence",
1142
+ "write-activation-state"
1143
+ ],
1144
+ "remote": [
1145
+ "github-read"
1146
+ ]
1147
+ },
1148
+ "evidence": {
1149
+ "schema": "dev-proof.v1",
1150
+ "required": true,
1151
+ "headerSchemaVersion": 2,
1152
+ "liveReadbackProviders": [
1153
+ "github"
1154
+ ]
1155
+ },
1156
+ "approvalGate": {
1157
+ "kind": "none",
1158
+ "required": false,
1159
+ "envelopeSchemaVersion": 2
1160
+ },
1161
+ "invalidationInputs": [
1162
+ "workflow-source",
1163
+ "project-files"
1164
+ ],
1165
+ "rollback": {
1166
+ "kind": "none",
1167
+ "target": null,
1168
+ "description": "A failed check blocks descendants until fixed."
1169
+ },
1170
+ "terminalStates": [
1171
+ "verified",
1172
+ "failed"
1173
+ ]
1174
+ },
1175
+ {
1176
+ "id": "staging-qualified",
1177
+ "label": "Staging release qualification is complete",
1178
+ "dependencies": [
1179
+ {
1180
+ "anyOf": [
1181
+ "dev-proof"
1182
+ ],
1183
+ "accepts": [
1184
+ "approved",
1185
+ "verified",
1186
+ "inapplicable",
1187
+ "retained",
1188
+ "disposed"
1189
+ ],
1190
+ "description": "Development proof precedes staging qualification."
1191
+ }
1192
+ ],
1193
+ "applicability": {
1194
+ "kind": "always"
1195
+ },
1196
+ "allowedMutations": {
1197
+ "local": [
1198
+ "write-evidence",
1199
+ "write-activation-state"
1200
+ ],
1201
+ "remote": [
1202
+ "github-read",
1203
+ "azure-read"
1204
+ ]
1205
+ },
1206
+ "evidence": {
1207
+ "schema": "staging-qualified.v1",
1208
+ "required": true,
1209
+ "headerSchemaVersion": 2,
1210
+ "liveReadbackProviders": [
1211
+ "github",
1212
+ "azure"
1213
+ ]
1214
+ },
1215
+ "approvalGate": {
1216
+ "kind": "none",
1217
+ "required": false,
1218
+ "envelopeSchemaVersion": 2
1219
+ },
1220
+ "invalidationInputs": [
1221
+ "workflow-source",
1222
+ "security-evidence",
1223
+ "live-readback"
1224
+ ],
1225
+ "rollback": {
1226
+ "kind": "none",
1227
+ "target": null,
1228
+ "description": "Qualification failures keep production blocked."
1229
+ },
1230
+ "terminalStates": [
1231
+ "verified",
1232
+ "failed"
1233
+ ]
1234
+ },
1235
+ {
1236
+ "id": "production-rehearsed",
1237
+ "label": "Production promotion and rollback are rehearsed",
1238
+ "dependencies": [
1239
+ {
1240
+ "anyOf": [
1241
+ "staging-qualified"
1242
+ ],
1243
+ "accepts": [
1244
+ "approved",
1245
+ "verified",
1246
+ "inapplicable",
1247
+ "retained",
1248
+ "disposed"
1249
+ ],
1250
+ "description": "Only a staging-qualified candidate may be rehearsed."
1251
+ }
1252
+ ],
1253
+ "applicability": {
1254
+ "kind": "always"
1255
+ },
1256
+ "allowedMutations": {
1257
+ "local": [
1258
+ "write-evidence",
1259
+ "write-activation-state"
1260
+ ],
1261
+ "remote": [
1262
+ "github-read",
1263
+ "azure-read"
1264
+ ]
1265
+ },
1266
+ "evidence": {
1267
+ "schema": "production-rehearsed.v1",
1268
+ "required": true,
1269
+ "headerSchemaVersion": 2,
1270
+ "liveReadbackProviders": [
1271
+ "github",
1272
+ "azure"
1273
+ ]
1274
+ },
1275
+ "approvalGate": {
1276
+ "kind": "none",
1277
+ "required": false,
1278
+ "envelopeSchemaVersion": 2
1279
+ },
1280
+ "invalidationInputs": [
1281
+ "live-readback",
1282
+ "workflow-source"
1283
+ ],
1284
+ "rollback": {
1285
+ "kind": "none",
1286
+ "target": null,
1287
+ "description": "Rollback remains ungated and documented."
1288
+ },
1289
+ "terminalStates": [
1290
+ "verified",
1291
+ "failed"
1292
+ ]
1293
+ },
1294
+ {
1295
+ "id": "green-red-proof",
1296
+ "label": "Required checks are proven green and deliberately red",
1297
+ "dependencies": [
1298
+ {
1299
+ "anyOf": [
1300
+ "production-rehearsed"
1301
+ ],
1302
+ "accepts": [
1303
+ "approved",
1304
+ "verified",
1305
+ "inapplicable",
1306
+ "retained",
1307
+ "disposed"
1308
+ ],
1309
+ "description": "Promotion rehearsal precedes final context proof."
1310
+ }
1311
+ ],
1312
+ "applicability": {
1313
+ "kind": "always"
1314
+ },
1315
+ "allowedMutations": {
1316
+ "local": [
1317
+ "write-evidence",
1318
+ "write-activation-state"
1319
+ ],
1320
+ "remote": [
1321
+ "github-read"
1322
+ ]
1323
+ },
1324
+ "evidence": {
1325
+ "schema": "green-red-proof.v1",
1326
+ "required": true,
1327
+ "headerSchemaVersion": 2,
1328
+ "liveReadbackProviders": [
1329
+ "github"
1330
+ ]
1331
+ },
1332
+ "approvalGate": {
1333
+ "kind": "none",
1334
+ "required": false,
1335
+ "envelopeSchemaVersion": 2
1336
+ },
1337
+ "invalidationInputs": [
1338
+ "security-evidence",
1339
+ "workflow-source"
1340
+ ],
1341
+ "rollback": {
1342
+ "kind": "none",
1343
+ "target": null,
1344
+ "description": "Missing red proof prevents enforcement."
1345
+ },
1346
+ "terminalStates": [
1347
+ "verified",
1348
+ "failed"
1349
+ ]
1350
+ },
1351
+ {
1352
+ "id": "enforcement-approved",
1353
+ "label": "Final ruleset enforcement is approved",
1354
+ "dependencies": [
1355
+ {
1356
+ "anyOf": [
1357
+ "green-red-proof"
1358
+ ],
1359
+ "accepts": [
1360
+ "approved",
1361
+ "verified",
1362
+ "inapplicable",
1363
+ "retained",
1364
+ "disposed"
1365
+ ],
1366
+ "description": "Only exact green/red evidence may request enforcement."
1367
+ }
1368
+ ],
1369
+ "applicability": {
1370
+ "kind": "always"
1371
+ },
1372
+ "allowedMutations": {
1373
+ "local": [
1374
+ "write-activation-state",
1375
+ "write-evidence"
1376
+ ],
1377
+ "remote": [
1378
+ "none"
1379
+ ]
1380
+ },
1381
+ "evidence": {
1382
+ "schema": "enforcement-approved.v1",
1383
+ "required": false,
1384
+ "headerSchemaVersion": 2,
1385
+ "liveReadbackProviders": []
1386
+ },
1387
+ "approvalGate": {
1388
+ "kind": "enforcement",
1389
+ "required": true,
1390
+ "envelopeSchemaVersion": 2
1391
+ },
1392
+ "invalidationInputs": [
1393
+ "approval-envelope",
1394
+ "ruleset-readback"
1395
+ ],
1396
+ "rollback": {
1397
+ "kind": "none",
1398
+ "target": null,
1399
+ "description": "Approval expiry blocks ruleset application."
1400
+ },
1401
+ "terminalStates": [
1402
+ "approved",
1403
+ "failed"
1404
+ ]
1405
+ },
1406
+ {
1407
+ "id": "rulesets-applied",
1408
+ "label": "Repository rulesets are applied idempotently last",
1409
+ "dependencies": [
1410
+ {
1411
+ "anyOf": [
1412
+ "enforcement-approved"
1413
+ ],
1414
+ "accepts": [
1415
+ "approved",
1416
+ "verified",
1417
+ "inapplicable",
1418
+ "retained",
1419
+ "disposed"
1420
+ ],
1421
+ "description": "Final enforcement approval precedes ruleset mutation."
1422
+ }
1423
+ ],
1424
+ "applicability": {
1425
+ "kind": "always"
1426
+ },
1427
+ "allowedMutations": {
1428
+ "local": [
1429
+ "write-evidence",
1430
+ "write-activation-state"
1431
+ ],
1432
+ "remote": [
1433
+ "github-ruleset-write",
1434
+ "github-read"
1435
+ ]
1436
+ },
1437
+ "evidence": {
1438
+ "schema": "rulesets-applied.v1",
1439
+ "required": true,
1440
+ "headerSchemaVersion": 2,
1441
+ "liveReadbackProviders": [
1442
+ "github"
1443
+ ]
1444
+ },
1445
+ "approvalGate": {
1446
+ "kind": "enforcement",
1447
+ "required": true,
1448
+ "envelopeSchemaVersion": 2
1449
+ },
1450
+ "invalidationInputs": [
1451
+ "approval-envelope",
1452
+ "ruleset-readback"
1453
+ ],
1454
+ "rollback": {
1455
+ "kind": "reverse-to",
1456
+ "target": "green-red-proof",
1457
+ "description": "Rulesets can be disabled or repaired without approval-gating rollback."
1458
+ },
1459
+ "terminalStates": [
1460
+ "verified",
1461
+ "failed"
1462
+ ]
1463
+ },
1464
+ {
1465
+ "id": "live-readback",
1466
+ "label": "Live enforcement readback matches source",
1467
+ "dependencies": [
1468
+ {
1469
+ "anyOf": [
1470
+ "rulesets-applied"
1471
+ ],
1472
+ "accepts": [
1473
+ "approved",
1474
+ "verified",
1475
+ "inapplicable",
1476
+ "retained",
1477
+ "disposed"
1478
+ ],
1479
+ "description": "Live readback follows ruleset application."
1480
+ }
1481
+ ],
1482
+ "applicability": {
1483
+ "kind": "always"
1484
+ },
1485
+ "allowedMutations": {
1486
+ "local": [
1487
+ "write-evidence",
1488
+ "write-activation-state"
1489
+ ],
1490
+ "remote": [
1491
+ "github-read"
1492
+ ]
1493
+ },
1494
+ "evidence": {
1495
+ "schema": "live-readback.v1",
1496
+ "required": true,
1497
+ "headerSchemaVersion": 2,
1498
+ "liveReadbackProviders": [
1499
+ "github"
1500
+ ]
1501
+ },
1502
+ "approvalGate": {
1503
+ "kind": "none",
1504
+ "required": false,
1505
+ "envelopeSchemaVersion": 2
1506
+ },
1507
+ "invalidationInputs": [
1508
+ "ruleset-readback",
1509
+ "live-readback"
1510
+ ],
1511
+ "rollback": {
1512
+ "kind": "reverse-to",
1513
+ "target": "rulesets-applied",
1514
+ "description": "Mismatched live readback blocks completion."
1515
+ },
1516
+ "terminalStates": [
1517
+ "verified",
1518
+ "failed"
1519
+ ]
1520
+ },
1521
+ {
1522
+ "id": "bootstrap-state-disposed",
1523
+ "label": "Retained local bootstrap state is disposed after day 30",
1524
+ "dependencies": [
1525
+ {
1526
+ "anyOf": [
1527
+ "live-readback"
1528
+ ],
1529
+ "accepts": [
1530
+ "approved",
1531
+ "verified",
1532
+ "inapplicable",
1533
+ "retained",
1534
+ "disposed"
1535
+ ],
1536
+ "description": "Disposal is scheduled only after live enforcement readback."
1537
+ }
1538
+ ],
1539
+ "applicability": {
1540
+ "kind": "conditional",
1541
+ "discriminator": "state-path",
1542
+ "when": "statePath=bootstrap-local",
1543
+ "inapplicableWhen": "statePath!=bootstrap-local",
1544
+ "exclusiveWith": []
1545
+ },
1546
+ "allowedMutations": {
1547
+ "local": [
1548
+ "delete-local-state",
1549
+ "write-evidence",
1550
+ "write-activation-state"
1551
+ ],
1552
+ "remote": [
1553
+ "none"
1554
+ ]
1555
+ },
1556
+ "evidence": {
1557
+ "schema": "bootstrap-state-disposed.v1",
1558
+ "required": true,
1559
+ "headerSchemaVersion": 2,
1560
+ "liveReadbackProviders": []
1561
+ },
1562
+ "approvalGate": {
1563
+ "kind": "destructive-disposal",
1564
+ "required": true,
1565
+ "envelopeSchemaVersion": 2
1566
+ },
1567
+ "invalidationInputs": [
1568
+ "remote-state",
1569
+ "approval-envelope"
1570
+ ],
1571
+ "rollback": {
1572
+ "kind": "dispose",
1573
+ "target": null,
1574
+ "description": "Deletion destroys only the local encryption key and records no payload."
1575
+ },
1576
+ "terminalStates": [
1577
+ "disposed",
1578
+ "failed",
1579
+ "inapplicable"
1580
+ ]
1581
+ }
1582
+ ]
1583
+ }