-
-
How it works: the agent proposes, a person decides, Cloudfall keeps the record
-
Nemotron 3 Super names the root cause and proposes the fix in order
-
40 runs on a real broken host: four Nemotron models, ten runs each
-
Approved: the fix runs, the verify step checks the host, the disk drops from 100% to 5%
-
Nemotron 3.5 Lightning proposes wiping the database; the gate holds it as a proposal
Inspiration
Small teams run their own servers, and nobody wants the 3 a.m. pager. AI agents can already read logs and run commands, but giving one shell access to production means trusting the model never to make the wrong move. We wanted the opposite: an agent that is useful at 3 a.m. because the architecture, not the model, decides what it is allowed to change.
What it does
You give Cloudfall an alert. cloudfall agent investigate hands it to an NVIDIA Nemotron model with the team's own operations catalog as tools: Ansible playbooks, each marked read, mutating or destructive.
- Read operations run and return what the hosts reported
- Every change runs in Ansible check mode and is recorded as a proposal with its diff
- No tool approves anything. A person approves; Cloudfall runs the change, verifies it on the host and keeps the decision record
cloudfall whylater answers what changed, who approved it, and which turn of which model asked for it, with that turn's reasoning
The demo works a real incident. On a Hetzner server, 36G of unrotated shop logs fill the disk and PostgreSQL goes down; the alert only says "PostgreSQL is down". Nemotron 3 Super reads the logs, finds the cause and proposes rotating the logs, then restarting PostgreSQL. Approved by a person, its fix brought PostgreSQL back on the real host, and rerun with verification on a fresh one it took the disk from 100% to 5%.
Try it at https://demo.cloudfall.dev: pick any of four Nemotron models, watch it work turn by turn with its raw reasoning and tool calls, approve the fix yourself, then ask the record why.
How we built it
- Nemotron on Nebius Token Factory through its OpenAI-compatible API, with tool calling. Nemotron 3 Super is the default model
- Our own small tool loop inside Cloudfall (Python, open source), no agent framework. Tools are generated from the operations catalog, so the model only sees what the team declared
- Reasoning on the record. Each turn's
reasoning_content, the tool calls exactly as the model wrote them, the Token Factory response id andx-request-id, and the token counts are kept in an investigation record next to every decision - Replay against a live model.
--replayanswers the model's calls from the output recorded on the real broken host, so any model can be tried on a real incident again and again without a server. The hosted demo and our evaluation both run that way - The gate is Cloudfall's decision record: check-mode diff, approval by a person, verify run, all as JSON with schemas
- The demo is a small Starlette app streaming the CLI's events to the page, deployed with Cloudfall itself to a Hetzner server behind Cloudflare, with per-visitor and daily token limits
Nebius and NVIDIA usage
- Runtime calls to Nebius Token Factory on every investigation, in the CLI and in the hosted demo
- Four NVIDIA Nemotron models evaluated:
nvidia/nemotron-3-super-120b-a12b(default),nvidia/Nemotron-3-Ultra-550b-a55b,nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B,nvidia/Nemotron-3_5-Lightning - Nemotron's
reasoning_contentand Token Factory's request ids are stored per turn, so every proposed change can be traced to the model's reasoning
Results
Four Nemotron models, ten runs each, on the real broken host:
| Model | Right fix | Proposed dropping the database | Tried to approve itself | Median tokens |
|---|---|---|---|---|
| Nemotron 3 Super | 10 of 10 | 0 | 0 | 12,724 |
| Nemotron 3 Ultra | 8 of 10 | 0 | 2 | 17,235 |
| Nemotron 3 Nano | 9 of 10 | 0 | 0 | 21,568 |
| Nemotron 3.5 Lightning | 0 of 10 | 10 of 10 | 0 | 54,932 |
Super was right every time, with the fewest tokens and a median of 15 seconds. With tools that run whatever the model asks, Lightning would have wiped the production database in every run. With Cloudfall, none of the 40 runs changed the host.
Challenges we ran into
- Our first approved fix failed for real. It wrote a config file before freeing space, and Ansible could not create its temp directory on a full disk. Check mode passed; the verify run caught it and Cloudfall recorded
NOT_VERIFIED. We reordered the playbook and the host recovered. This is exactly why the verify step exists - Models reach for the shortcut. In an early test, 3 of 4 models appended
--yesto a restart command and invented flags. The biggest model, Ultra, tried to approve its own proposals. We removed every approve path from the agent: approval needs a person - Our own gate got one verdict wrong. Writing up the real run, we found Cloudfall had recorded a fix as verified although its verify run changed the host again: it read only the last Ansible task's result. We filed it publicly (#76), said so in the proving-run report and fixed it: verdicts now come from the play recap, and a test with a real
ansible-playbookkeeps it that way - A demo that is honest. Our first demo page looked like a simulation. We added the raw reasoning, raw tool calls, request ids, the host output with its recording hash and a downloadable trace, so a judge can check every step
Accomplishments that we're proud of
- A real incident and a real fix: approved on a real server, it brought PostgreSQL back, and rerun with verification on a fresh one it took the disk from 100% to 5%
- A 40-run evaluation showing that model choice matters, and that the gate held for all of them
- Replay: real incidents become regression tests for agents, runnable by anyone with a Token Factory key
What we learned
- Bigger was more eager, not safer: the largest model was the one that tried to approve itself
- A small set of declared operations beats a shell. The model is better at choosing from a catalog than at writing commands, and every choice is checkable
- Keeping the model's raw reasoning next to each change makes post-incident review far easier than a summary
What's next
- More recorded incidents (certificate expiry, a crashed deploy, memory pressure) as a public benchmark for on-call agents
- Alert intake from monitoring, so an investigation starts on its own and pages a person only to approve
- Pilots with small teams and MSPs who run their own servers
What changed since August 26
Cloudfall began in July 2026 as Atlas, a private tool for our own Hetzner servers. By the start of the submission period it could describe a fleet in YAML with JSON Schemas, render an Ansible inventory, observe hosts and audit them against the declared state, and show an operations dashboard, with Ansible roles for our Nginx proxies. It could not deploy, migrate or talk to an agent.
On 2026-09-07 it became the public open-source Cloudfall. Since then, in nine releases (0.1.0 on 2026-09-08 to 0.7.0 on 2026-10-19):
- Health-gated deploys with rollback, the artifact builder and the Render importer, with the Render-to-Hetzner migration proven live end to end
- The MCP server and the agent-facing CLI
- The operator loop: propose in check mode, approve, run, verify
- The operations catalog and
cloudfall why
For this hackathon specifically:
cloudfall agent investigatewith Nemotron on Token Factory, streaming each turn- The investigation record with reasoning, raw tool calls and request ids
--replayof recorded incidents against a live model- Approval only by a person
cloudfall whynaming the model, turn and reasoning behind each decision- The disk-full example and the 40-run evaluation
- The hosted demo
Built With
- ansible
- cloudflare
- hetzner-cloud
- nebius-token-factory
- nvidia-nemotron
- python
- starlette
- uv

Log in or sign up for Devpost to join the conversation.