# Whitespace > A site-selection agent for independent restaurant founders in New York City (Brooklyn, Queens, Manhattan, the Bronx). A founder describes a concept and customers; the agent finds vacant storefronts in the NYC Storefront Registry, ranks them with a lease score built on NYC inspection records, checks competition and foot traffic, writes a positioning brief for the top pick with Qloo taste data, lists local partners and next steps, and answers follow-up questions with tools. Built for the Qloo Agentic Hackathon 2026. MIT licence. Every claim the product makes about a data source rests on a pre-registered test, committed before its result existed. City records decide where to open; census and jobs data decide who lives nearby; Qloo place records supply competitors' Friday closing times and review mentions, and power the "where else do their fans go" scene explorer. Finished runs play back with no API calls. API keys stay on the server. This guide is also served as Markdown at [/llms.md](/llms.md). A longer version, with every test behind the product and every claim's result and caveat, is at [/llms-full.txt](/llms-full.txt). ## Use the site - [Home](/): a dot map of every active restaurant and vacant storefront in four boroughs; click a block to score it - [The business](/#business): yearly openings and vacancies from city records, with a revenue estimate you can adjust - [Scout form](/#scout): describe a plan, search an area, or compare two to five addresses - [Drop a pin](/#play): score any block on a map, compare up to three, and try what-if changes - [Finished runs](/#saved): real recorded runs that open in seconds with no API calls - [Why Qloo](/#why): what each model answered in the closing-time check, as pie charts, and a restaurant-by-restaurant duel - [Beat the model](/#game): guess a real restaurant's Friday closing time against GPT-6 Astra alone and with Qloo - [Results](/#results): every head-to-head of Qloo against its baseline, with a ledger of results by area - [How it works](/#how): the six steps of every run and what each source does - [Scene explorer](/#scene): name up to three places; Qloo returns where their fans also go - [How we know](/#evidence): what the tests show, and every test in order ## API (JSON) - [Health](/health): `{ok, live}`; whether this server can run live - [Stats](/api/stats): counts of active restaurants, vacant storefronts, neighbourhoods and tested cuisines - [Cuisines](/api/concepts): the 25 cuisines the lease score was tested on - [Evidence](/api/evidence): every claim with its test, result, caveat and source files - [Finished runs](/api/golden): list of recorded runs; `GET /api/golden/{id}` plays one back as server-sent events; `GET /api/golden/{id}/sha256` returns the hash of the recording - `POST /api/run`: a live run, body `{concept, cuisine?, goal? | area? | leases?: [{address}]}`, streamed as server-sent events, rate limited - `POST /api/ask`: a follow-up question about a run, streamed, rate limited - `GET /api/around?concept=&lat=&lon=`: competitors near a point from city records, with Qloo's Friday closing times and review mentions; no model call - [Closing-time answers](/api/test20): every recorded answer behind the closing-time check, place by place - `POST /api/duel`: body `{name, lat, lon}`; asks the model when a real place closes on Friday, alone and with Qloo's record, side by side; rate limited - `GET /api/pin?concept=&lat=&lon=`: the city-records lease score for any point; no Qloo call and no model call - `GET /api/whatif?concept=&density=&same=`: the lease score percentile for a block with these counts - [City map](/api/citymap): every active restaurant and vacant storefront as packed grid positions, for the header map - `POST /api/scene`: body `{anchors: [1 to 3 place names]}`; Qloo's places their fans also go, and the music and brands that crowd follows; no model call ## Key results - Asked when 30 real NYC restaurants close on Friday, GPT-6 Astra alone was right 0 times and Gemini 3.8 Flash 3 times; with Qloo's place record both were right 29 times (closing-time check). - Qloo's Friday closing times matched Google Maps for 29 of 30 places, checked by a person (hours and prices). - The lease score reaches AUC 0.893 with Qloo, against 0.851 without it (0.887 across 25 cuisines). There is no rent data. Staten Island is not covered. - Qloo finds 92.4% of real competitors (competitor coverage) and matches price levels for 25 of 27 places (hours and prices). - Blind raters preferred positioning briefs written with Qloo 78% of the time; a blind judge 76%. - The follow-up agent has twelve tools, including competitor_hours and place_hours, which answer hours questions from Qloo's place records; it never states opening hours from memory. ## Optional - [Full version](/llms-full.txt): this file plus every test behind the product and every claim's result, caveat and source files - [Markdown version](/llms.md): this file as Markdown - [Data sources](/#evidence): NYC DOHMH Restaurant Inspection Results, NYC Storefront Registry, NYC 2020 Neighborhood Tabulation Areas, US Census ACS 2023 and LODES jobs data, MTA subway ridership, business improvement districts, NYC Planning GeoSearch, Qloo Insights API ## Every test behind the product Each was pre-registered: its protocol was committed before its code or its result. | Test | Protocol | Question | Result | |---|---|---|---| | Cuisine heatmaps | `PREREGISTRATION.md` | Do Qloo cuisine heatmaps find blocks a cuisine has not reached yet? 14 cuisines, 648 first openings, 2024 to 2026 | Qloo AUC 0.812 versus 0.742 for restaurant count. | | Brief, human raters | `PREREGISTRATION_2.md` | Do two blind human raters prefer briefs written with Qloo evidence? | Qloo briefs preferred 78% of the time. | | Lease score | `PREREGISTRATION_3.md` | Which city-records score ranks storefronts, and does Qloo add to it? | lease score with Qloo 0.893 versus 0.851 without it. | | Lease score, 25 cuisines | `PREREGISTRATION_6.md` | Does that score extend to more cuisines? | Yes, to 11 more: 25 cuisines, 83% of active restaurants. | | Survival | `PREREGISTRATION_5.md` | Does the lease score predict which restaurants last? | No. Mean AUC 0.516 (0.499 to 0.535). It shows where operators open, not where they survive, and the page says so. | | Audience tags | `PREREGISTRATION_4.md` | Do Qloo's audience tags match census and jobs data across 181 neighbourhoods? | 2 of 7 (Affluent Diners, Business Professionals). Demographics come from the census. | | Storefront cuisine | `PREREGISTRATION_7.md` | Given a storefront, does Qloo predict which cuisine opens there? | +0.087 AUC over city records. | | Brief, blind judge | `PREREGISTRATION_8.md` | Does a blind judge prefer briefs written with Qloo area evidence over briefs written with a list of nearby businesses? | Qloo briefs preferred 76% (0.68 to 0.83). | | Brief from place records | `PREREGISTRATION_9.md` | Can a different use of Qloo (place records, not area lift) improve the brief, against a control that differs only by Qloo? | Q over Q0 0.60 (0.433 to 0.767), over C+ 0.633 (0.483 to 0.80); the rule was not met. | | Competitor coverage | `PREREGISTRATION_10.md` | Is Qloo's list of competitors complete and current? | Qloo finds 92.4% of competitors. | | Restaurant scene | `PREREGISTRATION_11.md` | Is a restaurant's Qloo scene about the restaurant or only its location? | Specific to the restaurant (two unlike restaurants on one block share 0.225 of their lists), but it does not follow the city's cuisine category, so nothing independent backs it. Shown as "not validated", never used to choose where to open. | | Hours and prices | `PREREGISTRATION_12.md` | Are Qloo's closing times and price levels right, against Google Maps? | Closing times: 29 of 30 within 30 minutes. Price levels: 25 of 27 matched. | | Closing-time check | `PREREGISTRATION_20.md` | Asked when a real NYC restaurant closes on Friday, is a model right more often with Qloo's record than alone? | **Yes, for both models.** GPT-6 Astra: 0 of 30 alone (it declined every time), 29 of 30 with Qloo. gemini-3.8-flash: 3 of 30 alone with 6 confident wrong times, 29 of 30 with Qloo. | ## Every claim the product makes, with its test ### Lease score: how leases are ranked - Claim: Leases are ranked from NYC inspection records by two things: how many restaurants are in the lease's block, and how many of the same cuisine are in and around it. - Result: With Qloo the lease score reaches AUC 0.893, against 0.851 without it. - Caveat: An opening shows where operators chose to go, not whether they survived; rent is not included. - Status: Pre-registered; protocol committed before the result. - Files: PREREGISTRATION_3.md, backtest4.py, backtest4_results.json, lease_model.json ### Cuisine heatmaps: does Qloo taste find blocks a cuisine has not reached yet? - Claim: Hypothesis: Qloo taste minus existing supply finds blocks with unserved demand. - Result: Qloo AUC 0.812, against 0.742 for restaurant count. - Caveat: An opening shows where operators chose to go; the mechanism check is in the project log. - Status: Pre-registered; protocol committed before the result. - Files: PREREGISTRATION.md, backtest.py, backtest_results.json ### Where supply comes from - Claim: Existing restaurants come from city records, not Qloo. - Result: Qloo lists 72 Korean places in Queens; city inspection records list 198. - Caveat: Manual check on one cuisine and borough (checks.py). - Status: Descriptive check. - Files: checks.py ### How the positioning brief uses Qloo - Claim: Qloo tags and brands the lease's area over-indexes on versus all of NYC, with items common to most neighbourhoods filtered out, ground the brief. - Result: Briefs written with Qloo were preferred 78% of the time. - Caveat: Nearby addresses get near-identical profiles (74 to 100% overlap within 1.5 km), so the brief describes the area, not the single lease. Every named business is traced (see the next entry). - Status: Pre-registered; protocol committed before the result. - Files: PREREGISTRATION_2.md, blind_test.py, blind_sheet.md, blind_key.sha256 ### Lease score, 25 cuisines: does it work for cuisines we had not tested? - Claim: The first 14 cuisines cover half of active NYC restaurants. The 25-cuisine test ran the same city-records lease score on the 24 largest untested inspection categories, with a pass rule fixed first: at least 50 blocks with a new opening, AUC at least 0.75, interval lower bound at least 0.70. - Result: With Qloo the lease score reaches 0.887 against 0.851 without it. 11 passed and are now in the product: American (0.809), New American (0.925), chicken (0.760), burgers (0.814), sandwich shops (0.858), seafood (0.805), Spanish (0.819), Asian fusion (0.885), juice bars (0.828), ice cream and frozen desserts (0.831), bagel shops (0.875). 13 failed, mostly on too few openings to judge (French 0.926 on 47, Southeast Asian 0.903 on 26); they stay untested and the agent says so. - Caveat: For seafood, ice cream, burgers, sandwiches and Asian fusion the score is mostly how busy the block is: same-cuisine supply added little. Broad categories like American mix very different concepts. The 14 original cuisines scored the same on this all-blocks sample as before (0.782 to 0.897). - Status: Pre-registered (PREREGISTRATION_6.md); committed before results. - Files: PREREGISTRATION_6.md, backtest4b.py, backtest4b_results.json ### What the agent does when it cannot verify a name - Claim: Every business, brand or organisation the brief names is checked in code: it must come from Qloo's evidence for the area, NYC inspection records within 2 km, or a NYC business improvement district within 2 km. - Result: A name that traces to none of these is sent back to the model to replace, and only the sentences naming it may change. If that repair fails its checks, code removes those sentences, keeps every section, and checks the brief again. In the saved Astoria run the model named Astoria Bookshop; nothing we hold could trace it, so it was replaced, and the page says so under the brief. - Caveat: Tracing shows a name exists in a source, not that the business would partner with you. A real business missing from our sources is replaced too. - Status: A code check, not a statistical claim. - Files: positioning.py, agent.py ### Reliability: does the agent finish the job, with traceable numbers? - Claim: Separate from the tests above: this checks the agent works, not that any signal predicts anything. - Result: On the Oct 11 code, run 3 times each: 13 of 13 search and compare cases passed every run; 5 of 5 edge cases (Staten Island, a bad address, an untested cuisine, Hoboken, a prompt injection) stopped with a clear error; 5 of 5 follow-up questions called the right tool with every number traced to a tool result; scout mode passed for students and families (3 runs each) and office workers and seniors (1 run each). After the lease score was extended to more cuisines and added burgers, the untested-cuisine edge case changed from 'Vegan burger joint' to 'Ethiopian injera house'; it and the other two code-only edge cases were re-run on the current code and passed 3 of 3. The other cases ran on the code before that extension and the address-validation fix. - Caveat: These cases were written by us, and the saved runs on this page were re-recorded on the final code; they show the demo, not a pass rate. When a live run fails, the page says whether the model host was busy (try again in a minute) or the demo budget is used up, and saved runs keep working either way. Plans that depend on what we do not measure (rent, opening hours, nightlife, neighbourhood change) get a fixed 'Not measured here' note with the shortlist. - Status: Reliability, not validation. - Files: eval_suite.py, eval_suite_results_v3.json, eval_suite_results_scout.json ### Survival: do restaurants on high-scoring blocks last? - Claim: Hypothesis: the lease score also ranks blocks where young restaurants last. - Result: No. 4136 restaurants opened Oct 2018 to Oct 2021; 50% were still open in Oct 2026. The lease score ranked survivors at mean AUC 0.5161 (interval 0.499 to 0.5352): no better than chance. Qloo taste added +0.013, which passed the registered rule, but a placebo feature with no foresight gained as much (+0.016) and one cuisine (Caribbean) carried most of it. - Caveat: So the lease score shows where operators open, not where they last, and we make no survival claim for Qloo. Closure is inferred from a restaurant missing today; the cohort opened partly during COVID-19; Qloo's map is today's, not 2021's. - Status: Pre-registered (Oct 2021 snapshot vs today); the placebo check is exploratory. - Files: PREREGISTRATION_5.md, backtest5.py, backtest5_results.json, backtest5_exploratory_placebo.py ### Audience tags: do Qloo's tags describe who is in an area? - Claim: Hypothesis: Qloo's customer-identity tags for a place match independent data about that place. - Result: 2 of 7 matched across 181 NYC neighbourhoods: Affluent Diners vs income rho +0.41; Business Professionals vs job density rho +0.38; Seniors vs share 65+ rho +0.07; Tourists vs hotel density rho +0.02; Young Adults vs share aged 20 to 34 rho +0.01; College Students vs college enrolment rho -0.15; Families vs households with children rho -0.17. Families ran opposite to where families live. - Caveat: The tags move together along one urban, affluent axis (Affluent Diners tracks job density at +0.48, more than income), so even the two that matched say little beyond it. Census data answers demographic questions directly, so scout mode will use census data for target customers and Qloo only for taste. - Status: Pre-registered; protocol and code committed before any data was pulled. - Files: PREREGISTRATION_4.md, backtest6.py, backtest6_results.json