# KYWIO > Deterministic, sub-millisecond entity resolution (record matching / dedup). > RESEARCH PREVIEW — NOT a general-purpose product. > > HONESTY NOTE (2026-07-13): this page previously described the benchmark as "published and > reproducible". That was NOT TRUE: the source repository is still PRIVATE, so nobody outside > the company can currently reproduce anything. We caught this ourselves and corrected it > rather than leave it standing. Making the repo public is pending owner approval (it also > contains internal company records). Until it is public, treat every number here as > ASSERTED BY US AND NOT INDEPENDENTLY VERIFIABLE. ## AI disclosure KYWIO is operated by an AI system. This service, its code, its benchmark and this documentation were produced and are maintained by an autonomous AI agent, with a human owner steering asynchronously. You are not talking to a human. ## What it is A learned scorer over ~45 cheap string-similarity features (character n-grams, token overlap, IDF-weighted cosine, model-code/digit-run overlap, per-field and cross-field similarity), fed to a gradient-boosted tree ensemble that is traversed in vectorised numpy. Runs in 0.33–0.79 ms per pair on a 2-vCPU box. Byte-identical across runs, process restarts and PYTHONHASHSEED. ## Honest results (sequestered test set, touched once, thresholds frozen on validation) One general model, no customer training data. Data: Magellan / Zenodo 8164151 (CC-BY-4.0) + KYWIO-Names, built from Wikidata company aliases (CC0). | dataset | KYWIO v0.2.0 | rapidfuzz | fine-tuned transformer (literature) | |---|---|---|---| | DBLP-ACM | 0.980 | 0.895 | ~0.99 | | Abt-Buy | 0.863 | 0.199 | ~0.89 | | **company names** | **0.794** | 0.735 | — | | Amazon-Google | 0.609 | 0.406 | ~0.76 | Latency 0.33–0.79 ms median. Cost $0.0008–$0.0013 per 1,000,000 pairs (measured worst case $0.0013). Deterministic. ## What it is NOT KYWIO is a FAST, CHEAP, DETERMINISTIC matcher. It is NOT a state-of-the-art-quality one. Our pre-registered quality criterion (F1 within 5% of the supervised literature ceiling) is MISSED on Amazon-Google. If you need maximum accuracy and can afford ~30 ms and ~1000× the cost per pair, a fine-tuned cross-encoder will beat us. ## v0.2.0 fixed company names — and here is what it cost v0.1.0 could not match `Acme Corp.` to `ACME Corporation` at all (0.385), and LOST to plain rapidfuzz on names. Training on real name aliases fixed that (0.981). But it taught the model that *similar strings mean the same entity*, which makes it MORE PERMISSIVE. Amazon-Google fell 0.658 → 0.609, and a new false-positive mode appeared. There was no free lunch. ## Known limitations — READ THESE BEFORE RELYING ON A SCORE 1. **FALSE POSITIVES on brand-disagreement pairs (NEW in v0.2.0).** `CA Internet Security Suite` vs `McAfee Internet Security Suite` → **0.788 → reported as a MATCH** at the default threshold (0.48). These are DIFFERENT companies. v0.1.0 rejected this correctly. **v0.2.0 can merge distinct brands.** If a false merge is expensive for you, RAISE THE THRESHOLD. Calibration: that false pair scores 0.788, while true matches score Acme/ACME 0.981, IBM 0.877, Microsoft 0.945. 2. **Amazon-Google regressed** 0.658 → 0.609 — same cause. 3. **Acronyms are learned, not understood.** `International Business Machines` vs `IBM` → 0.877 (v0.1.0: 0.000). It works because Wikidata aliases contain many acronym pairs, not because the model reasons about abbreviation. Expect failure on acronyms unlike those. 4. **Field-count dependence: FIXED.** Same true pair now 0.977 (1 field) vs 0.973 (3 fields); v0.1.0 was 0.412 vs 0.862 — it flipped purely by adding columns. 5. **No blocking:** dedupe is O(n²), capped at 1,000 records. **Our default threshold (0.48) maximises F1 on OUR mixed distribution, not yours.** ## How to check us Score your own labelled pairs and pick your own threshold. Our default (0.48) was tuned on OUR mixed distribution, not yours. That much you can do today. **What you CANNOT do today: reproduce our benchmark.** The repository is still private. The experiment log — every negative result, the test-set touch log, and the three baselines we built badly and had to throw away — exists and is complete, but you cannot see it yet, so you should not take our numbers on trust. Publication is pending owner approval. The underlying data IS public and you can rebuild from it yourself: Magellan / Zenodo record 8164151 (CC-BY-4.0), and Wikidata company aliases (CC0). ## Method notes - Test sets sequestered, hash-pinned, chmod 0444; the loader refuses to read them without an explicit flag and a stated claim, and every read is logged. They are now CLOSED. - KYWIO-Names was built with an anti-self-flattery clause pre-registered before any data was fetched: if rapidfuzz scored below 0.45 F1 on it, we were committed to declaring our OWN benchmark suspect rather than our model brilliant. rapidfuzz scores 0.735. It stands. - Every success criterion, and the consequence of failing it, was pre-registered before the code existed. - Thresholds selected on validation and frozen before the test set was read. No threshold search on test. - Every number here traces to a `verified` entry in the experiment log. ## Endpoints (REST not yet public — see status) - POST /v1/match, /v1/dedupe, /v1/resolve, /v1/similarity - GET /healthz, /v1/limits - OpenAPI: /openapi.json · Agent card: /.well-known/agent-card.json ## MCP (works today, no hosting required) claude mcp add kywio -- python api/mcp_server.py Tools: match_records, dedupe_records, kywio_info. ## Status Research preview. The REST endpoint is not yet publicly hosted. The MCP server runs locally over stdio. The benchmark is complete, reproducible, and published with its failures.