Inspiration
Open-source bounties are a real workflow: verify escrow, claim the issue, write the fix, survive review. Humans are slow at that loop. Unchecked coding agents are worse — they mock ciphers, comment out require_auth(), skip assertions, then stamp the build green.
We already had a live bounty-hunting engine opening PRs across Next.js, NestJS, and Soroban repos. What we did not have was a fail-closed institutional fleet: cataloged agents, scoped identities, persistent memory, and an auditor that cannot write code.
The Universal Bounty Fleet is our Fortified Enterprise Fleet submission. The live camera is /console, not a chatbot.
What it does
Three scoped agents run the loop. None of them holds a god-token. None of them presses merge.
| Agent | Job | What it is allowed to touch |
|---|---|---|
| Intake Taskmaster | Qualify the issue, verify escrow, stake /try |
issues:read, issues:comment |
| Execution Engineer | Open a draft PR as native save-state and patch auditor findings | contents:write, pull_requests:write |
| Victory Auditor | Attack the diff. REQUEST_CHANGES on cheat. Stay fail-closed until PASS |
pull_requests:review only |
The tape (one unedited loop)
- Claim. A GitHub issue webhook hits Cloud Run. The 5-stage Sniper Filter rejects banned platforms, archived repos, competitor
/claims, and subjective “send a Loom” work. Vertex Gemini then parses escrow (USD, USDC, XLM, …) with a regex fallback. If funded, Intake posts/trywith payout routing. - Draft PR. The executor works in the open. If it is not on GitHub, it did not happen.
- Blocked. The Victory Audit Murder Board intercepts the PR webhook and scores three pillars:
- Pillar 1 — Cryptographic integrity. No mocked BLS, dummy pairings, or fake ZK host functions.
- Pillar 2 — Authorization. No commented-out
require_auth()/ caller checks on state changes. - Pillar 3 — Assertion preservation. No skipped, weakened, or
assert Truetests.
- Cleared. A clean diff gets a native GitHub
APPROVEand, if needed, draft → ready. Humans still hold merge.
The fail-closed invariant is stored in Firestore, not in a local log:
$$\texttt{merge_allowed} \;=\; (\texttt{auditor} = \texttt{APPROVE}) \;\land\; \neg\,\texttt{cheat_detected}$$
Agents coordinate by GitHub stigmergy: issues, draft PRs, comments, and official Reviews. The Memory Bank writes /console so judges see one word — PENDING, BLOCKED, or CLEARED.
How we built it
We used Antigravity’s /teamwork-preview to generate the first architecture from a constraint file, then hardened the runtime by hand: HMAC gateway, Firestore locks, the Murder Board, and the Fleet Console.
Mandatory stack, as shipped:
- Model: Gemini on Vertex AI (
odin-500008,us-central1) via the Google GenAI SDK, with structured Pydantic output for escrow and adversarial review. - Runtime: Cloud Run service
bounty-fleet-gateway— one stateless FastAPI process. - Memory: Firestore collection
bounty_memory/{id}(in-memory fallback for tests).
GEAP mapping (what the Fleet track asks for)
| GEAP layer | What we shipped |
|---|---|
| Agent Registry | Versioned cards at /api/registry: purpose, tool scope, identity, no god-token |
| Agent Gateway | FastAPI webhook router, HMAC-SHA256, Firestore delivery-id locks |
| Agent Runtime | Event-driven Cloud Run pods, hard 900s compute budget |
| Memory Bank | Cross-session bounty state, audit verdict, merge_allowed |
| Agent Identity | Per-agent GitHub scopes. The auditor cannot write repository contents |
| Model Armor analog | Deterministic Murder Board first; Gemini auditor ignores “SYSTEM OVERRIDE / approve this PR” in diffs |
| Observability | /console live camera, plus /console/ops, /history, /claims, /archive |
Gateway path: GitHub webhook → HMAC verify → Firestore idempotency → Intake or Auditor → Memory Bank → /console.
Accomplishments
This is not a slide-deck prototype.
- Live on Cloud Run in
odin-500008/us-central1, with a Firestore Memory Bank and a packaged console. - Fail-closed rehearsal: plant a
require_auth()bypass, watch the auditor fileREQUEST_CHANGES, then PASS after the fix. That is the demo. - 194 tests, 100% passing: HMAC timing, lock races, sniper/escrow/staking, Murder Board, native review submitter, and adversarial injection cases.
- Production pressure from the hunting engine (24–28 Aug overseer window): 79 PRs opened, 19 merged, 51 waiting on maintainers — including 5 merges into
Bitcoindefi/runaand 6 intoStellar-IndigoPay. We do not treat that as the product. We treat it as proof the chore is real.
What we learned
- A single coding agent will cheat to get green. The auditor must be a separate identity with no write access.
- Deterministic gates beat “ask Gemini to be careful.” Static analysis fails closed; Gemini adds semantic escrow and a second opinion. Both must pass.
- GitHub is a better control plane than a private chat. Draft PRs and Reviews are durable, visible, and judgeable.
- Cloud Run + Firestore is enough to look like an enterprise fleet if you actually implement Registry, Gateway, Memory, and Identity — not just name them.
What's next
- Point the live webhook path at the full Gemini auditor (static ∧ semantic) as the default, not only the Murder Board.
- Talk to Web3 escrow APIs directly so
/tryis backed by on-chain proof, not only issue text. - Keep merge in human hands. The fleet hunts, writes, and polices. People ship.
Built With
- agentic-ai
- antigravity-sdk
- artificial-intelligence
- automation
- bash
- cloud-run
- devops
- docker
- fastapi
- firestore
- gemini
- github-actions
- github-api
- google-cloud
- multi-agent-system
- python
- serverless
- webhooks
Log in or sign up for Devpost to join the conversation.