Inspiration

Research teams get cloud credits and grant funding, but they rarely have a platform or security team. A principal investigator or a lab manager still has to track budget, access, data restrictions, and approved regions — usually in a spreadsheet, and usually after the money is spent.

I wanted the rules checked before an experiment starts, not during an audit.

What it does

A researcher submits a cloud request: dataset, region, hardware, runtime, expected cost.

GrantOps checks it against the rules that a human confirmed from the award document: who is on the roster, which regions are allowed, which hardware, how long a run may last, and how much money is actually left. If the request does not fit, it says exactly which rules broke and offers configurations that do fit. When nothing fits, it shows the closest allowed configurations and how much money is missing, so the answer is never a bare no.

Gemini also reads the award document again and proposes updated rules. Each proposal keeps the clause, the quoted sentence, and a confidence level, and the lab manager accepts or declines it one by one. Nothing is enforced until a person confirms it.

The final approve or decline stays with the human, and every decision lands in the audit log.

How I built it

Python, Gemini 3.5 Flash Lite through Vertex AI, and Google ADK.

Cloud Run hosts the app. Firestore stores policies, evaluations, reviews, decisions, and audit events. Pub/Sub carries review work to an authenticated push worker. Secret Manager holds the demo access token, and IAM with OIDC ties the pieces together.

The split is deliberate. Deterministic Python decides compliance. Gemini reads documents, proposes rules, and explains outcomes. ADK routes specialist reviewers, and each reviewer receives only the findings it owns, so none of them can comment on a rule the engine never flagged.

The demo uses synthetic awards and synthetic research requests.

Challenges I ran into

Scope came first. Grant and cloud governance is a huge problem, so I cut it down to one workflow that runs end to end.

The harder problem was trust. My first version let the browser hold the confirmed policy, which meant a stale or forged value could drive an approval, so I moved the authoritative policy to the server. Approval originally trusted the budget as it looked at evaluation time; now the server re-checks the money actually left before it allows anything. And an early build let a request be approved when no affordable configuration existed at all — the API returns 409 for that now.

I also had to stop the model from being helpful in the wrong way. Reviewers were paraphrasing each other and once claimed a rule that did not exist, so each one now sees only its own findings and is told not to mention anything outside them.

Accomplishments that I'm proud of

The boundary holds: an AI reads and explains, a person confirms the rules and makes the decision, and plain code applies them and keeps the evidence.

The system is deployed on Google Cloud and running, not a local prototype. A different award document produces different enforcement without touching the code, which was the point of the whole exercise.

And the AI earns its place in a specific way: in the demo it catches that the rules in force claim $4,500 remains when the award clause says $600 — a stale rule nobody noticed.

What I learned

Existing tools handle identity, cost, or research compliance separately. The hard part is checking them together, before the resources are used.

Agents are good at collecting context, comparing options, and explaining trade-offs. They are not a substitute for explicit policy or human approval, and giving them the final say would have made the product worse, not better.

I also learned that a good refusal is a product feature. Telling someone their run costs $700 when $600 remains, and offering the same work for $160, is more useful than blocking them.

What's next for GrantOps

Billing and IAM integrations, so the remaining budget comes from real Cloud Billing data instead of a confirmed number, and the roster comes from the identity provider.

After the hackathon I want to publish the policy format and put GrantOps in front of research computing teams to find out which rules I got wrong.

Built With

Share this project:

Updates

Submission history