Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@ Notable changes to Cloudfall. The format follows

### Changed

- The repository moved to the `cloudfall-dev` organization:
github.com/cloudfall-dev/cloudfall. The package metadata, the README,
the site and `REPOSITORY_URL` point there; the old
github.com/romamo/cloudfall address redirects
- **Breaking:** the CLI follows one name per meaning, and its output is
typed:
- Decision records have their own group: `decisions list` (was
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ The reference resource set lives in this repository, so validating it means
a clone:

```console
git clone https://github.com/romamo/cloudfall.git
git clone https://github.com/cloudfall-dev/cloudfall.git
cd cloudfall
uv sync
uv run cloudfall config validate --project config/examples
Expand Down
2 changes: 1 addition & 1 deletion evaluations/cloudfall/findings.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
| §61 | Bidirectional Pipe Payload Deadlock | Critical | 1/3 | 2026-09-14 | Reproduced: agent writes 1 MiB to stdin before reading stdout while `inventory show` (600-server project) writes 181 KB to stdout; after 10s the writer is stuck at 65,536 bytes and the CLI is stuck on a full stdout pipe, a deadlock until killed. Cloudfall never reads stdin and never detects or rejects piped input (no `STDIN_TOO_LARGE`); every input already comes from file flags (`--source-url-file`, `--api-key-file`, blueprint path), so agents have no reason to pipe |
| §62 | $EDITOR and $VISUAL Trap | Critical | 2/3 | 2026-09-14 | No command opens an editor (no `EDITOR`/`VISUAL` reads in sources); every authoring path is flag-driven: `add server` with `EDITOR=vim VISUAL=vim` exit 0 in 0.31s, `init` with empty `EDITOR` exit 0 in 0.15s, no git commit is made. Capped at 2: no schema declares `requires_editor`. Side finding: `init`'s `next` hint `uv run cloudfall config validate .` fails verbatim (exit 2, 'unrecognized arguments: .') |
| §64 | Headless Display and GUI Launch Blocking | Critical | 2/3 | 2026-09-14 | No command launches a browser or GUI (no `webbrowser`/`xdg-open` in sources); `dashboard serve --port 0` with `DISPLAY=` emitted `{"dashboard": {"url": "http://127.0.0.1:65098/", ...}, "status": "ok"}` at t=0.4s (explicit flush), then served until SIGTERM; `dashboard build` returns file paths in JSON. Capped at 2: no schema declares `headless_behavior` |
| §71 | Non-Interactive Installation Absence | Critical | 2/3 | 2026-09-14 | README documents `git clone … && uv sync` (and `uvx --from git+https://github.com/romamo/cloudfall.git cloudfall init`); `uv sync` with `CI=true` exit 0 twice (idempotent, 'Checked 70 packages'). Not 3: no AGENTS.md, and no verify command: `cloudfall --version` exits 2 ('the following arguments are required: command'). Fresh-clone install not re-run (existing checkout; `uvx` path needs network) |
| §71 | Non-Interactive Installation Absence | Critical | 2/3 | 2026-09-14 | README documents `git clone … && uv sync` (and `uvx --from git+https://github.com/cloudfall-dev/cloudfall.git cloudfall init`); `uv sync` with `CI=true` exit 0 twice (idempotent, 'Checked 70 packages'). Not 3: no AGENTS.md, and no verify command: `cloudfall --version` exits 2 ('the following arguments are required: command'). Fresh-clone install not re-run (existing checkout; `uvx` path needs network) |
| §10 | Interactivity & TTY Requirements | Critical | 2/3 | 2026-09-14 | No prompts, pager, or editor on any path; with stdin=/dev/null and a 5s cap every mutating command returned: `migrate` plan 0.28s exit 0 (execution gated by `--yes`, not a prompt), `restart`/`backup run`/`data migrate` 0.8–0.9s exit 1 with JSON `lifecycle_execution_failed` (unresolvable hosts). Ansible runs with `PasswordAuthentication=no`. Side finding: `rollback --release r1` crashes with a `ValueError` traceback. Held at 2, not 3: Ansible's SSH host-key confirmation for an unknown reachable host (read from /dev/tty, not stdin) is neither disabled nor exercised here |
| §11 | Timeouts & Hanging Processes | Critical | 1/3 | 2026-09-14 | Never hung, but no caller-set timeout: `--timeout 2` rejected (exit 2); only `operator approve --verify-timeout`. Built-in bounds: SSH `ConnectTimeout=10`, HTTP 30s (Render) / 10s (gateway), 3600s per engine step. `health` on blackholed 203.0.113.10/11 took 10.89s → exit 1 `"status": "unhealthy"` (the timeout is reported as an unhealthy app); `import render-api` took 30.19s → `render_api_unreachable` ('urlopen error timed out') exit 2. No `TIMEOUT` code, no exit 10, no `completed_steps` |
| §12 | Idempotency & Safe Retries | Critical | 1/3 | 2026-09-14 | No `--idempotency-key` (rejected, exit 2) and no `effect` field. Retries do not duplicate: a second identical `add server h8` / `add ssh-key` → `resource_exists` exit 2 (not a noop exit 0, so a retry after a lost response looks like a failure); `migrate --yes` persists progress in `--plan-file` and a re-run resumes at the recorded `next` step (plan mode writes nothing); engine playbooks are convergent Ansible. `init` on an existing dir reported `project_revision_uncommitted` before checking emptiness. `deploy` of the same release twice not exercised (needs a live host) |
Expand Down
2 changes: 1 addition & 1 deletion evaluations/cloudfall/readiness.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@

### 4. Setup Reproducibility — 1/3

- Install: `git clone https://github.com/romamo/cloudfall.git && cd cloudfall && uv sync` (README Quickstart); for projects `uvx --from git+https://github.com/romamo/cloudfall.git cloudfall init my-project`. Not on PyPI
- Install: `git clone https://github.com/cloudfall-dev/cloudfall.git && cd cloudfall && uv sync` (README Quickstart); for projects `uvx --from git+https://github.com/cloudfall-dev/cloudfall.git cloudfall init my-project`. Not on PyPI
- Non-interactive: yes. Idempotent: `uv sync --dry-run` reports "Would make no changes" (exit 0)
- Dependencies: declared in `pyproject.toml`, locked in `uv.lock`; `uv` provisions Python 3.14
- Verification fails: `cloudfall --version` exits 2; no `doctor`/health-check command. Install lives only in README
Expand Down
2 changes: 1 addition & 1 deletion evaluations/cloudfall/report-agent-dev.md
Original file line number Diff line number Diff line change
Expand Up @@ -976,7 +976,7 @@ if "url" in data and not data.get("opened", True):

### §71 — Non-Interactive Installation Absence [Critical · 2/3]

**Gap:** README documents `git clone … && uv sync` (and `uvx --from git+https://github.com/romamo/cloudfall.git cloudfall init`); `uv sync` with `CI=true` exit 0 twice (idempotent, 'Checked 70 packages'). Not 3: no AGENTS.md, and no verify command: `cloudfall --version` exits 2 ('the following arguments are required: command'). Fresh-clone install not re-run (existing checkout; `uvx` path needs network)
**Gap:** README documents `git clone … && uv sync` (and `uvx --from git+https://github.com/cloudfall-dev/cloudfall.git cloudfall init`); `uv sync` with `CI=true` exit 0 twice (idempotent, 'Checked 70 packages'). Not 3: no AGENTS.md, and no verify command: `cloudfall --version` exits 2 ('the following arguments are required: command'). Fresh-clone install not re-run (existing checkout; `uvx` path needs network)

**Workaround:**
Before attempting installation, scan AGENTS.md and README for an explicit non-interactive install command. Prefer commands that include `-y`, `--yes`, `--non-interactive`, `DEBIAN_FRONTEND=noninteractive`, or equivalent flags.
Expand Down
2 changes: 1 addition & 1 deletion evaluations/cloudfall/report-dev.md
Original file line number Diff line number Diff line change
Expand Up @@ -999,7 +999,7 @@ fi

### §71 — Non-Interactive Installation Absence [Critical · 2/3]

**Gap:** README documents `git clone … && uv sync` (and `uvx --from git+https://github.com/romamo/cloudfall.git cloudfall init`); `uv sync` with `CI=true` exit 0 twice (idempotent, 'Checked 70 packages'). Not 3: no AGENTS.md, and no verify command: `cloudfall --version` exits 2 ('the following arguments are required: command'). Fresh-clone install not re-run (existing checkout; `uvx` path needs network)
**Gap:** README documents `git clone … && uv sync` (and `uvx --from git+https://github.com/cloudfall-dev/cloudfall.git cloudfall init`); `uv sync` with `CI=true` exit 0 twice (idempotent, 'Checked 70 packages'). Not 3: no AGENTS.md, and no verify command: `cloudfall --version` exits 2 ('the following arguments are required: command'). Fresh-clone install not re-run (existing checkout; `uvx` path needs network)

**Solutions:**
**For CLI authors:**
Expand Down
2 changes: 1 addition & 1 deletion evaluations/cloudfall/report-issues.md
Original file line number Diff line number Diff line change
Expand Up @@ -381,7 +381,7 @@ These are not confirmed bugs but verified gaps — the CLI does not meet the bar

### §71 — Non-Interactive Installation Absence [Critical · score 2/3]

**What fails:** README documents `git clone … && uv sync` (and `uvx --from git+https://github.com/romamo/cloudfall.git cloudfall init`); `uv sync` with `CI=true` exit 0 twice (idempotent, 'Checked 70 packages'). Not 3: no AGENTS.md, and no verify command: `cloudfall --version` exits 2 ('the following arguments are required: command'). Fresh-clone install not re-run (existing checkout; `uvx` path needs network)
**What fails:** README documents `git clone … && uv sync` (and `uvx --from git+https://github.com/cloudfall-dev/cloudfall.git cloudfall init`); `uv sync` with `CI=true` exit 0 twice (idempotent, 'Checked 70 packages'). Not 3: no AGENTS.md, and no verify command: `cloudfall --version` exits 2 ('the following arguments are required: command'). Fresh-clone install not re-run (existing checkout; `uvx` path needs network)
**Frequency:** Common
**Token/time cost when it triggers:** Token Spend: Low · Time: Critical
**Workaround exists:** Partial
Expand Down
2 changes: 1 addition & 1 deletion evaluations/cloudfall/trace.md
Original file line number Diff line number Diff line change
Expand Up @@ -511,7 +511,7 @@ writer blocked=True wrote=65536 error=None at t=10.0s; cli alive=True (stuck wri

**stdout** (first 20 lines):
```
{"files": ["pyproject.toml", ".gitignore", "README.md", "servers/.gitkeep", "server-types/.gitkeep", "applications/.gitkeep", "components/.gitkeep", "domains/.gitkeep", "ssh-public-keys/.gitkeep", "logging-stacks/.gitkeep", "services/.gitkeep", "alert-rules/.gitkeep", "operator-policies/.gitkeep"], "next": ["cd /Users/roman/PycharmProjects/Atlas/tmp/eval/init-s62 && uv sync", "uv run cloudfall add ssh-key ~/.ssh/id_ed25519.pub --owner <you>", "uv run cloudfall add server h1 --address <ip-or-hostname>", "uv run cloudfall config validate ."], "project": {"directory": "/Users/roman/PycharmProjects/Atlas/tmp/eval/init-s62", "name": "init-s62", "revision": "b9677a68ceac642c42b300a219a2a552dab1f0da", "source": "https://github.com/romamo/cloudfall.git"}, "status": "ok"}
{"files": ["pyproject.toml", ".gitignore", "README.md", "servers/.gitkeep", "server-types/.gitkeep", "applications/.gitkeep", "components/.gitkeep", "domains/.gitkeep", "ssh-public-keys/.gitkeep", "logging-stacks/.gitkeep", "services/.gitkeep", "alert-rules/.gitkeep", "operator-policies/.gitkeep"], "next": ["cd /Users/roman/PycharmProjects/Atlas/tmp/eval/init-s62 && uv sync", "uv run cloudfall add ssh-key ~/.ssh/id_ed25519.pub --owner <you>", "uv run cloudfall add server h1 --address <ip-or-hostname>", "uv run cloudfall config validate ."], "project": {"directory": "/Users/roman/PycharmProjects/Atlas/tmp/eval/init-s62", "name": "init-s62", "revision": "b9677a68ceac642c42b300a219a2a552dab1f0da", "source": "https://github.com/cloudfall-dev/cloudfall.git"}, "status": "ok"}
```

**stderr** (first 20 lines):
Expand Down
2 changes: 1 addition & 1 deletion examples/render-demo/render.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ services:
- type: web
name: render-demo
runtime: python
repo: https://github.com/romamo/cloudfall
repo: https://github.com/cloudfall-dev/cloudfall
branch: main
rootDir: examples/render-demo
plan: free
Expand Down
6 changes: 3 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ dependencies = [

[project.urls]
Homepage = "https://cloudfall.dev"
Repository = "https://github.com/romamo/cloudfall"
Changelog = "https://github.com/romamo/cloudfall/blob/main/CHANGELOG.md"
Issues = "https://github.com/romamo/cloudfall/issues"
Repository = "https://github.com/cloudfall-dev/cloudfall"
Changelog = "https://github.com/cloudfall-dev/cloudfall/blob/main/CHANGELOG.md"
Issues = "https://github.com/cloudfall-dev/cloudfall/issues"

[project.optional-dependencies]
mcp = [
Expand Down
2 changes: 1 addition & 1 deletion sdk/src/cloudfall/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
_GIT_TIMEOUT_SECONDS = 30
_GIT_NOT_A_REPOSITORY_EXIT_CODE = 128

REPOSITORY_URL = "https://github.com/romamo/cloudfall"
REPOSITORY_URL = "https://github.com/cloudfall-dev/cloudfall"
"""Location of the Cloudfall repository, for links to its files."""

SECRETS_DIRECTORY = "secrets"
Expand Down
2 changes: 1 addition & 1 deletion sdk/tests/test_project.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ def test_init_links_the_guide_and_examples_at_the_pinned_release(
init_project(_options(directory))

readme = (directory / "README.md").read_text(encoding="utf-8")
base = "https://github.com/romamo/cloudfall"
base = "https://github.com/cloudfall-dev/cloudfall"
assert "[secrets guide][secrets-guide]" in readme
assert "[reference set][examples]" in readme
assert f"[cloudfall]: {base}\n" in readme
Expand Down
28 changes: 14 additions & 14 deletions site/public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@
"operatingSystem": "Linux",
"license": "https://www.gnu.org/licenses/agpl-3.0.html",
"offers": { "@type": "Offer", "price": "0", "priceCurrency": "USD" },
"sameAs": ["https://github.com/romamo/cloudfall"],
"sameAs": ["https://github.com/cloudfall-dev/cloudfall"],
"image": "https://cloudfall.dev/og.png"
}
</script>
Expand All @@ -240,8 +240,8 @@
<a class="hide-sm" href="#how">How it works</a>
<a class="hide-sm" href="#status">Status</a>
<a class="hide-sm" href="/manifesto">Manifesto</a>
<a href="https://github.com/romamo/cloudfall/blob/main/docs/render-migration-guide.md">Docs</a>
<a class="btn btn-ghost" href="https://github.com/romamo/cloudfall">GitHub</a>
<a href="https://github.com/cloudfall-dev/cloudfall/blob/main/docs/render-migration-guide.md">Docs</a>
<a class="btn btn-ghost" href="https://github.com/cloudfall-dev/cloudfall">GitHub</a>
</div>
</nav>
</div>
Expand All @@ -262,8 +262,8 @@ <h1>Your servers, run by an agent.<br>With a <span class="accent">record</span>
happened. Plain systemd and nginx. No Kubernetes.
</p>
<div class="cta">
<a class="btn btn-primary" href="https://github.com/romamo/cloudfall">View on GitHub</a>
<a class="btn btn-ghost" href="https://github.com/romamo/cloudfall/blob/main/docs/render-migration-guide.md">Read the migration guide</a>
<a class="btn btn-primary" href="https://github.com/cloudfall-dev/cloudfall">View on GitHub</a>
<a class="btn btn-ghost" href="https://github.com/cloudfall-dev/cloudfall/blob/main/docs/render-migration-guide.md">Read the migration guide</a>
</div>

<div class="term">
Expand Down Expand Up @@ -303,7 +303,7 @@ <h1>Your servers, run by an agent.<br>With a <span class="accent">record</span>
declared policy in 2m06s, proved a real backup restorable in a timer-driven drill,
and delivered an alert to a second machine across the public network, receipts
throughout.
<a href="https://github.com/romamo/cloudfall/tree/main/docs/proving-runs">Read the proving-run reports</a>
<a href="https://github.com/cloudfall-dev/cloudfall/tree/main/docs/proving-runs">Read the proving-run reports</a>
</p>
</div>
</div>
Expand Down Expand Up @@ -448,7 +448,7 @@ <h3>Not there yet</h3>
<li>Broader service catalog: MySQL, Elasticsearch, RabbitMQ, Node runtimes</li>
<li>Enforced per-component resource limits for shared nodes</li>
<li>Importers beyond Render</li>
<li>Your existing Ansible inventory and playbooks as the config and the agent's tool list: <a href="https://github.com/romamo/cloudfall/blob/main/docs/brownfield-design.md">design written</a>, nothing built</li>
<li>Your existing Ansible inventory and playbooks as the config and the agent's tool list: <a href="https://github.com/cloudfall-dev/cloudfall/blob/main/docs/brownfield-design.md">design written</a>, nothing built</li>
</ul>
</div>
</div>
Expand All @@ -459,12 +459,12 @@ <h3>Not there yet</h3>
<div class="wrap">
<div class="kicker">Get started</div>
<h2>Sixty seconds to see how it thinks</h2>
<div class="install"><span class="p">$</span> git clone https://github.com/romamo/cloudfall && cd cloudfall
<div class="install"><span class="p">$</span> git clone https://github.com/cloudfall-dev/cloudfall && cd cloudfall
<span class="p">$</span> uv run cloudfall config validate --project config/examples
<span class="p">$</span> uv run cloudfall init ../my-project</div>
<div class="cta">
<a class="btn btn-primary" href="https://github.com/romamo/cloudfall">Star on GitHub</a>
<a class="btn btn-ghost" href="https://github.com/romamo/cloudfall/blob/main/ROADMAP.md">See the roadmap</a>
<a class="btn btn-primary" href="https://github.com/cloudfall-dev/cloudfall">Star on GitHub</a>
<a class="btn btn-ghost" href="https://github.com/cloudfall-dev/cloudfall/blob/main/ROADMAP.md">See the roadmap</a>
</div>
</div>
</section>
Expand All @@ -477,11 +477,11 @@ <h2>Sixty seconds to see how it thinks</h2>
Cloudfall
</a>
<div class="links">
<a href="https://github.com/romamo/cloudfall">GitHub</a>
<a href="https://github.com/cloudfall-dev/cloudfall">GitHub</a>
<a href="/manifesto">Manifesto</a>
<a href="https://github.com/romamo/cloudfall/blob/main/ROADMAP.md">Roadmap</a>
<a href="https://github.com/romamo/cloudfall/blob/main/SECURITY.md">Security</a>
<a href="https://github.com/romamo/cloudfall/blob/main/CONTRIBUTING.md">Contributing</a>
<a href="https://github.com/cloudfall-dev/cloudfall/blob/main/ROADMAP.md">Roadmap</a>
<a href="https://github.com/cloudfall-dev/cloudfall/blob/main/SECURITY.md">Security</a>
<a href="https://github.com/cloudfall-dev/cloudfall/blob/main/CONTRIBUTING.md">Contributing</a>
</div>
<div class="license">AGPL-3.0-or-later · commercial exception reserved · © 2026 Cloudfall</div>
</div>
Expand Down
16 changes: 8 additions & 8 deletions site/public/manifesto.html
Original file line number Diff line number Diff line change
Expand Up @@ -182,8 +182,8 @@
<a class="hide-sm" href="/#why">Why</a>
<a class="hide-sm" href="/#how">How it works</a>
<a class="hide-sm" href="/#status">Status</a>
<a href="https://github.com/romamo/cloudfall/blob/main/docs/render-migration-guide.md">Docs</a>
<a class="btn btn-ghost" href="https://github.com/romamo/cloudfall">GitHub</a>
<a href="https://github.com/cloudfall-dev/cloudfall/blob/main/docs/render-migration-guide.md">Docs</a>
<a class="btn btn-ghost" href="https://github.com/cloudfall-dev/cloudfall">GitHub</a>
</div>
</nav>
</div>
Expand Down Expand Up @@ -339,8 +339,8 @@ <h2>Open core, never crippled</h2>
this document. File it.
</p>
<div class="cta">
<a class="btn btn-primary" href="https://github.com/romamo/cloudfall/issues">File an issue</a>
<a class="btn btn-ghost" href="https://github.com/romamo/cloudfall/blob/main/MANIFESTO.md">Read it on GitHub</a>
<a class="btn btn-primary" href="https://github.com/cloudfall-dev/cloudfall/issues">File an issue</a>
<a class="btn btn-ghost" href="https://github.com/cloudfall-dev/cloudfall/blob/main/MANIFESTO.md">Read it on GitHub</a>
</div>
</div>
</div>
Expand All @@ -353,11 +353,11 @@ <h2>Open core, never crippled</h2>
Cloudfall
</a>
<div class="links">
<a href="https://github.com/romamo/cloudfall">GitHub</a>
<a href="https://github.com/cloudfall-dev/cloudfall">GitHub</a>
<a href="/manifesto">Manifesto</a>
<a href="https://github.com/romamo/cloudfall/blob/main/ROADMAP.md">Roadmap</a>
<a href="https://github.com/romamo/cloudfall/blob/main/SECURITY.md">Security</a>
<a href="https://github.com/romamo/cloudfall/blob/main/CONTRIBUTING.md">Contributing</a>
<a href="https://github.com/cloudfall-dev/cloudfall/blob/main/ROADMAP.md">Roadmap</a>
<a href="https://github.com/cloudfall-dev/cloudfall/blob/main/SECURITY.md">Security</a>
<a href="https://github.com/cloudfall-dev/cloudfall/blob/main/CONTRIBUTING.md">Contributing</a>
</div>
<div class="license">AGPL-3.0-or-later · commercial exception reserved · © 2026 Cloudfall</div>
</div>
Expand Down
Loading