QAP ENGINE mosaic tools / lihtc / allocation-plan q&a DEMO built by russh.work

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
  • It is not legal or application advice. QAPs are amended, clarified, and superseded; this corpus is a snapshot of three published documents (MD 2025 QAP final draft, MD 2025 MRFP Guide, DC 2025 QAP). Verify anything that matters against the agency's current publication.
  • Two jurisdictions only. Questions naming any other state are refused rather than answered from the wrong plan. That refusal is deliberate product behavior, not a failure.
  • Cross-references can break. QAPs constantly say "as defined in Section X." If Section X is not among the retrieved passages, the answer will be incomplete. The model is instructed to say so rather than fill the gap.
  • Tables lose structure. Point tables and fee schedules are extracted as flowing text. Simple tables survive; wide matrices can garble. Numbers are quoted verbatim from the extracted text, which is not the same as verbatim from the printed table.
  • Rate-limited demo. 15 questions per hour per visitor. This is a portfolio demonstration of a RAG architecture, not a hardened production service.
  • 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.

    QAP Engine is a portfolio build by Russ (russh.work), a finance-native AI engineer working in LIHTC and CRE credit. Related: First Pass, Deal Intake, Realization Guard. Source documents: Maryland DHCD and DC DHCD public publications.