Amicus attorney pipeline · field guide

From a Google search to a dot on the map

How one law-firm listing gets found, checked, named and finally drawn on the tempmap1 map. Every stage below shows real listings from the Seattle-area run, what was kept, what was thrown away (in red), and why.

Numbers measured 31 Oct – 1 Nov 2026 from the September 2026 run (c3a0e554_2026-09) with read-only database queries. Anything we could not confirm is marked unverified.

Words used on this page

Listing
One business entry on Google Maps: a name, an address, a phone, maybe a website. One law firm with three offices has three listings.
cid
Google's ID number for one listing, e.g. 8957294568084597328. It never changes, so we track listings by it.
Website / domain
The site a listing links to, trimmed to its bare name, e.g. searsinjurylaw.com.
Verdict
Our answer to "is this a private law firm?": ATTORNEY_CONFIRMED (yes), NON_ATTORNEY (no), NO_DATA (couldn't tell — website wouldn't load), UNCERTAIN (looked, still unsure).
Silver
The big list of every listing we have looked at, with its verdict each month. Silver keeps the no's too.
Gold
The short list of listings whose most recent clear verdict is "yes, a law firm". Gold is not a separate copy — it is a filter laid over silver.
Grid
A net of 1,544 evenly spaced points over the Seattle area. At each point we ask Google "who ranks for divorce lawyer here?" (and 7 other searches).
Rank
A listing's position in Google's results at one grid point: #1 is the top.

The route at a glance

  1. 001City scan — 4,099 listings found, 3,047 kept
  2. 002aWebsite check — 2,626 websites visited
  3. 003Is it a law firm? — 2,125 sites yes, 355 no
  4. 004Silver → Gold — 2,830 listings in gold today
  5. namesDisplay names — how "Goldberg Jones - Divorce For Men" becomes "Goldberg Jones"
  6. 008eGrid scan — 3,519 listings rank somewhere; 950 never checked
  7. 008f/gBackfill — check the ones the city scan missed in progress
  8. mapMap build gate — only gold gets drawn
  9. headerName on the map — "Carr Law Olympia #1"
  10. #142Name ledger planned

The stages

1ST SCAN — 001

City scan: ask Google Maps who the lawyers are

keptthrown awaychanged
EXPLANATION
What it does
Types 17 searches ("divorce lawyer", "personal injury attorney" …) into Google Maps from 18 towns (Arlington down to Olympia) and keeps the lawyer-looking listings with a website inside our map area.
Goes in
17 searches × 18 towns = 306 requests to DataForSEO (a paid Google-results service), up to 700 results each. Cost $0.87.
Comes out
One row per listing in silver, each with its website.
Counts
26,096 raw results → 4,099 unique listings → 3,047 kept (2,626 distinct websites).
4,099 found
3,047 kept
1,052 dropped
Problem solved
Google mixes courts, agencies, tax shops and directories in with lawyers. The cheapest filters (no website, .gov, .org) remove the obvious ones before we pay to look closer.
Side effect
Real firms with no website are dropped here and never reach the map. Stage 008g fixes this.

Source: bronze raw results of run c3a0e554_2026-09_1mon; silver row count.

002a

Website check: does the site actually load?

EXPLANATION
What it does
Sends a crawler (DataForSEO On-Page) to each website and records what came back, sorted into 22 outcome types.
Goes in
2,626 websites.
Comes out
The page text of each site, plus an outcome: live, blocked, dead…
Counts
live 1,977 · no answer 246 · Cloudflare wall 159 · 403 forbidden 105 · unknown 74 · smaller outcomes ~65.
Problem solved
We can't judge a firm by its name alone. We need to read its website.

Source: 002a crawl table, September run.

003a · 003b · 003c · 003d

Is this a private law firm?

EXPLANATION
What it does
003a checks the Google category against our list of ~35 lawyer categories. 003b opens blocked sites in a real browser. 003c has AI read the site in up to three passes (a fast model first, a stronger one when unsure; legal technicians are a "no" by rule). 003d copies each website's verdict back onto every listing that uses that website.
Goes in
2,507 websites with readable text.
Comes out
One verdict per website, then per listing.
Counts
Websites: 2,125 yes · 355 no · 15 no data · 12 "likely".
Listings: 2,520 yes · 369 no · 145 no data · 13 other = 3,047. AI cost $3.21.
2,520 yes
369 no
145 no data
Problem solved
Google's "attorney" category is wrong often enough (clinics, tax shops, dead domains) that we read every site.

Source: 003c verdict table and silver_cids, September run.

004a · 004b → GOLD

Silver becomes gold

Abogado Raymundo · bishoplegal.com · Normandy Park Juneyes Julyyes Augustyes Septemberno data skipped — not a clear answer Latest clear answer = August "yes" → stays in gold
A website that fails to load for one month does not knock a firm off the map. A later clear "no" does.
EXPLANATION
What it does
004a has AI tag each firm's specialty (injury, family…). 004b writes the final row per listing into silver. Gold is a saved filter over silver: a listing is in gold when its most recent clear verdict is "yes". "No data" and "likely" months are skipped.
Goes in
Every month's verdicts for every listing.
Comes out
The gold list. Nothing writes to gold directly.
Counts
2,830 listings (2,286 websites) in gold today, Seattle area.
Problem solved
Silver holds everything, including the no's. Gold is the one list the map is allowed to trust.

