title-guard — Executive Summary
One line: we validated and normalized B2B contact data (names + job titles) at commercial-vendor quality on a $5/month server, for roughly one ten-thousandth of the quoted budget.
💡 Update (July 15, 2026): a follow-up adversarial test round (1,400 generated cases + fresh holdout) hardened the filters — profanity morphology, 396 known fake identities, unicode names, placeholder edge cases. SEC golden pass is now 100%; whole-box throughput 909 titles/s (10M records ≈ 3.1h, still 8× under requirement). Details: blog post.
What it does
Given a contact record, title-guard answers three questions with a 0–1 confidence score and explicit flags:
- Is the job title real? (
Chief Butthead,asdf qwerty,test→ rejected) - What does it mean? Normalized to the US Department of Labor ONET taxonomy (1,016 occupations) plus a seniority level (`EVP & CFO` → Chief Executives*, c-suite)
- Is the person real? (
Mickey Mouse,John Doe,N/A N/A, keyboard mash → rejected;Sean O'Brien,Lakshmi Venkatasubramanian→ accepted)
No GPU, no external API, no per-row vendor fees. Built entirely from free authoritative data: O*NET, SEC EDGAR, US Census, SSA.
Quality (measured)
| Check | Result |
|---|---|
| 600 real SEC-filed executive titles accepted | 99.8% |
| Synthetic garbage titles caught | 12/12 |
| Legitimate names accepted (incl. Irish, Indian, Hispanic, hyphenated) | 16/16 |
| Fake/garbage names caught | 16/16 |
Key insight: Mickey Mouse, Chief Magic Officer passes a title-only check (it is a plausible title). Only the combined name+title filter catches it. Both filters ship.
Speed and cost (measured on the 4-core VPS)
- 1,030 titles/second whole-box; 42,771 names/second per core.
- 10 million records ≈ 2.8 hours on this one $5/month box — 8× under the 24-hour requirement, at ~$0 marginal cost.
| Approach for 10M records | Wall time | Cost |
|---|---|---|
| This VPS (owned) | ~2.8 h | ~$0 |
| Rented 32-vCPU cloud box | ~20 min | \< $1 |
| Hybrid: title-guard + LLM on low-confidence 5% | ~3 h | ~$110 |
| LLM API for every record (Haiku 4.5, batch) | hours | ~$2,000 |
| LLM API (Sonnet 5, batch) | hours | ~$6,800 |
The $100–500 budget is not just met — the pure-classical path is ~500× under it, and the quality-maximizing hybrid still fits 4× under the low end.
Recommendation
- Run the classical filter on everything. It is effectively free and catches the bulk of garbage with explainable, auditable flags.
- Spend the budget on the tail: route the ~5% low-confidence records to an LLM (≈$110 per 10M records) and to the planned C2.5 embedding layer, which fixes the one known weakness (function-vs-rank confusion: "Head of Growth Marketing" currently maps to an agricultural occupation).
- GPU only if/when the embedding layer scales up — and then via Python (RAPIDS/PyTorch) on ~$0.50/hr spot instances, not CUDA engineering.
Full method and benchmarks: see the research paper and case study in this folder. Every number comes from a measured run; `bench_results.json` is in the repo.