Inspiration

A 2026 insurance-industry article put the problem in one sentence: standard errors & omissions (E&O) coverage now excludes AI-generated content unless a production can document consent, clearance, and provenance for every synthetic element — and "the coverage you need does not exist in standard form." Every distributor still needs roughly $1M per claim / $3M aggregate in E&O to sign a distribution deal. That means an AI-assisted film can be finished and still be unreleasable — the footage exists, the paperwork an underwriter needs doesn't. That gap, documented by a real broker rather than invented by us, is what RADAR is built to close.

What it does

A script goes in. Scenes get generated. Five deterministic gates check every one — continuity (does it match what was already established?), clearance (trademarks, real people, song lyrics, AI-disclosure via C2PA), 2026 compliance law (EU AI Act Art. 50, California's digital-replica statutes, and more, each cited to a real dated rule), technical delivery (broadcast/streaming spec conformance), and music rights. When a gate raises a real problem, a bounded, cost-governed loop tries to fix it automatically — capped at two attempts, every attempt re-checked against the same rules, never able to sign off on itself. When a scene finally clears every gate, it locks and gets a hash-chained, cryptographically signed certificate that anyone can verify publicly, no login required.

The same pipeline also assembles the actual document an insurer needs — a disclosure schedule, consent ledger, provenance chain, and findings ledger with its full waiver trail — generated in seconds instead of the days a broker spends stitching it together by hand today. On top of the core pipeline we added six additional standalone capabilities: a public rights/compliance Quick Scan that needs no registered production, an embeddable "cleared" badge, a public regulatory-deadline tracker, a partner map naming the real adjacent players (Vermillio, Loti, Interra BATON, Audible Magic) we intentionally orchestrate rather than rebuild, and a findings-grounded Gemini assistant that can explain a scene's state but — deliberately — can't sign or change anything itself.

How we built it

A TypeScript monorepo (pnpm + Turborepo) with a Fastify REST API, a Zod schema as the single source of truth for every data shape, and a property-fuzzed pure function (fast-check) as the one place the "can this scene lock?" rule lives — so a scene can provably never lock with an unresolved blocking finding, not just usually. Alongside it, a Python agent built on Google's Agent Development Kit: a Gemini model on Vertex AI with two deterministic, budget- and lock-gated tools, and a live connection to the Grafana Cloud MCP server, self-hosted with a service-account token so it can run unattended. Every fix, incident, and cost event gets pushed to Grafana as a real annotation. The whole system runs in a DRY_RUN mode with no GCP project required for the deterministic core, with real adapters (Firestore, Cloud KMS, Veo) designed as typed seams behind a ports/adapters layer, so swapping in real infrastructure is additive, not a rewrite. Deployment is Cloud Run for the API and console, driven entirely by gcloud CLI commands, no manual console clicking.

Challenges we ran into

We ran a real, self-initiated security audit partway through the build and found a genuine broken-access-control bug: several privileged actions — signing a certificate, engaging the kill switch, waiving a high-severity finding — were trusting a client-supplied header instead of anything cryptographically verified. We fixed it by moving authority to a real bearer-token identity checked against the same model our MCP server already used, added regression tests, and proved the fix live (no token → 401, wrong token → 403, real credential → 200) rather than just claiming it was fixed.

Cloud Run deployment surfaced its own real problems: a monorepo build needs the whole workspace built together, not just the one service being deployed, which cost us a failed build before we caught a missing tsconfig.base.json in the build context; a pnpm filter missing its dependency-inclusive suffix silently skipped building an internal package in a fresh container even though it "worked" locally (stale local dist/ was masking it); and a Windows/PowerShell-vs-WSL-vs-Git-Bash environment split repeatedly broke naive environment-variable passing until we made scripts accept plain positional arguments instead. We also hit a real Gemini free-tier quota limit mid-testing, which taught us to route the production assistant through Vertex AI credentials instead of an API key — more correct architecturally anyway. And in our own adversarial testing script, we caught ourselves reporting false vulnerabilities twice — once from reading an HTTP status code when the real signal was in the response body, once from a shell argument-length limit being misread as a server timeout — a good reminder to verify a script's own signal before trusting it, the same discipline we expect of our compliance gates.

Accomplishments that we're proud of

A live, self-hosted Grafana Cloud MCP connection an agent genuinely calls at runtime — not a dashboard built to look good. A real Gemini agent on Vertex AI, grounded only in real findings, with zero authority to take any action itself. Real C2PA provenance verification using the actual ContentAuth c2patool binary against genuine signed assets, not a simulated check. 268 automated tests, all green, including property-based fuzzing proving the lock rule can't be bypassed. And a security vulnerability we found, disclosed to ourselves, fixed, and proved fixed — before anyone else had the chance to find it for us.

What we learned

That a public API endpoint returning the same HTTP 200 for every outcome (and encoding the real result in the response body) means any test script — including our own — has to read the body, not the status code, or it will confidently report the wrong thing. That "it works on my machine" and "it works in a clean container" are genuinely different claims for a monorepo. And that treating your own project's claims with the same skepticism you'd apply to a stranger's — verify, don't assume; re-run, don't trust an old screenshot — caught real problems before a judge ever could.

What's next for RADAR

Real Cloud KMS asymmetric signing in place of the current mock; a real Veo integration behind the existing VeoBackend seam; deeper live integration with Vermillio/Loti for likeness licensing and Audible Magic for music rights, beyond the typed port contracts that exist today; expanding the Saboteur adversarial corpus and publishing SceneBench scorecards as an ongoing, versioned benchmark; and evaluating a full Agent Engine deployment for the Python agent once its Grafana MCP subprocess dependency has a verified Linux-sandbox path.

Built With

  • c2pa
  • contentauth-c2patool
  • docker
  • fast-check
  • fastify
  • gemini
  • google-adk-(agent-development-kit)
  • google-cloud-build
  • google-cloud-kms
  • google-cloud-run
  • grafana-cloud
  • grafana-mcp
  • json-rpc
  • model-context-protocol
  • next.js
  • node.js
  • pnpm
  • python
  • react
  • turborepo
  • typescript
  • vertex-ai
  • zod
Share this project:

Updates

Submission history