The schema gate is where triagepilot finally spends a model call, and it is the only move that does. A report that survived the noise filter and dedupe reaches one call whose prompt carries the report, the dedupe corpus and the application's entire source. The model must answer in a strict shape: duplicate with its target, diagnosed with a file, a location, a cause and a fix sketch, or needs-info. Nothing else is a legal answer.

One model call, three legal verdicts, one zod schema. A response that does not fit the shape never reaches the tracker, and needs-info is an allowed answer, not a failure.

The verdict is then validated against a zod schema before it is allowed to touch a ticket. The model proposes; the gate decides. A response that does not fit the shape does not get to write itself into the issue tracker, so a diagnosis reaches a ticket only when it is well formed and pointed at a real file in the source it was shown.

The verdict worth dwelling on is needs-info. Abstaining is first-class here: a vague report with no reproducible symptom is labelled needs-info rather than handed an invented diagnosis. A model asked to conclude will always conclude something, and the honest answer to an unclear report is to say the report is unclear. Making that a legal, expected verdict is what keeps the confident-fiction failure from reaching a human as a false lead.