WatchlineNYC

Making NYC landlord ownership visible
conversationally, with its uncertainty labeled

Robert Flagg — mathematician turned trustworthy-AI engineer I make AI systems trustworthy by grounding them in knowledge graphs
An open source project, built on JustFix's Who Owns What
Agenda

Where we're headed


1The Problem — Holding landlords accountable
2How Who Owns What builds portfolios
3Two failure modes — false splits & false merges
4Resolving false splits — probabilistic record linkage
5Resolving false merges — the beneficial owner group
6Next steps
The Problem

Holding landlords accountable


102 E 7TH ST LLC
11 AVENUE B LLC
124 RIDGE LLC
134 ORCHARD LLC
17 GAY LLC
151 RIVINGTON HLDGS
159-161 STANTON LLC
17 W 103RD LLC
145 E 26 LLC
1590 LEXINGTON LLC
124 RIDGE LLC
…107 names
→
STEVEN CROMAN
one operator

118 buildings. 107 different LLC names. Almost one shell per building — each named for its own address, none of them "Croman."

A tenant can't find their real landlord. A journalist can't map the empire. An agency can't add up the violations.
Source: Who Owns What's own "Steven Croman" portfolio (#87254); LLC names from NYC PLUTO owner-of-record. AG case: public record.
How Who Owns What builds portfolios

A WoW “portfolio” is a connected component of a landlord graph


one portfolio = one connected component 134 Orchard 17 Gay 145 E 26 151 Rivington 88 Pitt 12 Jones CONNECTED_BY_ADDRESS CONNECTED_BY_ADDRESS CONNECTED_BY_NAME CONNECTED_BY_ADDRESS …other landlords · other portfolios
1 · Nodes — one per building's owner/officer contact: a (name, business address) drawn from HPD registrations → their contacts (head officer / owner).
2 · Edges — CONNECTED_BY_ADDRESS (same business address) and CONNECTED_BY_NAME (same name, corroborated by a nearby address).
3 · Portfolio — a connected component: everything transitively linked.
JustFix — Who Owns What (portfoliograph): HPD registrations + contacts → landlords_with_connections (self-join on shared name / business address) → connected components.
The problem this talk is about

Two ways to be wrong


FALSE MERGE one shared office fuses unrelated owners WoW → one “portfolio” ✗ 300 W 12 88 Pitt 7 Ave A CONNECTED_BY_ADDRESS over-counts — 3 unrelated owners, one managing-agent office FALSE SPLIT shells share no name and no address truth → one owner no CONNECTED_BY_* edges 134 E 5 22 W 9 5 Place misses it — one owner split into 3 portfolios
Both come from the same rule — connect on shared attributes. Lean on it and you fuse strangers; require it and you lose real owners. The rest of the talk: fix each without breaking the other.
False split — in the wild

One owner, six Who Owns What portfolios

The same man at the same two offices — split by floor labels, a name spelling, and a dropped digit


# Registered office — as filed in HPD Name filed Filings Buildings
1 424 WEST 51 ST — “GF” · “GROUND” · “2 FL” STEVEN / STEVE CROMAN 5 118
2 740 BROADWAY — “—” · “2” · “2 FL” STEVE / STEVEN CROMAN 3 5
3 4 WEST 51 ST ⚠ a couple of digits dropped from 424 STEVEN CROMAN 1 1
4 424 WEST 22 ST STEVEN CROMAN 1 1
5 424 BROADWAY STEVEN CROMAN 1 1
6 632 BROADWAY STEVEN CROMAN 1 1
6 fragments — all “Steven Croman,” one owner 12 127
Every row is the same man at the same couple of offices. Who Owns What splits him six ways on clerical noise — a floor label, a name spelling, a missing digit — because exact name-and-address matching can't bridge any of it.
WatchlineNYC discovery graph — WoW-equivalent components over CONNECTED_BY_NAME ∪ CONNECTED_BY_ADDRESS; owner identity unifies them to 127 buildings. See the live map · docs/cases/croman.html.
The engine — fixing false splits

Probabilistic record linkage

Decide whether two records are the same owner from many partial clues — not one exact match


Record A
CROMAN · 9 E 38 ST · 10016
Record B
CROMAN · 9 EAST 38 STREET STE 600 · 10016
last name exact & rare ✓✓ · street fuzzy ~ · zip exact ✓  →  match probability ≈ 0.99  →  same owner (the exact-match rule would split these)
①Compares field-by-field, in degrees — exact / fuzzy / mismatch on name, house number, street, zip — so typos and variants still match
②Weighs the evidence (Fellegi–Sunter model) — agreement on a rare value counts more than a common one → a calibrated match probability, with weights learned unsupervised (no labels)
③Scales, with a precision dial — “blocking” compares only plausible pairs, so it runs over millions of records; we set the threshold high — link only on strong evidence
The open-source engine behind our CONNECTED_BY_SPLINK edges — it links the fragments exact-match rules miss, reuniting an owner WoW splits.
Splink — open-source probabilistic record linkage, UK Ministry of Justice · moj-analytical-services.github.io/splink
False split — resolved

