I had an AI agent climb my family tree
Just outside Egmond-Binnen, a small village at the edge of the North Holland dunes, lies the Adelbertusakker: the early-medieval burial site of Saint Adalbert and the spot where the village first stood before drifting sand pushed it inland. At the entrance, three life-size wooden statues greet visitors. Saint Adalbert, eighth century. Count Dirk II of Holland, tenth century, who founded the abbey there. And a third man, labeled simply "Dirk Schuit, nineteenth-century inhabitant": a farmhand who lived next to the field, and the last named ordinary resident of the place before it became a heritage site.
Ten years ago my parents visited, photographed the statue, and wondered. Schuit is not a common name. Was this an ancestor? Nobody in the family knew; the family's own knowledge stopped at my grandfather, a carpenter in Haarlem, and even that was two lines: roughly when he lived, that the family was Roman Catholic and poor, and a birthplace nobody was sure of.
On a Sunday in May I gave those two lines to Claude Code and asked it to work its way up through the public archives. By the evening it had a documented line back to a baptism in 1790, an inferred generation beyond that, and an answer to my parents' question. Its research log had gone through forty-seven revisions by then, several of them corrections of its own mistakes, some of which I had to catch. This note is about both halves.
What it worked with
Dutch civil and church records are unusually well indexed online, which is what made this feasible at all. The agent used, in rough order of usefulness: Open Archieven (the aggregated index, including its raw JSON API), the Noord-Hollands Archief catalog and its scan viewer, WieWasWie, the CBG family-announcements collection, VPND (a volunteer project that transcribes pre-1811 church registers and publishes the scans as PDFs), the Regionaal Archief Alkmaar person index, and the newspaper viewer of the Noord-Hollands Archief for old address books and death notices. Some sources it could not use: Delpher was unreachable from its environment, FamilySearch and the CBG scans sit behind logins, and the newspaper viewer is behind an anti-bot wall that it got through only by driving my actual browser through the Chrome extension.
The navigation pattern was always the same: search the index, open the record, follow "view on source website" to the archive's own item page, open the scan, read the handwriting. VPND's PDFs it downloaded and read page by page. Over the day it read birth, marriage and death certificates from the nineteenth and early twentieth centuries, a population register, Catholic baptism and marriage registers from the 1780s and 1790s, tax-collector burial books, and a run of city address books.
What it found
I am not going to publish the tree here; it belongs to more people than me. The shape of it is enough. Each generation is tied to the one above by at least one primary record that names the parents: a birth certificate, a marriage certificate, a death certificate, in the best cases all three, cross-checked against each other for dates and ages. The line runs from Haarlem back through a couple of villages north of it to Egmond-Binnen, and from carpenter back through laborer to farmhands in the dunes. Around the time of Napoleon it arrives at a Dirk Schuit: baptized in Egmond-Binnen in 1790, married there in 1818, died there in 1859 at sixty-nine, farmhand, and named as father on the marriage certificate of the next generation down. Baptism, marriage and death all name the same parents for him. It is the best-documented link in the whole chain.
Which is to say: a Dirk Schuit who lived his entire adult life in the nineteenth century in Egmond-Binnen, in a family of farmhands and laborers on the dune edge, is a direct ancestor. The archives do not, of course, mention a statue, and I have not asked the foundation that maintains the site whom exactly they meant. But there are not many candidates. Very probably my parents were looking at great-great-great-grandfather.
The trail goes one generation further, to Dirk's parents, married in 1789 in the same village, and then stops. Not for lack of trying: the register from before about 1780 uses patronymics only. The surname was not in use yet, and there is no name index. Dirk's father is known only from the patronymic his children carried and from the fact that Dirk was named after him. The agent's final deep read of the older baptism register (scans, in Latin, from 1726) confirmed the wall at source level: even if a "Cornelis, son of Dirk" appears there, nothing can attribute him to this family. It called this the "documented ceiling," and I think that is exactly right. Eight generations, the eighth by inference.
Along the way it explained one thing that had puzzled the family for years: every cemetery headstone transcription came back empty. Poor families did not buy a grave; they rented a general one, cleared after about ten years, headstone removed. The burial register would still record the interment, but the stone is long gone.
Where it went wrong
This is the part worth reading if you are thinking of doing the same.
- A confident false match, early. It proposed a birth record for my grandmother in an entirely different province. Wrong age, wrong region, no family connection. I rejected it; it marked the claim superseded and moved on. Had I not known her rough birth year, that would have been baked into everything after.
- It misdescribed a source, twice. It said an 1818 marriage would be found in VPND. VPND transcribes church registers; civil-status certificates from 1811 onward are a different system entirely. I pointed this out; it agreed, then a few revisions later said it again. Its own log records "Onno's repeated, correct catch." It had also called the 1784 to 1814 Catholic layer "manual paleography, not searchable" when in fact a finished typed transcription exists; "too pessimistic," it wrote when corrected.
- "AI can't read the scan; this is a human read." That is a literal line from an early version of the log. I told it that of course it could read the scan. It then transcribed the 1818 certificate, and later three more. Reading the handwriting turned out to be one of the most valuable things it did.
- A birthplace asserted "throughout" that a primary record contradicted. A population register gave one birthplace for an ancestor; the agent repeated it everywhere, including in the summary I had already emailed to my family. His death certificate said a different town. When I flagged it, the agent went back and found that his marriage certificate agreed with the death certificate: two independent civil records against one clerical outlier. His actual birth certificate was never found online. Normal and reliable, but I would have liked the agent to notice the conflict itself.
- An OCR artifact presented as a fact. It claimed one ancestor was never documented at a particular address, based on a text search of scanned address books. His death certificate says he died there. "The primary akte overrides it," it wrote, and it did.
- The dead link. The first paper trail I sent to my family had, next to the weakest link in the chain, a placeholder instead of a record reference; the link literally did not work, which I noticed only after sending. It took two more revisions to fetch the real record and to discover that the scan of that certificate lives only in the archive's own catalog; the aggregator's only pointer is a login-gated FamilySearch collection.
- The ceiling moved twice. Version 1.14 announced "Ascent concluded: 7 generations verified." Version 1.20 said the same ceiling was "genuine, not just an index gap." Version 1.30: "CEILING BROKEN," one more generation. Each of the earlier claims was reasonable on the evidence it had at the time. None of them was final.
The pattern across all of these: the agent is very good at the mechanics (finding, fetching, reading, cross-checking dates and ages, keeping a per-link source list) and needs a human who knows the family and the sources to keep it honest. Every catch above came from me knowing something it did not, or from me reading its output skeptically. It never invented a record. It did over-generalize from a single record several times, and it did assert its own limits wrongly more than once.
Second opinions
When I sent the result to the family, one of them asked his own Claude session about it and got a different emphasis: the family's base, it said, was in the neighboring Egmond villages, not Egmond-Binnen, and it offered the statue as the clue for how a Dirk born in 1790 ended up there. Two agents, two framings, both consistent with the records. What settled it was not either agent's confidence but the paper trail: I had not started from the statue and worked down, I had started from my grandfather and worked up, and Dirk was where the records led.
The exchange also produced my favorite line of the day. Since surnames were not yet in use when the elder Dirk was born, I told my daughter that it remains technically possible that we descend from the count.
What I make of it
Forty-seven revisions in one day, most of them driven by me pushing back or asking for a deeper read of a specific register. That is a very different mode of working from "ask a question, get an answer": more like supervising an extremely fast, extremely literal research assistant who does not know what it does not know. The result is a family tree with a source next to every link and a clear statement of which link is weakest and why. I would not trust any of it without the source list, and with the source list I trust most of it.
Tool: Claude Code, with the Chrome extension for the sites that block scripted access. Everything it read is public, and every claim in its log carries a reference that can be opened and checked.