Inspiration
Before a film can be insured and sold, someone has to prove permission for every piece of third-party material in it — every logo on a coffee cup, every poster on a wall, every song bleeding in from a car radio, every face in the crowd. That job is called rights clearance, and it is done by hand, by people, watching the cut frame by frame with a legal pad.
It is slow, it is expensive, and it is the reason independent films die in post. A single sync clearance runs four to five rounds of correspondence across two separate rights — the composition and the recording — and a feature has dozens of them.
The obvious move is to point an LLM at the footage. The obvious move is also wrong, and understanding why is the whole project.
What it does
Clearance Desk watches a cut and produces an errors-and-omissions clearance report: every clearable item, who owns it, what you must obtain, what it will cost, how long it will take, and which items block delivery outright.
Three stages, deliberately separated:
- Gemini 2.5 Pro watches the picture and reports what it observes — a brand, a sculpture, an audible cue, a face — with a timecode, a prominence grade, and its evidence for saying so.
- Parallel's Task API researches chain of title for each distinct work, returning named rights holders with citations. On the bundled samples this resolves 91 of 92 researched items to a named holder.
- A deterministic Python rules engine decides the legal position.
That third stage is the point. No model ever forms the legal position.
Models observe and research; a rules engine with numbered, published rules
adjudicates. The same evidence always produces the same verdict, every rule
that fired is named in the output, and readjudicate re-runs the entire rule
set over past reports for free to prove nothing drifted.
That is what makes the report defensible. A lawyer can disagree with rule TM-001 and read exactly what it says. They cannot argue with a model's mood.
How we built it
FastAPI and Pydantic on Cloud Run, Gemini via Vertex AI, Parallel's Task API for research, AudD for acoustic fingerprinting when a cue has no name, ffmpeg for sampling. 296 tests, none of which can make a billed call.
Eight sixty-second sample cuts ship with the app, each carrying a recorded pass, so anyone can get a real report — real findings, real citations — without footage of their own and without spending the host's money.
Challenges we ran into
Real footage broke our assumptions twice. Unresearchable one-off physical objects were being sent to research and coming back empty; artwork with no traceable author was being told to "obtain a release" from nobody. Both became explicit triage paths.
The UI was lying about our own success rate. It led with blockers and printed "chain of title unresolved" for both "we found the owner, a gap remains" and "nobody knows". A tool that identified a holder for 91 of 92 items read as a tool that mostly fails.
A swallowed HTTP error became a legal finding. When the fingerprinting token expired, the failure returned the same value as a genuine no-match, and the report stated "likely original score" — a claim about the music produced entirely by a claim about our own credentials. For a project whose central commitment is that no model forms the position, an outage forming one instead was the same defect wearing a different hat.
Two rules described their verdicts in words that contradicted the evidence beside them — calling a featured billboard "incidental", calling a legible Vogue masthead "not legible". Re-adjudicating reworded 64 positions and moved none: the reasoning was right, only its description misled.
Publishing it safely. The deployment is public and unauthenticated, and research bills a fixed prepaid balance. The cost confirmation lived in the browser, where a loop against the API never sees it. The cap is now enforced server-side and persisted in Cloud Storage with compare-and-swap, so it survives cold starts and deploys.
What we learned
The hard part of agentic work is not getting the model to do more. It is deciding what the model is never allowed to do, and building the boring deterministic thing that does it instead.
What's next
Cue-sheet round-tripping to the PROs, territory-specific rule sets beyond US practice, and a rules engine a production lawyer can extend without touching Python.
Built With
- artifact-registry
- audd
- cloud-build
- cloud-run
- cloud-storage
- css
- docker
- fastapi
- ffmpeg
- gemini
- google-cloud
- html
- httpx
- javascript
- parallel
- pydantic
- pytest
- python
- secret-manager
- uvicorn
- vertex-ai
Log in or sign up for Devpost to join the conversation.