Inspiration

Most film AI I saw was about storyboards, shots, or schedules. Safety still lives in a spreadsheet that nobody opens after call.

Two people who do this work already named the job.

Michael Buckalew argued that if AI can help plan a shoot, it can also flag high-risk scenes before cameras roll. The point is earlier visibility for producers and safety leads, not a replacement for them.

Jonathan Moore put it more tightly: the lot already has hazards. Then the unit arrives with pyro, nights, cable runs, and a tired grip department. A location RA that only lists terrain is incomplete. The useful question is how those two layers collide.

A comment on Buckalew's post (Frank Houbre) said the attachment point that would work is the shot list, and that fatigue is more than hours: commute, circadian load, elevation.

Those two ideas are what MATRIX implements.

What it does

MATRIX takes a script, a call sheet, and a location, then drafts a shoot-specific risk assessment for a 1st AD or safety supervisor.

Four ADK specialists share one orchestrator:

  • hazard_scanner flags stunts, pyro, water, vehicles, aerial, crowds, and weapons on each slug line
  • fatigue_forecaster scores crew from hours, consecutive days, week load, circadian, commute, altitude, role weight, and lot × role fusion
  • location_enricher starts from a known-lot table (Vasquez Rocks, Venice, Death Valley, Brooklyn Bridge, Tahoe). If a Parallel key is set, it adds cited live notes for fire weather, heat, permits, and closures
  • risk_synthesizer scores the collision and writes a Hazard | Risk | Controls register

The dashboard is the product. You answer who / what / where / when, edit the suggested hazards, then get a printable brief. The three cards at the top are the argument: what the lot already has, what the unit introduces, and what not to roll without a look.

Gemini narrates Ask and the ADK chat when a key is present. The tools always run. Analyze works with no Gemini and no Parallel key.

A supervisor can edit or drop any suggested hazard. The footer says a qualified safety professional has to validate the draft before production.

Try it: open the live dashboard, click Try the sample western, then open Scene 12.

Why ADK, Gemini, and Parallel matter

I did not want a chatbot that invents a risk number.

Google ADK gives four named agents that call the same Python functions the dashboard uses. Gemini routes and explains. The score comes from the tool.

Parallel Search is the live layer for a lot I do not have in the table, or for fire weather that changed this week. Results show up as citations with URLs. They never replace the baseline. If the key is missing or the call fails, the lot table still scores.

That split is the product: the model talks, the tools compute, a human signs.

How I built it

I used IBM Bob in Plan and Review while laying out the four agents and the tool split. Bob is a development partner here, not a runtime dependency. The container runs ADK + Gemini.

The backend is FastAPI on ADK's get_fast_api_app, so /dashboard and /dev-ui/?app=matrix share the same root_agent (gemini-2.5-flash-lite on Vertex AI).

The React dashboard calls /api/analyze, which runs run_assessment with no LLM. That kept the demo testable and free of a Gemini bill. pytest covers the tools, the collision rules, and the Parallel merge / fallback.

Scoring is written down in docs/SCORING.md. Fatigue fusion is visible on every crew row (factor_breakdown, fusion_notes). I did not train the Liu paper's neural net. There is no biometric stream on a call sheet.

The app is on Cloud Run (us-central1), min instances 0.

Challenges I ran into

The first design temptation is to let Gemini write the whole brief. That looks finished and is hard to audit. I split it: tools compute, the model talks.

The fatigue paper wants sleep quality and other signals a call sheet does not have. Using hours alone would ignore the comment that started this. I kept the terms a 1st AD can check. A 16-hour key grip on a fire-prone lot is not a 16-hour coordinator.

Live web on a safety draft is easy to over-trust. A Parallel excerpt is a thing to click, not a certified EMS time. The UI says that.

Accomplishments that I'm proud of

The sample western. Scene 12 is dry-brush pyro, a horse, a cliff, a helicopter, night, and a fatigued G&E crew on Vasquez Rocks. The brief treats that as one collision, not six separate "high" flags.

The dashboard and the agents share one tool layer. If a score looks wrong, you can read the function.

The product still returns a draft when Gemini and Parallel are off.

What I learned

The interesting risk is the interaction. "Fire = high" is not the job.

For anything a supervisor might take to set, the model should not own the number.

Cited live search is useful. Overwriting a baseline with no URL is not.

What's next for MATRIX

I am not a 1st AD or a safety supervisor. The next step is to sit with one of them on a real call sheet and see which flags are noise.

I would add more lots, tighten the Parallel queries, and keep the human edit path. I would not treat the keyword scanner as a finished script breakdown.

Built With

Share this project:

Updates

Submission history