WIMS · Statistical Report · 2026-06-10

Trademark Holder Matching — v7: Round 1–4 FP Fixes + Full Re-scan + AI Re-review

Fresh deterministic re-scan from a cleared slate (14,476 rows / 11,797 holders) followed by a complete Mistral v3 AI re-review of all 8,374 uncertain matches — 54.9% confirm rate, 10,698 effective matches.
Pre-Round-4 snapshot · 14,705 rows / 12,075 holders / 10,869 effective v7 (current) · 14,476 rows / 11,797 holders / 10,698 effective AI: mistral:latest · MIN_SCORE=0.75 · 281.6 min · 8,369 reviewed
1

What Changed in v7

CODE FIXES (Rounds 1–4)
Generic-token and person-name guards landed in the deterministic matchers. GENERIC_CORPORATE_TOKENS in lei.js was extended with geographic terms (south/north/east/west/africa/taiwan/japan/korea/india/europe/pacific) and industry terms (semiconductor/semiconductors) to stop generic-word LEI parent-walk bridges. A new isPersonNameInitialSuffix() guard in fuzzy.js catches patent-style "Surname Initial" inventor names (e.g. "Smith J") so they no longer fuzzy-match against unrelated companies. Five stale wikidata_relationships rows that produced recurring false-positive subsidiary clusters were deleted.
RE-SCAN
All 14,705 TM matches cleared and re-derived from scratch (snapshot preserved in entity_matches_pre_r4_rescan_backup). The full match:tm cascade (exact → DBA → LEI → wikidata parent-walk → fuzzy → transliteration) re-ran against all 1,262,112 holders at MATCH_CONCURRENCY=16, completing in 21.9 minutes with 14,476 rows across 11,797 unique holders.
AI QUEUE
Queue rebuilt uncertain-only. build:ai-queue queued 8,374 reason='uncertain' entries (existing matches at confidence 0.50–0.94) plus 989,847 reason='no_match' FTS candidates from Phase 2. Per standing policy (<1% acceptance on no-match candidates), the Phase 2 rows were deleted before launch, leaving the queue at exactly 8,374 entries.
RESULT
AI re-review completed under PM2 (ai-queue-mistral, same calibrated v3 prompt and threshold as the prior production run): 8,369 entries processed in 281.6 minutes, 4,591 confirmed (54.9%), 3,778 rejected, 5 errors (transient — see §8). Combined with the 6,107 deterministic matches that never entered the queue (confidence ≥ 0.95 or below the AI floor), the final effective TM match set is 10,698 rows / 8,666 unique holders.
2

Headline KPIs — Before vs After

Total TM Match Rows
14,70514,476
−229 (−1.6%)
Unique Holders Matched
12,07511,797
−278 (−2.3%)
Effective Matches
10,86910,698
−171 (−1.6%)
AI Confirmed
4,8204,591
−229 (−4.8%)
AI Rejected (audit)
3,8363,778
−58 (−1.5%)
AI Confirm Rate
55.7%54.9%
−0.8pp · stable
Companies Covered
4,7444,743
34.5% of 13,767 companies
Holder Coverage
0.93%
11,797 / 1,262,112 holders
Processing Errors
5
0.06% of queue · transient, see §8

Headline finding: a from-scratch deterministic re-scan plus an independent fresh AI pass reproduces 97.3% of the previous hand-curated effective match set (10,698 / 10,869) — and the AI confirm rate held essentially flat (55.7% → 54.9%). This validates that the Round 1–4 code fixes generalize: the −229 net rows removed are not AI-review noise but systematic false-positive removal (generic-token bridges, person-name initials, stale wikidata relationships) that the pipeline now avoids automatically, without manual per-row deletion.

3

AI Re-review — Confirm Rate by Deterministic Origin

Every uncertain match (confidence 0.50–0.94) carries its originating deterministic method in metadata.original_method. Grouping the 8,369 AI decisions by that origin shows where the AI agrees with the deterministic pipeline and where it diverges.

Confirm Rate by Origin Method

exact
1,198 / 1,222
98.0%
translit_*
24 / 28
85.7%
wikidata
118 / 166
71.1%
lei
1,398 / 2,464
56.7%
dba
43 / 99
43.4%
fuzzy
1,810 / 4,390
41.2%
All (total)
4,591 / 8,369
54.9%
Origin methodConfirmedRejectedTotalConfirm rate
exact1,198241,22298.0%
lei1,3981,0662,46456.7%
fuzzy1,8102,5804,39041.2%
wikidata1184816671.1%
dba43569943.4%
translit_*2442885.7%
Total4,5913,7788,36954.9%
📊

Reading the table: exact normalized-name matches at uncertain confidence are almost always genuine (98.0%) — the AI mostly catches edge cases like truncated legal suffixes. fuzzy and dba sit near a coin-flip (41.2% / 43.4%), confirming these remain the noisiest deterministic tiers and the ones where AI adjudication adds the most value. lei at 56.7% reflects the mix of same-country (high agreement) and cross-country (lower agreement) LEI matches. wikidata parent-walk subsidiary links score well (71.1%), and the new transliteration pipeline validates strongly at 85.7% (24/28) — see §6.

4

AI Score Distribution

Confirmed (4,591 rows)

0.795 (raw=0.90)
2,115 rows
46.1%
0.823 (raw=0.95)
1,242 rows
27.1%
0.85 (raw=1.00)
1,172 rows
25.5%
0.8335 (raw=0.97)
46 rows
1.0%
0.839 (raw=0.98)
13 rows
0.3%
0.7675 (raw=0.85)
3 rows
<0.1%

