Ask the allocation plans.
Natural-language questions over real LIHTC Qualified Allocation Plans. Every factual claim in the answer cites document and page. When the corpus cannot answer, it says so instead of guessing.
What this system cannot do
How it works, and what Phase 2 would be
Retrieval. 505 chunks, section-aware so a chunk never straddles two scoring criteria, each carrying document, state, section, and page metadata. Embeddings are text-embedding-3-small truncated to 256 dimensions: at this corpus size the quality loss is small and the whole index fits in the serverless function's memory, so there is no vector database to operate. Adding one at 505 vectors would be architecture theater.
State routing. A query naming Maryland or DC filters retrieval to that state's documents. A query naming only an uncovered state is refused before any model call. Both behaviors exist because the eval suite caught the failures they fix: cross-state bleed and confident answers about states the corpus has never seen.
Generation. The model answers only from the retrieved passages, cites every claim by bracket number, and is instructed to say when the passages do not answer. Thresholds and point values are quoted verbatim.
Phase 2, if this were a client engagement: expand to every state the client applies in; move the index to a managed vector store once corpus size justifies it; table-aware parsing for the scoring matrices; and year-over-year QAP diffing, because what changed since last cycle is the question developers actually pay to answer.