Source: gold view definition (bq/schemas/gold.py); gold_cids count 1 Nov 2026.

DISPLAY NAMES — today

Turning Google's title into a firm name

EXPLANATION
What it does
Two tools, applied in order. (1) A June AI table (firm_display_names, 2,426 names written once on 23 June 2026, never added to). (2) A text-rule cleaner (deterministic_normalize) that cuts ™, brackets, "| search phrase", "- slogan", "PLLC" and similar. The AI name is used only if the cleaner would leave the title unchanged.
Goes in
Google's listing title, which firms stuff with keywords.
Comes out
The name shown on the map.
Counts
199 gold listings have a title the June table has never seen (earlier count in the plan: 174). 138 gold titles contain "|" or " - ". 329 websites have 2+ listings; 169 of them show 2+ different names (plan said 168).
Problem
Neither tool knows which listings belong to the same firm, so one firm can show several names. Planned fix: #142 below.

Source: firm_display_names, gold_cids titles; cleaner run locally on the titles shown.

2ND SCAN — 008e

Grid scan: who ranks at each point on the map

EXPLANATION
What it does
Lays a net of points about 1.3 miles apart over the whole area and asks Google, at each point, 8 searches (divorce, personal injury, employment, estate planning, business, criminal defense, immigration, bankruptcy lawyer), recording the top 100.
Goes in
1,544 points × 8 searches. Cost $7.41.
Comes out
1,234,960 rank rows: which listing is #1, #2 … at each point. This is what the map colors.
Counts
3,519 distinct listings appear:
2,376 already gold
506 never checked, have a website
444 never checked, no website
112 checked and "no"
79 no data
25 ranked listings have government websites.
Problem
The grid finds hundreds of listings the city scan never saw. Until #134, the map drew them anyway — unchecked.

Source: 008e grid table, run c3a0e554_2026-09_3mon, compared against silver/gold.

008f · 008g — #134

Backfill: check what the grid found in progress

EXPLANATION
What it does
008f takes every grid listing that was never checked (or got "no data", or is a gold listing with a tax category) and puts it through the same checks as stages 002a–004b, under its own run name gridbf_atty_wa_seattle_20261031. Government filters are not applied here on purpose — the AI judges courts and agencies as "not a firm". 008g handles listings with no website: AI (Sonnet) reads the Google profile — name, category, address, reviews — and says yes only if it sees a private practice.
Goes in
656 listings (591 websites), seeded 1 Nov 2026 02:32 UTC.
Comes out
New verdicts in silver; yes's join gold automatically.
Status
20-listing test done: website path 9 yes / 7 no / 4 no data; profile path 19 yes / 1 uncertain; cost under $0.10. The first full run stopped (PC out of memory) part-way through the website check. As of 1 Nov 03:08 UTC no results for the full run are in the database and nothing was running on the VM. Next: rerun on the VM.
Problem solved
Real firms the city scan missed (no website, outside its 18 towns) get a fair check instead of being drawn unchecked.

Source: shared/grid_backfill.py, 008f/008g code, silver row counts, VM process list.

MAP BUILD — gold gate

Only gold listings get drawn

Real grid point 1021 (Bellevue), search "employment lawyer"
#1HKM Employment Attorneys LLP
#2Law Office of Mark S. Lee (rymap.org) — not gold
#3Skidmore & Fomina
#4Hosseini Law Office
#5HKM Employment Attorneys
#6Employer Solutions Law
#7WA Dept of Labor and Industries – Bellevue Office — not gold
#8Premier Law Group (Bellevue)
#9Amity Legal Associates
After the gate the map shows #1, #3, #4, #5, #6, #8, #9. The gaps stay: a firm keeps the rank Google gave it, so #3 is not promoted to #2.
EXPLANATION
What it does
The map builder (_build_mapdom_cells.py) writes two files: the firm list and the per-point rankings. It skips every listing not in gold, and refuses to write anything if one slips through. A separate check (check_mapdom_gold.py) fails the build if named bad listings (Falcon Tax, Everett court, Thurston County court, Jackson Hewitt, any .gov) are present, or named good ones (Ramos Immigration, Davis Law Group Seattle and Bellingham) are missing.
Goes in
Grid rankings + gold.
Comes out
The map's data files.
Today's live map
Still the old, ungated September file: 3,943 firms, 1,119 not in gold, 22 with .gov sites. Running the check on it: FAIL, 7 of 13 checks. The gate is committed; the live map changes when the backfill finishes and the map is rebuilt.
Problem solved
Courts, agencies and tax shops can no longer appear just because Google ranked them.

Source: builder and check code; check run against https://tempmap1.toolforge.ai data file (byte-identical to local copy).

MAP PAGE — header

The name at the top of a firm's map

