{
  "measuredOn": "2026-10-10",
  "command": "node scripts/evaluate-corpus.mjs",
  "scope": "Hand-checked ground truth in corpus/manifest.json. Ground truth was not copied from parser output. Official bank PDFs are not redistributed from this site.",
  "limits": "Seven cases and 52 ground-truth rows. That is below this project's own target of 15 statements and 5 banks. A bank listed on /banks is not a tested layout. These figures are not a guarantee for your file.",
  "allCases": {
    "cases": 7,
    "groundTruthRows": 52,
    "transactionRecall": "96.2% (50/52)",
    "amountAccuracy": "96.2% (50/52)",
    "dateAccuracy": "90.4% (47/52)",
    "directionAccuracy": "90.4% (47/52)",
    "missedRows": "2/52",
    "silentSevereErrors": 0,
    "balanceAnomalyRecall": "100% (1/1)",
    "structuralRejectAccuracy": "100% (1/1)"
  },
  "heldOutOfficialSamples": {
    "cases": "Wells Fargo official sample and Commerce Bank official sample",
    "groundTruthRows": 27,
    "transactionRecall": "92.6% (25/27)",
    "amountAccuracy": "92.6% (25/27)",
    "dateAccuracy": "81.5% (22/27)",
    "directionAccuracy": "81.5% (22/27)"
  },
  "cases": [
    {
      "id": "official-wells-fargo-sample",
      "source": "Official public sample PDF, not redistributed",
      "kind": "native text PDF",
      "rows": "22/22 dates, amounts, and signs",
      "balance": "Statement reported valid",
      "result": "pass"
    },
    {
      "id": "official-commerce-bank-sample",
      "source": "Official public sample PDF, not redistributed",
      "kind": "native text PDF",
      "rows": "3 of 5 rows recalled. A deposit row and an ATM withdrawal were missed. Three check rows kept unparsed MM-DD dates and the wrong sign.",
      "balance": "Statement flagged invalid. The miss was not silent. The source PDF's own check summary also disagrees with its itemized checks.",
      "result": "parser miss"
    },
    {
      "id": "official-bank-of-america-how-to-read",
      "source": "Official how-to-read PDF, not redistributed",
      "kind": "composite document, expected reject",
      "rows": "0 transactions extracted",
      "balance": "Flagged UNSUPPORTED_COMPOSITE_DOCUMENT instead of exporting a fake transaction table",
      "result": "expected reject"
    },
    {
      "id": "single-column-running-balance",
      "source": "Synthetic text we can republish",
      "kind": "single amount column",
      "rows": "6/6",
      "balance": "Valid",
      "result": "pass"
    },
    {
      "id": "debit-credit-wrapped-description",
      "source": "Synthetic text we can republish",
      "kind": "split debit and credit columns, wrapped description",
      "rows": "6/6",
      "balance": "Valid",
      "result": "pass"
    },
    {
      "id": "balance-break-and-duplicate",
      "source": "Synthetic text we can republish",
      "kind": "planted duplicate row and a closing balance that is $20.00 high",
      "rows": "6/6 recalled",
      "balance": "Flagged invalid, which is the intended result",
      "result": "caught failure"
    },
    {
      "id": "us-format-multi-page-markers",
      "source": "Synthetic text we can republish",
      "kind": "two pages, repeated header, wrapped description, trailing minus, parentheses, DR and CR",
      "rows": "7/7 including negative amounts and a row that continues after the page break",
      "balance": "Valid. Opening 4820.00 to closing 5579.75",
      "result": "pass"
    }
  ],
  "scannedSeparate": {
    "includedInThe52Rows": false,
    "whatItIs": "One synthetic image-only PDF with no text layer. English OCR runs locally. The automated test expects 4 dated rows, signed amounts, running balances, and a matching closing balance, with no network request.",
    "whatItIsNot": "Not a scanned-bank accuracy rate. Phone photos, skew, blur, handwriting, and non-English scans are not in this scored set."
  },
  "notMeasured": [
    "QuickBooks Desktop or QuickBooks Online import success",
    "Every layout of the banks named on /banks",
    "Real customer files",
    "A percentage for blurry or photographed statements"
  ]
}
