CORE Pipeline Quality Report


Form: 990 Tax year: 2012 Generated: 2026-05-11 17:05:18

✅ PASSED — Strict mode: TRUE

Executive Summary

Metric Value
Row count 287,884
Column count 251
Vintage-aware completeness 99.99%
Raw completeness (all cols / all rows) 89.27%
Unique EINs 287,020
Duplicate EINs (amendments) 864
Missing columns vs schema 0
Extra columns vs schema 0
YoY row-count delta vs prior run outside_bounds

Identity-Field Checks

Code
ein  <- r$critical_field_issues$ein
tp   <- r$critical_field_issues$tax_period
sub  <- r$critical_field_issues$subsection
typ  <- r$critical_field_issues$types

ident <- data.table(
  Check = c("EIN format (XX-XXXXXXX)", "EIN null count", "EIN duplicates (soft)",
            "tax_period format (YYYYMM)", "tax_period out-of-range",
            "subsection_cd whitelist", "Column types"),
  Result = c(
    if (is.null(ein))  "✅ all valid" else sprintf("❌ %d malformed", ein$malformed),
    if (is.null(ein) && r$summary_stats$duplicate_eins >= 0) "✅ no nulls" else sprintf("❌ %d nulls", ein$null_count),
    sprintf("ℹ %d (soft, not a failure)", r$summary_stats$duplicate_eins),
    if (is.null(tp))   "✅ all valid"  else sprintf("❌ %d malformed", tp$malformed_count),
    if (is.null(tp))   "✅ all in range" else sprintf("❌ %d out of range", tp$out_of_range_count),
    if (is.null(sub))  "✅ all in IRM whitelist" else sprintf("❌ %d unknown codes", sub$unknown_count),
    if (is.null(typ))  "✅ all types correct" else sprintf("❌ %s", paste(typ$issues, collapse = "; "))
  )
)
kable(ident)
Check Result
EIN format (XX-XXXXXXX) ✅ all valid
EIN null count ✅ no nulls
EIN duplicates (soft) ℹ 864 (soft, not a failure)
tax_period format (YYYYMM) ✅ all valid
tax_period out-of-range ✅ all in range
subsection_cd whitelist ✅ all in IRM whitelist
Column types ✅ all types correct

Subsection Code Distribution

(IRC 501(c) / 501(d) / 501(e) / 501(f) / 501(k) / 501(n) / 521 / 527 / 529 / 4947 / 1381 subsection codes per IRM 25.7.1. See data/lookups/subsection_codes.csv.)

Code
sd <- r$summary_stats$subsection_distribution
if (length(sd$top_values) == 0L) {
  cat("(no subsection data)")
} else {
  tab <- rbindlist(lapply(sd$top_values, as.data.table))
  setnames(tab, c("code", "count", "pct"))
  tab[, pct := paste0(pct, "%")]
  tab[, count := format(count, big.mark = ",")]
  kable(tab)
}
code count pct
3 212,173 73.7%
6 19,582 6.8%
4 11,104 3.86%
5 9,930 3.45%
7 9,453 3.28%
9 5,395 1.87%
8 4,661 1.62%
19 4,262 1.48%
12 2,840 0.99%
14 2,124 0.74%

Financial Summary

Code
fin <- r$summary_stats$financial
if (length(fin) == 0L) {
  cat("(no financial summary)")
} else {
  tab <- data.table(
    metric = c("total_revenue", "total_expenses", "total_assets_eoy"),
    sum = c(fmt_money(fin$revenue$total),  fmt_money(fin$expenses$total),  fmt_money(fin$assets$total)),
    median = c(fmt_money(fin$revenue$median), fmt_money(fin$expenses$median), fmt_money(fin$assets$median))
  )
  kable(tab)
}
metric sum median
total_revenue $2,097,569,023,459 $399,160
total_expenses
total_assets_eoy $4,302,372,363,085 $631,462

Tax Period Year Coverage

Code
d <- r$summary_stats$tax_period_year_distribution
if (length(d) == 0L) {
  cat("(no coverage data)")
} else {
  tab <- data.table(tax_year = names(d), n = as.integer(unlist(d)))
  setorder(tab, tax_year)
  tab[, pct := sprintf("%.2f%%", 100 * n / sum(n))]
  tab[, n := format(n, big.mark = ",")]
  kable(tab)
}
tax_year n pct
2012 287,884 100.00%

Field Completeness by Category

Columns are grouped by Form section parsed from the crosswalk’s location field.

Code
cats <- r$category_reports
if (length(cats) == 0L) {
  cat("(no category breakdown)")
} else {
  tab <- rbindlist(lapply(cats, function(c) data.table(
    category         = c$category_name,
    n_cols           = c$column_count,
    cols_present     = c$columns_present,
    avg_completeness = sprintf("%.2f%%", c$avg_completeness)
  )))
  setorder(tab, -n_cols)
  kable(tab)
}
category n_cols cols_present avg_completeness
part_iv 52 52 85.82%
part_viii 48 48 94.68%
part_ix 36 36 87.81%
part_v 35 35 87.80%
part_x 34 34 88.76%
sched_a 32 32 91.15%
part_vii 5 5 85.84%
header 3 3 100.00%
other 1 1 0.87%

Completeness by Vintage Cohort

When a single tax-year file blends rows from multiple extract_year × source_form cohorts, the per-cohort completeness reveals whether any vintage is dragging the overall metric down. A clean run produces 100% for every cohort.

Code
pc <- r$completeness_by_cohort
if (length(pc) == 0L) {
  cat("(single cohort)")
} else {
  tab <- rbindlist(lapply(pc, function(c) data.table(
    extract_year     = c$extract_year,
    source_form      = c$source_form,
    rows             = format(c$n_rows, big.mark = ","),
    expected_cols    = c$n_expected_cols,
    completeness_pct = sprintf("%.2f%%", c$completeness_pct)
  )))
  kable(tab)
}
extract_year source_form rows expected_cols completeness_pct
2012 990 40,768 67 100.00%
2013 990 229,004 250 100.00%
2014 990 15,617 250 100.00%
2015 990 1,496 251 97.61%
2016 990 512 251 100.00%
2017 990 201 251 100.00%
2018 990 142 251 100.00%
2019 990 51 251 97.01%
2020 990 22 251 96.87%
2021 990 26 251 97.04%
2022 990 16 251 89.44%
2023 990 16 251 96.49%
2024 990 13 251 97.24%

Data Issues

Code
issues <- character(0)
if (length(r$missing_columns)) issues <- c(issues, sprintf("Missing %d columns: %s",
  length(r$missing_columns), paste(head(r$missing_columns, 10), collapse = ", ")))
if (length(r$extra_columns)) issues <- c(issues, sprintf("Extra %d columns: %s",
  length(r$extra_columns), paste(head(r$extra_columns, 10), collapse = ", ")))
if (length(r$critical_field_issues)) {
  for (k in names(r$critical_field_issues)) {
    issues <- c(issues, sprintf("%s: %s", k, paste(unlist(r$critical_field_issues[[k]]), collapse = " | ")))
  }
}

if (length(issues) == 0L) {
  cat("✅ No hard-check issues detected.\n")
} else {
  for (i in issues) cat("- ", i, "\n", sep = "")
}
✅ No hard-check issues detected.

Generated from /mnt/c/Users/tpoongundranar/Documents/Urban/NCCS/nccs-data-core/data/logs/quality_990_2012.rds. See R/quality/post_checks.R for the validator implementation and docs/05-quality-gates.qmd for the gate definitions.