Matching talent to a role looks like an AI problem: lots of fuzzy criteria, judgement, context. That's what pushed us, early on, to hand ranking to a language model. Experience taught us the opposite.

The problem with version one

The old pipeline pre-filtered crudely (gender, age, hair color), sent the first twenty candidates to an LLM to rank five, and did it once per role, sequentially. Three roles = three back-to-back calls. Worse: the frontend then re-applied other filters (height, origin, languages…), so the model sometimes ranked candidates that would be dropped moments later. We were paying time and tokens for nothing.

Three layers, only one powered by AI

The new architecture cleanly separates responsibilities:

  • Hard filters — deterministic exclusion, no AI: gender, allergy conflict, firm unavailability. An excluded candidate costs nothing.
  • Score engine — a 0-to-100 score, fully deterministic: playable-age overlap (up to +40, with linear decay inside the tolerance), hair/eye/height/origin/language matches, skills and traits, photo present. Penalties adjust the score without excluding.
  • AI tiebreaker — only when the score can't separate two talents, and on a small model. AI becomes a line judge, not the referee.
"The right question wasn't ‘how do we make the LLM rank better,’ but ‘how do we almost never need the LLM.’"

Why deterministic wins

A score engine has three virtues all-AI doesn't. It's fast: no network call for the vast majority of cases. It's predictable: the same role and roster always produce the same ranking. And it's explainable: you can show an agent why a talent surfaces — age fits, language fits, origin fits — instead of an opaque verdict.

AI keeps its place where it shines: reading a casting call in natural language, suggesting wording, breaking a tie between two genuinely equivalent profiles. The rest is classic engineering, and that's exactly right.

The lesson

On a real product, "put AI everywhere" isn't a strategy. The discipline is to isolate the small core where AI creates real value, and handle the rest with deterministic, testable, fast code. That's what makes Castflow's matching both useful and reliable.