diff --git a/CHANGELOG.md b/CHANGELOG.md index 215b1e2..1a50298 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/README.md b/README.md index 36114c1..c073746 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/evaluations/cloudfall/findings.md b/evaluations/cloudfall/findings.md index 5a8cedc..b96fc48 100644 --- a/evaluations/cloudfall/findings.md +++ b/evaluations/cloudfall/findings.md @@ -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) | diff --git a/evaluations/cloudfall/readiness.md b/evaluations/cloudfall/readiness.md index ccf5196..86c1b02 100644 --- a/evaluations/cloudfall/readiness.md +++ b/evaluations/cloudfall/readiness.md @@ -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 diff --git a/evaluations/cloudfall/report-agent-dev.md b/evaluations/cloudfall/report-agent-dev.md index 60552f7..34787c8 100644 --- a/evaluations/cloudfall/report-agent-dev.md +++ b/evaluations/cloudfall/report-agent-dev.md @@ -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. diff --git a/evaluations/cloudfall/report-dev.md b/evaluations/cloudfall/report-dev.md index d9214fc..7db4328 100644 --- a/evaluations/cloudfall/report-dev.md +++ b/evaluations/cloudfall/report-dev.md @@ -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:** diff --git a/evaluations/cloudfall/report-issues.md b/evaluations/cloudfall/report-issues.md index 5f95ac8..119cdb8 100644 --- a/evaluations/cloudfall/report-issues.md +++ b/evaluations/cloudfall/report-issues.md @@ -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 diff --git a/evaluations/cloudfall/trace.md b/evaluations/cloudfall/trace.md index 0b26ba8..65b947e 100644 --- a/evaluations/cloudfall/trace.md +++ b/evaluations/cloudfall/trace.md @@ -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 ", "uv run cloudfall add server h1 --address ", "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 ", "uv run cloudfall add server h1 --address ", "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): diff --git a/examples/render-demo/render.yaml b/examples/render-demo/render.yaml index 2f6a413..9fcccac 100644 --- a/examples/render-demo/render.yaml +++ b/examples/render-demo/render.yaml @@ -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 diff --git a/pyproject.toml b/pyproject.toml index 6596dba..8f46c16 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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 = [ diff --git a/sdk/src/cloudfall/project.py b/sdk/src/cloudfall/project.py index 21c7cfe..cfd0db6 100644 --- a/sdk/src/cloudfall/project.py +++ b/sdk/src/cloudfall/project.py @@ -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" diff --git a/sdk/tests/test_project.py b/sdk/tests/test_project.py index 0e46676..652228f 100644 --- a/sdk/tests/test_project.py +++ b/sdk/tests/test_project.py @@ -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 diff --git a/site/public/index.html b/site/public/index.html index afa46b8..3e3f2fe 100644 --- a/site/public/index.html +++ b/site/public/index.html @@ -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" } @@ -240,8 +240,8 @@ How it works Status Manifesto - Docs - GitHub + Docs + GitHub @@ -262,8 +262,8 @@

Your servers, run by an agent.
With a record happened. Plain systemd and nginx. No Kubernetes.

@@ -303,7 +303,7 @@

Your servers, run by an agent.
With a record 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. - Read the proving-run reports + Read the proving-run reports

@@ -448,7 +448,7 @@

Not there yet

  • Broader service catalog: MySQL, Elasticsearch, RabbitMQ, Node runtimes
  • Enforced per-component resource limits for shared nodes
  • Importers beyond Render
  • -
  • Your existing Ansible inventory and playbooks as the config and the agent's tool list: design written, nothing built
  • +
  • Your existing Ansible inventory and playbooks as the config and the agent's tool list: design written, nothing built
  • @@ -459,12 +459,12 @@

    Not there yet

    Get started

    Sixty seconds to see how it thinks

    -
    $ git clone https://github.com/romamo/cloudfall && cd cloudfall +
    $ git clone https://github.com/cloudfall-dev/cloudfall && cd cloudfall $ uv run cloudfall config validate --project config/examples $ uv run cloudfall init ../my-project
    @@ -477,11 +477,11 @@

    Sixty seconds to see how it thinks

    Cloudfall
    AGPL-3.0-or-later · commercial exception reserved · © 2026 Cloudfall
    diff --git a/site/public/manifesto.html b/site/public/manifesto.html index 932532c..d2fc306 100644 --- a/site/public/manifesto.html +++ b/site/public/manifesto.html @@ -182,8 +182,8 @@ Why How it works Status - Docs - GitHub + Docs + GitHub @@ -339,8 +339,8 @@

    Open core, never crippled

    this document. File it.

    @@ -353,11 +353,11 @@

    Open core, never crippled

    Cloudfall
    AGPL-3.0-or-later · commercial exception reserved · © 2026 Cloudfall