Loading results from the API… If the hosted API was asleep, this can take up to a minute.
Loading results from the API… If the hosted API was asleep, this can take up to a minute.
Design-partner pilot
The pilot is free. It takes one working session of about two hours, plus a follow-up a week later to see what Guard caught on your real pull requests. Setup is hands-on: Furnace does not yet configure an arbitrary app by itself, and this page lists exactly what it needs.
Not deployed on this site. Every page shows recorded results.
Not connected to this site. Live Guard runs happen on the runner machine during a pilot.
This deployment’s own runner. During a pilot, the runner is a machine of yours, and this panel shows yours.
Scan a public repository, or upload a zip, to get the map Furnace starts from: LLM call sites, prompts, models, serving settings and routes, each tied to a file and line. Nothing is executed during a scan.
Treat the findings as a starting point. On five apps the scanner had never seen, 39 of its 77 findings were right. In the pilot, we check the findings together before Guard relies on any of them.
Scanning is not available on this site.
This deployment shows recorded results only and runs nothing a visitor submits. In a pilot, the scan runs on a connected runner, and we go through the map together.
main's rendered prompts measured on your endpoint: geometric-mean and p95 time to first token, prefix-cache hit rate, with the GPU clock recorded.
One recent PR replayed through Guard: which checks it could affect, which ran, and the gate's verdict with its interval.
If a PR puts per-request values at the start of a prompt, a draft fix that passed the tests and the gate. Otherwise you get a clear statement that nothing supported was found.
What was measured, what was inconclusive, and what Furnace could not see in your app.
The commands are the real ones. Full detail is in the pilot guide and the GitHub App guide.
together
We confirm the items above, and you pick the repository, the endpoint and one recent pull request that changed prompts or serving settings.
you
Created from a manifest that you review before clicking Create. Permissions: read code, write only to new furnace/* branches, open draft PRs, report check runs. No organization permissions.
uv run furnace gh-setup --name furnace-<your-org> uv run furnace gh-check
you, with us on a call
The runner pulls jobs from the queue. Your code and keys stay on that machine.
docker compose up -d postgres uv run poe migrate uv run poe runner
we write it, you review it
A suite file that ties your checks to the parts of the app they cover, plus a questions file with real user inputs for the benchmark. This is the setup work Furnace cannot yet do on its own.
FURNACE_GUARD_SUITE_PATH=path/to/suite.py FURNACE_GUARD_QUESTIONS_PATH=path/to/questions.json FURNACE_GITHUB_ALLOWED_REPOS=your-org/your-repo
Furnace
On each push to a pull request, Guard posts a check run on its head commit: PASS, FAIL or INCONCLUSIVE, with the interval and the evidence. Shown once on a public repository (2026-10-14); see the Demo page.
uv run poe gh-poll # or a webhook to a hosted API uv run furnace gh-guard your-org/your-repo <PR> --suite $FURNACE_GUARD_SUITE_PATH
you decide
Off by default. When on, a supported regression gets a draft PR into the pull request's branch. It is never merged and never pushed to main.
FURNACE_GUARD_AUTO_REPAIR=true
Guard is configured on the runner machine, in its .env file. These settings are the whole configuration; nothing is read from your repository except the code under test. The perf gate itself is fixed: geometric-mean TTFT, 3 interleaved runs per revision, a 90% interval, PASS at or below +10%, BLOCK above +25%.
| FURNACE_GUARD_SUITE_PATH | required | Python file listing your checks and the graph nodes each one covers |
| FURNACE_GUARD_QUESTIONS_PATH | required | Real inputs used to render prompts for the perf gate |
| FURNACE_GUARD_MAX_PROMPT_TOKENS | optional | Context budget the context check enforces |
| FURNACE_GITHUB_ALLOWED_REPOS | recommended | Repositories the runner will act on; events from anything else are refused |
| FURNACE_GUARD_AUTO_REPAIR | default false | Your consent for draft repair PRs |
| FURNACE_GITHUB_APP_ID, …_PRIVATE_KEY_PATH, …_WEBHOOK_SECRET | written by gh-setup | Kept in .env and ~/.furnace on the runner; never printed or uploaded |
Every check reports one of these. A skipped check is never counted as passed.