Methodology
Describes the corpus this build shipped — data as of .
1. What this is
Fiscal Receipts connects four things that live in separate government silos: what agencies said money was for (budget documents), what was actually obligated and to whom (federal and state spending records), who ultimately received it (contractors, grantees, and their corporate parents), and what auditors said about it (GAO findings, improper-payment estimates). Every number on this site carries a citation to the exact source document, page, or API endpoint it came from. If we cannot cite it, we do not publish it.
2. Where every number comes from
Federal awards — USAspending.gov
The official federal award database (contracts, grants, loans, and subawards), mandated by the DATA Act. We download bulk archive ZIP files from files.usaspending.gov/award_data_archive/, convert them to compressed Parquet, and record the exact file name, URL, and SHA-256 hash of every file. Current scope: Department of Defense agencies, FY2017 onward. Update cadence: monthly.
DoD budget justification books (“J-books”)
The detailed budget submissions the Pentagon sends to Congress each spring, published at comptroller.defense.gov. These cover every R&D program (R-2 exhibits) and procurement budget line (P-40 exhibits) with program narratives, project-level cost tables, and congressional justifications.
The Pentagon's budget system embeds its own database inside these PDFs: the full structured XML is attached inside the PDF itself. We extract that XML directly. For the rare document that lacks an XML attachment, we use a deterministic PDF parser as a fallback, with an accuracy gate requiring ≥98% numeric-field agreement against XML-backed ground truth. We also download the official R-1 and P-1 Excel rollups, which serve as independent control totals for total obligational authority (TOA). Update cadence: annual.
Improper-payment estimates — paymentaccuracy.gov
Agencies are legally required to estimate and report payment-error rates. The dollar exposure figure we show per agency is derived by multiplying the published rate by the published outlay figure. The federal government reported approximately $186 billion in improper payments in FY2025. This is a derived estimate and is labeled as such. Update cadence: annual.
GAO high-risk list — gao.gov/high-risk-list
The GAO's biennial list of federal programs at high risk for fraud, waste, or mismanagement. Update cadence: biennial.
Senate lobbying disclosures — lda.senate.gov
The Senate Lobbying Disclosure Act database (lda.senate.gov/api/v1) contains filings for 2025 and prior years, each with a permanent UUID, registrant, client company, dollar amounts, agencies lobbied, and issue text. We have linked LDA client names to our company-family database and match each filing’s issue text against our program titles for keyword co-occurrence — never a claim that the filing names the program. 10,560 program mentions connect filings to budget lines this way: one row per filing × matched program element, qualifying only when the exact PE/BLI code appears, a curated alias appears, or at least two distinct, non-generic title words co-occur in the same filing — a single common word is never treated as evidence (see the dataset inventory, which states the qualifying tier per row as evidence_kind). Lobbying income and expenditure by year are shown alongside federal obligations received — influence is presented side by side with outcomes, never as a causal claim.
State checkbooks — California and Connecticut (pilot)
California's Open Fi$Cal and Connecticut's OpenCheckbook publish transaction-level government spending. We aggregate by department, spending category, and fiscal year, and use Census Bureau population estimates (NST-EST series) for per-capita comparisons. The category mappings that bridge both states' classification systems are published alongside the data.
California data covers FY2025 only — CA Open Fi$Cal updates on a lag; prior years not yet ingested. why FY2025 only? →
3. How we verify
Reconciliation
Every figure extracted from a J-book clears two arithmetic checks. Check A: project-level amounts within an exhibit must sum to the program-element total in that same exhibit (tolerance: ±$0.001M). Check B: that program-element total must match the corresponding row in the official R-1 or P-1 Excel rollup. Failures do not get published — they go to a human review queue.
Zero-absent rule
When a program has no funding for a given fiscal year, the official rollup workbook simply omits the row. Our reconciliation code recognizes this so zero-funded programs are not incorrectly flagged as failures.
Coverage gate
At least 99% of R-1 program elements must have either extracted detail or an explicit gap record. Silent holes are a build failure.
Provenance spot-check
Each build randomly samples 50 served facts and mechanically verifies that the cited source document exists on disk, its SHA-256 matches the download manifest, and the XML element path resolves to a real node. A number whose citation chain breaks does not render.
Per-build automated checks
A Python test suite and a browser test suite both run green before any build ships, alongside 24 site verification gates and 98 dbt data-model assertions. The analyst-agent evaluation set (48 question-answer pairs) requires at least 44 correct answers and 100% citation resolution before shipping.
4. How confident to be
Citation tiers
Every rendered figure is in one of three states. Cited (underlined, clickable): a fact_id resolves to a source document in our citation index — J-book PDF page-and-bbox, a specific workbook cell, an LDA filing, a USAspending query, or a derived formula whose inputs chain back to those sources. XML-path chip: a zero-dollar budget line that exists in the structured XML but has no corresponding citation row — the XML element path is displayed. Citation tier pending (⁂): figure is from a dataset for which row-level citation linkage is not yet complete. As of this build every published dataset carries a citation tier (the pending ledger is empty); the state remains defined — and gate-enforced — for future datasets that ship before their citations do.
Company families — registry fact vs. name inference
High confidence (registry fact): SAM.gov records a common registered parent name for the subsidiaries. Medium confidence (name inference): slightly different legal-name variants normalize to the same string. Both tiers appear on screen; the method is always disclosed. Where the method is uniform across a whole table — as it is on /companies/, every family of which resolves by name inference — the per-row chip is suppressed and the method is stated once in the header, because a badge that never varies tells the reader nothing.
Renames and acquisitions — hand-curated, not inferred
Name inference cannot know that Raytheon Company and RTX Corp are one company: federal award records carry the recipient name that was on the contract, and a rename produces two names. We close that gap with a small hand-curated table of corporate renames and acquisitions, each row sourced to an SEC filing or an official company press release. Those sources are external references, not warehouse citations — they leave this site and carry no fact ID, because we read them rather than extracted them. The combined figure a merged family renders IS a warehouse citation: a derived fact whose inputs are the member figures it replaced, recomputed by the citation verifier so a merge can never double count. Names that do not resolve to a recipient family are marked unresolved rather than guessed at.
Budget-to-contract links
Connecting a budget program element to the contracts that funded it is an inference. We use three tiers. High: the award's federal account code matches the budget line's appropriation, and program-title keywords overlap substantially. Medium: account matches and the contracting sub-agency matches the budget organization. Low: only the account matches. Low-tier links are useful for exploration but are not evidence of a program-to-program connection.
Derived figures are labeled derived
Any figure computed from published rates or published subtotals — rather than directly reported in a source document — is labeled as derived wherever it appears.
5. Known limitations
- FY attribution is approximate.Contracts execute across multiple fiscal years; our current method assigns links based on which fiscal years' award transactions share the same federal account code.
- Losing bidders are not in federal data. FPDS records offer counts and competition type; it does not name unsuccessful bidders.
- Company family grouping by name inference can err. Acquired, divested, or renamed subsidiaries may be grouped incorrectly. Corrections create superseding records; the original is retained.
- Improper-payment dollar figures are derived from OMB-published rates and carry the same uncertainty as the underlying rate estimates.
- State comparables depend on category mappings. Treat cross-state comparisons as directional.
- Classified programs are absent. DoD classified budget lines are not in public J-books or USAspending.
- Data-as-of dates vary by source. USAspending updates monthly; GAO high-risk is biennial; J-books are annual. Numbers on the same page may reflect different time periods.
- Lobbying-obligations correlation is not causation. Lobbying expenditure appearing alongside federal obligations is presented for transparency, not to imply that lobbying caused any particular award.
Coverage & limits
Several surfaces on this site are deliberately partial: we show a link only when we can defend it, and we say so where the data renders instead of burying the caveat here. Each block below is the destination for one of those inline “why …? →” links. Two program universes appear in these counts. The flows, dossiers, and years-matrix blocks below count against the detail-grade universe — those features require full R-2/P-40 J-book data, so that is their denominator.
These blocks say what each surface covers and why. For the same coverage laid out in one table — with the specific blocker and a dated target beside each figure, and a plain statement of which gap is a methodology limit rather than a queue — see Coverage.
Corpus: 1,993 browsable program pages; 1,739 of them carry detail-grade R-2/P-40 J-book data — excludes personnel, O&M, and R-1/P-1 lines that lack R-2/P-40 project detail. what separates the two tiers? →
Follow the dollar — 17 of 1,741 programs
The follow-the-dollar view draws a budget line's path to specific awards, recipient families, and districts. That link is an inference (§4): we render the flow only for the high-confidence crosswalk tier, where the award's federal account matches the budget line's appropriation and program-title keywords overlap substantially. Today that covers 17 of 1,741 programs, concentrated in DARPA lines whose account structure makes matching reliable. Program pages outside the crosswalk say so in place of the flow — absence of a diagram means we could not defend the link, not that no money moved.
Research dossiers — 50 of 1,741 programs
Dossiers exist for 50 of 1,741 programs, selected by ranking FY2026 requested dollars among programs with full J-book (R-2/P-40) detail — the 50 largest by money at stake, not by editorial judgment. Program pages that exist only through budget-trajectory data (no J-book detail book) are outside the ranking pool. Every dossier sentence must carry a resolvable citation or the build fails (“cited-or-absent”), so programs without a dossier show a one-line note instead of unsourced prose. Coverage grows as the research pipeline is run against more programs.
Company award linkage — 20 of 200 profiled companies
Company profiles cover the top 200 contractor families by DoD obligations. Award rows on those profiles come from the budget→award crosswalk, which currently contains R&D performers rather than primes — so only 20 of 200 profiled companies show linked awards. The remaining profiles still carry obligation totals and lobbying activity; a family-level awards mart is on the roadmap.
District lens — 106 of 435 districts
106 of 435 congressional districts appear in the district lens. A district gets a page only when at least one high-confidence budget→award link places obligated dollars there — a consequence of the crosswalk's current 17-program scope, not evidence that other districts receive no defense money. District totals therefore understate true defense spending everywhere they appear.
California — FY2025 only
California figures come from CA Open Fi$Cal and cover FY2025 only — the state publishes on a lag and prior years have not been ingested yet. Connecticut (OpenCheckbook) is the only other state in the pilot. Cross-state comparisons rely on our published category mappings and should be treated as directional, not exact.
FY2026 is a partial year
FY2026 does not close until September 30, 2026, and USAspending reports awards on a rolling basis — any FY2026 award total shown is a partial-year figure that will grow. FY2026 budget figures are the requested amounts from the FY2026 J-books, not enacted appropriations. Comparing partial FY2026 award totals against complete prior years will always understate FY2026.
Years matrix — edition-honest columns
The budget-over-time grid spans ten President's Budget editions (PB2017–PB2026). Its default columns follow the edition rule — actuals for FY N come from the PB(N+2) book, and every column states its edition (see the editions block below). The PB2026-detail columns (FY2024 Actuals, FY2025 Enacted/Total, the FY2026 request) remain that one edition's own restatements, selectable from the column picker. A program missing a value in a column renders “–”, never 0, and the grid computes no derived metrics of its own — the Δ and %Δ columns come from the recompute-verified trajectory mart.
“–” and a zero tagged XMLmean different things. “–” is absent: the trajectory workbook simply has no row for that program and column (most DARPA program elements, for example, carry no FY2026 Total there). An amber XML-tagged zero on a project sub-row is a source statement: the J-book XML explicitly records a zero-dollar amount for that project, cited to its XML path. A parent showing “–” above zero-valued project rows is therefore honest reporting of two different documents — the grid never derives a parent total from its children.
Detail-grade (R-2/P-40) data is ingested for 1,739 program elements; the full site carries 1,993 browsable program pages — see the service J-books block below for what separates the two tiers.
Budget editions — how ten books become one decade
Each President's Budget edition reports three fiscal years: its own request (FY N in the PB(N) book), the prior year's enacted total (FY N−1), and the year before that as actuals (FY N−2). The decade columns follow that rule — actuals for FY N come from the PB(N+2) book, enacted for FY N from PB(N+1) — and every column, cell citation, and diff states its edition. Editions are parallel publications, not corrections: PB2026's FY2024 actuals and PB2025's FY2024 enacted may disagree, both are kept, and the site never averages or reconciles across books. All ten defense-wide editions (PB2017–PB2026) are loaded; the nine backfilled editions each passed a per-edition probe, with every per-book exclusion (duplicate consolidated volumes, niche-fund books) recorded in the edition coverage manifest — an honest record, never a silent skip.
Two honest gaps remain. First, cross-edition procurement comparisons stop at the PB2024 boundary: PB2017–PB2023 procurement lines are keyed within their own edition (the underlying account/line identity is unstable across those years), so book diffs for the era editions cover RDT&E only — a wrong lineage would be worse than a gap. Second, program elements absent from an edition render as gaps (“–”, or a break in the decade sparkline) with a “not in the PB20XX edition” note; the site never interpolates across missing books and never fuzzy-matches renamed programs across editions.
Service J-books — 1,739 of 1,993 program pages with full detail
Every distinct program element in the budget workbooks has a page — 1,993 in total. Full J-book detail (mission prose, project tables, accomplishments) is ingested for 1,739of them, whose justification books come from the sources already in the pipeline. As of Phase 5G the FY2026 justification books for all three military departments are ingested: the Navy's RDT&E and procurement books, the Army's, and the Air Force and Space Force books — over 1,400 service program elements now carry full R-2/P-40 detail with working PDF citations, where before they showed only cited workbook figures. The books were pulled from the official service comptroller sites where reachable and from the Internet Archive's WAF-free public mirror where the comptroller sites sat behind CAC or Akamai access walls; the embedded XML that anchors every figure to its page survives the mirror intact. What remains figures-only is a near-zero residual: a handful of lines that publish no R-2/P-40 narrative at all — classified, SBIR, or spectrum program elements, plus a small number of R-1/P-1 workbook remainders with no matching book entry. Those pages say which case applies in place of a description rather than claiming a book is missing. We never substitute generated prose for a missing source document, and coverage grows as any residual book lands.
The flowdown chart — two rivers, bridged for 10 of 24 crosswalked PEs
/flow/ draws two separate systems and refuses to blur them. The budget river is the FY2026 President's Budget request (R-1 + P-1, USD thousands) — money Congress is being asked to approve. The spend river is DoD prime-contract obligations from USAspending (USD, per selected fiscal year, FY2017–FY2026) — money that actually went on contract. Budget years are not obligation years, and request dollars are not obligation dollars, so the two rivers carry separate unit statements and never share an axis.
The bridge between them exists only where the award crosswalk (§4) links a program element to contractor families: 10 of 24 crosswalked PEs carry FY2026 request dollars (6at high confidence). Everything else terminates in an explicit “not yet crosswalked” band — 98.7% of the request. That band is an honest statement about our crosswalk, not a claim that those programs have no contractors. The G9 gate verifies the remainder arithmetic exactly and recomputes every node from the parquet lake.
Spend-river edges are colored by FPDS extent_competed(full & open / set-aside / other than full / not competed), with the distribution of offers receivedon hover. FPDS records how many offers came in — never who the losing bidders were — so the chart states offer counts and implies nothing more. Negative flows (net de-obligations, where an office clawed back more than it obligated to a family in that year) render as zero-width hairlines per the exporter's layout rule; their tooltips carry the honest negative value. Every node and edge opens a citation panel with its derived formula and inputs.
Anomaly Feed — signal types and thresholds
The /feed page surfaces automated signals computed from the defense budget and award data. Each signal type has a defined threshold; all figures carry citations.
Subscribing. The feed is published as files, not just a page: 223 current items are available at /rss.xml (RSS 2.0, with /feed.xml as an alias) and /atom.xml (Atom 1.0). The 4 signal types that currently have events each have their own feed as well — a type with no events gets no feed rather than an empty one, which is why the withdrawn zeroed_fy2026 section below has none. There are 123 per-program and 39 per-company watch feeds — one for every program or contractor family that actually has events, so no advertised feed is permanently empty. Every item carries the dollar magnitudes the event is about, not only a percentage, plus a /fact/ permalink to the receipt behind the figure. Feeds are rewritten from scratch on each build and stale ones are deleted, so a program whose events disappear loses its feed rather than continuing to serve last month's claims. Readers autodiscover them through the <link rel="alternate"> tags on the relevant pages.
Year-over-Year Swings (yoy_swing)
Programs where FY2025 total is ≥ $50M and the absolute percentage change to FY2026 is ≥ 50%. Budget figures come from the fct_budget_trajectory mart (trajectory pivot of FY2025 enacted and FY2026 requested budget workbook lines). The figure shown is the percentage change; the delta in dollar terms is the cited trajectory figure.
Zeroed in FY2026 (zeroed_fy2026) — withdrawn, currently empty
Programs the budget workbooks record as literally zero in FY2026 after carrying positive FY2025 money. The figure shown is the last known FY2025 amount. No FY2025 floor — any positive amount qualifies. This section currently shows nothing, and that is the correct result.
What we got wrong.Until August 2026 this section published 87 cards reading “<program>zeroed out in FY2026 (had $0 in FY25)”. Both halves of that sentence were false. The underlying query treated a program’s absencefrom our FY2026 extract as a zero, and none of the 87 was a genuine zero. Separately, a formatting bug printed the FY2025 amount as “$0” on every card, hiding $7.07B of real FY2025 money.
Why absence is not zero.In DoD’s published R-1/P-1 workbooks a blank FY2026 cell and a 0 cell mean different things, and both appear in the same file. Our loader preserves that distinction. A blank usually means the line is not carried in the FY2026 columns — most often because the program element was renumbered, not cancelled. DARPA is the clearest case: the FY2026 request retired 14 of its old program elements and introduced 8 new ones, while DARPA’s total request rose to $4.92B from $4.15B. Calling Defense Research Sciences“zeroed out” described a renumbering as a cancellation.
The query now requires positive evidence: the corpus must hold a FY2026 figure for the program and that figure must be zero. On the current corpus nothing meets that bar, so the section is empty rather than populated with inference. A gate (24h) fails the build if any feed card claims a program was zeroed in a year for which we hold no figure, or a non-zero one.
Award Concentration Shifts (concentration_shift)
Programs whose Herfindahl-Hirschman Index (HHI), computed from high-confidence award transactions grouped by fiscal year, is non-trivial. The HHI floor is $5M in matched obligations. HHI = sum(share² × 10,000) where share = family_obligation / total_obligation; only positive obligations are included (negative/recoupment flows are excluded). Bands follow the DOJ/FTC Horizontal Merger Guidelines convention: below 1,500 is competitive, 1,500–2,500 is moderately concentrated, and 2,500 or above is highly concentrated (2,500 is the "highly concentrated" floor, not a near-monopoly line — four equal-share firms alone produce exactly 2,500).
This figure is a single fiscal year’s HHI, not a program’s overall concentration. A program’s own page (its “Contractor Concentration” card) renders a different, pooled HHI computed across every award year and both high- and medium-confidence links. The two are legitimately different measures of the same program — a single concentrated year can sit next to a competitive pooled figure, or the reverse, with no error on either page. Every concentration_shift card states which fiscal year its HHI covers and that the program’s pooled figure can differ.
Largest Request-vs-Actuals Gaps (request_vs_actuals_gap)
The largest gaps between what a President's Budget asked for a fiscal year and what a later book reported actually spent: the PB(N) request for FY N compared against the PB(N+2) book's FY N actuals, ranked by absolute dollar gap across all loaded editions (PB2017–PB2026). The claim is scoped exactly to this request-vs-actuals comparison — the feed makes no claim about request-vs-request changes between adjacent asks. Each figure cites its book-diff derived fact; the citation panel shows the two input figures (each cited to its own edition's workbook) and the show-your-work breakdown.
New Defense Contractors (new_entrant)
Entity families whose first award year in the DoD transaction data is FY2024 or later and whose cumulative positive obligations exceed $1M. “First award year” is determined from the USAspending award archive (FY2017 onward). Entities that received their first award before FY2017 may appear as new entrants due to archive coverage limits — treat as a weak signal. The figure shown is total cumulative obligations (USD).
6. Corrections
If you find a number that appears wrong, send us the citation that contradicts it and we will investigate. We follow a supersede-not-delete policy: a corrected record is marked superseded and a new record takes its place. The old record is retained and accessible. Permalinks continue to resolve permanently; they show the current best value alongside the correction history if one exists.
Corrections issued 2026-08-08
An independent review found six published figures that were correctly cited but wrongly labelled — each number matched its source, while the sentence around it claimed something the source did not support. Four of the corrections make a published figure smaller. We publish the smaller true number rather than the larger false one.
| Figure | Was | Now | Why |
|---|---|---|---|
| District linkable obligations | $8.01B | $5.58B | One award matched to N program elements was counted N times. Alaska's $1.05B was a single $209.3M award counted five times. Totals now count each award once. |
| Lobbying program mentions | 34,538 | 10,560 | A mention required one shared word of five or more letters, so “Based”, “Services” and “Chemical” counted as namings. A mention now requires a program-element code, two distinctive words, or a curated alias, and each row shows which. |
| Program index coverage | 1,741 of 1,741 | $228.5B of $385.3B | The row counter denominated the index by itself. It is now denominated in dollars against the FY2026 request, and the largest excluded lines are named. |
| Program lineage (stated edges) | 31 | 29 | Two edges were extracted from sentences that retract themselves — one described a transfer made “erroneously” and reversed in the next sentence. |
| FY2026 request figures | unlabelled | split disclosed | $89.01B of the $385.27B request is one-time reconciliation money. Program pages now show the discretionary and reconciliation parts, and the discretionary change rate, beside the combined figure. |
| Basis chip on RDT&E lines | P-1 TOA | R-1 TOA | P-1 is the procurement exhibit; 1,077 of 1,741 programs are RDT&E and are reported on R-1. The chip now reads from each row's own exhibit. |
| Programs sharing a budget-line key | fused | separated | Six pages summed two unrelated programs that share a numeric key. Shipboard Tactical Communications published $2.62B; it is a $20.9M line, and the rest belonged to LPD Flight II. The keys are now account-aware. The displaced programs are named in the coverage note on Programs, not silently dropped. |
| Concentration (HHI) wording | “near-monopoly” | DOJ/FTC bands | 2,500 was labelled a near-monopoly; it is the “highly concentrated” floor, and four equal firms produce exactly 2,500. A single year's concentration also now says so, because the pooled all-years figure on the page it links to can legitimately differ. |
Twenty-seven claims in five research dossiers cited lobbying mentions that no longer meet the evidence standard. Those claims were removed and the affected dossiers say so.
Title overrides
A handful of program titles are verbatim source-workbook text with a typo the workbook itself never fixed. We do not run a display-time find-and-replace for this — this corpus also carries RDT&E, S&T, HM&E, D&UP and R&D, and a rule that inserts a space after every ampersand would corrupt every one of those. Instead each correction is a specific, published row below: the exact source string, what we display instead, and why. A row stops applying automatically if the source workbook is ever corrected upstream — the title it names must still match the workbook's current text, or it no longer takes effect.
| PE / BLI | Source title | Displayed title | Why | Verified |
|---|---|---|---|---|
| 0603183D8Z | Joint Hypersonic Technology Development &Transition | Joint Hypersonic Technology Development & Transition | Source workbook omits the space after the ampersand; no other change. | 2026-08-13 |
7. Cite us / bulk data
When citing a specific figure, include the source citation displayed alongside it: document title, fiscal year, page or XML element path, and the date we retrieved the file. USAspending-derived figures cite the archive file name and SHA-256 hash; J-book figures cite the PDF title, page number, and XML element path.
Bulk data exports (Parquet files with data dictionaries) are available — see Downloads. The export schema includes the same provenance metadata that backs every on-screen figure.