Bimodal as in v6: the 0.795 (raw 0.90) and 0.823 (raw 0.95) clusters dominate, with a smaller 0.85 (raw 1.00, "certain") tail. Score structure is consistent with the calibrated v3 prompt's known distribution.

Rejected (3,778 rows)

0.0 (different entities)
2,233 rows
59.1%
0.685 (raw=0.70) ✗
1,532 rows
40.5%
0.7125 (raw≈0.75)
9 rows
0.2%
0.7356 (raw≈0.79)
4 rows
0.1%

59.1% are outright rejections (model judged different entities, score=0). The remaining 40.9% scored just below MIN_SCORE=0.75 — dominated by the 0.685 "uncertain" bucket (raw 0.70), the same cluster the v3 threshold was specifically calibrated to filter. These rows keep match_method='ai_rejected' for audit but no longer count as effective matches.

5

Final TM Match Breakdown (v7)

Effective Matches (10,698 rows)

exact
5,874 rows
54.9%
ai_confirmed
4,591 rows
42.9%
dba
229 rows
2.1%
fuzzy
3 rows
<0.1%
lei
1 row
<0.1%

exact + dba + fuzzy + lei here are the 6,107 deterministic matches that scored ≥0.95 (or never entered the queue) and were left untouched by AI review.

ai_confirmed Link Type Split

direct
3,244 rows
70.7%
subsidiary
1,347 rows
29.3%

The subsidiary count (1,347) is identical to the pre-Round-4 backup — the −229 net change is entirely in direct links (3,473 → 3,244), consistent with the FP fixes targeting direct fuzzy/LEI bridges rather than the wikidata-derived parent-walk subsidiary set.

Match methodDirectSubsidiaryTotal% of effective
exact5,87405,87454.9%
ai_confirmed3,2441,3474,59142.9%
dba22902292.1%
fuzzy303<0.1%
lei101<0.1%
Effective total9,3511,34710,698100%
ai_rejected (audit only)2,6601,1183,778
Grand total12,0112,46514,476
6

Transliteration Pipeline — First Validation

translit_* Matches Through AI Review

Cyrillic → confirmed
23 / 25
92.0%
CJK → confirmed
1 / 1
100%
Greek → confirmed
0 / 2
0%
All scripts
24 / 28
85.7%
🌍

First independent signal on transliteration quality: all 28 transliteration-derived matches (Cyrillic ×25, CJK ×1, Greek ×2) were uncertain-tier and went through AI review. The AI confirmed 24/28 (85.7%) — well above the all-method average (54.9%) and close to the exact tier (98.0%). The 2 Greek rejections were the entire Greek sample, so no conclusion can be drawn about Greek transliteration quality from n=2; Cyrillic (23/25 = 92.0%) is a much stronger signal. This pipeline remains wired in for direct holder-name matching only — see §7 for the still-open gap against match-patent.js ([[project-transliteration]]).

7

Data Quality Notes

Holder nameCandidate companyOrigin methodExisting conf.
LIMITED LIABILITY COMPANY "NORMA"OCARD Limited Liability Company (LLC)fuzzy0.675
The Green Hornet, Inc.On The Green LLCfuzzy0.7875
Gold Medal Manufacturing Sdn. Bhd.Gold Medal, Incfuzzy0.81
The Coca-Cola Comp.The Coca-Cola, Co.lei0.828
CTHCTH Ltd.exact0.90

5 queue entries (0.06%) errored after 3 consecutive unparseable AI responses — the run log's generic "company not in DB" label is misleading here: all 5 target companies exist in companies (verified by ID). These were transient Ollama parsing failures. The rows remain in their pre-AI deterministic state (match_method unchanged, confidence still 0.675–0.90, included in the §5 totals) and are eligible for re-queue on a future run:ai-queue pass — they will simply be picked up again as reason='uncertain' with status='error' currently blocking re-dequeue unless reset to 'pending'.

8

Recommended Next Steps

📝

Current state: TM matching is fully re-validated post Round 1–4 — 10,698 effective rows / 8,666 unique holders / 4,743 companies covered. The patent side (patent_applicant, 10,379 rows / 7,952 unique applicants) shares the same fixed lei.js/fuzzy.js code but has never been through AI review.

PriorityActionDetailEst. scope
High Build + run patent AI queue 7,373 uncertain patent matches never AI-reviewed: fuzzy 4,466, lei 2,626, wikidata 226, exact 50, dba 5 ~4–5 hrs at observed 30/min
Medium Reset the 5 errored queue entries to pending and re-run Transient Ollama parse failures (§7) — small batch, quick to clear Minutes
Medium Manually set link_type='subsidiary' for Panasonic IP Management Corp. (entity_matches IDs 3006899/3006900) Round 4 reviewer confirmed the match is correct but it landed as fuzzy/direct — genuine patent-holding subsidiary of Panasonic Corporation 2-row UPDATE
Medium Round 5 manual review prep Sample new ai_confirmed/ai_rejected rows for spot-checking, focused on the lei (56.7%) and fuzzy (41.2%) origin tiers where AI agreement is lowest ~50-pair sample
Low Wire transliteration pipeline into match-patent.js Currently TM-only ([[project-transliteration]]); §6 shows 85.7% AI confirm rate on the 28 TM transliteration matches, suggesting similar value on the patent side Pipeline dev