EXPLANATION
What it does
Groups listings with exactly the same display name. One listing alone: name only. Several: name + " City". Several in one city: " City #1", " #2" by review count.
Problem
Exact-name matching only works if names are already right. One differing word ("of Everett") splits a firm. Fixed by the rules below and #142.

Source: firmParts() in linked.html (#139–#141).

#142

Name ledger planned

WHAT IT WILL DO
Idea
A permanent, add-only ledger (name_ledger) with one row per (Google title, website): the firm name, which firm it belongs to, and whether it is an office or one lawyer's personal profile.
New title
When a title appears that the ledger has never seen, AI (Sonnet) decides once and the answer is written down forever.
Guard
check_names.py fails the build if any map listing has no ledger row or a firm shows two names.
Removes
The text-rule cleaner and the June table's guesses. Backfill cost estimate under $5.

The logic problems, one at a time

1. One website, several names — Sears

searsinjurylaw.com Puyallup572 rev Tacoma243 Lacey54 Gig Hbr89 Fed Way106 Everett125 "Sears Injury Law" × 4 "Seattle Injury Law…" × 2 Rule: one website = one firm. Most common name wins (4 vs 2): all six → "Sears Injury Law" seattleinjurylaw.com (Seattle, 318 rev) is its own website → its own firm "Seattle Injury Law".

Today: three names on one website. After #142: one firm, one name.

2. One firm, two websites — Polaris and Carr

polarisinjurylaw.comBothell · 43 reviews seattletruckinjurylawyer.comSeattle · 5 reviews Two websites = two firms on the map. Owner confirmed. Same for Carr: carrlaw.com vs haroldcarrattorney.com.

Carr detail: the Lakewood "Carr Law" listing (cid 18091948255906428848) shows haroldcarrattorney.com in the grid data but carrlaw.com in gold — Google changed its website between scans.

3. A slogan in the name — Goldberg Jones

Two listings at 1200 Westlake Ave N #700, Seattle, both on goldbergjones-wa.com:

Rule: one website, one firm. Each name appears once (a tie), so most reviews wins → "Goldberg Jones".

4. Individual lawyers' own listings — Beresford Booth

beresfordlaw.com 2 office listingsEdmonds · Bothell 23 lawyer profilessame Edmonds address Amanda N. Gamble, Esq.Mackenzie O. Bretz, Esq.Eli K. Yim, Esq.Trevor H. Lane, Esq. … Kept on map Today the map counts this as 25 "firms".

The June AI table even invented firms for them: "Amanda N. Gamble, Esq." became "Law Offices of Amanda Gamble". Same pattern elsewhere: "Amy Allison" (who works at Anderson Hunter Law in Everett, not Beresford Booth) became "Law Offices of Amy Allison".

Owner rule: personal lawyer listings are thrown away. #142 marks each as "practitioner" and drops it.

5. Government listings leaking onto the map

BEFORE #134 Grid rank Map no check AFTER #134 Grid rank in gold? Map not in gold → left off (rank gap stays)

On the live map today: Employment Security Department (2 listings), Labor & Industries (2), Office of the Attorney General (2), Everett – Snohomish County District Court and others — 23 listings with government websites.

Fixed in code by the gold gate. Live once the map is rebuilt. Note: Falcon Tax is in gold (judged a firm Jul–Sep), so the gate alone won't remove it; the backfill re-checks it.

6. A real firm missing — Davis Law Group, Bellingham

Seattle47.61 Arlington48.12 grid edge 48.22 Bellingham≈48.75 North ←→ (latitude). Shaded = towns the city scan searches from.

Davis Law Group's Bellingham office (cid 2203112235072678874) appears in 0 of 10 city scans and only once in the grid (rank 99 at one edge point). It was never in silver, so it could never be gold. The backfill has now seeded it. Bellingham's latitude is approximate unverified; whether the scan area should grow north is an open owner decision.

7. "Same firm" means "exact same name"

The map header groups offices only when the names match letter for letter. So "Sears Injury Law" (4 offices) and "Seattle Injury Law of Everett" (same website) are counted as two firms, and the Everett office never gets "Sears Injury Law Everett". The fix is to group by website (rule 1), not by name.

The rules (owner, final — 31 Oct 2026)

  1. One website = one firm. Group listings by website, never by brand.
  2. The firm's name is the most common cleaned title among that website's offices; ties go to the office with the most reviews. searsinjurylaw.com → "Sears Injury Law" (4 vs 2). seattleinjurylaw.com → "Seattle Injury Law".
  3. Two websites = two firms, even if run by the same people (Polaris, Carr). Confirmed.
  4. One website hosting unrelated firms → AI (Sonnet) flags it for the owner to review. Never merged automatically.
  5. Individual lawyers' own listings are thrown away. Only office listings appear.
  6. Legal aid and public-sector lawyers stay off the map (courts, prosecutors, public defenders, agencies).
  7. Keep Google's raw rank. Removing a listing leaves a gap; nobody is promoted.
  8. Listings with no website get their own firm each and are judged from their Google profile (008g).

Sources and method