cloudfall 0.7.0rc1__tar.gz → 0.7.0rc2__tar.gz

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 (393) hide show
  1. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/PKG-INFO +1 -1
  2. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/pyproject.toml +1 -1
  3. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/src/cloudfall_demo/server.py +46 -1
  4. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/src/cloudfall_demo/static/index.html +35 -0
  5. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/tests/test_demo.py +68 -0
  6. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/uv.lock +3 -3
  7. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/pyproject.toml +1 -1
  8. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/.ansible-lint +0 -0
  9. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/.gitignore +0 -0
  10. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/ARCHITECTURE.md +0 -0
  11. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/CHANGELOG.md +0 -0
  12. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/CODE_OF_CONDUCT.md +0 -0
  13. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/CONTRIBUTING.md +0 -0
  14. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/LICENSE +0 -0
  15. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/MANIFESTO.md +0 -0
  16. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/README.md +0 -0
  17. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/ROADMAP.md +0 -0
  18. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/SECURITY.md +0 -0
  19. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/Taskfile.yml +0 -0
  20. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/changelog.d/76-changed-from-play-stats.md +0 -0
  21. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/changelog.d/78-why-agent-turn.md +0 -0
  22. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/changelog.d/README.md +0 -0
  23. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/README.md +0 -0
  24. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/alert-rules/postgresql-down.yaml +0 -0
  25. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/applications/crm.yaml +0 -0
  26. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/components/crm-backend.yaml +0 -0
  27. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/domains/crm-site.yaml +0 -0
  28. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/logging-stacks/operations.yaml +0 -0
  29. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/operator-policies/production.yaml +0 -0
  30. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/server-types/debian-application.yaml +0 -0
  31. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/servers/h1.yaml +0 -0
  32. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/servers/h2.yaml +0 -0
  33. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/services/postgresql-main.yaml +0 -0
  34. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/services/redis-cache.yaml +0 -0
  35. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/ssh-public-keys/example-admin.yaml +0 -0
  36. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/agent-investigation.schema.json +0 -0
  37. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/alert-rule.schema.json +0 -0
  38. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/application.schema.json +0 -0
  39. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/artifact.schema.json +0 -0
  40. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/backup-receipt.schema.json +0 -0
  41. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/common.schema.json +0 -0
  42. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/component.schema.json +0 -0
  43. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/deployment-receipt.schema.json +0 -0
  44. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/domain.schema.json +0 -0
  45. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/environment-receipt.schema.json +0 -0
  46. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/logging-stack.schema.json +0 -0
  47. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/observed-domain.schema.json +0 -0
  48. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/observed-server.schema.json +0 -0
  49. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/operation-decision.schema.json +0 -0
  50. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/operation.schema.json +0 -0
  51. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/operator-policy.schema.json +0 -0
  52. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/operator-proposal.schema.json +0 -0
  53. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/release-receipt.schema.json +0 -0
  54. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/server-type.schema.json +0 -0
  55. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/server.schema.json +0 -0
  56. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/service.schema.json +0 -0
  57. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/ssh-public-key.schema.json +0 -0
  58. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/tests/invalid/missing-server/applications/crm.yaml +0 -0
  59. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/tests/invalid/missing-server/components/crm-backend.yaml +0 -0
  60. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/tests/invalid/missing-server/server-types/debian-application.yaml +0 -0
  61. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/tests/invalid/missing-server/servers/h1.yaml +0 -0
  62. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/tests/invalid/schema/components/component-unknown-field.yaml +0 -0
  63. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/tests/observed/compliant/h1.json +0 -0
  64. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/tests/observed/compliant/h2.json +0 -0
  65. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/README.md +0 -0
  66. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/.gitignore +0 -0
  67. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/ansible.cfg +0 -0
  68. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/inventories/production/hosts.yml +0 -0
  69. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/operations/converge.yml +0 -0
  70. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/operations/disk-report.yml +0 -0
  71. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/operations/journal-vacuum.yml +0 -0
  72. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/operations/postgresql-reinit.yml +0 -0
  73. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/operations/postgresql-restart.yml +0 -0
  74. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/operations/service-logs.yml +0 -0
  75. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/operations/shop-logrotate.yml +0 -0
  76. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/playbooks/disk-report.yml +0 -0
  77. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/playbooks/journal-vacuum.yml +0 -0
  78. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/playbooks/postgresql-reinit.yml +0 -0
  79. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/playbooks/postgresql-restart.yml +0 -0
  80. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/playbooks/postgresql.yml +0 -0
  81. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/playbooks/service-logs.yml +0 -0
  82. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/playbooks/shop-logrotate.yml +0 -0
  83. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/playbooks/shop.yml +0 -0
  84. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/disk-report-20261008170744.diff +0 -0
  85. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/disk-report-20261008170744.json +0 -0
  86. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/journal-vacuum-20261008171016.diff +0 -0
  87. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/journal-vacuum-20261008171016.json +0 -0
  88. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/postgresql-reinit-20261008171010.diff +0 -0
  89. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/postgresql-reinit-20261008171010.json +0 -0
  90. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/postgresql-restart-20261008170624.diff +0 -0
  91. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/postgresql-restart-20261008170624.json +0 -0
  92. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/service-logs-20261008170612.diff +0 -0
  93. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/service-logs-20261008170612.json +0 -0
  94. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/service-logs-20261008170740.diff +0 -0
  95. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/service-logs-20261008170740.json +0 -0
  96. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/service-logs-20261008170742.diff +0 -0
  97. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/service-logs-20261008170742.json +0 -0
  98. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/service-logs-20261008170838.diff +0 -0
  99. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/service-logs-20261008170838.json +0 -0
  100. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/service-logs-20261008170920.diff +0 -0
  101. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/service-logs-20261008170920.json +0 -0
  102. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/shop-logrotate-20261008170752.diff +0 -0
  103. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/shop-logrotate-20261008170752.json +0 -0
  104. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full-approved/disk-report-20261008204348.diff +0 -0
  105. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full-approved/disk-report-20261008204348.json +0 -0
  106. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full-approved/disk-report-20261008204421.diff +0 -0
  107. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full-approved/disk-report-20261008204421.json +0 -0
  108. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full-approved/postgresql-restart-20261008204358.diff +0 -0
  109. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full-approved/postgresql-restart-20261008204358.json +0 -0
  110. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full-approved/shop-logrotate-20261008204351.diff +0 -0
  111. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full-approved/shop-logrotate-20261008204351.json +0 -0
  112. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/scenario/break.yml +0 -0
  113. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/site.yml +0 -0
  114. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/src/cloudfall_demo/__init__.py +0 -0
  115. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/src/cloudfall_demo/static/evaluation.json +0 -0
  116. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/ansible-context.md +0 -0
  117. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/assets/logo.svg +0 -0
  118. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/availability-design.md +0 -0
  119. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/brownfield-design.md +0 -0
  120. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/decisions/2026-09-14-no-ansible-replacement.md +0 -0
  121. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/decisions/2026-09-14-no-nixos-base.md +0 -0
  122. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/decisions/2026-09-14-no-rust-rewrite.md +0 -0
  123. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/decisions.md +0 -0
  124. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/fleet-goals.md +0 -0
  125. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/getting-started.md +0 -0
  126. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/hybrid-storage-design.md +0 -0
  127. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/images/demo.png +0 -0
  128. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/landscape.md +0 -0
  129. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/logging-service-guide.md +0 -0
  130. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/neon-migration-guide.md +0 -0
  131. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/new-server-storage-guide.md +0 -0
  132. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/operator-guide.md +0 -0
  133. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-08-debian-container-m1.md +0 -0
  134. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-08-dns-cutover.md +0 -0
  135. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-08-guided-data-migration.md +0 -0
  136. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-08-hetzner-m1.md +0 -0
  137. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-08-hetzner-m2-m3.md +0 -0
  138. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-08-hetzner-m4-m5.md +0 -0
  139. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-08-render-cutover.md +0 -0
  140. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-10-hetzner-m7.md +0 -0
  141. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-10-hetzner-m8.md +0 -0
  142. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-10-hetzner-m9.md +0 -0
  143. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-11-hetzner-m10.md +0 -0
  144. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-10-08-disk-full-agent.md +0 -0
  145. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/render-migration-guide.md +0 -0
  146. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/secrets-guide.md +0 -0
  147. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/README.md +0 -0
  148. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/ansible.cfg +0 -0
  149. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/backup.yml +0 -0
  150. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/baseline.yml +0 -0
  151. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/bootstrap.yml +0 -0
  152. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/data.yml +0 -0
  153. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/deploy.yml +0 -0
  154. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/domains.yml +0 -0
  155. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/health.yml +0 -0
  156. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/inspect.yml +0 -0
  157. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/logging.yml +0 -0
  158. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/restart.yml +0 -0
  159. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/rollback.yml +0 -0
  160. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/services.yml +0 -0
  161. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/time.yml +0 -0
  162. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_access/defaults/main.yml +0 -0
  163. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_access/handlers/main.yml +0 -0
  164. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_access/meta/argument_specs.yml +0 -0
  165. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_access/meta/main.yml +0 -0
  166. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_access/tasks/main.yml +0 -0
  167. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_bootstrap/defaults/main.yml +0 -0
  168. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_bootstrap/meta/argument_specs.yml +0 -0
  169. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_bootstrap/meta/main.yml +0 -0
  170. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_bootstrap/tasks/main.yml +0 -0
  171. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_data_migration/defaults/main.yml +0 -0
  172. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_data_migration/meta/argument_specs.yml +0 -0
  173. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_data_migration/meta/main.yml +0 -0
  174. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_data_migration/tasks/main.yml +0 -0
  175. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_deploy/defaults/main.yml +0 -0
  176. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_deploy/meta/argument_specs.yml +0 -0
  177. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_deploy/meta/main.yml +0 -0
  178. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_deploy/tasks/health.yml +0 -0
  179. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_deploy/tasks/health_gate.yml +0 -0
  180. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_deploy/tasks/main.yml +0 -0
  181. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_deploy/tasks/restart.yml +0 -0
  182. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_deploy/tasks/rollback.yml +0 -0
  183. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_deploy/templates/component.service.j2 +0 -0
  184. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_firewall/defaults/main.yml +0 -0
  185. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_firewall/handlers/main.yml +0 -0
  186. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_firewall/meta/argument_specs.yml +0 -0
  187. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_firewall/meta/main.yml +0 -0
  188. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_firewall/tasks/main.yml +0 -0
  189. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_firewall/templates/nftables.conf.j2 +0 -0
  190. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_inspect/defaults/main.yml +0 -0
  191. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_inspect/meta/argument_specs.yml +0 -0
  192. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_inspect/meta/main.yml +0 -0
  193. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_inspect/tasks/main.yml +0 -0
  194. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/defaults/main.yml +0 -0
  195. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/handlers/main.yml +0 -0
  196. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/meta/argument_specs.yml +0 -0
  197. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/meta/main.yml +0 -0
  198. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/tasks/main.yml +0 -0
  199. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/alertmanager-defaults.j2 +0 -0
  200. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/alertmanager.yaml.j2 +0 -0
  201. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/grafana.ini.j2 +0 -0
  202. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/loki-datasource.yml.j2 +0 -0
  203. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/loki-systemd-override.conf.j2 +0 -0
  204. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/loki.yaml.j2 +0 -0
  205. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/nginx-loki-gateway.conf.j2 +0 -0
  206. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/prometheus-datasource.yml.j2 +0 -0
  207. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/prometheus-defaults.j2 +0 -0
  208. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/prometheus-rules.yaml.j2 +0 -0
  209. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/prometheus.yaml.j2 +0 -0
  210. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_collector/defaults/main.yml +0 -0
  211. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_collector/handlers/main.yml +0 -0
  212. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_collector/meta/argument_specs.yml +0 -0
  213. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_collector/meta/main.yml +0 -0
  214. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_collector/tasks/main.yml +0 -0
  215. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_collector/templates/alloy-systemd-override.conf.j2 +0 -0
  216. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_collector/templates/config.alloy.j2 +0 -0
  217. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_nginx_site/defaults/main.yml +0 -0
  218. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_nginx_site/handlers/main.yml +0 -0
  219. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_nginx_site/meta/argument_specs.yml +0 -0
  220. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_nginx_site/meta/main.yml +0 -0
  221. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_nginx_site/tasks/apply_virtual_host.yml +0 -0
  222. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_nginx_site/tasks/main.yml +0 -0
  223. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_nginx_site/templates/domain-site.conf.j2 +0 -0
  224. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/defaults/main.yml +0 -0
  225. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/handlers/main.yml +0 -0
  226. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/meta/argument_specs.yml +0 -0
  227. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/meta/main.yml +0 -0
  228. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/tasks/main.yml +0 -0
  229. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/templates/backup.service.j2 +0 -0
  230. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/templates/backup.sh.j2 +0 -0
  231. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/templates/backup.timer.j2 +0 -0
  232. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/templates/cloudfall.conf.j2 +0 -0
  233. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/templates/restore-check.service.j2 +0 -0
  234. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/templates/restore-check.sh.j2 +0 -0
  235. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/templates/restore-check.timer.j2 +0 -0
  236. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/defaults/main.yml +0 -0
  237. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/handlers/main.yml +0 -0
  238. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/meta/argument_specs.yml +0 -0
  239. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/meta/main.yml +0 -0
  240. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/tasks/main.yml +0 -0
  241. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/templates/backup.service.j2 +0 -0
  242. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/templates/backup.sh.j2 +0 -0
  243. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/templates/backup.timer.j2 +0 -0
  244. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/templates/cloudfall.conf.j2 +0 -0
  245. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/templates/restore-check.service.j2 +0 -0
  246. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/templates/restore-check.sh.j2 +0 -0
  247. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/templates/restore-check.timer.j2 +0 -0
  248. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_time/defaults/main.yml +0 -0
  249. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_time/meta/argument_specs.yml +0 -0
  250. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_time/meta/main.yml +0 -0
  251. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_time/tasks/main.yml +0 -0
  252. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_unattended_upgrades/defaults/main.yml +0 -0
  253. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_unattended_upgrades/meta/argument_specs.yml +0 -0
  254. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_unattended_upgrades/meta/main.yml +0 -0
  255. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_unattended_upgrades/tasks/main.yml +0 -0
  256. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/src/cloudfall_engine/__init__.py +0 -0
  257. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/src/cloudfall_engine/__main__.py +0 -0
  258. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/src/cloudfall_engine/ansible_inventory.py +0 -0
  259. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/src/cloudfall_engine/artifact.py +0 -0
  260. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/src/cloudfall_engine/cli.py +0 -0
  261. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/src/cloudfall_engine/playbook.py +0 -0
  262. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/src/cloudfall_engine/py.typed +0 -0
  263. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/tests/test_ansible_inventory.py +0 -0
  264. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/tests/test_artifact_builder.py +0 -0
  265. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/tests/test_deploy_templates.py +0 -0
  266. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/tests/test_firewall_templates.py +0 -0
  267. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/tests/test_logging_templates.py +0 -0
  268. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/tests/test_nginx_site_role.py +0 -0
  269. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/tests/test_nginx_site_templates.py +0 -0
  270. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/tests/test_playbook.py +0 -0
  271. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/tests/test_postgresql_templates.py +0 -0
  272. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/tests/test_time_role.py +0 -0
  273. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/.gitignore +0 -0
  274. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/README.md +0 -0
  275. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/ansible.cfg +0 -0
  276. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/inventories/production/hosts.yml +0 -0
  277. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/operations/converge.yml +0 -0
  278. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/operations/disk-report.yml +0 -0
  279. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/operations/journal-vacuum.yml +0 -0
  280. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/operations/postgresql-reinit.yml +0 -0
  281. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/operations/postgresql-restart.yml +0 -0
  282. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/operations/service-logs.yml +0 -0
  283. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/operations/shop-logrotate.yml +0 -0
  284. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/playbooks/disk-report.yml +0 -0
  285. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/playbooks/journal-vacuum.yml +0 -0
  286. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/playbooks/postgresql-reinit.yml +0 -0
  287. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/playbooks/postgresql-restart.yml +0 -0
  288. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/playbooks/postgresql.yml +0 -0
  289. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/playbooks/service-logs.yml +0 -0
  290. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/playbooks/shop-logrotate.yml +0 -0
  291. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/playbooks/shop.yml +0 -0
  292. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/disk-report-20261008170744.diff +0 -0
  293. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/disk-report-20261008170744.json +0 -0
  294. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/journal-vacuum-20261008171016.diff +0 -0
  295. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/journal-vacuum-20261008171016.json +0 -0
  296. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/postgresql-reinit-20261008171010.diff +0 -0
  297. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/postgresql-reinit-20261008171010.json +0 -0
  298. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/postgresql-restart-20261008170624.diff +0 -0
  299. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/postgresql-restart-20261008170624.json +0 -0
  300. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170612.diff +0 -0
  301. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170612.json +0 -0
  302. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170740.diff +0 -0
  303. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170740.json +0 -0
  304. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170742.diff +0 -0
  305. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170742.json +0 -0
  306. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170838.diff +0 -0
  307. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170838.json +0 -0
  308. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170920.diff +0 -0
  309. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170920.json +0 -0
  310. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/shop-logrotate-20261008170752.diff +0 -0
  311. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/shop-logrotate-20261008170752.json +0 -0
  312. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full-approved/disk-report-20261008204348.diff +0 -0
  313. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full-approved/disk-report-20261008204348.json +0 -0
  314. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full-approved/disk-report-20261008204421.diff +0 -0
  315. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full-approved/disk-report-20261008204421.json +0 -0
  316. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full-approved/postgresql-restart-20261008204358.diff +0 -0
  317. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full-approved/postgresql-restart-20261008204358.json +0 -0
  318. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full-approved/shop-logrotate-20261008204351.diff +0 -0
  319. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full-approved/shop-logrotate-20261008204351.json +0 -0
  320. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/scenario/break.yml +0 -0
  321. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/site.yml +0 -0
  322. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/render-demo/README.md +0 -0
  323. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/render-demo/pyproject.toml +0 -0
  324. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/render-demo/render.yaml +0 -0
  325. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/render-demo/src/demo/__init__.py +0 -0
  326. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/render-demo/src/demo/asgi.py +0 -0
  327. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/render-demo/uv.lock +0 -0
  328. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/README.md +0 -0
  329. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/__init__.py +0 -0
  330. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/__main__.py +0 -0
  331. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/agent_server.py +0 -0
  332. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/agent_tools.py +0 -0
  333. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/ansible_api.py +0 -0
  334. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/ansible_reader.py +0 -0
  335. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/app.py +0 -0
  336. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/audit.py +0 -0
  337. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/authoring.py +0 -0
  338. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/callback_plugins/__init__.py +0 -0
  339. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/callback_plugins/cloudfall_host_stats.py +0 -0
  340. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/catalog.py +0 -0
  341. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/cli.py +0 -0
  342. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/commands.py +0 -0
  343. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/cutover.py +0 -0
  344. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/dashboard.py +0 -0
  345. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/dashboard_server.py +0 -0
  346. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/decision.py +0 -0
  347. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/domain.py +0 -0
  348. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/importer.py +0 -0
  349. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/inventory.py +0 -0
  350. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/investigation.py +0 -0
  351. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/lifecycle.py +0 -0
  352. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/migrate.py +0 -0
  353. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/observation.py +0 -0
  354. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/observe.py +0 -0
  355. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/operations.py +0 -0
  356. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/operator.py +0 -0
  357. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/project.py +0 -0
  358. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/py.typed +0 -0
  359. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/recording.py +0 -0
  360. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/render_api.py +0 -0
  361. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/resources.py +0 -0
  362. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/secrets.py +0 -0
  363. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/service_evidence.py +0 -0
  364. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/validation.py +0 -0
  365. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/why.py +0 -0
  366. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_agent_server.py +0 -0
  367. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_ansible_reader.py +0 -0
  368. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_app.py +0 -0
  369. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_arguments.py +0 -0
  370. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_audit.py +0 -0
  371. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_authoring.py +0 -0
  372. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_catalog.py +0 -0
  373. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_commands.py +0 -0
  374. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_cutover.py +0 -0
  375. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_dashboard_server.py +0 -0
  376. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_data_migration.py +0 -0
  377. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_decision.py +0 -0
  378. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_host_stats.py +0 -0
  379. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_importer.py +0 -0
  380. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_inventory.py +0 -0
  381. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_investigation.py +0 -0
  382. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_lifecycle.py +0 -0
  383. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_migrate.py +0 -0
  384. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_observe.py +0 -0
  385. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_operations_dashboard.py +0 -0
  386. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_operator.py +0 -0
  387. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_project.py +0 -0
  388. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_render_api.py +0 -0
  389. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_resources.py +0 -0
  390. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_secrets.py +0 -0
  391. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_service_evidence.py +0 -0
  392. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_validation.py +0 -0
  393. {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_why.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: cloudfall
3
- Version: 0.7.0rc1
3
+ Version: 0.7.0rc2
4
4
  Summary: The operator's record for self-hosted servers run by an AI agent: Ansible executes, Cloudfall gates, verifies and keeps the receipts
5
5
  Project-URL: Homepage, https://cloudfall.dev
6
6
  Project-URL: Repository, https://github.com/cloudfall-dev/cloudfall
@@ -19,7 +19,7 @@ package = true
19
19
  [tool.uv.sources]
20
20
  # The demo is deployed from this directory alone, so Cloudfall comes from git,
21
21
  # pinned: bump the rev to ship a new Cloudfall to the demo.
22
- cloudfall = { git = "https://github.com/cloudfall-dev/cloudfall", rev = "9e51dc569a758504d82828e157dc6f65b9978bd9" }
22
+ cloudfall = { git = "https://github.com/cloudfall-dev/cloudfall", rev = "6b4807884de7cfe800548bbd90ad868a1393267c" }
23
23
 
24
24
  [build-system]
25
25
  requires = ["hatchling>=1.27"]
@@ -5,7 +5,9 @@ A visitor picks a model and runs the alert. The server runs the real
5
5
  recorded on a Hetzner host and streams its events to the page as they
6
6
  happen. The model is live, through Nebius Token Factory; the host is
7
7
  recorded, so nothing anyone does here can touch a server. Approving a
8
- decision plays back the approval that was recorded on the same host.
8
+ decision plays back an approval recorded on a real host broken the same
9
+ way. Once a run ends, ``cloudfall why`` answers from its record what the
10
+ agent proposed and what it was thinking in the turn that asked.
9
11
  """
10
12
 
11
13
  import asyncio
@@ -142,6 +144,48 @@ async def start_run(request: Request) -> Response:
142
144
  )
143
145
 
144
146
 
147
+ async def why(request: Request) -> Response:
148
+ """Answer from one run's record, as ``cloudfall why`` does, with the command."""
149
+ run_id = request.query_params.get("run", "")
150
+ run = INCIDENT / RUNS / run_id
151
+ if not run_id.isalnum() or not run.is_dir():
152
+ return JSONResponse({"error": "unknown run"}, status_code=404)
153
+ arguments = (
154
+ "why",
155
+ *("--decisions", (RUNS / run_id / "decisions").as_posix()),
156
+ *("--investigations", (RUNS / run_id / "investigations").as_posix()),
157
+ )
158
+ process = await asyncio.create_subprocess_exec(
159
+ _cloudfall(),
160
+ *arguments,
161
+ "--format",
162
+ "json",
163
+ cwd=INCIDENT,
164
+ env={**os.environ, "PATH": f"{_BIN}{os.pathsep}{os.environ['PATH']}"},
165
+ stdout=asyncio.subprocess.PIPE,
166
+ stderr=asyncio.subprocess.DEVNULL,
167
+ )
168
+ output, _ = await process.communicate()
169
+ envelope = json.loads(output)
170
+ if not envelope["ok"]:
171
+ return JSONResponse({"error": envelope["error"]["message"]}, status_code=500)
172
+ return JSONResponse(
173
+ {
174
+ "command": " ".join(["cloudfall", *arguments]),
175
+ "answers": [
176
+ {
177
+ "id": entry["id"],
178
+ "operation": entry["decision"]["spec"]["operation"]["id"],
179
+ "status": entry["decision"]["spec"]["status"],
180
+ "story": entry["story"],
181
+ "agent": entry.get("agent"),
182
+ }
183
+ for entry in envelope["data"]["answers"]
184
+ ],
185
+ }
186
+ )
187
+
188
+
145
189
  async def approve(request: Request) -> Response:
146
190
  """Play back the recorded approval of the operation a decision proposes."""
147
191
  body = await request.json()
@@ -387,6 +431,7 @@ app = Starlette(
387
431
  Route("/api/config", config),
388
432
  Route("/api/runs", start_run, methods=["POST"]),
389
433
  Route("/api/approve", approve, methods=["POST"]),
434
+ Route("/api/why", why),
390
435
  Route("/health", lambda _request: JSONResponse({"status": "ok"})),
391
436
  ]
392
437
  )
