cloudfall 0.8.0rc14__tar.gz → 0.8.0rc15__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.8.0rc14 → cloudfall-0.8.0rc15}/PKG-INFO +1 -1
- cloudfall-0.8.0rc15/docs/decisions/2026-11-02-isolation-without-containers.md +155 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/decisions.md +8 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/pyproject.toml +1 -1
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/.ansible-lint +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/.gitignore +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/ARCHITECTURE.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/CHANGELOG.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/CODE_OF_CONDUCT.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/CONTRIBUTING.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/LICENSE +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/MANIFESTO.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/README.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/ROADMAP.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/SECURITY.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/Taskfile.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/106-enforce-manual-approval.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/113-component-build-validation.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/114-refuse-node-runtimes.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/115-component-build-steps.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/116-converge-one-domain.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/117-domains-apply.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/118-domains-observe.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/119-release-command.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/120-release-command-plan.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/121-owned-postgresql-validation.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/122-owned-postgresql-converge.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/123-postgresql-remote-access.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/124-data-copy-schema.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/125-data-copy-preflight.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/126-source-schema-checks.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/140-scram-verifier.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/143-audit-remote-access.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/144-pg-hba-reload-and-names.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/151-keep-hand-made-unit.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/159-domain-routes-validation.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/160-release-approve.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/161-command-health-check-schema.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/162-domain-routes-render.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/164-command-health-gate.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/165-migrate-approval-pause.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/166-command-check-restart-rollback-health.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/173-preflight-extension-arrays.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/174-no-templating-config-values.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/181-catalog-inputs-as-data.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/183-migrate-observations-missing.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/89-ci-deploy-guide.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/90-domain-upstream-early.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/96-healthcheck-none.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/97-stale-proposals.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/README.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/README.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/examples/alert-rules/postgresql-down.yaml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/examples/applications/crm.yaml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/examples/components/crm-backend.yaml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/examples/domains/crm-site.yaml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/examples/logging-stacks/operations.yaml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/examples/operator-policies/production.yaml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/examples/server-types/debian-application.yaml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/examples/servers/h1.yaml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/examples/servers/h2.yaml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/examples/services/postgresql-main.yaml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/examples/services/redis-cache.yaml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/examples/ssh-public-keys/example-admin.yaml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/agent-investigation.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/alert-rule.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/application.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/artifact.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/backup-receipt.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/common.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/component.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/deployment-receipt.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/domain.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/environment-receipt.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/logging-stack.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/observed-domain.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/observed-server.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/operation-decision.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/operation.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/operator-policy.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/operator-proposal.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/release-approval.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/release-receipt.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/server-type.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/server.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/service.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/ssh-public-key.schema.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/tests/invalid/missing-server/applications/crm.yaml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/tests/invalid/missing-server/components/crm-backend.yaml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/tests/invalid/missing-server/server-types/debian-application.yaml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/tests/invalid/missing-server/servers/h1.yaml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/tests/invalid/schema/components/component-unknown-field.yaml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/tests/observed/compliant/h1.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/tests/observed/compliant/h2.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/README.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/.gitignore +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/ansible.cfg +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/inventories/production/hosts.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/operations/converge.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/operations/disk-report.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/operations/journal-vacuum.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/operations/postgresql-reinit.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/operations/postgresql-restart.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/operations/service-logs.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/operations/shop-logrotate.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/playbooks/disk-report.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/playbooks/journal-vacuum.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/playbooks/postgresql-reinit.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/playbooks/postgresql-restart.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/playbooks/postgresql.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/playbooks/service-logs.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/playbooks/shop-logrotate.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/playbooks/shop.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full/disk-report-20261008170744.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full/disk-report-20261008170744.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full/journal-vacuum-20261008171016.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full/journal-vacuum-20261008171016.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full/postgresql-reinit-20261008171010.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full/postgresql-reinit-20261008171010.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full/postgresql-restart-20261008170624.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full/postgresql-restart-20261008170624.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full/service-logs-20261008170612.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full/service-logs-20261008170612.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full/service-logs-20261008170740.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full/service-logs-20261008170740.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full/service-logs-20261008170742.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full/service-logs-20261008170742.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full/service-logs-20261008170838.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full/service-logs-20261008170838.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full/service-logs-20261008170920.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full/service-logs-20261008170920.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full/shop-logrotate-20261008170752.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full/shop-logrotate-20261008170752.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full-approved/disk-report-20261008204348.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full-approved/disk-report-20261008204348.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full-approved/disk-report-20261008204421.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full-approved/disk-report-20261008204421.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full-approved/postgresql-restart-20261008204358.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full-approved/postgresql-restart-20261008204358.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full-approved/shop-logrotate-20261008204351.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/recordings/disk-full-approved/shop-logrotate-20261008204351.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/scenario/break.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/incident/site.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/pyproject.toml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/src/cloudfall_demo/__init__.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/src/cloudfall_demo/server.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/src/cloudfall_demo/static/evaluation.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/src/cloudfall_demo/static/index.html +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/tests/test_demo.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/demo/uv.lock +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/ansible-context.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/assets/logo.svg +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/availability-design.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/brownfield-design.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/ci-deploy-guide.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/decisions/2026-09-14-no-ansible-replacement.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/decisions/2026-09-14-no-nixos-base.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/decisions/2026-09-14-no-rust-rewrite.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/fleet-goals.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/getting-started.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/hybrid-storage-design.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/images/demo.png +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/landscape.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/logging-service-guide.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/neon-migration-guide.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/new-server-storage-guide.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/operator-guide.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/product.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/proving-runs/2026-09-08-debian-container-m1.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/proving-runs/2026-09-08-dns-cutover.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/proving-runs/2026-09-08-guided-data-migration.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/proving-runs/2026-09-08-hetzner-m1.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/proving-runs/2026-09-08-hetzner-m2-m3.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/proving-runs/2026-09-08-hetzner-m4-m5.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/proving-runs/2026-09-08-render-cutover.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/proving-runs/2026-09-10-hetzner-m7.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/proving-runs/2026-09-10-hetzner-m8.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/proving-runs/2026-09-10-hetzner-m9.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/proving-runs/2026-09-11-hetzner-m10.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/proving-runs/2026-10-08-disk-full-agent.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/render-migration-guide.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/secrets-guide.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/specs/001-stale-proposals.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/specs/002-component-build-steps.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/specs/003-domain-routes.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/specs/004-domains-apply.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/specs/005-release-command.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/specs/006-standalone-postgresql.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/specs/007-data-copy-schemas.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/specs/008-enforce-manual-approval.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/docs/specs/009-command-health-check.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/README.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/ansible.cfg +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/playbooks/backup.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/playbooks/baseline.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/playbooks/bootstrap.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/playbooks/data.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/playbooks/deploy.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/playbooks/domains-observe.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/playbooks/domains.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/playbooks/health.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/playbooks/inspect.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/playbooks/logging.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/playbooks/restart.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/playbooks/rollback.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/playbooks/services.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/playbooks/time.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_access/defaults/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_access/handlers/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_access/meta/argument_specs.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_access/meta/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_access/tasks/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_bootstrap/defaults/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_bootstrap/meta/argument_specs.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_bootstrap/meta/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_bootstrap/tasks/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_data_migration/defaults/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_data_migration/meta/argument_specs.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_data_migration/meta/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_data_migration/tasks/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_deploy/defaults/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_deploy/meta/argument_specs.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_deploy/meta/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_deploy/tasks/command_health_check.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_deploy/tasks/health.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_deploy/tasks/health_gate.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_deploy/tasks/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_deploy/tasks/release_command.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_deploy/tasks/release_receipt.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_deploy/tasks/restart.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_deploy/tasks/rollback.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_deploy/templates/component.service.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_firewall/defaults/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_firewall/handlers/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_firewall/meta/argument_specs.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_firewall/meta/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_firewall/tasks/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_firewall/templates/nftables.conf.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_inspect/defaults/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_inspect/meta/argument_specs.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_inspect/meta/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_inspect/tasks/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_backend/defaults/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_backend/handlers/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_backend/meta/argument_specs.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_backend/meta/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_backend/tasks/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_backend/templates/alertmanager-defaults.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_backend/templates/alertmanager.yaml.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_backend/templates/grafana.ini.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_backend/templates/loki-datasource.yml.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_backend/templates/loki-systemd-override.conf.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_backend/templates/loki.yaml.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_backend/templates/nginx-loki-gateway.conf.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_backend/templates/prometheus-datasource.yml.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_backend/templates/prometheus-defaults.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_backend/templates/prometheus-rules.yaml.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_backend/templates/prometheus.yaml.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_collector/defaults/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_collector/handlers/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_collector/meta/argument_specs.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_collector/meta/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_collector/tasks/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_collector/templates/alloy-systemd-override.conf.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_logging_collector/templates/config.alloy.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_nginx_site/defaults/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_nginx_site/handlers/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_nginx_site/meta/argument_specs.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_nginx_site/meta/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_nginx_site/tasks/apply_virtual_host.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_nginx_site/tasks/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_nginx_site/tasks/static_access.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_nginx_site/templates/domain-site.conf.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_postgresql/defaults/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_postgresql/handlers/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_postgresql/meta/argument_specs.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_postgresql/meta/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_postgresql/tasks/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_postgresql/tasks/owner_password.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_postgresql/templates/backup.service.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_postgresql/templates/backup.sh.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_postgresql/templates/backup.timer.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_postgresql/templates/cloudfall.conf.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_postgresql/templates/pg_hba-remote-access.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_postgresql/templates/restore-check.service.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_postgresql/templates/restore-check.sh.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_postgresql/templates/restore-check.timer.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_redis/defaults/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_redis/handlers/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_redis/meta/argument_specs.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_redis/meta/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_redis/tasks/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_redis/templates/backup.service.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_redis/templates/backup.sh.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_redis/templates/backup.timer.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_redis/templates/cloudfall.conf.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_redis/templates/restore-check.service.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_redis/templates/restore-check.sh.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_redis/templates/restore-check.timer.j2 +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_time/defaults/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_time/meta/argument_specs.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_time/meta/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_time/tasks/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_unattended_upgrades/defaults/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_unattended_upgrades/meta/argument_specs.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_unattended_upgrades/meta/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/ansible/roles/cloudfall_unattended_upgrades/tasks/main.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/src/cloudfall_engine/__init__.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/src/cloudfall_engine/__main__.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/src/cloudfall_engine/ansible_inventory.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/src/cloudfall_engine/artifact.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/src/cloudfall_engine/cli.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/src/cloudfall_engine/playbook.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/src/cloudfall_engine/py.typed +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/golden/examples/ansible-inventory.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/golden/examples/h1/nftables.conf +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/golden/examples/h1/postgresql-main/backup.sh +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/golden/examples/h1/postgresql-main/cloudfall.conf +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/golden/examples/h1/postgresql-main/restore-check.sh +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/golden/examples/h2/nftables.conf +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/golden/nginx-site/http-1.22.1.conf +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/golden/nginx-site/http-1.26.3.conf +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/golden/nginx-site/tls-1.22.1.conf +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/golden/nginx-site/tls-1.26.3.conf +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_ansible_inventory.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_artifact_build_steps.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_artifact_builder.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_command_health_gate.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_data_migration_role.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_deploy_role.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_deploy_templates.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_domains_certificate.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_domains_one_domain.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_domains_playbook.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_examples_render_unchanged.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_firewall_templates.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_logging_templates.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_nginx_site_role.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_nginx_site_routes.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_nginx_site_templates.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_playbook.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_postgresql_owner_role.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_postgresql_remote_access.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_postgresql_templates.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_release_command.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_services_passwords.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_time_role.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/engine/tests/test_unsafe_config_values.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/.gitignore +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/README.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/ansible.cfg +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/inventories/production/hosts.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/operations/converge.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/operations/disk-report.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/operations/journal-vacuum.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/operations/postgresql-reinit.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/operations/postgresql-restart.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/operations/service-logs.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/operations/shop-logrotate.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/playbooks/disk-report.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/playbooks/journal-vacuum.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/playbooks/postgresql-reinit.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/playbooks/postgresql-restart.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/playbooks/postgresql.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/playbooks/service-logs.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/playbooks/shop-logrotate.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/playbooks/shop.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full/disk-report-20261008170744.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full/disk-report-20261008170744.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full/journal-vacuum-20261008171016.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full/journal-vacuum-20261008171016.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full/postgresql-reinit-20261008171010.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full/postgresql-reinit-20261008171010.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full/postgresql-restart-20261008170624.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full/postgresql-restart-20261008170624.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170612.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170612.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170740.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170740.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170742.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170742.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170838.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170838.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170920.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full/service-logs-20261008170920.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full/shop-logrotate-20261008170752.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full/shop-logrotate-20261008170752.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full-approved/disk-report-20261008204348.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full-approved/disk-report-20261008204348.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full-approved/disk-report-20261008204421.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full-approved/disk-report-20261008204421.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full-approved/postgresql-restart-20261008204358.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full-approved/postgresql-restart-20261008204358.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full-approved/shop-logrotate-20261008204351.diff +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/recordings/disk-full-approved/shop-logrotate-20261008204351.json +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/scenario/break.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/disk-full-incident/site.yml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/render-demo/README.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/render-demo/pyproject.toml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/render-demo/render.yaml +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/render-demo/src/demo/__init__.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/render-demo/src/demo/asgi.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/examples/render-demo/uv.lock +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/README.md +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/__init__.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/__main__.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/agent_server.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/agent_tools.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/ansible_api.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/ansible_data.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/ansible_reader.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/app.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/audit.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/authoring.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/callback_plugins/__init__.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/callback_plugins/cloudfall_host_stats.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/catalog.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/cli.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/commands.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/cutover.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/dashboard.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/dashboard_server.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/decision.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/domain.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/importer.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/inventory.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/investigation.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/lifecycle.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/migrate.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/observation.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/observe.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/operations.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/operator.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/project.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/py.typed +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/recording.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/release_approval.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/render_api.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/resources.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/secrets.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/service_evidence.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/validation.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/src/cloudfall/why.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_agent_server.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_ansible_reader.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_app.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_arguments.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_audit.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_authoring.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_catalog.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_command_health_check.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_commands.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_component_build_validation.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_cutover.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_dashboard_server.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_data_copy_preflight.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_data_migration.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_decision.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_deploy_approval.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_domain_routes.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_domains_apply.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_domains_converge.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_domains_observe.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_host_stats.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_importer.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_inventory.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_investigation.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_lifecycle.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_migrate.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_migrate_approval.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_observe.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_operations_dashboard.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_operator.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_owned_postgresql.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_owned_postgresql_converge.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_project.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_release_approval.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_release_command_plan.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_render_api.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_resources.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_secrets.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_service_evidence.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_stale.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_validation.py +0 -0
- {cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/sdk/tests/test_why.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: cloudfall
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.0rc15
|
|
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
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Decision: isolation without containers or self-run VMs
|
|
2
|
+
|
|
3
|
+
Date: 2026-11-02. Status: decided, revisit on the triggers listed below.
|
|
4
|
+
|
|
5
|
+
## Question
|
|
6
|
+
|
|
7
|
+
How does Cloudfall keep components, runners and environments apart, and does
|
|
8
|
+
that need containers or virtual machines it runs itself?
|
|
9
|
+
|
|
10
|
+
## Decision
|
|
11
|
+
|
|
12
|
+
No containers and no hypervisor of Cloudfall's own. Isolation has two
|
|
13
|
+
boundaries:
|
|
14
|
+
|
|
15
|
+
- **Inside a server**, the boundary is the systemd sandbox of each unit, a
|
|
16
|
+
database role per component, and cgroup limits. This is required on every
|
|
17
|
+
server
|
|
18
|
+
- **Between trust levels**, the stronger boundary is a separate server: its
|
|
19
|
+
own kernel. A VPS counts as a server; its hypervisor belongs to the
|
|
20
|
+
provider, not to Cloudfall. This is recommended, not required
|
|
21
|
+
|
|
22
|
+
A team may run everything on one server, several independent projects
|
|
23
|
+
included, when it accepts the shared-kernel risk. The acceptance is declared
|
|
24
|
+
in the plan, never implied: Cloudfall warns about a placement that puts two
|
|
25
|
+
trust levels on one server unless the plan declares it.
|
|
26
|
+
|
|
27
|
+
A separate Unix user per component is necessary but is not a boundary on its
|
|
28
|
+
own.
|
|
29
|
+
|
|
30
|
+
## Why a Unix user is not enough
|
|
31
|
+
|
|
32
|
+
A user keeps files and signals apart. It does not stop:
|
|
33
|
+
|
|
34
|
+
- a local privilege escalation in the shared kernel, which reaches every
|
|
35
|
+
component on the host
|
|
36
|
+
- a database, cache or queue on localhost that trusts every local user, or
|
|
37
|
+
that components share one account of
|
|
38
|
+
- membership in the `docker` group or a broad sudo rule, either of which is
|
|
39
|
+
root
|
|
40
|
+
- a runner that executes code from a pull request or a compromised
|
|
41
|
+
dependency, which gets every key the runner holds; the keys, not the uid,
|
|
42
|
+
set the blast radius
|
|
43
|
+
- reading other processes' command lines in `/proc`, world-readable home
|
|
44
|
+
directories, and one component exhausting memory, disk or processes for
|
|
45
|
+
the rest
|
|
46
|
+
|
|
47
|
+
## Why not containers
|
|
48
|
+
|
|
49
|
+
Docker and Podman isolate with the same kernel mechanisms systemd exposes
|
|
50
|
+
directly: namespaces, cgroups, seccomp and capabilities. A container shares
|
|
51
|
+
the kernel exactly as a sandboxed unit does, so it adds no boundary. What it
|
|
52
|
+
adds is packaging (images, independent library versions) and a runtime to
|
|
53
|
+
operate. Cloudfall's base is Debian and systemd
|
|
54
|
+
([`2026-09-14-no-nixos-base.md`](2026-09-14-no-nixos-base.md)), container
|
|
55
|
+
orchestration is a non-goal ([`../product.md`](../product.md), N-1), and the
|
|
56
|
+
exit test is that any Linux admin can take over a server with Debian
|
|
57
|
+
knowledge.
|
|
58
|
+
|
|
59
|
+
## Why not self-run VMs
|
|
60
|
+
|
|
61
|
+
A hypervisor on Cloudfall's hosts (Proxmox, KVM, Firecracker) is a second
|
|
62
|
+
infrastructure layer to provision, patch, back up and explain to whoever
|
|
63
|
+
takes over. A separate small server gives the same kernel boundary for a
|
|
64
|
+
few euros a month and fits the model Cloudfall already manages.
|
|
65
|
+
|
|
66
|
+
## The target model
|
|
67
|
+
|
|
68
|
+
The first four parts are required on every server, one server or many. The
|
|
69
|
+
last is a recommendation.
|
|
70
|
+
|
|
71
|
+
**Each unit is sandboxed by systemd.** The component unit gets, by default:
|
|
72
|
+
|
|
73
|
+
- its own user (or `DynamicUser=`), `NoNewPrivileges=` and an empty
|
|
74
|
+
`CapabilityBoundingSet=`
|
|
75
|
+
- `ProtectSystem=strict`, `ProtectHome=`, `PrivateTmp=`, `PrivateDevices=`,
|
|
76
|
+
writes only to `ReadWritePaths=` and `StateDirectory=`
|
|
77
|
+
- `ProtectProc=invisible`, `SystemCallFilter=@system-service`,
|
|
78
|
+
`RestrictNamespaces=`, `RestrictAddressFamilies=`
|
|
79
|
+
- `IPAddressAllow=` and `IPAddressDeny=` where the component's peers are
|
|
80
|
+
known
|
|
81
|
+
- `MemoryMax=`, `CPUQuota=`, `TasksMax=` from the component's declared
|
|
82
|
+
envelope ([`../fleet-goals.md`](../fleet-goals.md), goal 8)
|
|
83
|
+
- secrets through `LoadCredentialEncrypted=` rather than `EnvironmentFile=`,
|
|
84
|
+
so a value is readable by that unit only and never sits in the process
|
|
85
|
+
environment
|
|
86
|
+
|
|
87
|
+
`systemd-analyze security` scores a unit; a score threshold can become a
|
|
88
|
+
deploy gate.
|
|
89
|
+
|
|
90
|
+
**Shared services authenticate per component.** Each component gets its own
|
|
91
|
+
PostgreSQL role, preferably through `peer` authentication over the Unix
|
|
92
|
+
socket, so the unit's user is the role and no password exists. A service
|
|
93
|
+
without authentication is never shared between components of different
|
|
94
|
+
owners.
|
|
95
|
+
|
|
96
|
+
**Runners are ephemeral and sandboxed.** A runner executes untrusted code.
|
|
97
|
+
It runs one job per transient unit started with `systemd-run` under the same
|
|
98
|
+
sandbox and `DynamicUser=`, its state removed after the job, and its network
|
|
99
|
+
open only for the dependency step. On a server that also runs production
|
|
100
|
+
components, the runner's unit is also denied the production components'
|
|
101
|
+
directories and network peers (`InaccessiblePaths=`, `IPAddressDeny=`) and
|
|
102
|
+
holds no production keys. This is the most exposed point of a one-server
|
|
103
|
+
placement.
|
|
104
|
+
|
|
105
|
+
**Access is scoped by environment.** A runner holds the SSH and age keys of
|
|
106
|
+
one environment ([`../ci-deploy-guide.md`](../ci-deploy-guide.md)). Deploys
|
|
107
|
+
log in as a dedicated user with sudo limited to the commands a deploy runs,
|
|
108
|
+
not as root.
|
|
109
|
+
|
|
110
|
+
**Separate servers separate trust levels (recommended).** Where the budget
|
|
111
|
+
allows, these do not share a kernel:
|
|
112
|
+
|
|
113
|
+
- production and staging
|
|
114
|
+
- build and CI, and production; production servers then receive built
|
|
115
|
+
artifacts only
|
|
116
|
+
- components of different customers or owners
|
|
117
|
+
|
|
118
|
+
A team can only accept risk for its own projects. Placing components of
|
|
119
|
+
different owners on one server puts the risk on owners who did not accept
|
|
120
|
+
it, so Cloudfall keeps a separate, stronger warning for it. Cloudfall cannot
|
|
121
|
+
verify ownership, so this stays a warning, not a refusal.
|
|
122
|
+
|
|
123
|
+
## Where Cloudfall is today
|
|
124
|
+
|
|
125
|
+
- Each component already runs as its own application user with
|
|
126
|
+
`NoNewPrivileges=true` and `PrivateTmp=true`
|
|
127
|
+
(`engine/ansible/roles/cloudfall_deploy/templates/component.service.j2`);
|
|
128
|
+
the rest of the sandbox is missing
|
|
129
|
+
- SSH keys are scoped by environment, but the baseline installs them into
|
|
130
|
+
root's `authorized_keys`, so a runner's key is root on every server of its
|
|
131
|
+
environment
|
|
132
|
+
- Secrets reach units through `EnvironmentFile=`
|
|
133
|
+
- Resource envelopes are not declared or enforced yet
|
|
134
|
+
|
|
135
|
+
## Triggers to revisit
|
|
136
|
+
|
|
137
|
+
- **A customer needs untrusted code from several tenants on one server**,
|
|
138
|
+
where a separate server per tenant does not pay; then a stronger sandbox
|
|
139
|
+
(gVisor, microVMs) is the question, not containers
|
|
140
|
+
- **A required workload ships only as a container image** with no reasonable
|
|
141
|
+
Debian install path
|
|
142
|
+
- **systemd sandboxing proves insufficient** for a concrete attack that a
|
|
143
|
+
container runtime would have stopped
|
|
144
|
+
|
|
145
|
+
## Consequences
|
|
146
|
+
|
|
147
|
+
- The component unit template gains the sandbox directives above as
|
|
148
|
+
defaults, with per-component opt-outs that are declared, not silent
|
|
149
|
+
- No container runtime, image build or registry appears in Cloudfall's
|
|
150
|
+
engine or docs as the way to isolate components
|
|
151
|
+
- One server is a supported placement, not a degraded one; the required
|
|
152
|
+
parts above carry the whole isolation there
|
|
153
|
+
- A plan that puts two trust levels on one server declares it as an
|
|
154
|
+
accepted risk; Cloudfall warns when it is undeclared, and warns again,
|
|
155
|
+
more strongly, when the trust levels belong to different owners
|
|
@@ -75,3 +75,11 @@ entry that supersedes it, never by editing an old one.
|
|
|
75
75
|
- Why: psql substitutes a variable into the statement text, so ALTER ROLE ... PASSWORD with the plaintext puts the password in the server's log under log_statement ddl or all, or on a failing statement; PostgreSQL stores a pre-hashed verifier as it is
|
|
76
76
|
- Applies to: engine/ansible/roles/cloudfall_postgresql/tasks/owner_password.yml, sdk/src/cloudfall/secrets.py, engine/src/cloudfall_engine/cli.py
|
|
77
77
|
- Enforced by: a regression test that the staged file holds a verifier and never the password
|
|
78
|
+
|
|
79
|
+
## D-10: Components are isolated by the systemd sandbox, and separate servers are recommended, not required
|
|
80
|
+
|
|
81
|
+
- Decided: 2026-11-02, by the maintainer; reasoning in docs/decisions/2026-11-02-isolation-without-containers.md
|
|
82
|
+
- Rule: On every server, components are kept apart by each unit's systemd sandbox (own user, ProtectSystem, ProtectHome, PrivateTmp, ProtectProc, SystemCallFilter, capability and address-family limits, cgroup limits), a database role per component, secrets through systemd credentials, keys scoped by environment and a non-root deploy user; runners are ephemeral sandboxed units, denied production directories, network peers and keys when they share a server with production; separate servers for different trust levels (production and staging, build or CI and production, different owners) are recommended, and a team may place everything on one server, several independent projects included, by declaring the accepted risk in the plan; Cloudfall warns about an undeclared placement of two trust levels on one server, and warns more strongly when they belong to different owners; Cloudfall adds no container runtime and no hypervisor of its own
|
|
83
|
+
- Why: A Unix user alone keeps only files and signals apart; containers use the same kernel mechanisms systemd exposes and add no boundary, only a runtime to operate; a separate kernel is the one stronger boundary and comes from a separate server, but requiring it would rule out the one-server teams Cloudfall serves, and a team can accept that risk for its own projects, not for other owners
|
|
84
|
+
- Applies to: engine/ansible/roles/cloudfall_deploy/templates/component.service.j2, engine/ansible/roles/cloudfall_access, server placement in plans, runner and CI setup
|
|
85
|
+
- Enforced by: review
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "cloudfall"
|
|
3
|
-
version = "0.8.
|
|
3
|
+
version = "0.8.0rc15"
|
|
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
|
|
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.8.0rc14 → cloudfall-0.8.0rc15}/changelog.d/166-command-check-restart-rollback-health.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
|
{cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/examples/alert-rules/postgresql-down.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/examples/operator-policies/production.yaml
RENAMED
|
File without changes
|
{cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/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.8.0rc14 → cloudfall-0.8.0rc15}/config/examples/ssh-public-keys/example-admin.yaml
RENAMED
|
File without changes
|
{cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/agent-investigation.schema.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/deployment-receipt.schema.json
RENAMED
|
File without changes
|
|
File without changes
|
{cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/environment-receipt.schema.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/config/schemas/v1/operation-decision.schema.json
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.8.0rc14 → cloudfall-0.8.0rc15}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudfall-0.8.0rc14 → cloudfall-0.8.0rc15}/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
|