Private AI Valuation Agent Week 4: Entity Resolution & The Golden Set
Databricks appears under 51 different filing names and SpaceX under 28; Om Mali builds a 322-label golden set to test a deterministic matcher and catches his own labeling mistake along the way.
Every filing writes a company's name however it likes, which sounds like a minor annoyance until you try to price anything based on those filings. If you cannot tell for certain which company a row of data refers to, nothing downstream, valuation, comparison, trend analysis, can be trusted. Week four of the private AI valuation agent project tackles that problem head-on, building both a matcher that decides which company a filing means and a rigorous way to prove whether that matcher actually works.
The scale of the messiness
Seven companies turn out to file under 128 different name spellings between them. Databricks alone shows up under 51 different spellings. SpaceX appears under 28, and Anthropic under 10. These are not hypothetical variations; they are real strings exactly as funds typed them into their filings, and they are scattered across 3.2 million distinct issuer names in the underlying dataset. Finding every one of those 128 spellings and correctly mapping them back to the right company is the entire problem this week's work sets out to solve.
Building a golden set instead of trusting a guess
Rather than eyeballing whether a matcher looked reasonable, the project built a ground-truth set: 322 name strings, each hand-labeled with the company it actually refers to, covering 7,276 individual holdings. That golden set became the yardstick for scoring two different systems, the original simple name-pattern matcher and a new deterministic matcher built for this stage of the project. The pattern matcher scored 98% recall. The new deterministic matcher hit 100% recall, but precision barely moved between the two, and on the hardest individual cases, the older pattern matcher was actually cleaner. The honest claim from this test is about recall, not precision, and stating that distinction clearly matters more than claiming an overall win.
One character hiding 85 holdings
A single formatting quirk illustrates why this level of rigor matters. Some funds write a company's ticker-like abbreviation with a dot in the middle, others without it. That one dot was hiding 85 holdings, all belonging to Fidelity, the largest holder of that company. A single character was enough to make the largest holder of a company effectively invisible to the matcher.
Catching your own mistake
The most important moment in this week's work was not a success, it was catching a self-inflicted error. A holding had been flagged as not belonging to any of the seven tracked companies, with a confident written justification for excluding it. Reading the actual underlying rows told a different story: five holdings, including ones held by major funds, all priced at 687.6869, which is the exact per-share price of OpenAI's Series C round to four decimal places. The flagged holding was OpenAI the whole time, and the original justification for excluding it was factually wrong. That approval was withdrawn, the matcher was fixed, and the worse number was published right next to the better one, because a score measured only after fixing what the test caught is not a real validation, it is just a number.
Where a human still has to step in
Not every case resolves cleanly even after the fixes. A used-car marketplace whose name happens to contain a substring similar to a tracked company's name scores identically to entries that genuinely are that company, and two of those entries differ only by a trailing space, yet all score at the same confidence level. No cutoff threshold cleanly separates them. For cases like this, four per run, the system routes the decision to a person rather than forcing an automated call. Of the full golden set of 322 labels, eight have now actually been reviewed by a person as a direct result of this testing process.
Key takeaways
- Seven tracked private companies file under 128 different name spellings, hidden across 3.2 million distinct issuer names.
- A 322-label golden set, covering 7,276 holdings, was built to score matcher performance against real ground truth.
- The new deterministic matcher improved recall from 98% to 100%, but precision did not meaningfully improve.
- A single formatting difference, a dot in an abbreviation, was hiding 85 holdings belonging to Fidelity.
- The golden set caught a previously approved mislabeling of an OpenAI holding, identified by matching its exact Series C share price.
- Ambiguous cases with no clean confidence threshold, roughly four per run, are routed to a human reviewer instead of being resolved automatically.
Try it yourself
The challenge for anyone working with messy company or entity data: take a real list of names from your own dataset, customers, vendors, anything, and hand-label 30 rows with the true entity each one represents. Run your existing matching logic against those labels and measure its recall, then go back and find what your own labeling got wrong in the first place. This project is part of the Mycroft Financial AI work within the Humanitarians AI Fellows program.
Chapters
- 0:00Week 4: The Challenge of Messy Filing Names
- 0:307 Companies, 128 Spellings, 3.2 Million Rows
- 0:55Building the Golden Set of 322 Ground-Truth Labels
- 1:18Testing the Systems: Pattern Matcher vs. Deterministic Matcher
- 1:45The Hiding Dot: Spotting Fidelity's Hidden Holdings
- 2:10Letting the Test Overrule You: The Open Air C-Series Price Trap
- 2:45The 4-Case Threshold: When to Involve a Human
- 3:10Your Turn: Run Your Own Entity Resolution Test
Full transcript(auto-generated, with timestamps)
Week 4: The Challenge of Messy Filing Names
[0:00]Hi, I'm Am Molly. Week four of the private AI valuation agent. Seven companies filing under 128 different names. This week, I built the thing that decides which company a filing is actually talking about. And more importantly, a way to prove whether it works. Every filing writes a company's name however it likes. And if you cannot tell which company a row refers to, you cannot price anything. So this week has two halves. A matcher that decides and a labeled set of right answers to check it against. The second half is the one that
7 Companies, 128 Spellings, 3.2 Million Rows
[0:30]Matters. Data Bricks shows up under 51 different spellings. Space Exploration 28, Anthropic 10, seven companies wearing 128 names between them. Those are real strings exactly as funds typed them. And they are hiding inside 3.2 million distinct issuer names. So I built a ground truth set, 322 of these strings, each labeled with the company it actually means, covering 7,276
Building the Golden Set of 322 Ground-Truth Labels
[0:55]Holdings. Then I scored two systems against the same labels. The simple name patterns I started with and a new deterministic matcher. The patterns I started with 98% recall. The new matcher 100% but precision barely moves. And I want to be exact about that. On the hardest cases, the old patterns were actually cleaner. So the honest claim here is recall not precision. Here is
Testing the Systems: Pattern Matcher vs. Deterministic Matcher
[1:18]One reason why some funds write X do I with a dot in the middle. Some write it without. That single dot was hiding 85 holdings. And the fund hiding behind it was Fidelity, the largest holder of that company. One character, the biggest holder, invisible. Now, the part I did not expect. I had flagged a holding called Openair.com as not one of my companies. I wrote a confident reason. I approved my own judgment. Then I read the actual rows. Five holdings, Black Rockck, and New York Life, all priced at
The Hiding Dot: Spotting Fidelity's Hidden Holdings
[1:46]687.6869, which is Open AI series C price to four decimal places. It was open AI the whole time. My reason had been factually wrong and my own matcher was throwing those five holdings away. So I withdrew the approval, fixed the matcher and published the worst number next to the better one. Because a score you measured after fixing what the test caught is not a validation. It is just a score. And there is no threshold that saves you
Letting the Test Overrule You: The Open Air C-Series Price Trap
[2:11]Here. A used car marketplace whose name happens to contain open and I scores exactly the same as three entries that really are space X. And two of those three are the same string, differing only by a trailing space. 080 all four. No cutoff separates them. So four cases a run go to a person instead. Week four on one page. Seven companies, 128 spellings, 3.2 million names to hide in. A golden set of 322 labels, and two systems scored against it. Recall went to 100%. Precision did not really improve, and the set caught a label I had already approved. Eight of those 322
The 4-Case Threshold: When to Involve a Human
[2:45]Have actually been reviewed by a person. next week. Can a language model beat this? And if it cannot, I say so. Your turn. Paste this into Claude. Take a messy list of names out of your own data, customers, vendors, anything. Label 30 rows by hand with the real entity each one is. Then run whatever matching logic you already have against those labels and measure its recall. Then, and this is the part that matters, go back and find out what your own labeling got wrong. Building the test is
Your Turn: Run Your Own Entity Resolution Test
[3:10]The easy half. Being willing to let it overrule you is the whole job. Entity resolution and the golden set. Week four of the private AI valuation agent Amali for humanitarians.
More from Mycroft Financial AI
3:35Private AI Valuation Agent Week 5: Local LLM vs. Rules
2:18Mycroft's GitHub MCP Assistant Part 2: The Manual Client & Debugging Harness
2:09Muskan's Update on Vendor Intel Guardrails: Enforcing Instructions in Code
3:00Mycroft Thesis Guard: Fighting Thesis Drift in Investment Research
1:55Brief Evaluation Harness: Grading AI Outputs with Code
15:15