Why I built it
A release claim can be correct and still be unsafe to act on. Its evidence may belong to another commit, be too old, contain a secret, or have changed since a reviewer approved it. When those checks exist only in model prose, a good explanation can look like permission.
ProofStitch turns that release contract into data and completes the release-readiness workflow. It checks evidence against an immutable source ref, consumes an approval only when it matches the exact packet, and records a SHA-256 receipt. The final deployment remains a human decision.
What ProofStitch does
The dashboard starts a server-built release workflow. A deterministic Python gate rejects evidence that is missing, stale, failed, sensitive, untrusted, or tied to the wrong ref. When all evidence passes, the workflow waits for approval bound to the project, action, source ref, and full packet fingerprint. Change the packet and the old approval no longer matches.
ProofStitch returns BLOCKED, AWAITING_APPROVAL, READY, or READY_FOR_HUMAN_ACTION. After approval, it atomically consumes the run, records the receipt, and issues READY_FOR_HUMAN_ACTION as an auditable handoff. That completes ProofStitch's workflow; the irreversible deployment remains outside it.
Gemini 3.6 Flash runs one fixed synthetic tool round trip through Google ADK. The route accepts no user prompt. Gemini can call one argument-free evidence tool. Python validates the typed result and writes the authority statement, so model output cannot issue authorization or trigger a release.
How I built it
FastAPI serves the dashboard and bounded API on Cloud Run. Google ADK runs the fixed Gemini workflow through the Gemini Developer API Free tier. Pydantic models set limits on packet fields and list sizes. The in-memory workflow store has a fixed capacity, a short TTL, unpredictable run IDs, deep-copy isolation, and atomic one-shot approval.
The Cloud deployment is private. Cloud Run IAM is the first boundary. A separate 256-bit operator capability protects every Cloud POST before the server reads its body. The service has zero minimum instances, one maximum instance, one concurrent request, a 60-second request timeout, and an activation window of at most ten minutes. A verified Cloud Tasks request provides a deletion fallback. The cleanup script removes fallback resources only after it confirms that the service is absent.
The public repository includes an architecture diagram, a frozen dependency lock, local and private Cloud setup instructions, and a verifier covering 91 passing test cases, two deliberately skipped live-model checks, plus lint, type, static, and secret checks. The Docker option builds the pinned container and runs a smoke test. The demo uses only server-built synthetic release data, has no external business data source, and never sends caller content to Gemini.
What took the most care
The model boundary was the most delicate part. ProofStitch permits exactly one fixed tool call, revalidates its deterministic report, and replaces the model's final free-form text with a server-owned authority statement. Evidence trust, fingerprints, approvals, and state transitions stay in typed code.
The Cloud lifecycle was the other tricky part. Deployment starts with the application disabled. It verifies IAM and cleanup authority, schedules deletion, and only then opens the service window. An invalid or indeterminate check stops deployment.
What I learned
Authority is easier to audit when it is represented as data instead of prose. A small typed state machine made the human boundary clearer than another prompt instruction. It also made the failure tests concrete: change the ref, evidence set, approval scope, or capability, and the workflow must stop.
Disclosure
ProofStitch was built during the contest submission period. It uses open-source Python packages listed and hash-locked in uv.lock. No pre-existing application code or external data was incorporated.
Log in or sign up for Devpost to join the conversation.