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
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
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/splinkFalse split — resolved
Add CONNECTED_BY_SPLINK, recompute the components — Croman is whole
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.
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 ignoresCONNECTED_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
▸ 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 withoutCONNECTED_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.
▸ 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
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.