@@ -112,6 +112,13 @@ details summary { cursor: pointer; font: 500 .72rem var(--mono); color: var(--bl
112
112
  .command { font: .72rem var(--mono); background: var(--code); border: 1px solid var(--line); border-radius: 8px; padding: 8px 10px; margin-bottom: 12px; overflow-wrap: anywhere }
113
113
  .tools { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin-top: 10px }
114
114
  .tools button { border: 1.5px solid var(--line); background: var(--card); color: var(--ink); border-radius: 8px; padding: 5px 12px; font: 600 .82rem var(--body); cursor: pointer }
115
+ #record[hidden] { display: none }
116
+ .answer { background: var(--card); border: 1px solid var(--line); border-radius: 12px; padding: 14px; margin-top: 12px }
117
+ .answer .top { display: flex; justify-content: space-between; gap: 8px; align-items: center; flex-wrap: wrap }
118
+ .answer b { font: 700 1rem var(--display) }
119
+ .answer ol { margin: 10px 0 0; padding-left: 22px; font-size: .9rem }
120
+ .answer li { margin-bottom: 5px; overflow-wrap: anywhere }
121
+ .answer li.agent { background: color-mix(in srgb, var(--sun) 10%, transparent); border-left: 3px solid var(--sun); padding: 4px 8px; border-radius: 0 8px 8px 0; list-style-position: inside; margin-left: -22px }
115
122
  </style>
116
123
  </head>
117
124
  <body>
@@ -143,6 +150,12 @@ details summary { cursor: pointer; font: 500 .72rem var(--mono); color: var(--bl
143
150
  </div>
144
151
  </div>
145
152
 
153
+ <section class="more" id="record" hidden>
154
+ <h2>Ask the record why</h2>
155
+ <p class="status">After the run, Cloudfall answers from the files it wrote alone, not from the model: what was proposed, how it was checked, what gate it waits at, and which turn of which model asked for it, with that turn's reasoning.</p>
156
+ <div id="answers"></div>
157
+ </section>
158
+
146
159
  <section class="more">
147
160
  <h2>40 runs on a real broken host</h2>
148
161
  <p class="lede">The same alert, ten times per model, against a Hetzner server whose disk was really full. If the tools had run whatever the model asked:</p>
@@ -343,6 +356,25 @@ function showFinding(event) {
343
356
  $("#timeline").append(box);
344
357
  }
345
358
 
359
+ async function showRecord() {
360
+ const response = await fetch(`/api/why?run=${encodeURIComponent(state.run)}`);
361
+ const result = await response.json();
362
+ if (!response.ok) return;
363
+ const shown = result.answers.filter((entry) => entry.status !== "ran");
364
+ const answers = shown.map((entry) => el("div", { class: "answer" },
365
+ el("div", { class: "top" }, el("b", {}, entry.operation), el("span", { class: `badge b-${entry.status}` }, entry.status)),
366
+ el("code", { class: "ids" }, entry.id),
367
+ el("ol", {}, ...entry.story.map((sentence) =>
368
+ el("li", { class: /^(The agent |Its reasoning |That investigation )/.test(sentence) ? "agent" : "" }, sentence)))));
369
+ const reads = result.answers.length - shown.length;
370
+ $("#answers").replaceChildren(
371
+ el("div", { class: "command" }, el("span", { class: "label" }, "the server runs"), "$ " + result.command),
372
+ ...answers,
373
+ el("p", { class: "status" }, shown.length ? `${reads} read operation${reads === 1 ? "" : "s"} ran freely and are on the record too; the raw answer has them.` : "The model proposed no change; its reads are on the record."),
374
+ rawDetails("raw answer", JSON.stringify(result, null, 2)));
375
+ $("#record").hidden = false;
376
+ }
377
+
346
378
  function download() {
347
379
  const blob = new Blob([state.raw.join("\n") + "\n"], { type: "application/x-ndjson" });
348
380
  const link = el("a", { href: URL.createObjectURL(blob), download: `cloudfall-investigation-${state.run}.ndjson` });
@@ -351,10 +383,12 @@ function download() {
351
383
 
352
384
  async function run() {
353
385
  $("#run").disabled = true;
386
+ state.run = null;
354
387
  state.decisions.clear();
355
388
  state.events.clear();
356
389
  state.raw = [];
357
390
  $("#timeline").replaceChildren();
391
+ $("#record").hidden = true;
358
392
  $("#decisions").replaceChildren(el("p", { class: "empty" }, "Nothing proposed yet."));
359
393
  $("#status").textContent = "Running…";
360
394
  thinking(true);
@@ -385,6 +419,7 @@ async function run() {
385
419
  thinking(false);
386
420
  $("#run").disabled = false;
387
421
  }
422
+ if (state.run) await showRecord();
388
423
  }
389
424
 
390
425
  function handle(text, line) {
@@ -148,3 +148,71 @@ def test_a_decision_outside_the_runs_is_refused() -> None:
148
148
 
149
149
  assert response.status_code == 400
150
150
  assert json.loads(response.text)["error"] == "unknown decision"
151
+
152
+
153
+ def _investigated(run: str, decision: str) -> None:
154
+ """Record, in a run, the investigation whose second turn asked for it."""
155
+ investigations = server.INCIDENT / server.RUNS / run / "investigations"
156
+ investigations.mkdir(parents=True, exist_ok=True)
157
+ record = {
158
+ "apiVersion": "cloudfall/v1",
159
+ "kind": "AgentInvestigation",
160
+ "metadata": {"id": "investigation-20261011120000"},
161
+ "spec": {
162
+ "alert": server.ALERT,
163
+ "model": {"endpoint": server.BASE_URL, "name": "nvidia/nemotron"},
164
+ "startedAt": "2026-10-11T12:00:00Z",
165
+ "finishedAt": "2026-10-11T12:00:09Z",
166
+ "status": "answered",
167
+ "turns": 2,
168
+ "tokens": {"prompt": 100, "completion": 10},
169
+ "steps": [
170
+ {
171
+ "tool": "operation_shop_logrotate",
172
+ "arguments": {"target": "hz1"},
173
+ "outcome": "proposed",
174
+ "decision": decision,
175
+ "turn": 2,
176
+ }
177
+ ],
178
+ "answer": "",
179
+ "trace": [
180
+ {
181
+ "turn": 2,
182
+ "text": "",
183
+ "reasoning": "The shop logs filled the disk.",
184
+ "toolCalls": [],
185
+ "elapsedMs": 900,
186
+ "tokens": {"prompt": 100, "completion": 10, "reasoning": 6},
187
+ "responseId": "chatcmpl-2",
188
+ }
189
+ ],
190
+ },
191
+ }
192
+ (investigations / "investigation-20261011120000.json").write_text(
193
+ json.dumps(record), encoding="utf-8"
194
+ )
195
+
196
+
197
+ def test_the_record_tells_which_turn_asked_for_a_change() -> None:
198
+ decision = _proposed("testrun4", "shop-logrotate")
199
+ _investigated("testrun4", decision)
200
+ try:
201
+ result = CLIENT.get("/api/why", params={"run": "testrun4"}).json()
202
+ finally:
203
+ shutil.rmtree(server.INCIDENT / server.RUNS / "testrun4")
204
+
205
+ assert result["command"].startswith("cloudfall why --decisions tmp/runs/testrun4/")
206
+ [answer] = result["answers"]
207
+ assert (answer["operation"], answer["status"]) == ("shop-logrotate", "proposed")
208
+ assert answer["agent"]["turn"] == 2
209
+ assert any(
210
+ sentence.startswith("The agent nvidia/nemotron") and "in turn 2" in sentence
211
+ for sentence in answer["story"]
212
+ )
213
+ assert any("The shop logs filled the disk." in line for line in answer["story"])
214
+
215
+
216
+ def test_the_record_of_an_unknown_run_is_refused() -> None:
217
+ assert CLIENT.get("/api/why", params={"run": "nosuchrun"}).status_code == 404
218
+ assert CLIENT.get("/api/why", params={"run": "../x"}).status_code == 404
@@ -136,8 +136,8 @@ wheels = [
136
136
 
137
137
  [[package]]
138
138
  name = "cloudfall"
139
- version = "0.5.1"
140
- source = { git = "https://github.com/cloudfall-dev/cloudfall?rev=9e51dc569a758504d82828e157dc6f65b9978bd9#9e51dc569a758504d82828e157dc6f65b9978bd9" }
139
+ version = "0.6.0"
140
+ source = { git = "https://github.com/cloudfall-dev/cloudfall?rev=6b4807884de7cfe800548bbd90ad868a1393267c#6b4807884de7cfe800548bbd90ad868a1393267c" }
141
141
  dependencies = [
142
142
  { name = "ansible-core" },
143
143
  { name = "jsonschema", extra = ["format"] },
@@ -164,7 +164,7 @@ dev = [
164
164
 
165
165
  [package.metadata]
166
166
  requires-dist = [
167
- { name = "cloudfall", git = "https://github.com/cloudfall-dev/cloudfall?rev=9e51dc569a758504d82828e157dc6f65b9978bd9" },
167
+ { name = "cloudfall", git = "https://github.com/cloudfall-dev/cloudfall?rev=6b4807884de7cfe800548bbd90ad868a1393267c" },
168
168
  { name = "starlette", specifier = ">=0.46,<2" },
169
169
  { name = "uvicorn", specifier = ">=0.34,<1" },
170
170
  ]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cloudfall"
3
- version = "0.7.0rc1"
3
+ version = "0.7.0rc2"
4
4
  description = "The operator's record for self-hosted servers run by an AI agent: Ansible executes, Cloudfall gates, verifies and keeps the receipts"
5
5
  readme = "README.md"
6
6
  license = "AGPL-3.0-or-later"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes