Inspiration

My wife is a professor. At the end of last semester I found her at the kitchen table with her laptop open, clicking through a folder tree, opening files one at a time. Not reading them — just opening them, closing them, moving to the next one.

I asked what she was doing. She said she was checking that none of them were corrupted.

That is a real step in a real accreditation workflow. Before a professor submits a semester's evidence, she opens every artifact, however deeply nested, to confirm it isn't broken. Then she copies her gradebook out of Blackboard and retypes it, row by row, into the university's accreditation template. Then she builds the folder structure by hand and files everything into it.

I asked how long the whole thing takes. Three to four days. Per semester. And the part that actually requires her academic judgment — scanning three graded samples for each performance band — is about thirty minutes of it.

Then I asked the question that became this project: after those three days, does anyone check that the evidence actually complies?

No. She checks that the files open. Nobody checks that they're right.

That is the gap. Three days of work buys tidiness, not assurance. And then she receives a colleague's package and runs the entire checking pass again as peer review — work that isn't even counted in the numbers below.

The size of the problem

I interviewed several professors and took the conservative end of every input: 3 days rather than 4, 400 professors rather than 450.

$$ 400 \text{ professors} \times 3 \text{ days} \times 7 \frac{\text{hours}}{\text{day}} = 8{,}400 \text{ hours per semester} $$

$$ 8{,}400 \times 4 \text{ semesters} = 33{,}600 \text{ hours per year} $$

Roughly 9,000 hours a semester and 35,000 hours a year at a single medium-sized university — and that still excludes peer review.

From the individual's side it's just as stark. A professor's working year is $7 \times 5 \times 40 = 1{,}400$ hours, so the burden is

$$ \frac{84\text{–}112 \text{ hours}}{1{,}400 \text{ hours}} = 6\text{–}8\% $$

of her entire working year. Three working weeks a year, spent filing. And it doesn't spread evenly — it lands in the end-of-semester crunch, on top of marking, four times a year.

What it does

Compliance Guardian is an agent fleet that takes over everything except the scanning. A professor drops a semester's evidence into a workspace — a ZIP, some graded scans, a Blackboard CSV — and the fleet classifies it, builds the folder structure, files each artifact, ports the gradebook into the accreditation template, verifies 24 requirements, and emits a hash manifest so her peer reviewer reads one report instead of opening fifty files.

$$ \text{3–4 days} \;\longrightarrow\; \text{2–3 hours} \qquad (>85\% \text{ reduction}) $$

But the number I care about more is verification coverage: 0 requirements actually checked → 24 of 24, deterministically, on every submission.

How I built it

The fleet is built on Google's Agent Development Kit with three agents — Root, Intake, Audit — deployed to Vertex AI Agent Engine. Root routes. Intake inspects and classifies incoming evidence. Audit runs verification. Transfers are explicitly gated: Intake cannot hand off to Audit, and unauthorized peer transfers are disallowed at the agent definition, so a malformed submission provably never reaches the audit stage.

Gemini 3.5 Flash handles the one thing code can't: looking at a scanned page and recognizing it as graded student work. The web platform is FastAPI + Jinja + HTMX, case state lives in Firestore, audited packages land in Cloud Storage, and every run is instrumented through Cloud Trace.

The architectural decision that everything else follows from:

Gemini reads. Code decides.

Gemini never returns a verdict. It returns a bounded observation — is this graded work, which assessment, what mark — and nothing else. No transcription, no student names, no free text. Deterministic, unit-tested code takes that observation, applies the band policy, runs the 24 checks, and computes a stable report hash. The same inputs produce a byte-identical report every time.

What I learned

Non-determinism is disqualifying in compliance. My first instinct was to let a model read the evidence and report findings. That's unusable. An accreditation finding has to be defensible to a regulator, and "the model was fairly confident" is not a defense. The model's job had to shrink until everything downstream of it was deterministic.

The trace is part of the product, not debug output. The most persuasive moment in the whole demo is a rejection — a Blackboard export missing a Student ID column, refused at Intake, with a decision timeline showing exactly which agent inspected what and why it stopped. Legibility is the feature.

Talk to your user, then talk to them again. I rewrote my own economics three times. I assumed scanning was half the work — it's thirty minutes. I assumed 9,000 hours was annual — it's per semester, a 4× error I'd have been caught on. I conflated per-course with per-professor. Each correction came from asking one more question.

Challenges

Drawing the model/code line. Deciding exactly where Gemini's responsibility ends took longer than implementing either side of it.

Keeping student data away from the model — provably. Real student work must never reach a cloud model. Vision calls run against an explicit fixture allowlist and raise before a request is ever constructed if the hash isn't on it. I scan traces, logs and generated documents for student data and assert zero matches. That's measured, not aspirational.

The Blackboard → template port. This is the single biggest time sink for a professor and the least glamorous thing to build — column mapping, inconsistent exports, a template that has to come out exactly as the accreditation office expects.

Deterministic hashing across a nested package. Getting a stable, reproducible manifest hash over an arbitrary folder tree took more care than expected — ordering, normalization, and what to exclude.

What's next

Event-driven ingestion through Eventarc so submissions process on upload without a human starting a run, then a pilot with a real department — using their template, their Blackboard exports, and their accreditation cycle. Proper report generation module.

Built With

  • accreditation
  • compliance
Share this project:

Updates

Submission history