I built ProofBid, and wrote this article, for the purposes of entering the All Things Agentic Hackathon (Google × Devpost, August 2026). Everything described below was implemented and verified during the submission period.
The friction I brought
The hackathon's Taskmaster track has a "Bring Your Own Friction" mandate: find a messy, multi-step chore in your own job and build an agent that actually finishes it. Mine was easy to pick. My day job is business operations in the enterprise-equipment channel, and preparing the bid package for an equipment procurement tender is the most stressful recurring chore I know.
The pain is not writing text. It is assembly under proof obligations: requirements arrive scattered across documents; every qualification and product claim needs a specific piece of evidence behind it; pricing must stay consistent across the quotation, the bill of materials, and the summary; and one missing project-specific manufacturer authorization can invalidate an otherwise perfect package.
A chat assistant can summarize this work. It cannot be trusted to finish it, because "finished" means files a reviewer can sign off on—and a language model left in charge of facts will eventually paper over a gap with something plausible. That failure mode is disqualifying in tendering.
What ProofBid does
ProofBid turns one tender event into a complete, reviewable preparation package—or an honest refusal.
One click in a public React workbench fires the event. FastAPI on Cloud Run accepts it and returns 202. A Cloud Run Job executes the agent in the background. Cloud Storage holds task state, receipts, and deliverables. The workbench polls status, shows a live tool timeline, and offers the final ZIP only after integrity validation passes.
Two synthetic public cases differ by exactly one variable:
-
Green: all evidence present. The run ends
completed, with 12/12 requirements matched against 63 evidence references and a validated Word/Excel/JSON/Trace/ZIP package. Both readiness flags are true. -
Blocked: the same tender and catalog, with only the project authorization removed. The run ends
blockedwith exactly one missing item, the stable reason codePROJECT_AUTHORIZATION_MISSING, both readiness flags false—and it still delivers a validated evidence ledger and remediation package.
Nothing is fabricated to make a result look complete. Signing, pricing freeze, sending, and submission are locked: submission_executed=false and high_risk_actions_locked=true are invariant contract fields in every result.
The architecture decision that matters: routing vs. authority
The obvious critique of a safety-first agent is "isn't the model just a thin wrapper around a pipeline?" ProofBid's answer is to make the division of power explicit.
Gemini 3.5 Flash (through Vertex AI) drives the run via Google ADK FunctionTools, and its decision rights are real: it chooses the order of registered tools within enforced dependencies, decides when analysis is sufficient, chooses the correct terminal branch—complete versus blocked—and may choose exactly one legal retry after a transient renderer failure. In verified runs those are ten FunctionTool calls per task, each with a real ADK function_call_id.
Deterministic Python code owns everything a bid reviewer must be able to trust: requirement extraction, evidence matching, BOM and pricing arithmetic, readiness gates, document rendering (python-docx, openpyxl), and cross-artifact validation.
The seam between the two is a server-side state machine. The model receives no paths, shell, SQL, URLs, prices, or business facts as parameters. The runtime enforces a tool allowlist, call budgets, input digests, dependency order, idempotency, and bounded retry. Unknown tools, input drift, duplicate terminal actions, provider errors, and schema errors all fail closed. finalize_complete is unreachable until the domain and delivery validators pass; a business evidence gap must end at finalize_blocked.
Every tool call lands in a SHA-256-chained receipt (tool_receipts.jsonl), packaged with an exact-set manifest, so anyone can audit which decisions the model actually made.
What "verified" means here
I tried to hold the project to evidence standards similar to the domain it serves:
- 69 Python tests plus a 50-case synthetic Eval matrix (structure, missing evidence, product/pricing, prompt injection, bounded recovery) at 50/50 on local runs;
- Playwright desktop and mobile checks against the real built frontend;
- real Cloud Run Job executions for green, blocked, and one admin-only recovery route, each reconciled across the Gemini provider receipt, structured logs, Cloud Run revision and image digest, and matching ZIP SHA-256 hashes in Cloud Storage and the public service;
- a clean-clone gate: a fresh public HTTPS clone must pass installs, tests, Eval, frontend build, Playwright, a Docker build, and a container run end to end.
All public data is synthetic by design. Real tender documents are confidential, and a fixed single-variable pair of cases lets a reviewer verify that completion and blocking are driven by evidence rather than prompt luck. Real-document parsing is the next product step—behind human approval receipts, not automated signing or sending.
What I learned
- Agent autonomy is strongest when its decision rights are explicit. A constrained tool router is still meaningfully agentic if it owns recovery and terminal-branch decisions, while typed deterministic tools protect professional truth.
- A truthful blocker is a feature, not a failure. Distinguishing a business blocker from a technical failure—and still shipping a validated remediation package—turned the "sad path" into the most convincing part of the demo.
- Receipts beat claims. Chained digests, provider receipts, and reconciled cloud evidence made every demo statement checkable, which changed how I built everything upstream of the video.
Links
- Demo video (4 min): https://youtu.be/E4Ke_cWLFus
- Live workbench (two synthetic cases): https://proofbid-um2t63h7ha-uc.a.run.app
- Source (Apache-2.0): https://github.com/yyswordsman-CN/proofbid
Built solo with Gemini 3.5 Flash, Google ADK, Cloud Run, and Cloud Storage for the All Things Agentic Hackathon. #AllThingsAgenticHackathon













