Four decisions carry the architecture:
Inference stays inside the perimeter. Open-weight models on your own GPUs. This costs accuracy relative to a frontier API, and the honest trade is that for narrow extraction against a fixed schema, a well-prompted mid-size open model is close enough that the compliance benefit dominates.
Chunking respects document structure. Splitting at a fixed character count severs tables from headers and clauses from their definitions. Segmenting on structural boundaries — sections, tables, numbered clauses — keeps a retrieved passage self-contained.
Decoding is constrained to a schema. The model does not write prose that a parser then guesses at. Grammar-constrained decoding makes malformed output structurally impossible, which removes an entire class of silent failure.
Every value carries a span. The model returns the verbatim sentence and page it extracted from; a post-step verifies that span actually exists in the source. An extraction whose span does not match is rejected — which is what converts "trust the model" into "check the model in two seconds".