Add CONNECTED_BY_SPLINK, recompute the components — Croman is whole


WatchlineNYC map: Steven Croman's 127 buildings resolved to one owner, versus Who Owns What's six portfolios
▸ add docs/meetup/croman-watchline-map.png
(WatchlineNYC — Croman, one owner · 127 buildings)
Same landlord graph, one new edge type. The Splink matches bridge the typo'd offices and name variants WoW's exact rules can't — one filed from 4 WEST 51, another from 424 WEST 51 — so the connected component now spans the lot: 6 portfolios → 1 owner, 127 buildings.
WatchlineNYC discovery graph — owner identity via connected components over CONNECTED_BY_NAME ∪ CONNECTED_BY_ADDRESS ∪ CONNECTED_BY_SPLINK. Toggle vs. Who Owns What live on the map.
False merge — in the wild

One WoW portfolio, seven owner groups

Twenty-seven buildings self-file from a single Lakewood office — Who Owns What reads them as one owner.


Owner — beneficial owner group Filed under Bldgs
Joe Nebenzahl JOE · JOSEPH NEBENZAHL 7
Abraham Miller ABRAHAM · ABARAHAM MILLER 7
Jeanette Padilla JEANETTE PADILLA 4
Nathan Obstfeld NATHAN OBSTFELD 4
Vanessa Soria VANESSA · VANEESA SORIA 3
⚠ singleton NATHAN OBTFELD — a 1-letter typo 1
singleton BENYOMIN FISCH — one building, unmerged 1
Who Owns What: “one owner” 235 River Ave, Lakewood NJ 27
A shared back-office is an operational nexus, not an owner. Who Owns What's one portfolio is really seven owner groups — five families plus two one-building singletons (one of them a typo of Obstfeld).
All 27 buildings file HPD registrations from 235 River Ave, Lakewood NJ (self-filed — not a registered agent). Owner groups from the WatchlineNYC discovery graph. See the live map: the Miller portfolio.
Resolving false merges

The beneficial owner group

A shared business address tells you who operates together — not who owns.


NEW — the beneficial owner group, its own node type WoW: one portfolio — an operational nexus IN_OWNER_GROUP CONNECTED_BY_ADDRESS :OwnerGroup RIVERA :OwnerGroup CHEN A. RIVERA ANA RIVERA L. CHEN LI CHEN :Address shared office one shared office → two beneficial owner groups SPLINK SPLINK
Don't ask one signal two questions!
A shared office answers “who operates together?” — never “who owns?” So ownership gets its own node, built from its own edges.
Beneficial owner group = connected components over CONNECTED_BY_SPLINK ∪ CONNECTED_BY_DEED (ownership signals) — it ignores CONNECTED_BY_ADDRESS. Worked example: the Miller map — one Lakewood office, seven owner groups.
False merge — resolved

Drop CONNECTED_BY_ADDRESS, recompute the components — the false merge vanishes


WatchlineNYC map: Who Owns What's single Miller portfolio (27 buildings, one owner) resolved into seven distinct owner groups
▸ add docs/meetup/miller-map.png
(WatchlineNYC — Miller portfolio, one WoW owner → seven owner groups)
Owner identity is built from SPLINK ∪ DEED — it never uses the shared-office edge. Recompute connected components without CONNECTED_BY_ADDRESS and the one fake portfolio falls apart into its real owners: 1 WoW portfolio → 7 owner groups, 27 buildings.
WatchlineNYC discovery graph — owner groups via connected components over CONNECTED_BY_SPLINK ∪ CONNECTED_BY_DEED (CONNECTED_BY_ADDRESS excluded). Toggle vs. Who Owns What live on the Miller map.
Owner groups — why CONNECTED_BY_DEED

Some owners are held together by nothing but the deed

Citadel Estates bought 15 Brooklyn buildings on one 2008 deed ($58.4M), then re-titled each into its own $0 shell — a Deadhead's roll-call (Ripple, Scarlet Begonias, Stella Blue…) — registered under three different people.


