Every pack tailored builds comes from a single canon.yaml, the candidate's structured facts, and the schema gate is what stands between that file and everything that reads it. It is a zod schema, so the check is exact rather than approximate: identity, experience, projects, education, skills and a protectedTopics list each have a shape, and a file that does not match that shape is rejected with the reason.

The first gate. canon.yaml is checked against a zod schema, and a malformed file is rejected with its reason before a word is drafted.

The gate runs first, before the model is asked for a single word. That ordering is deliberate. A drafting loop fed malformed facts will happily produce a beautiful document built on a broken foundation, and the earlier you catch a bad input the cheaper the failure. Stopping at the schema is the difference between a typed error and a plausible lie.

It also gives the rest of the system one thing to trust. Downstream gates, the drafting model and the human at the desk all read the same validated facts, so a claim can only reach a page if it is well formed in one place first. The schema is the anchor the whole pack is measured against.