Does the card match the record?
The eighth spot often goes to the catcher. Glove first. The one guy who sees the whole field and keeps the book on every hitter.
This one has no agent in it. Across the top of the scorecard, in my grandfather's hand: GEORGE GEORGE. Then 1st, circled. Then the names: Georgie. George. Roger. And me. Three generations of Georges on one card, and the card is the first row in everything the rest of the lineup queries.
The game. Sunday, June 10, 1984. Bat Day. Blue Jays at Yankees, 5–3. My first game. Rawley started, Christiansen got the win (Poppa circled him), Righetti saved it. Mattingly homered in the third, Gamble in the sixth. 41,018 people, and four of them were us. Uncle Roger came along, and as far as the record knows, it's the only game I ever saw with him.
178 games, 22 ballparks, 400 home runs. The full stat sheet is in the game notes.
Who I went with, top five: Melissa 57, Bergan 27, Al 26, alone 16, Poppa 14. First names only, by rule. Poppa is on fourteen of the cards and kept score at most of them. The names were 101 different spellings before a cleanup pass made them 84 people. And a simple check, two values in one row can't be one person, caught six wrong game ids that had survived 41 years of copying. That check became the model for every gate an agent has to pass later.
The lineage runs backward from here. Tickets and programs and scorecards were the source I typed into a baseball-tracking app twenty-some years ago. The app exported to a spreadsheet. The spreadsheet became a BigQuery table. dbt modeled it. The agents stand on that. Scanning the cards closes the loop: it brings the physical artifacts back into the pipeline they seeded. This is not a data project. It's a multigenerational family archive that happens to be queryable.
Thirteen cards are scanned so far, from a shoebox of fifty to a hundred. Eleven of them match a game in the 178. Two don't, and the rule for those is simple: if Poppa's card has a date that isn't in my games, it's a game he went to without me, because he'd surely have written “Georgie.” One of the two is July 7, 1991. “Williams CF” is scored in the Yankees lineup. Bernie Williams's major-league debut, in my grandfather's pencil, at a game I wasn't at. That one mattered to us. The Albany-Colonie Yankees, Double-A, were our local team, and we'd watched a lot of kids come up through there. Bernie played for them in '89 and '90, with Buck Showalter managing. It stays in the archive and out of the data.
The box score above is generated. box_score.py takes any of the 178 game ids, pulls the play-by-play from Retrosheet, and renders the agate the way the AP wire would have. Batting lines, pitching lines, the line score. Set it beside the card and you're looking at two records of the same afternoon kept forty-two years apart by two different methods, and they agree. That agreement is the whole argument for writing things down.
Of the 30 playoff games, eight are from 2001: every home game of the Division Series and the League Championship Series, and World Series Games 3 and 5. So the President's first pitch in Game 3 and Brosius's ninth-inning home run in Game 5, in person. Jeter's “Mr. November” walk-off was Game 4. I watched that one on TV like everyone else. The data knows the difference, and so does the card.
Find the oldest record you have of anything you care about. Check one row against the official source. If they agree, you've got a clean dataset. If they don't, you've got a story.
Next, batting 9th: Why do people like us keep score? →