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.
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/PKG-INFO +1 -1
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/pyproject.toml +1 -1
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/src/cloudfall_demo/server.py +46 -1
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/src/cloudfall_demo/static/index.html +35 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/tests/test_demo.py +68 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/uv.lock +3 -3
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/pyproject.toml +1 -1
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/.ansible-lint +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/.gitignore +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/ARCHITECTURE.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/CHANGELOG.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/CODE_OF_CONDUCT.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/CONTRIBUTING.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/LICENSE +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/MANIFESTO.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/README.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/ROADMAP.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/SECURITY.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/Taskfile.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/changelog.d/76-changed-from-play-stats.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/changelog.d/78-why-agent-turn.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/changelog.d/README.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/README.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/alert-rules/postgresql-down.yaml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/applications/crm.yaml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/components/crm-backend.yaml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/domains/crm-site.yaml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/logging-stacks/operations.yaml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/operator-policies/production.yaml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/server-types/debian-application.yaml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/servers/h1.yaml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/servers/h2.yaml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/services/postgresql-main.yaml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/services/redis-cache.yaml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/ssh-public-keys/example-admin.yaml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/agent-investigation.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/alert-rule.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/application.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/artifact.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/backup-receipt.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/common.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/component.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/deployment-receipt.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/domain.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/environment-receipt.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/logging-stack.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/observed-domain.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/observed-server.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/operation-decision.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/operation.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/operator-policy.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/operator-proposal.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/release-receipt.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/server-type.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/server.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/service.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/schemas/v1/ssh-public-key.schema.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/tests/invalid/missing-server/applications/crm.yaml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/tests/invalid/missing-server/components/crm-backend.yaml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/tests/invalid/missing-server/server-types/debian-application.yaml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/tests/invalid/missing-server/servers/h1.yaml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/tests/invalid/schema/components/component-unknown-field.yaml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/tests/observed/compliant/h1.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/tests/observed/compliant/h2.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/README.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/.gitignore +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/ansible.cfg +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/inventories/production/hosts.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/operations/converge.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/operations/disk-report.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/operations/journal-vacuum.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/operations/postgresql-reinit.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/operations/postgresql-restart.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/operations/service-logs.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/operations/shop-logrotate.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/playbooks/disk-report.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/playbooks/journal-vacuum.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/playbooks/postgresql-reinit.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/playbooks/postgresql-restart.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/playbooks/postgresql.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/playbooks/service-logs.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/playbooks/shop-logrotate.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/playbooks/shop.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/disk-report-20261008170744.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/disk-report-20261008170744.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/journal-vacuum-20261008171016.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/journal-vacuum-20261008171016.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/postgresql-reinit-20261008171010.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/postgresql-reinit-20261008171010.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/postgresql-restart-20261008170624.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/postgresql-restart-20261008170624.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/service-logs-20261008170612.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/service-logs-20261008170612.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/service-logs-20261008170740.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/service-logs-20261008170740.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/service-logs-20261008170742.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/service-logs-20261008170742.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/service-logs-20261008170838.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/service-logs-20261008170838.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/service-logs-20261008170920.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/service-logs-20261008170920.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/shop-logrotate-20261008170752.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full/shop-logrotate-20261008170752.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full-approved/disk-report-20261008204348.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full-approved/disk-report-20261008204348.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full-approved/disk-report-20261008204421.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full-approved/disk-report-20261008204421.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full-approved/postgresql-restart-20261008204358.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full-approved/postgresql-restart-20261008204358.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full-approved/shop-logrotate-20261008204351.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/recordings/disk-full-approved/shop-logrotate-20261008204351.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/scenario/break.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/incident/site.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/src/cloudfall_demo/__init__.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/demo/src/cloudfall_demo/static/evaluation.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/ansible-context.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/assets/logo.svg +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/availability-design.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/brownfield-design.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/decisions/2026-09-14-no-ansible-replacement.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/decisions/2026-09-14-no-nixos-base.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/decisions/2026-09-14-no-rust-rewrite.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/decisions.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/fleet-goals.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/getting-started.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/hybrid-storage-design.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/images/demo.png +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/landscape.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/logging-service-guide.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/neon-migration-guide.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/new-server-storage-guide.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/operator-guide.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-08-debian-container-m1.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-08-dns-cutover.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-08-guided-data-migration.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-08-hetzner-m1.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-08-hetzner-m2-m3.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-08-hetzner-m4-m5.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-08-render-cutover.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-10-hetzner-m7.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-10-hetzner-m8.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-10-hetzner-m9.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-11-hetzner-m10.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-10-08-disk-full-agent.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/render-migration-guide.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/secrets-guide.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/README.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/ansible.cfg +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/backup.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/baseline.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/bootstrap.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/data.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/deploy.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/domains.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/health.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/inspect.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/logging.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/restart.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/rollback.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/services.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/playbooks/time.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_access/defaults/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_access/handlers/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_access/meta/argument_specs.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_access/meta/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_access/tasks/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_bootstrap/defaults/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_bootstrap/meta/argument_specs.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_bootstrap/meta/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_bootstrap/tasks/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_data_migration/defaults/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_data_migration/meta/argument_specs.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_data_migration/meta/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_data_migration/tasks/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_deploy/defaults/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_deploy/meta/argument_specs.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_deploy/meta/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_deploy/tasks/health.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_deploy/tasks/health_gate.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_deploy/tasks/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_deploy/tasks/restart.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_deploy/tasks/rollback.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_deploy/templates/component.service.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_firewall/defaults/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_firewall/handlers/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_firewall/meta/argument_specs.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_firewall/meta/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_firewall/tasks/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_firewall/templates/nftables.conf.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_inspect/defaults/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_inspect/meta/argument_specs.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_inspect/meta/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_inspect/tasks/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/defaults/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/handlers/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/meta/argument_specs.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/meta/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/tasks/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/alertmanager-defaults.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/alertmanager.yaml.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/grafana.ini.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/loki-datasource.yml.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/loki-systemd-override.conf.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/loki.yaml.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/nginx-loki-gateway.conf.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/prometheus-datasource.yml.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/prometheus-defaults.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/prometheus-rules.yaml.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_backend/templates/prometheus.yaml.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_collector/defaults/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_collector/handlers/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_collector/meta/argument_specs.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_collector/meta/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_collector/tasks/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_collector/templates/alloy-systemd-override.conf.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_logging_collector/templates/config.alloy.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_nginx_site/defaults/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_nginx_site/handlers/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_nginx_site/meta/argument_specs.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_nginx_site/meta/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_nginx_site/tasks/apply_virtual_host.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_nginx_site/tasks/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_nginx_site/templates/domain-site.conf.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/defaults/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/handlers/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/meta/argument_specs.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/meta/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/tasks/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/templates/backup.service.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/templates/backup.sh.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/templates/backup.timer.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/templates/cloudfall.conf.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/templates/restore-check.service.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/templates/restore-check.sh.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_postgresql/templates/restore-check.timer.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/defaults/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/handlers/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/meta/argument_specs.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/meta/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/tasks/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/templates/backup.service.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/templates/backup.sh.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/templates/backup.timer.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/templates/cloudfall.conf.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/templates/restore-check.service.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/templates/restore-check.sh.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_redis/templates/restore-check.timer.j2 +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_time/defaults/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_time/meta/argument_specs.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_time/meta/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_time/tasks/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_unattended_upgrades/defaults/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_unattended_upgrades/meta/argument_specs.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_unattended_upgrades/meta/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/ansible/roles/cloudfall_unattended_upgrades/tasks/main.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/src/cloudfall_engine/__init__.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/src/cloudfall_engine/__main__.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/src/cloudfall_engine/ansible_inventory.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/src/cloudfall_engine/artifact.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/src/cloudfall_engine/cli.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/src/cloudfall_engine/playbook.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/src/cloudfall_engine/py.typed +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/tests/test_ansible_inventory.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/tests/test_artifact_builder.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/tests/test_deploy_templates.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/tests/test_firewall_templates.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/tests/test_logging_templates.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/tests/test_nginx_site_role.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/tests/test_nginx_site_templates.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/tests/test_playbook.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/tests/test_postgresql_templates.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/engine/tests/test_time_role.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/.gitignore +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/README.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/ansible.cfg +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/inventories/production/hosts.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/operations/converge.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/operations/disk-report.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/operations/journal-vacuum.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/operations/postgresql-reinit.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/operations/postgresql-restart.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/operations/service-logs.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/operations/shop-logrotate.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/playbooks/disk-report.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/playbooks/journal-vacuum.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/playbooks/postgresql-reinit.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/playbooks/postgresql-restart.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/playbooks/postgresql.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/playbooks/service-logs.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/playbooks/shop-logrotate.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/playbooks/shop.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/disk-report-20261008170744.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/disk-report-20261008170744.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/journal-vacuum-20261008171016.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/journal-vacuum-20261008171016.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/postgresql-reinit-20261008171010.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/postgresql-reinit-20261008171010.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/postgresql-restart-20261008170624.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/postgresql-restart-20261008170624.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170612.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170612.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170740.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170740.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170742.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170742.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170838.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170838.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170920.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170920.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/shop-logrotate-20261008170752.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full/shop-logrotate-20261008170752.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full-approved/disk-report-20261008204348.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full-approved/disk-report-20261008204348.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full-approved/disk-report-20261008204421.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full-approved/disk-report-20261008204421.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full-approved/postgresql-restart-20261008204358.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full-approved/postgresql-restart-20261008204358.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full-approved/shop-logrotate-20261008204351.diff +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/recordings/disk-full-approved/shop-logrotate-20261008204351.json +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/scenario/break.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/disk-full-incident/site.yml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/render-demo/README.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/render-demo/pyproject.toml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/render-demo/render.yaml +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/render-demo/src/demo/__init__.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/render-demo/src/demo/asgi.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/examples/render-demo/uv.lock +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/README.md +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/__init__.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/__main__.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/agent_server.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/agent_tools.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/ansible_api.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/ansible_reader.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/app.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/audit.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/authoring.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/callback_plugins/__init__.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/callback_plugins/cloudfall_host_stats.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/catalog.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/cli.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/commands.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/cutover.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/dashboard.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/dashboard_server.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/decision.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/domain.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/importer.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/inventory.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/investigation.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/lifecycle.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/migrate.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/observation.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/observe.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/operations.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/operator.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/project.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/py.typed +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/recording.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/render_api.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/resources.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/secrets.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/service_evidence.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/validation.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/src/cloudfall/why.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_agent_server.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_ansible_reader.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_app.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_arguments.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_audit.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_authoring.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_catalog.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_commands.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_cutover.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_dashboard_server.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_data_migration.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_decision.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_host_stats.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_importer.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_inventory.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_investigation.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_lifecycle.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_migrate.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_observe.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_operations_dashboard.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_operator.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_project.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_render_api.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_resources.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_secrets.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_service_evidence.py +0 -0
- {cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/sdk/tests/test_validation.py +0 -0
- {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.
|
|
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 = "
|
|
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
|
|
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.
|
|
140
|
-
source = { git = "https://github.com/cloudfall-dev/cloudfall?rev=
|
|
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=
|
|
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.
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/server-types/debian-application.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/examples/ssh-public-keys/example-admin.yaml
RENAMED
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/tests/invalid/missing-server/applications/crm.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/config/tests/invalid/missing-server/servers/h1.yaml
RENAMED
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/decisions/2026-09-14-no-ansible-replacement.md
RENAMED
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-08-debian-container-m1.md
RENAMED
|
File without changes
|
|
File without changes
|
{cloudfall-0.7.0rc1 → cloudfall-0.7.0rc2}/docs/proving-runs/2026-09-08-guided-data-migration.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|