
Every research-grant submission at Iowa State (and most U.S. universities) carries the same hidden tax: the same budget has to be expressed in several different artifacts, and they all have to agree. Specifically, a proposal team builds an internal ISU One Page Budget spreadsheet, exports a Streamlyne PDF summary for the sponsor, and then writes a narrative budget justification (a Word document whose dollar amounts must mirror the spreadsheet exactly and whose structure must follow the funding agency's rules — NIH, NSF, USDA, etc.). Today, this reconciliation is done by hand: PIs and grant administrators eyeball totals across documents, copy figures into prose, and fight category-by-category formatting differences between agencies. Even small inconsistencies — a year-2 fringe number that rounds differently, a participant-support line missing from the justification, a salary that exceeds the NIH cap — can stall approval, trigger rework, or get the proposal rejected. The work is repetitive, easy to get wrong, and a poor use of the most experienced people in the lab.
Our project is the Budget Validation & Justification API — a backend service (FastAPI) with a matching CLI (budget-tool) that automates both ends of that workflow. It is composed of two cooperating pipelines that share the same parsers, models, and persistence layer, so a single uploaded Excel can be validated against a PDF and turned into an agency-specific justification document in one round trip. The components are: an ExcelExtractor + PDFExtractor that normalize the two source documents into the same line-item shape; a BudgetValidator that runs a three-phase matching algorithm (exact value fingerprints → tolerance-aware comparison → semantic scoring) to produce a structured report of matches, mismatches, and missing items; an ExcelMetadataExtractor that lifts the rich budget metadata (key/other personnel, fringe rates, travel and tuition detail sheets, period totals, IDC) out of the workbook; and a family of template generators (Generic, NIH, USDA, NSF) that emit a ready-to-edit .docx with every dollar already filled in plus placeholder narrative ready for the PI to flesh out. All attempts are persisted in MySQL with versioning and history, so users can re-run, diff, and re-export prior runs from the web viewer or the CLI.
