a knowledge graph of everything square's marketing says — cited, verified, queryable by any ai agent — and the generative product pages it led to.
a world model of what square actually says: every page and lifecycle email extracted into cited, verified entities, served to any ai agent over mcp — and then used to help build the generative refresh of square's product pages.
designed and built the pipeline end to end (crawler, ensemble extraction, citation audits, the mcp server, the dashboards), then carried the same thinking into production: i ported the new product-page design into square's web renderer, including the page that personalizes itself per visitor.
25,427 verified entities queryable by any agent at block; ai-drafted emails measured against it cut critical factual errors from 87.5% to 16.7%; the neue components i built shipped on squareup.com.
ai-generated marketing content sounds right and gets the details wrong: wrong rates, invented testimonials, made-up statistics. the facts exist — they are on the live site — but scattered across thousands of pages in different regions and languages, with no machine-readable model of what the company actually says. card processing is 2.6% + 10¢ in the us, 1.6% in australia, 1.75% in the uk; an llm writing from memory will happily leak one region's rate into another. and the gaps were just as invisible: nobody could say which products had no spanish content, or where english ctas sat untranslated on localized pages.
don't teach the model the facts. build a queryable model of the facts, make every claim carry a verbatim citation, and let agents look things up the way a careful human would.
squareup.com sitemap + 988 lifecycle emails
│
▼
[ two-phase crawler ] scrape → extract, resumable
│
▼
[ ensemble extraction ] claude + gpt-4o, merged
│ every entity: ≤5 verbatim citations + url
▼
┌──────────────────┐
│ knowledge graph │ 25,427 entities · 300 edges
└───┬──────────┬───┘
▼ ▼
[ audits ] [ mcp server ] 7 tools, any agent
98.9% email search · detail · relationships
91.5% web page patterns (a blueprint
citations for generating new pages)




one llm extracting alone misses things and invents things, and you cannot tell which is which. so extraction runs twice — claude and gpt-4o on the same pages — and the results are merged with provenance: 4,245 entities found by both models (highest confidence), the rest tagged by which model found them. a 50-page head-to-head showed why it's worth the cost: both averaged 6.9 entities a page, but claude read per-audience content better and gpt-4o was stronger on pricing and non-english pages. the ensemble keeps both strengths and makes disagreement visible instead of silent.
citations are only worth something if someone checks them. an automated audit re-verified every quote against its source: 98.90% of 9,845 email citations held up; a 200-citation sample against the live site verified at 91.5%, and the failures are annotated rather than hidden (mostly anchor drift from page edits, one dead url). a regression gate keeps future extraction runs from quietly degrading citation quality.
to find out whether grounding actually helps, i ran a controlled experiment with square's lifecycle email tooling: 48 ai-drafted emails across 8 scenarios, written with and without access to the knowledge graph, scored blind on 6 weighted dimensions by a three-pass ai judge. with the graph, composite quality went from 3.28 to 4.48 out of 5 — and the rate of critical factual errors (fabricated testimonials, wrong rates, invented stats) fell from 87.5% to 16.7%. the biggest gains were exactly where grounding should matter: social-proof accuracy and cta quality.
knowledge graph mcp · internal
entities 25,427
web 16,632 email 8,795
sources 3,046 pages · 988 emails
locales en · fr · es · ja
provenance 4,245 both models
11,917 claude · 9,265 gpt-4o
citations ≤5 per entity, verified
7 mcp tools, incl. get_page_patterns —
page composition as a blueprint
for generating new pages


late in the summer the pipeline was generalized to a second brand: the same crawler, ensemble extraction and mcp server now run against cash app's lifecycle templates, with brand isolation so square facts can never leak into cash app copy and vice versa. that was the test of the architecture — a world model per brand, from the same machinery.
the reason to model what the site says is to be able to regenerate the site from it. that became real in the fall: square's product pages were being redesigned (a direction called neue, prototyped in vue), and i ported that design into the production web renderer as reusable, content-managed components — pricing, hardware showcases, a feature catalog, hardware video.
the furthest expression is a product page that assembles itself per visitor: you type your business name, a lookup finds it, and the page's heading and feature set re-render for that business while a "personalizing" beat plays. the page is composed from verified content for a specific reader — the world model's promise, running in production.




understand the data first; the design follows from its shape. the thing i'd defend hardest is the trust chain — ensemble extraction, verbatim citations, audits with annotated failures — because it is what let other teams build on the model without asking permission or taking my word for it.
sitemapper ↗ — a personal project with the same approach: crawl a site, extract entities, build a queryable model. full source.
this work was done at block, inc. (square). the case study covers process and design thinking only; metrics, screenshots and proprietary details are omitted per nda. more available on request, under the right agreement.