15 Brooklyn buildings colored by three registrants — without the deed edge the owner group splits three ways; the 2008 Citadel deed reunites them into one owner
▸ add docs/meetup/citadel-map.png
(Citadel — without deed → 3 fragments; with deed → 1 owner)
No shared name, no usable address (their one shared office is a masked aggregator we ignore), no Splink match. Strip CONNECTED_BY_DEED and this owner group shatters into three. The deed is the only thing keeping the true owner whole — which is why the owner group is SPLINK ∪ DEED.
Owner group OG-67966 — a deed_only clique (CONNECTED_BY_DEED; no name/address/splink among the three). One 2008 ACRIS deed + $0 restructuring. Toggle without deed ↔ one owner on the Citadel map.
WoW Portfolios vs Beneficial Owner Groups

The same algorithm over different edge sets


WoW Portfolio operational nexus — who operates together? CONNECTED_BY_NAME ∪ CONNECTED_BY_ADDRESS one portfolio (L1–L3) · a shared office Beneficial Owner Group identity — who actually owns? CONNECTED_BY_SPLINK ∪ CONNECTED_BY_DEED SPLINK DEED its own group L3 splits out — same office, a different owner L1 L2 L3 L4 L5 L1 L2 L3 L4 L5 same nodes · same algorithm · different edges → different communities
Community detection never changes — connected components over one landlord graph. Swap the edge set and you swap the question: operate together vs own together.
Both are connected components in the WatchlineNYC discovery graph. WoW portfolio edges: CONNECTED_BY_NAME ∪ CONNECTED_BY_ADDRESS; beneficial owner group edges: CONNECTED_BY_SPLINK ∪ CONNECTED_BY_DEED. (We also add SPLINK to the portfolio layer to heal false splits — earlier slides.)
The close

What's next?


On the ~39,500 buildings both systems group, we differ both ways — ~780 of our owner-groups unify what WoW splits · ~620 WoW portfolios split across ours. Which of those are improvements? The blind eval decides — and it isn't run.
What's not done yet
  • The blind accuracy eval is built, not run — ~530 pairs need adjudication.
  • This is a prototype, not a shared service.
  • A conversational front-end to give access to non-technical users like journalists, tenant advocates, watchdog agencies, and the general public.
Where I need help
  • Running the ~530-pair blind eval — ground-truth portfolios, adjudication time, or a co-adjudicator.
  • Feedback on the new graph model.

Thank you!  (Q&A)

Appendix · the live agent

Conversational — by design, not free-form

The agent orchestrates queries; it doesn't reason about people


Guarantees enforced in code — not asked of the model:

  • Asks the graph, never answers from itself — plain English → parameterized, read-only queries; it reports only what a query returned, every inferred element carrying its caveat.
  • "Who owns this?" returns both — recorded owner and apparent controller, labeled — and flags when they disagree.
  • Read-only, access-gated — writes/admin refused; deep investigation only for vetted users (fail-closed).
You can't manufacture false certainty about a person if you only ever report what a sourced, labeled query returned.
Enforced in the tool-visibility layer, not a prompt — the records themselves (violation text, ACRIS JSON) are a prompt-injection surface.
Appendix · live demo · pinned to a public landlord

Ask it about Steven Croman

Watch it label every layer — sourced vs inferred — and refuse to overclaim


① "Who owns 17 Gay Street?" → the three layers
Three labeled layers, one answer: 17 GAY LLC (sourced) · Steven Croman (inferred) · unified owner — 12 fragments, 127 buildings (inferred, a lead not title).
② "And who manages it — same as who owns it?" → manager ≠ owner
Centennial Properties NY (114 buildings) — "a manager is not an owner." Management ≠ ownership.
③ "So can I report he legally owns all 127?" → leads, not verdicts
It declines — "not a legal determination… only a title search or court finding could support that." Leads, not verdicts.
If projection fails: pre-recorded capture + screenshots as backup. Data: BBL 1005930008 → owner group OG-105462 (12→127) · manager Centennial (114).
Backup · likely pushback

Two fair questions


"We live in SQL — what does the graph add?"
  • Concede: most of the pipeline is SQL — WoW is Postgres, the linkage is DuckDB.
  • The graph earns its place for the transitive, multi-relationship parts: connected-component owner identity · N-hop "who connects to whom" across owner/manager/deed layers · graph analytics.
  • "Count violations per owner" → SQL. "Everyone within 3 hops across four link types, ranked by centrality" → graph.
"We don't trust AI."
  • Good — neither do I, for claims about people.
  • The real inference is transparent statistical linkage (measured precision), not a neural net.
  • The language model is a read-only front door — it makes no claims; the public record does. Ignore it and read the sourced records.
  • Its main job is to not falsely connect people.
Both answers share one core: the substance is the public record + a transparent, measured linkage step. The graph and the LLM are tooling around it — each earning its place, everything labeled sourced vs. inferred.
Case file · Case studies · Maps · FAQ