issue 001  //  09.08.2026  //  16:04 theme  //  snd: off
menu
homepage / 002 ux + product / square website refresh / world model02 / 07

square website refresh / world model

a knowledge graph of everything square's marketing says — cited, verified, queryable by any ai agent — and the generative product pages it led to.

featprodbenctapriceteststatproduct-aproduct-bproduct-cproduct-dproduct-eproduct-f
gapsproducts × entity types × locales. empty cells are the point.
layer 2 · the dashboard's landing view (illustrative, not real data)
what it is

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.

what i did

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.

what happened

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.

speci
roledesign + build, end to endcompanyblock, inc. (square)whenmarch – october 2026whata knowledge graph of square's marketing content + the generative website work it unlockedscale3,046 web pages · 988 lifecycle emails · 25,427 entities · 5 localesstackpython crawler · claude + gpt-4o ensemble extraction · postgres · mcp server · react/typescript renderer components
the problem01

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.

the bet·

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.

the approach02
  1. extracta two-phase crawler (scrape, then extract, resumable at every step) walks the sitemap and pulls structured entities from each page: features, benefits, pricing, ctas, testimonials, statistics.
  2. catalogentities are deduplicated into a canonical model spanning pages and locales — one source of truth for what square says about each product, in each region.
  3. verifyevery entity keeps up to five verbatim quotes with source urls. automated audits re-check the quotes against the live source.
  4. servean mcp server any agent at block can add in one command. the model stops being my tool and becomes infrastructure.
pipeline·
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)
the early version · dashboard: 9,437 entities, content building blocks, product dna
explorer · every entity with locale coverage and funnel stage
graph · hierarchy, co-occurrence and cross-page relationships
dashboard, continued · top ctas, locale coverage, translation gaps
the graph view of the extracted model
two models are better than one03

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.

trust, measured·

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.

how i worked with ai04
  1. query the data before designing anythingi sat with claude and wrote queries against the extracted entities to see real distributions before committing to any visualization. some ideas i had going in were wrong; cheaper to learn that from a query than a prototype.
  2. ship the cli first, then the uithe extractor began as a command-line tool: paste a url, get entities back as json. once i could see the shape of the output, the dashboards followed from that shape.
  3. write a plan before every sessioneach chunk of work started as a written plan: what exists, what changes, what done looks like. plans got shorter as the codebase got clearer, but writing context first never stopped being useful.
  4. make the ai check the aiextraction, judging, and auditing are all llm work, but none of it is taken on faith: ensemble agreement, citation re-verification, and a three-pass ai judge with median scoring each exist to catch the model being confidently wrong.
did it work? an honest test05

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.

what shipped·
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
knowledge graph mcp · the internal results page: scale, sources, the seven tools
citations, audits, and how agents are told to use them
setup · one command for any agent at the company
the model becomes a pattern06

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.

design decisions·
citations are the productan uncited fact is a liability. every tool response carries verbatim quotes and urls, and agents consuming the graph are required to pass them through.
make gaps obviousmost coverage views make empty cells invisible. here, empty cells have a visible dashed outline, so a missing locale is as readable as content.
audit in the openverification failures are annotated, never hidden. 91.5% with reasons beats 100% on trust.
serve, don't embedthe graph is an mcp server, not a dataset baked into one app. any agent at the company can add it in one command.
from world model to website07

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.

shipped on squareup.com·
  • neue pricing section
  • hardware showcase + video showcase
  • feature catalog (large-heading accordion)
  • the personalized features heading + search takeover
  • each ported from the vue prototype into the contentful-backed react renderer, with responsive and accessibility test coverage
the neue features page in production, default state
the same page after a business lookup · re-rendered for a food & beverage seller
neue stills · the new visual language the components carry: checkout, invoices, qr pay
the model behind the page · entities feeding the renderer
reflection08

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.

related, open source·

sitemapper ↗ — a personal project with the same approach: crawl a site, extract entities, build a queryable model. full source.

a note on what you're seeingnda

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.

← homepage  //  002 ux + product © 2026 naeema :)