For people who came to verify the claim

The proof.

The headline receipt: the cloud maintainer opened its own first PR, autonomously, on real Cloud Run + Firestore — and a human merges it. A check that can't go red proves nothing. So the multi-tenant isolation was attacked, not just asserted. Every bring-up bug is listed out below, none buried. And every oracle on this page is built to actually fail — the only reason a green here means anything. Engineers trust receipts, not adjectives.

The headline · it happened, end-to-end

The maintainer opened its own first PR.

Not a demo, not a mock. The cloud maintainer read an open issue, wrote the fix with Claude, proved it with the gate — the issue's own failing test went green — pushed a clean branch under the GitHub App bot identity, and opened a pull request. On real Cloud Run + Firestore. A human merges it. The bot never can.

heimdall · GitHub App bot · opened a pull request PR #5 · OPEN · awaiting a human merge
Heimdall fix: off-by-one in sum_range
heimdall/issue/<id> → main · pushed by the App bot, never to main
issue → fix · read the open issue, Claude wrote the correct sum_range fix gate PROVED it · the issue's own failing test went green — the named gating test, not the model's word clean diff scope · source-only branch, no venv or cache, bot identity real infra · Cloud Run + Firestore · not a local dry-run
Authored autonomously by the maintainer loop on a gate-PASS fix. Autonomy ends here — a human reviews and merges. The bot pushes only to heimdall/* and cannot self-merge. The human gate is the feature, not a limitation.
# scoped bot token · pushes only to heimdall/* · no push to main · no self-merge
The honesty story: before this PR, the loop refused to fake a single green. For 15 straight runs it surfaced a real, named failure instead of reporting a phantom success — right up to the keystone bug that had been silently reporting PR_OPEN while the create actually failed. Nothing shipped until everything was true. That's the product thesis eating its own dogfood.
Multi-tenant isolation · attacked, not asserted

23 attacks. 23 kills. Score 1.0.

A shared control plane holds every team's credentials, so "we isolated it" has to be falsifiable. We wrote a cross-tenant attack oracle: 23 mutants, each the same isolation model with exactly one gate removed. With that gate gone, a real breach succeeds — and the oracle goes red. All 23 are caught. It shipped at six and grew to 23 as the login, god-surface and auto-join paths landed — the number below is whatever the command prints today, not whatever it printed the day this page was written.

23 / 23 = 1.0 mutants killed · bin/falsify rr-multitenant-isolation --assert-score 1.0
INV-1 · SPOOF KILLED

Forge your team_id

Team A sets team_id: B in the request body to operate as team B. Killed: the server derives team_id from the Ed25519 signature — a body-set team_id is ignored.

INV-2 · CRED KILLED

Read another team's credential

Team A's job resolves a shared/global model cred instead of its own. Killed: every cred read is keyed by the per-team Secret Manager partition, with no cross-team enumeration path.

INV-2/3 · QUEUE KILLED

Drain another team's queue

Team A drains team B's task queue for the same repo name. Killed: the queue partition key is (team_id, repo), not repo alone — A can never see B's rows.

INV-11 · IDOR KILLED

Dispatch on a repo you don't own

Team A names team B's repo slug to open a PR there. Killed: a repo↔team authorization check (team_covers_repo) blocks a repo the team wasn't granted.

A5 · INSTALL KILLED

Swap the GitHub App install

Team A wields team B's installation_id to PR on B's repo. Killed: the installation is resolved server-side from the caller's team — a wire param is not honored.

INV-6 · SURFACE KILLED

Dispatch from the public surface

A popped public surface tries to grant a cred and dispatch. Killed: the public boundary is enqueue-only — a code-scan asserts it references no cred-read and no dispatch symbol.

Those six are the original attack surface. Seventeen more landed with the login, god-mode and auto-join paths — each one a gate removed, each one caught. The names below are the mutant ids the command prints, so you can diff this list against your own run.

G1
god-in-public-allowlist
The owner-only god surface is added to the public allowlist, exposing it on the unauthenticated origin.
G3
drop-require-owner
The owner requirement is dropped, so a signed-in non-owner reaches god mode.
G4
god-accepts-body-team-id
God mode honors a body-set team_id and reads across partitions instead of the caller's own.
G5
god-accepts-forged-iap
A forged IAP assertion is accepted as proof of identity rather than verified.
L1
session-honors-body-team
A session honors a body-supplied team, letting one login act cross-team.
L2
session-teams-from-client
The session's team list is taken from the client, so tampering grants membership.
L3
skip-session-expiry
Expiry stops being enforced — an expired session keeps working.
L4
mint-skips-sig-verify
A token is minted without verifying the signature on the request.
L5
login-session-grants-owner
Merely holding a login session confers owner, collapsing the privilege boundary.
C1
chat-trusts-bare-chatid
A bare chat_id is trusted without binding it to a team.
AT1
autoteam-skips-collab-check
Auto-join skips the repo collaborator check, so a stranger joins by repo name.
AT2
autoteam-trusts-claimed-ghuser
A claimed GitHub username is trusted instead of one proven by the token.
AT3
autoteam-honors-wire-teamid
Auto-join honors a wire-supplied team_id rather than deriving it server-side.
AT4
autoteam-public-read-joins
Public read access to a repo is treated as enough to join its team.
AT5
autoteam-any-caller-initiates
Any caller can initiate a join for a repo they have no binding to.
AT6
autoteam-skips-haid-possession
HAID possession stops being proven, so an identity can be asserted rather than held.
AT7
client-preempts-server-binding
The client preempts the server's repo↔team binding, so one repo lands on two teams.
The oracle is falsifiable too: drop the IDOR acceptance case and a mutant survives — the score falls below 1.0. A test that proves the test can fail.
Debugged in the open

The 29-bug bring-up ladder.

Standing this up live surfaced 29 real production bugs, all found and fixed before the first PR — every one the same class: a green test on the laptop hid a deployed-shape break the container couldn't survive. We don't hide them. Each fix has a named cause, and each closed with a deployed-shape test so it can't come back. The first fourteen rungs of that climb:

01
missing dependency
CP image lacked google-cloud-secret-manager/team/cred 503. Added the dep + a build-time import guard.
02
least-privilege write path
The public service account correctly can't write Secret Manager → cred now write-forwards public→gated over authenticated service-to-service.
03
mode-routing field-collapse
A config collapse ate mode=control-plane → bare rr SSH'd a VM instead of POSTing the task to the queue.
04
job-name mismatch
The dispatcher defaulted to the wrong Cloud Run job name → set HEIMDALL_CP_JOB_NAME explicitly.
05
per-team env drop
The job runner discarded the per-team env → jobs would run credless / cross-tenant. Fix: a per-execution env override, isolated per team.
06
silent task consumption
Drain completed tasks even when dispatch refused; deterministic ids made re-submits a no-op → queue looked empty. Fix: bounded retry → dead bucket → re-openable, with loud logging.
07
drain enumeration gap
Drain only swept teams with an install → now sweeps union(queue partitions ∪ install teams), so no team is starved.
08
CPU throttling
The background tick starved outside requests (Cloud Run gives ~0 CPU) → token mint timed out. Fix: min-instances=1 + no-CPU-throttling.
09
read-only rootfs / no checkout
A dir create under /app failed; the cloud job has no checkout. Fix: resolve a writable workspace and clone the repo there.
10
no local enable file
The ephemeral container has no .maintainer.enabled file → added explicit server-set task authorization for drain-dispatched cycles.
11
reserved env names
PORT, K_* in the job override caused a live 400 → filter reserved Cloud Run names.
12
opaque mint failure
Drain gave "no idea why" → surface the real mint-failure cause with detail + timing in the log. The error_tail discipline was born here.
13
fresh-home fail-closed budget
A fresh home fail-closed the token budget → run with a truthful used:0, and every failed cycle names its cause via error_tail.
14
ingest had zero callers
The maintainer never pulled its work → ingest OPEN maintainer-labeled issues into the queue at loop start.
28
KEYSTONE · phantom success
The architectural one: open_pr's return value was discarded, so a failed gh pr create silently faked PR_OPEN — every run since bug #21 had reported success while failing. Fixed with an honest PR_FAILED state: flagged, loud, re-runnable. Turning phantom greens into named errors is what let bug #29 and the real PR fall in minutes.
The lesson, wired in: local-green hides deployed-shape breaks, and a silently-caught error is worse than a loud one. Every store + dispatch path now has a deployed-shape test, and every failure reports loudly instead of dying silent — the discipline that turned run 15's silent failure into the first real PR.
Measured, not asserted

It generalizes.

Every AI coding tool claims it works. Heimdall measured whether its reuse engine actually generalizes — and published the number. It was pointed at 8 open-source repos it had never seen — five JavaScript, three Python — on tasks where a competent developer would reuse existing code rather than reinvent it.

The pass thresholds were frozen before the run, so the verdict couldn't be tuned to look good — a low number would have shipped as a finding. The run even surfaced and fixed its own measurement bugs before reporting — missing toolchains, missing test dependencies, a buggy assertion — rather than quietly passing. The 8 / 10 working-output figure is adjudicated, not the raw machine count: the run scored 6 / 10 unaided, and two repos were re-graded up because their failures were measurement artifacts rather than bad output. The honesty is the brand. It came back GENERALIZES.

Rubric frozen before results · reported as measured
S6-C3 · reuse generalization sweep
# S6-C3 generalization sweep · one-off research run # produced by bin/heimdall-s6-sweep — a research script, not a user subcommand scope: reuse generalization · repos not in corpus languages: js · python · 8 reuse-measured rubric: frozen before run · thresholds locked repos evaluated ······· 8 / 8 median reuse ······· 0.50 working output ······· 8 / 10 adjudicated raw machine count ······· 6 / 10 · +2 re-graded note: 3 measurement-bug classes found & fixed pre-report (missing toolchains · missing test deps · 1 buggy assertion) re-graded: jmespath.py — baseline died on a missing hypothesis test dep; the assertion itself exited 0 cachecontrol — passed the hardened re-run undetermined: cobra · anyhow — no go / cargo toolchain, so no verdict. They are the other 2 of the 10; the 8 repos that could be evaluated all produced output. verdict: GENERALIZES — on a rubric committed before results # pre-committed thresholds · reported as measured, not tuned

No test that cannot fail.

The discipline behind every number on this page: a check that can't go red proves nothing. The isolation oracle only counts a mutant killed because dropping the gate makes the attack succeed. The self-scan runs at pre-push over the full history — so a --no-verify commit can't slip a secret past it, and during development one such commit was caught doing exactly that.

There is one door, and every push goes through it: a push is proven only when every gate passes — and the gate that proves it can't be the one that decides to skip itself.

PRE-PUSH · FULL HISTORY
Motion · the watchman reacts

Watch a gate go red.

hmd demo · staged failureSCANNING
▸ secret-scan · scanning full history…

A staged failure you watch deny, fix, and pass on the first run — the same loop Heimdall runs on every real push, and on every PR the cloud maintainer opens.

Convinced?

Onboard your team in three commands.

Install it, point rr at the control plane, connect your Claude sub, and let the maintainer open a proven PR. Pinned, BYO-credential, MIT.

Get started