SEC EDGAR company facts (us-gaap revenue, gross profit and operating income as filed, company-wide) and US Census ACS 5-year estimates for residents (population, age, households, income, commute); they cost no Qloo calls
Window
Apr–Sep 2025; nothing after it
Cache
Shared; the age of every saved copy is shown
Models
Clerk Haiku 5.5 · Analyst Sonnet 5.5
The seven steps
Same for every answer
1InterpretThe question becomes an intent: topic, job, names and safety.Clerk · Haiku
2ResolveNames must match Qloo exactly; a near miss stops at a picker.Gate · code
3PlanPriors H1–H4 are written before any data reaches the model.Priors are written in the first turn, before any Qloo data reaches the model. The report can only give them verdicts.Analyst · Sonnet
4FetchUp to 40 Qloo requests per answer; repeats come from cache.A cached request keeps its original request id and fetch time, and its age is shown on every note.Quant · code
5ComputeEvery figure is computed in code; the model types none.Quant · code
6CheckEach number in the prose is traced to its metric and request.A number passes only as a token bound to a metric that code computed. A failed check buys one repair turn.Checker · code
7WriteProse is written around traced numbers; priors get verdicts.Analyst · Sonnet
Opening scan
While the analyst plans, code runs the job's default skills, so the first figures arrive early. Their evidence is cited like any other.
The opening scan of each job
Brands & investing
Brands & investingReal competitors
Substitution map · Audience DNA · Travel taste · Company filings
Brands & investing
Brands & investingCompare two brands
Substitution map · Ranking · Share of taste · Audience DNA · Company filings
Taste tags · Taste tags · Lift map · Area census · Places nearby
Places
PlacesRead a neighbourhood
Block DNA · Area census · Places nearby
Places
PlacesBest tenant for a space
Block DNA · Area census · Places nearby
Places
PlacesFind an area's twin
Taste tags · Taste tags · Taste twins · Area census · Area census · Places nearby · Places nearby
Places
PlacesCompare cities
Taste tags · Taste tags · Block DNA · Block DNA · Block DNA · Block DNA · Lift map · Lift map · Lift map · Lift map · Share of taste · Places nearby · Places nearby · Places nearby · Places nearby
Sponsors & tours
Sponsors & toursSponsor fit
Sponsor slate · Cultural neighbourhood
Sponsors & tours
Sponsors & toursLaunch & tour cities
Travel taste · Share of taste
Sponsors & tours
Sponsors & toursBrand collaborations
Cultural neighbourhood · Ranking · Audience DNA · Cultural neighbourhood
Sponsors & tours
Sponsors & toursArtists & podcasts who fit
Cultural neighbourhood · Ranking · Ranking
Audiences
AudiencesWho they are
Cultural neighbourhood · Audience DNA · Share of taste
The analyst's turns
Turn 1
The plan: up to 4 priors and the steps, with the first data calls. Code runs them alongside the scan and answers once, with every digest and the findings it detected.
Turn 2
Plan steps that needed turn-1 results, and follow-ups that must each cite a finding: 8 requests and about 40 s in all. Or the report.
Turn 3
The report. Any further data call is refused.
Guards
At most 5 model responses. A nudge at 120 s and a stop at 180 s; a wrap-up nudge at $0.40 of model spend and a stop at $0.60. An answer with no report by then becomes an evidence digest marked incomplete.
Evidence marks
How to read an answer
On a number
SourceOpens the Qloo requests behind a number
DraftStill being checked; opens once every number passes
On the data
Saved copy, 2h oldFrom the shared cache; its age is shown
No data
No data; never drawn as 0
On a guess
As expectedPrior held against the data
SurpriseData contradicted the prior
Can't tell yetToo thin or mixed to call
Badges
Every number carries one badge. Its weight m scales the evidence strength conf = m·(1 − 1/√n), which sets the Strong, Moderate and Thin tags.
The five badges and their weight in evidence strength
Badge
Meaning
Weight
Measured
Returned by Qloo as is: a popularity, a pair similarity, a demographic index.
m = 1
Derived
Exact arithmetic in code over measured values: a within-call percentile, a tilt, a lift.
m = 1
Estimated
A fit or a model: a Theil–Sen residual, a robust z-score, a neighbourhood rollup.
m = 0.6
Historical
From Qloo's historical trending window, and always shown with that window.
m = freshness F
Not measured
No value. The reason is shown, never a zero.
m = 0
Checker rules
Code, not a model
The checker reads every draft report before anyone sees it. It is code, not a model. A rejection sends the draft back once; after that the report is accepted with warnings, and each warning lowers confidence.
V1Ids existEvery metric, evidence, dataset and prior the draft cites exists in this run.Rejects
V2Tokens resolveEvery number token and evidence token resolves to the run's ledger.Rejects
V3No bare numbersNo decimals or percentages outside tokens. Whole numbers above ten count too, in digits or spelled out ("forty"), except years, age labels, ZIPs written as ZIPs and digits inside names.Rejects; warns on the repair
V4No advice, no causationA phrase list blocks buy, sell and short calls, price targets, under- or overvalued, guarantees, shares of customers, causal verbs, collapse, individual framing, poaching and underpriced.Rejects
V5Citations chainEach argument cites a metric, each recommendation an argument, and each verdict on a prior a metric.Rejects
V6One scale per claimNo claim compares two raw affinity scores from different Qloo calls.Rejects
V7Enough evidenceWith fewer than 3 evidence bundles that came back ok, or with Qloo off, the signal becomes insufficient evidence.Forced by code
V8History names its windowA historical metric appears with its trending window in the same argument.Added by code
V9Lengths and countsA headline of at most 120 characters, 3 to 5 arguments, parts of at most 400 characters, at most 4 priors and 3 bear-case points. The thesis does not repeat the note at the top of the answer (a concept read at category level, a question read as its nearest job).Rejects; a repeated note that survives is dropped by code
V10Claims are measuredAge, gender or generation is claimed only where the same part cites a metric that measures it. A competitor claim (a count, few or no rivals, crowded, white space) needs the same part to cite a counted venue sample: at least 10 similar venues across the compared areas, and 3 in an area before it is called crowded. An area with none in a capped sample is not "few": its competition is unknown, and the map reads Not enough venue data. Where similar venues could not be counted, the note says the count is unknown.Rejects; warns on the repair
V11Public figures name their periodA figure from SEC EDGAR filings or the US Census appears with its period or vintage in the same sentence (a fiscal year with its filing, or the ACS 5-year vintage). No sentence ties a financial or Census figure to a taste metric as cause and effect: they are read side by side, never one explaining the other.Period added by code; a causal link rejects, then warns on the repair
V12Concepts and areas read honestlyA number that rests on a look-alike tag standing in for a concept the data lacks is never cited. A read of the concept's broader category is called a category read, with no winner, keep or veto. A hidden pocket (an area that stands out for its size, not where the crowd is) is never called the best. A prior judged only on category reads, on thin samples, or by a tool that never returned data stays inconclusive.Rejects; on the repair warns and caps confidence, or forces the prior to inconclusive
V13Small differences never leadA difference inside the about-level band (a near-even index, a percentile gap under five points, a rank gain of a place or two) cannot lead the headline, the finding or the thesis. It reads about level, never a lead or a win.Rejects; warns on the repair
Each warning a report is accepted with costs 5 confidence points.checker_warning
Confidence
Computed, not chosen
Confidence starts at 100 and loses points only by written rules. Some rules also cap it: a mixed or weak signal, a headline on a small sample, or a concept read only at category level can never score high, however clean the rest is. Code computes it from the run's flags; the model never sets it.
Confidence penalties
Start
100
A name was dropped or could not be matched
−15each
A step fell back to a simpler method (such as a point instead of an area outline)
−10each
Some area lift rests on a coarse heatmap grid
−10once
Momentum comes from a historical window only
−20once
A data call returned fewer than five rows
−10each
Very low-popularity results were dropped
−5each
The answer was accepted with a checker warning
−5each
Too little evidence to read a signal
−60once
The question was read as the nearest job, so part of it is not covered
−5each
Caps
The score is the lower of 100 minus the penalties and the lowest cap that applies. The answer names the cap that sets its band, e.g. "Medium: the signal is mixed".
Confidence caps: the highest score a rule allows
Part of the concept was not tested (a tag search came back empty or a part was never used)
at most 70
The signal is mixed, so confidence stays at most medium
at most 70
The signal is weak, so confidence is low
at most 45
The headline rests on a small sample, so confidence stays at most medium
at most 70
The concept is not in the data; only its broader category was read
at most 60
BandsHigh75–100Medium50–74Low0–49
Confidence rates how complete and clean the run's evidence is, not the chance that the conclusion is right.confidence.run
AI and web context
Shown apart, never measured
Beside the measured answer, two blocks add context. They sit under the answer, apart from it, with dashed borders, and they never change the verdict, a number or the confidence.
What AI knows (not verified)
One small model call recalls widely reported facts about the subject and place: deals and ownership, where it already operates, local operators, brand-safety risks.
It may state no number: code drops any item with a digit, a percent or currency sign, or a number word, and says how many it dropped. The model's knowledge can be out of date or wrong, so the block is labelled not verified.
Only one thing from it reaches the analysis: the market ids where the subject is said to operate already, checked against our market list, so market tables can mark them "Already there". The ranking stays the data's.
From the web
One small model call runs up to three web searches and writes short sentences, each tied to a search result. Code keeps only sentences with a citation, shows each with its link, publisher, published date (or "date unknown") and the date it was retrieved, and drops any sentence whose numbers are not in the cited passage.
Page text is untrusted data. It is shown escaped, with its link, and never reaches the analysis, a candidate list or a number. Sentences that read like instructions are dropped.
When they are off
Either block can be turned off on a server; web search is off in economy mode. A block that is off, empty, timed out or failed says so in one line. With Qloo off, the measured answer stays "not enough data" whatever the blocks say.
Neither block is a source for a number in the answer.aiContext · webContext
OpenStreetMap places
Counts are a floor
For place questions, code counts the real places already there from OpenStreetMap through the public Overpass API: competitors of the place type in each area (or around a city's centre), counts per km², each area against its city, and street activity (shops plus food and drink places).
Each count is a floor, not a census: OpenStreetMap is mapped by volunteers, dense US cities well, suburbs less so.
"More than the city" and "less than the city" compare an area's density with the metro's counties. Inside 0.8 to 1.25 times the city's level an area reads "about the city's level", never more or less. The city's area is approximate.
What an area has too much or too little of comes from counting every storefront type against the city: at 1.5 times the city's level with at least five places it has more; at half or less it has less.
Only place types whose tags are documented and widely used in OpenStreetMap are counted. A concept with no reliable tag is not counted, and the answer says so.
Every number in an answer names one of these formulas, and “How it's calculated” in How we know opens its entry here. They render from the same registry the code computes with.
pct_i = 1 − (r_i − 1)/(n − 1); r_i = descending average rank of i among the n scored candidatespcti = 1 − ri − 1n − 1ri = descending average rank of i among the n scored candidates
Where a candidate sits among the others scored in the same Qloo call: 1 is the top of the call, 0 the bottom. Ties share an averaged rank, and a lone scored candidate gets 1. Candidates at the call's shared floor value have no relationship to the signal, so they are left unscored rather than ranked last.
Reads
Qloo affinity of each candidate scored in one call
Caveats
Percentiles compare candidates inside one Qloo call only; never compare them across calls.
Candidates a call did not score, or that sit at its shared floor value, are shown as not scored, never as last.
Affinity is a taste signal, not sales, share or causation.
A percentile of a small set moves in large steps; read it with the set size (k of n).
Results with a Qloo popularity below 0.01 are treated as likely artifacts and dropped before any statistic is computed. Every drop is recorded in the ledger and lowers the run's confidence.
Reads
Qloo popularity of each result
Caveats
A dropped result can be a real but very obscure entity.
Results without a popularity value are kept, since a missing field is not evidence of an artifact.
Qloo's 0 to 1 popularity score for the entity: how widely it registers across Qloo's data relative to other entities. It is the Reach axis of the Taste Position card and the baseline that UNDER-THE-RADAR subtracts.
Reads
Qloo popularity from search or entity lookup
Caveats
Breadth of cultural signal, not revenue, sales or market share.
Small differences between entities are not meaningful; read it as a rank among peers.
Badge
Measured
Name matching
RES · resolve_entitiesRun by the resolution gate on every answer; the analyst calls it for new names
A mention resolves to a Qloo entity only when the two names are equal after normalising (accents folded, lower case, punctuation removed, spaces collapsed, a leading The and trailing corporate suffixes such as Inc, Co, Company, LLC and Ltd removed) and the entity type matches. Nothing is ever substituted: a main subject without an exact match goes to a picker, and a secondary mention without one is dropped with a limitation.
Reads
The name as written and the entity type the clerk read
Qloo search results of that type
Caveats
Popularity never decides a match.
An entity missing from Qloo's hackathon dataset cannot be analysed.
Two exact matches with the same name need a human pick.
Badge
None: a rule: it decides, it produces no number
Substitution map
SUBS · peer_landscapeOpening scan: Real competitors · Compare two brands
sim_ij = affinity(j | signal = i) = sim_jisimij = affinity(j | signal = i) = simji
Qloo's affinity for entity j when entity i is the taste signal. The gating probe verified that this score is symmetric and does not depend on which other candidates share the call, so one triangular set of calls fills the whole grid.
Reads
Qloo affinity of entity j with entity i as the signal, one call per row
Caveats
Audience taste similarity, not switching, share or sales.
Single-seed scores, and the scores are compressed: read ranks rather than raw values.
Pairs Qloo did not score are shown as not measured.
Symmetric by construction, so no claim that one brand takes customers from another.
rr_ij = 1 + #{ k ≠ i : sim_ik scored, sim_ik > sim_ij }; (1 = most similar; tied cells share the best rank)rrij = 1 + #{ k ≠ i : simik scored, simik > simij }(1 = most similar; tied cells share the best rank)
In each entity's row of the grid, its peers are ranked from most to least similar; the glyph in each cell shows this rank. Tied peers share the best rank among them (1, 2, 2, 4), so the glyph is always a whole number.
Reads
The scored similarities in row i
Caveats
A rank inside one row; rows can differ in how many peers were scored.
A tie skips the ranks its members would have taken, so the largest glyph in a row can be below the number of scored peers.
Hub and near-substitutes read averaged ranks instead: two peers tied for first both show 1 here, yet neither is the row's single closest peer.
The similarity behind it is symmetric, so a rank is not a claim about direction.
Hub_j = 1/(|R_j|) Σ_(i ∈ R_j) pct_ij; pct_ij = 1 − (r̄_ij − 1)/(n_i − 1); r̄_ij = average rank of sim_ij among the n_i scored cells of row i; R_j = { i ≠ j : sim_ij scored }; measured only when |R_j| ≥ max(2, ⌈ (k − 1)/2 ⌉)Hubj = 1|Rj|Σi ∈ Rj pctijpctij = 1 − r̄ij − 1ni − 1r̄ij = average rank of simij among the ni scored cells of row iRj = { i ≠ j : simij scored }measured only when |Rj| ≥ max(2, ⌈ (k − 1)/2 ⌉)
How central an entity is in the peer set: the average of its within-row percentiles across the other entities' rows. A hub sits close to many peers; a niche entity sits at the edge of the set.
Reads
Within-row percentiles of j across the other rows
How many cells each row scored
Caveats
Relative to the chosen peer set; different peers give different results.
Centrality in taste, not size, share or sales.
Not measured for an entity scored in fewer than half of the other rows (or fewer than 2): a score read off one row would make a brand close to a single peer look central.
How far an entity's audience taste is from its nearest peer: one minus its highest similarity to any other entity in the set. It is shown as a peer rank (k of n), where 1 is the most distinctive.
Reads
Similarities of entity i to every other entity in the set
Caveats
Relative to the chosen peer set; different peers give different results.
Two entities that are each other's nearest peer share the same value and the same rank.
Distinctive taste is evidence about substitution risk, not proof of a durable advantage.
r̄_ij = r̄_ji = 1 ∧ sim_ij ≥ Q_0.9({ sim_kl : k < l scored })r̄ij = r̄ji = 1 ∧ simij ≥ Q0.9({ simkl : k < l scored })
Two entities are near-substitutes when each is the other's single most similar peer (average rank 1, so a tie for first does not count) and their similarity is in the top tenth of all scored pairs in the set.
Reads
Average rank in row, both ways
Every scored pair similarity in the set
Caveats
Shared audience taste, not evidence that customers switch between them.
The threshold is relative to the set, so in a small set the closest pair usually qualifies.
No direction: neither entity is said to take from the other.
(#{ i ≠ t : t ranks last in row i })/(#{ i ≠ t : t is scored in row i }) ≥ 0.75; with at least 3 scored rows#{ i ≠ t : t ranks last in row i }#{ i ≠ t : t is scored in row i } ≥ 0.75with at least 3 scored rows
The target is a taste island when it ranks last in at least three quarters of the peer rows where it is scored, and it is scored in at least 3 rows: its audience's taste sits apart from the whole peer set.
Reads
The target's place in each peer row that scored it
Caveats
Relative to the chosen peer set; different peers give different results.
Taste set apart is not weak demand or poor performance.
Rows where the target was not scored do not count, and a row with no ordering (only the target scored, or every cell tied) has no last place.
Badge
Derived
Share of taste
SHARE · share_of_tasteOpening scan: Compare two brands · Compare cities · Launch & tour cities · Who they are
pct_cj = 1 − (r_cj − 1)/(n_c − 1); r_cj = rank of j among the n_c entities scored in context cpctcj = 1 − rcj − 1nc − 1rcj = rank of j among the nc entities scored in context c
In each context (an age group, an audience or a metro), the same set of entities is ranked by Qloo's affinity for that context. The grid shows each entity's within-call percentile and its rank k of n.
Reads
Qloo affinity of each entity in one context call: an age group, an audience or a metro
Caveats
Within-call rank among this set only; not market share.
Metro context is a Qloo locality taste signal, not residence, attendance or sales.
Candidates a call did not score, or that sit at its shared floor value, are shown as not scored, never as last.
Tilt_j = 1/(|Y|) Σ_(b ∈ Y) pct_(j,b) − 1/(|O|) Σ_(b ∈ O) pct_(j,b); Y ⊆ { ≤ 24, 25–29 }, O ⊆ { 45–54, 55+ } queried, pct among the entities all of them rankedTiltj = 1|Y|Σb ∈ Y pctj,b − 1|O|Σb ∈ O pctj,bY ⊆ { ≤ 24, 25–29 }, O ⊆ { 45–54, 55+ } queried, pct among the entities all of them ranked
The entity's average percentile in the young age contexts queried (24 and younger, 25–29) minus its average in the old ones queried (45–54, 55 and older); it needs at least one of each. Those calls are re-ranked over the entities all of them scored, so every tilt subtracts percentiles of the same set. With all four buckets fully scored it is the two youngest minus the two oldest. Positive means the set ranks it higher for younger audiences than for older ones.
Reads
Share-of-taste percentiles in the young and old age contexts queried, re-ranked over the entities all of them scored
Caveats
Relative to this set of entities, not the age mix of customers.
Percentiles compare candidates inside one Qloo call only; never compare them across calls.
Aggregated group-level taste signals; no individual-level inference.
An entity one of those calls did not score has no tilt, never 0.
s_c = (a_(c,1))/(a_(c,1) + a_(c,2)); 1 − s_c for the second entitysc = ac,1ac,1 + ac,21 − sc for the second entity
For a pair, in each context: the first entity's share of the two entities' affinities from that one Qloo call; the second entity has the rest, so the two sum to 1. A share within 0.02 of an even split reads as even.
Reads
The two entities' Qloo affinities in each context call
Caveats
Percentiles compare candidates inside one Qloo call only; never compare them across calls.
Metro context is a Qloo locality taste signal, not residence, attendance or sales.
A share of two affinities in one call, not market share or sales.
Badge
Derived
Audience DNA
DNA · audience_dnaOpening scan: Real competitors · Compare two brands · Brand collaborations · Who they are
{ τ ∈ T_t : #{ p ∈ P : τ ∈ T_p } < |P| / 2 }{ τ ∈ Tt : #{ p ∈ P : τ ∈ Tp } < |P| / 2 }
Search tags that the target carries and fewer than half of its peers of the same entity type carry, grouped by namespace: aesthetic, emotional tone, lifestyle, customer segment, personal style, product and genre. Tags in other namespaces are listed as context, never as distinctive.
Reads
Search tags of the target
Search tags of each peer
Caveats
Tags describe Qloo's catalogue profile of the entity, not measured customer attributes.
A missing tag is not evidence that the trait is absent.
Relative to the chosen peer set; different peers give different results.
Compared only with set peers of the same entity type that carry tags; with none, no tag is called distinctive.
Badge
Derived
Momentum
MOM · momentumCalled by the analyst when a question needs it
Δpct_26w = 26 · median_(i < j) (y_j − y_i)/(t_j − t_i); y = ISO-week median trending percentile, t in weeksΔpct26w = 26 · mediani < jyj − yitj − tiy = ISO-week median trending percentile, t in weeks
The robust trend of the entity's Qloo trending percentile: the median of all pairwise slopes between weekly values (Theil–Sen), scaled to 26 weeks. A single outlier week cannot swing it.
Reads
Weekly Qloo trending percentiles over the fixed historical window
Caveats
Historical window only (Qloo trending over one fixed past window), always badged STALE with the window.
The trending percentile reflects Qloo signal, not sales.
No signal is not the same as flat: short or nearly constant series show NO SIGNAL.
S = Σ_(i < j) sgn(y_j − y_i); τ = S/(n(n−1)/2); Var(S) = (n(n−1)(2n+5) − Σ_g t_g(t_g−1)(2t_g+5))/18; z = (S − sgn(S))/(√(Var(S))); p = 2 (1 − Φ(|z|))S = Σi < j sgn(yj − yi)τ = Sn(n−1)/2Var(S) = n(n−1)(2n+5) − Σgtg(tg−1)(2tg+5)18z = S − sgn(S)√Var(S)p = 2 (1 − Φ(|z|))
Tests whether the weekly series moves consistently in one direction. τ runs from −1 (always falling) to 1 (always rising); p is the chance of a pattern at least this consistent in a series with no trend.
Reads
The same weekly series
Caveats
Historical window only (Qloo trending over one fixed past window), always badged STALE with the window.
Step-shaped series repeat values; the variance is corrected for these ties.
A small p shows consistency, not size; read it together with the 26-week momentum.
Rising if Δ ≥ 0.02 ∧ p < 0.1; Declining if Δ ≤ −0.02 ∧ p < 0.1; otherwise FlatRising if Δ ≥ 0.02 ∧ p < 0.1Declining if Δ ≤ −0.02 ∧ p < 0.1otherwise Flat
Rising needs a 26-week gain of at least 0.02 in trending percentile and a consistent direction (Mann–Kendall p below 0.1); Declining is the mirror image; anything else is Flat.
Reads
26-week momentum
Mann–Kendall p
Caveats
Historical window only (Qloo trending over one fixed past window), always badged STALE with the window.
Fewer than 8 points, or a series with almost no distinct values, gives NO SIGNAL rather than Flat.
Each destination is placed by how strongly this audience's taste points to it (its percentile in the call) and by its popularity, split at the medians of the result set: HEARTLAND (high fit, high popularity), HIDDEN POCKET (high fit, low popularity), MASS (low fit, high popularity) and COLD. A destination with popularity 0.85 or more is never a hidden pocket, however the set's median falls: with high fit it is HEARTLAND.
Reads
Affinity percentile of each of Qloo's top US destinations for the audience
Destination popularity
Caveats
Places this audience's taste points to (travel and leisure), not residence, sales or ticket demand.
Among Qloo's top 50 US destinations for this audience only.
Median splits put half of the set on each side by construction.
H_d = Φ^(−1)(3/4) · (e_d − median(e))/(MAD(e)); e_d = A_d − (α + β p_d); (α, β) = Theil–Sen fit of A on pHd = Φ−1(3/4) · ed − median(e)MAD(e)ed = Ad − (α + β pd)(α, β) = Theil–Sen fit of A on p
How much more this audience's taste points to a destination than its popularity predicts: the robust z-score of its residual from a Theil–Sen line of fit on popularity. Above zero means more taste than popularity explains. A destination is called a hidden pocket when this score is 2 or more and its popularity is below both the set's median and 0.85.
Reads
Destination affinity percentiles
Destination popularity
Caveats
Relative within this result set.
Travel and leisure taste, not residence or ticket demand.
When more than half the residuals are equal the MAD is zero, and the mean absolute deviation stands in as the spread.
Badge
Estimated
Lift map and white space
LIFT · geo_liftOpening scan: Where to open · Compare cities · Compare cities · Compare cities · Compare cities
L_c = (u_c + 0.05)/(v_c + 0.05); for cells with u_c ≥ 0.5Lc = uc + 0.05vc + 0.05for cells with uc ≥ 0.5
For each map cell, the concept's heat compared with the baseline's heat (restaurants): u and v are the cell's percentiles among the non-zero cells both maps cover. The 0.05 cushion stops cold baseline cells from producing huge ratios, and only cells in the top half of the concept map are scored.
Reads
The concept's Qloo heatmap of the metro
The baseline heatmap: restaurants
Caveats
Relative within the metro.
Lift against the named baseline, not absolute demand.
Both maps are re-keyed to their coarsest shared geohash precision, and zero-affinity cells are excluded.
A cell only one map covers has no lift: not measured, never 0.
The typical cell lift inside a neighbourhood: the geometric mean of its gated cell lifts, so one extreme cell cannot dominate. A neighbourhood needs at least 5 gated cells to get a value.
Reads
Gated cell lifts
Neighbourhood boundaries from the gazetteer
Caveats
Relative within the metro and against the named baseline.
Neighbourhood boundaries come from our gazetteer; the source is credited on the map.
Maps at geohash 4 or coarser support no neighbourhood claims.
How much weight a neighbourhood lift can bear: it grows with the number of gated cells, reaching full weight at 12, and is scaled down for coarser map precision.
Reads
Gated cells in the neighbourhood
Map precision (geohash length)
Caveats
Reflects cell count and map precision only, not whether the baseline is the right comparison.
High where the concept's taste lift is strong and the density of indexed venues is low. Demand_pct is the neighbourhood's lift percentile and Supply_pct its percentile of venues per square kilometre, both among the neighbourhoods with a lift and only when there are at least three of them. Neighbourhoods tied on density share the lowest percentile of the tie, so one with no sampled venue has Supply_pct 0 and never counts as high supply. Median splits give four groups: high demand with few rivals, high demand with many rivals, low demand with many rivals, and low demand with few rivals.
Reads
Neighbourhood lift percentile (demand)
Venues per square kilometre in a capped sample of Qloo-indexed places (supply)
Caveats
Supply is a capped sample of venues Qloo indexes, not a full count of businesses.
Relative within the metro; not rent, footfall or sales.
Without a supply sample (none asked for, no category tag, or a first page that did not come back) white space is not measured, never 0.
A quadrant needs enough venues: at least 10 counted in at least three compared areas, never an area with none in a capped sample, and at least 3 in the area for either group with many rivals. Otherwise the area reads Not enough venue data.
raw_N = 1/(n_N) Σ_(c ∈ N) u_c; rawPct_N = percentile of raw_N among the areas with onerawN = 1nNΣc ∈ NucrawPctN = percentile of rawN among the areas with one
How strong the concept's own heat is in a neighbourhood, before comparing with the baseline: the mean of its cells' concept percentiles u, then ranked among the areas (needs at least three). An area is popular when it is in the top quarter here; a hidden pocket is in the top quarter for lift but the bottom half here, so it stands out for its size rather than being where the crowd already is. Both stand on the map side by side.
Reads
The concept's raw Qloo heatmap affinity in the area's cells
The same for every other area on the map
Caveats
Relative within the metro and within one call.
Popular means the concept's taste signal is strong there, not sales, footfall or rents.
A hidden pocket is never called the best area on its own: popular areas are shown next to it.
Badge
Derived
Block DNA
BLOCK · block_dnaOpening scan: Read a neighbourhood · Best tenant for a space · Compare cities · Compare cities · Compare cities · Compare cities
Δ_t = rank_city(t) − rank_area(t); a missing rank counts as N+1Δt = rankcity(t) − rankarea(t)a missing rank counts as N+1
How much higher a tag (or a brand) ranks in the area than in the city as a whole. Positive means the area over-indexes on it. A tag missing from a top-50 list counts as rank 51 and a brand missing from a top-30 list as rank 31; a row tied at its list's floor value has no rank and counts as missing.
Reads
The area's top tags (or brands) from Qloo
The same list for the whole city
Caveats
Affinities are compressed, so only rank deltas against the city are shown.
Taste signals of venue-goers, not residents or census data.
The area is the one Qloo resolves for the location, not our exact polygon.
t is NEW ⇔ t ∉ Top50_city ∧ t ∈ Top20_areat is NEW ⇔ t ∉ Top50city ∧ t ∈ Top20area
A tag is NEW when it is absent from the city's top 50 yet present in the area's top 20. A tag the city list holds, even unranked at its floor, is not NEW.
Reads
The city's top 50 tags
The area's top 20 tags
Caveats
Taste signals of venue-goers, not residents or census data.
r̄(t) = 1/(|P|) Σ_(c ∈ P) rank_c(t); rank_panel(t) = position of t by r̄(t) , top 50 onlyr̄(t) = 1|P|Σc ∈ P rankc(t)rankpanel(t) = position of t by r̄(t) , top 50 only
The comparison a whole city is read against: the other map cities' top-50 tag lists, each tag placed by its average rank across them (a tag missing from a city's list counts as 51 there). Only the panel's top 50 get a rank, like any single list. A city's rank gain on a tag is the panel rank minus the city's own rank, so a positive gain means the city over-indexes on it compared with the other map cities. NEW means absent from every other map city's list.
Reads
The top-50 tag list of each other map city
Caveats
The panel is the map cities Culture Terminal covers, not every US city.
Taste signals of venue-goers, not residents or census data.
Read ranks, not raw scores: affinities are compressed.
area: Δ_t = rank_city(t) − rank_area(t); city: place_c(t) = 1 + |{c′ ∈ P : rank_c′(t) < rank_c(t)}|; a missing rank counts as 51area: Δt = rankcity(t) − rankarea(t)city: placec(t) = 1 + |{c′ ∈ P : rankc′(t) < rankc(t)}|a missing rank counts as 51
How the question's concept tags stand in a Block DNA read, at no extra call. For a neighbourhood or point: how many places higher each concept tag ranks in the area's top-50 tag list than in the city's, as the rank gain does. For a whole city: its place among itself and the other map cities when each city is ordered by the tag's rank in its own top-50 list (1 = the city where the tag ranks highest; a city whose list misses the tag counts it as 51, and cities on the same rank share a place). A tag outside the tag families Block DNA reads, or in none of the lists, gets no value and says why.
Reads
The concept tags from the question
The top-50 tag lists Block DNA already read (the area, the city or the other map cities)
Caveats
The panel is the map cities Culture Terminal covers, not every US city.
Taste signals of venue-goers, not residents or census data.
A place among cities orders ranks; it does not say by how much one city leads another.
Badge
Derived
Tenant fit
RANK · rank_candidatesOpening scan: Compare two brands · Brand collaborations · Artists & podcasts who fit · Artists & podcasts who fit
Δ_j = pct_(site, j) − pct_(city, j); both among the candidates both calls rankedΔj = pctsite, j − pctcity, jboth among the candidates both calls ranked
How much higher a candidate ranks among the same candidates when the site's location is the signal than when the whole city is: each call is re-ranked over the candidates both scored. Positive means the site suits it better than the city at large. A candidate one call did not score has no shift.
Reads
Each candidate's percentile with the site as the location signal
The same with the city as the signal
Caveats
Percentiles compare candidates inside one Qloo call only; never compare them across calls.
A 0 to 100 fit score: 60% from the candidate's percentile at the site and 40% from how much better it ranks at the site than in the city. It is the only weighted formula in the product, and its weights are a fixed design choice shown here.
Reads
Percentile at the site
Rank shift
Caveats
Taste fit for a commercial concept; not credit, rent capacity, sales, or any decision about a business owner or resident.
The weights are not fitted to outcomes.
Because it also weighs the rise over the city, tenant fit can order two candidates the other way round from their site rank; tables state which order they are sorted by.
Percentiles compare candidates inside one Qloo call only; never compare them across calls.
Δ_j = pct_(last, j) − pct_(first, j); both among the candidates every compared context rankedΔj = pctlast, j − pctfirst, jboth among the candidates every compared context ranked
How much higher a candidate ranks in the last context of a slope than in the first, among the same candidates: each call is re-ranked over the candidates every compared context scored. Positive means it climbs from the first context to the last. A candidate one of the compared contexts did not score has no shift.
Reads
Each candidate's percentile in the first and last context of a slope, re-ranked over the candidates every compared context scored
Caveats
Ranks are compared across calls, never raw affinities.
Candidates a call did not score, or that sit at its shared floor value, are shown as not scored, never as last.
Metro context is a Qloo locality taste signal, not residence, attendance or sales.
A shift among a few common candidates moves in large steps; read it with the set size.
Badge
Derived
Cultural neighbourhood
XDOM · cross_domainOpening scan: Sponsor fit · Brand collaborations · Brand collaborations · Artists & podcasts who fit · Who they are
Fit minus popularity: high when the audience's taste points strongly to something that is not yet widely popular. A domain's under-the-radar pick is its highest score among results with fit at or above the domain's median fit, popularity below its median popularity and popularity below 0.85; a domain where no result clears that bar has no pick.
Reads
Within-call percentile of each result
Its popularity
Caveats
Not about price or value: Qloo has no pricing data.
It subtracts a global popularity from a within-call percentile, so read it as an ordering inside one domain.
The call caps popularity, so the most popular entities are not in the list.
The medians are relative to this list: a pick is less popular than most of its neighbours, not obscure.
edge(s, n) ⇔ K ≥ 2 ∧ share_(s,n) · K ≥ 1.1; K = number of seedsedge(s, n) ⇔ K ≥ 2 ∧ shares,n · K ≥ 1.1K = number of seeds
A line from a seed to a result is drawn only when that seed's share of Qloo's explanation is clearly above an even split. Otherwise the result shows its affinity only and the shares appear in the tooltip.
Reads
Qloo's explainability share of each seed
The number of seeds
Caveats
Explainability is attribution inside Qloo's model, not causation.
Most results split almost evenly across seeds and get no edge.
Badge
None: a drawing rule: it decides which lines a figure draws
fires ⇔ N ≥ 5 ∧ max_c N_c / N ≥ 0.6; N = scored partners, N_c = partners in top-level brand category cfires ⇔ N ≥ 5 ∧ maxcNc / N ≥ 0.6N = scored partners, Nc = partners in top-level brand category c
When at least 60% of at least five scored partner brands sit in one top-level brand category (after the subject's own category is left out), discovery has clustered. The suggested next step is a sponsor slate seeded by the subject over up to six sponsor categories the partners do not cover, so the note can name a best fit in each other category.
Reads
The scored partners' top-level brand categories
The subject's own category, left out
Caveats
A rule: it decides the next step and produces no number of its own.
Categories are Qloo's genre:brand branches; a partner without one is counted but sits in no category.
A sponsor category without a verified tag is never suggested.
j_c^* = arg max_(j ∈ c) A_j; A_j = percentile in the one-scale scoring callj*c = arg maxj ∈ cAjAj = percentile in the one-scale scoring call
The sponsor candidate with the highest fit in each category, all scored against the same seed in one call, so the slate holds one beer, one spirit and so on.
Reads
Percentiles from one scoring call over the shortlist
Each candidate's sponsor category
Caveats
Taste fit only; Qloo has no fee, availability or exclusivity data.
No ROI estimate.
Percentiles compare candidates inside one Qloo call only; never compare them across calls.
A candidate is flagged under the radar when its fit is at or above the slate's median fit while its popularity is below the slate's median popularity and below 0.85. A better-known name is never flagged, however the slate's median falls.
Reads
Slate fit percentiles
Candidate popularity
Caveats
Not about price or value: Qloo has no pricing data.
Relative to this slate; a different shortlist moves both medians.
Δ_jm = pct_jm − A_j^(m); A_j^(m) = national percentile of j among S_mΔjm = pctjm − A(m)jA(m)j = national percentile of j among Sm
How much higher a sponsor candidate ranks when the seed's taste is read in metro m than nationally, among the same brands: S_m, the slate brands the metro call scored. Positive means the market leans toward that candidate. A metro that scored fewer than three slate brands gives no value.
Reads
Percentile in each metro call
National affinity re-ranked over the brands that metro scored
Caveats
Metro context is a Qloo locality taste signal, not residence, attendance or sales.
Read within the brands the metro scored, often a few of the slate; a brand the metro dropped is not scored there.
Badge
Derived
Taste twins
TWIN · taste_twinsOpening scan: Find an area's twin
How alike two areas in different cities are in the way each differs from its own city. For every tag in either area's comparison, take its rank gain over its city (a missing rank counts as 51) and correlate the two lists of gains by rank: 1 means the same tags over- and under-index in both areas, 0 means no relation, below 0 means opposite patterns. At least 8 tags are needed. The more tags the two area lists share, the more the value can be trusted.
Reads
The source area's and each checked area's top tags from Qloo
The same lists for their two cities
Caveats
Taste signals of venue-goers, not residents or census data.
Ranks only the areas checked (named, picked by concept lift, or the largest), not every area of the target city.
Music tags (SOUND) are not compared.
Similar taste, not a forecast of sales, rents or footfall.
s_50 = the 50th result of the open concept call, scored again inside the scoring calls50 = the 50th result of the open concept call, scored again inside the scoring call
The bar an analog has to clear: the entity that ranks 50th when Qloo is asked for the concept's tags alone. It is scored again in the same call as the analogs, so the comparison never crosses calls. With fewer than 50 results, the last scored result is the anchor.
Reads
Qloo's open call for the concept's tags
The 50th result, scored again in the scoring call
Caveats
Percentiles compare candidates inside one Qloo call only; never compare them across calls.
The anchor depends on the concept tags chosen; other tags give another anchor.
KEEP ⇔ A_j ≥ A_(s_50); VETO ⇔ A_j < A_(s_50); A = affinity in the same scoring callKEEP ⇔ Aj ≥ As50VETO ⇔ Aj < As50A = affinity in the same scoring call
An analog is kept when the concept's taste scores it at least as high as the anchor (the concept's 50th result), and vetoed when it scores lower. An analog Qloo returns no score for, or one at the call's shared floor value, is not scored: never a VETO. ADD lists the concept's top results you did not name.
Reads
Affinity of each analog and of the anchor in one scoring call
Caveats
Percentiles compare candidates inside one Qloo call only; never compare them across calls.
Candidates a call did not score, or that sit at its shared floor value, are shown as not scored, never as last.
A VETO means the concept's taste points elsewhere, not that the analog is a weak business.
Affinity is a taste signal, not sales, share or causation.
R_p = the first revenue line the company reports for period pRp = the first revenue line the company reports for period p
Revenue for one fiscal year (10-K) or one quarter (10-Q) as the company reported it, taking the first revenue line it reports for the period in this order: revenue from contracts with customers excluding assessed tax, revenues, net sales revenue, revenue from contracts with customers including assessed tax. When a later filing restates a period, the latest-filed value is used.
Reads
US GAAP revenue lines in the company's SEC filings (10-K, 10-Q), latest filing per period
Caveats
As reported in the company's SEC filings (XBRL company facts), in US dollars; not advice.
Company-level: a brand inside a larger company is not broken out.
A company that changes its revenue line between years is compared as reported.
Gross profit and operating income as a share of revenue for the same reported period. A company that does not report gross profit has no gross margin; it is shown as not reported, never as 0.
Reads
Gross profit and operating income as filed
Revenue for the same period
Caveats
As reported in the company's SEC filings (XBRL company facts), in US dollars; not advice.
Company-level: a brand inside a larger company is not broken out.
How much revenue changed against the same period a year earlier (a fiscal year against the one before, a quarter against the same quarter a year before), both as reported.
Reads
Revenue for a period and for the same period a year earlier, as filed
Caveats
As reported in the company's SEC filings (XBRL company facts), in US dollars; not advice.
Company-level: a brand inside a larger company is not broken out.
Acquisitions, disposals and currency moves are included as reported, not adjusted.
Badge
Derived
Area economics (US Census)
ECON · area_economicsOpening scan: Where to open · Read a neighbourhood · Best tenant for a space · Find an area's twin · Find an area's twin
N_A = Σ_(u ∈ A) N_u; u = the ZIP code tabulation areas or census tracts of area ANA = Σu ∈ ANuu = the ZIP code tabulation areas or census tracts of area A
Population, households and workers of an area: the Census estimates of the ZIP areas or census tracts inside it, added up. Where an area is only part of a ZIP area, the whole ZIP area's figures are used, so they describe more than the area.
Reads
US Census ACS 5-year estimates for each ZIP area or census tract in the area
Caveats
US Census ACS 5-year survey estimates for residents, with sampling error; not customers, visitors or spending.
Units whose estimate Census withheld are left out of the sum, and the answer says so.
m̃_A = (Σ_(u ∈ A) P_u m_u)/(Σ_(u ∈ A) P_u); P_u = population of unit um̃A = Σu ∈ APumuΣu ∈ APuPu = population of unit u
Median age and median household income of an area made of several Census units: the population-weighted average of the units' medians. It approximates the area's true median, which Census does not publish for our areas, so it is badged approximate. An area of one unit shows that unit's published median.
Reads
Each unit's published median
Each unit's population
Caveats
US Census ACS 5-year survey estimates for residents, with sampling error; not customers, visitors or spending.
An average of medians is not the median of the combined area.
share_(A, k) = (Σ_(u ∈ A) W_(u, k))/(Σ_(u ∈ A) W_u); W = workers 16 and overshareA, k = Σu ∈ AWu, kΣu ∈ AWuW = workers 16 and over
The share of an area's resident workers who usually drive alone, take public transit, walk, cycle or work from home.
Reads
Resident workers by usual commute mode, ACS 5-year
Caveats
US Census ACS 5-year survey estimates for residents, with sampling error; not customers, visitors or spending.
About how residents get to work, not about who visits the area.
Badge
Derived
Places nearby (OpenStreetMap)
SUPP · local_supplyChained after the lift map, the twin search or a city comparison, and run for tenant and area questions, when OpenStreetMap is configured
N_(A,t) = #{ e ∈ OSM : e matches type t, e inside area A }NA,t = #{ e ∈ OSM : e matches type t, e inside area A }
How many places of a type (such as cafés) are mapped in OpenStreetMap inside a neighbourhood outline, or within 5 km of a market's centre. Nodes, ways and relations all count; the tags each type matches are listed in the method's tag table.
Reads
OpenStreetMap elements with the place type's tags inside the area outline or the market circle (Overpass API)
Caveats
OpenStreetMap is mapped by volunteers: counts are a floor, not a census.
A count of mapped places, not sales, rents, foot traffic or how busy the places are.
A place mapped twice (as a point and as a building) can count twice; this is rare.
I_(A,t) = D_(A,t) / D_(city,t); about the city's level when 0.8 ≤ I ≤ 1.25IA,t = DA,t / Dcity,tabout the city's level when 0.8 ≤ I ≤ 1.25
An area's density of a place type divided by its city's: 1 is the city's level, 2 is twice as dense. Between 0.8 and 1.25 it reads about the city's level. At 1.5 or more with at least 5 places, and at least 1.25 times the area's street-activity index (so the type is a larger share of its shops and food and drink places than in the city, not just part of a denser street), the area has more of that type than its city (oversupplied); at 0.5 or less while the city has some, and below 0.8 times its street-activity index, it has less (undersupplied).
Reads
The area's density
The same density over the metro's counties (an approximate area)
Caveats
OpenStreetMap is mapped by volunteers: counts are a floor, not a census.
The city reference is the county or counties around the city (approximate), so an index compares an area with that whole area.
Mapping completeness differs between areas, which moves the index too.
S_A = (#{shops, food and drink places in A})/(km_A^2)SA = #{shops, food and drink places in A}km2A
All mapped shops and food and drink places per square kilometre: a rough measure of how much street-level commerce an area has. Below 0.3 of the city's level the area reads low street activity.
Reads
Shops plus food and drink places in the area (OpenStreetMap)
The area's size in km²
Caveats
OpenStreetMap is mapped by volunteers: counts are a floor, not a census.
A count of mapped places, not sales, rents, foot traffic or how busy the places are.
U = the first n brands of the discovery call for the category tag or the seed brand; n ≤ 25U = the first n brands of the discovery call for the category tag or the seed brandn ≤ 25
The brands a screen ranks: the top results Qloo returns for brands with the category's tag, or for brands whose audience taste is near the seed brand. Every column then reads this same set, so ranks and percentiles compare these brands only.
Reads
The category tag or the seed brand
Qloo's brand results for it, in their order
Caveats
Brands outside the first results are not screened; a brand missing from Qloo's dataset cannot appear.
A different category tag or seed gives a different set.
Affinity is a taste signal, not sales, share or causation.
Badge
None: a rule: it sets which brands are screened, it produces no number
Fit minus popularity for each screened brand: high when the category's (or the seed's) taste points strongly to a brand that is not yet widely popular. A brand is flagged under the radar when its fit is at or above the set's median fit while its popularity is below the set's median and below 0.85, so a mass-market name is never flagged.
Reads
FIT: each brand's within-call percentile from the screen's scoring call
Each brand's Qloo popularity
The screened set's median of each
Caveats
Not about price or value: Qloo has no pricing data.
It subtracts a global popularity from a within-call percentile, so read it as an ordering inside this screen.
The medians are relative to this set: a flagged brand is less popular than most of the set, not obscure.
A brand the scoring call did not score has no value, never 0.
Badge
Derived
Category Taste Map
From a note's substitution map, or the screener's taste map calls
Places up to 14 entities on a flat map so that the distance between two points approximates how different their audiences' taste is (one minus their pairwise similarity). It is classical multidimensional scaling: the two largest eigenvectors of the double-centred squared distances. Pairs Qloo did not score are set to the largest scored distance, and the map lists them. Stress says how well the flat map keeps the distances: 0 is exact, above 0.2 reads as a poor fit and the map says so.
Reads
Pairwise Qloo similarities of up to 14 entities, one call per row
The largest scored distance, for any pair left unscored
Caveats
Only distances between points mean anything; the axes, the rotation and the scale do not.
Audience taste similarity, not switching, share or sales.
Relative to the chosen peer set; different peers give different results.
Two dimensions cannot keep every distance; read close pairs, not exact positions.
Starts at 100 and loses points for each weakness: 15 per dropped or unresolved secondary entity, 10 per code fallback, 10 for a coarse map, 20 when stale-only momentum is cited, 10 per thin result (fewer than 5 rows), 5 per quality-gate drop, 5 per CHECKER warning, 60 when there is too little evidence to read a signal, and 5 when the question was read as the closest kind of question Culture Terminal answers. Then caps tie it to the strength of the signal: a mixed signal caps it at 70 (never HIGH), a weak signal at 45 (LOW), a headline resting on a small sample at 70, a concept read only at its broader category at 60, and a partly tested concept at 70. HIGH is 75 or more, MED 50 to 74, LOW below 50. The breakdown shows on hover.
Reads
Counts the run collected: dropped names, code fallbacks, thin results, quality-gate drops and checker warnings
The coarse-map, stale-momentum and insufficient-evidence flags
Caveats
Measures the completeness and quality of this run's evidence, not the probability that the conclusion is right.
Computed by code from the run's flags; the model cannot change it.
conf = m_badge · (1 − 1/√n); clamped to [0, 1]conf = mbadge · (1 − 1/√n)clamped to [0, 1]
The evidence strength behind one number: a weight for its badge (measured data counts most) times a factor that grows with the number of observations n behind it. It drives the STRONG, MODERATE and THIN pills. A reported SEC or Census figure has no sample size, so its pill comes from its source and badge instead: a reported or exactly derived figure is STRONG, an approximate one (an area apportioned from tracts or ZIP areas) MODERATE.
Reads
The metric's badge
The number of observations n behind it
Freshness F for a historical metric
Caveats
An UNAVAILABLE metric has no confidence, and a single observation gives zero.
Strength of evidence, not the size or direction of the effect.
Badge
None: a score about a number, not a measurement
A value that is missing is badged Not measured with its reason, whatever the formula. It is never shown as 0.UNAVAILABLE · never 0
Evaluation
With and without Qloo
The evaluation has not been run yet, so there are no results to show. When it runs, this section prints its aggregates, never single answers.
Pre-registered questions across the four topics, adversarial ones included, are answered twice: by the full system, and by the same model with no tools (Ghost). A Reality Check scores public, real-world choices against Qloo.
What it measures
How often priors are refuted
Overlap of the top five picks, with and without Qloo
Picks the model alone names that Qloo cannot resolve
Numbers bound to a source
Adversarial questions handled correctly
Checker first-pass rate
Latency, Qloo calls and model cost per answer
Agreement is measured against Qloo's taste graph, not outcomes.
Only aggregates are published. Raw transcripts stay private.eval · aggregates only
Safe use
Each rule and what enforces it
The Qloo hackathon kit's safe-use guidance and the rules we add to it, each mapped to the code that enforces it. Rules marked Kit follow the kit's agent prompts or its resolution and provenance policy; the rest are ours.
Use taste data at group level. Never profile or infer an individual.OursThe clerk refuses questions about private people before any request. Only public figures are looked up. The checker rejects individual framing such as “this person” or “residents who”, and every answer says it is group-level.clerk · private_individual · checker V4
No inference about sensitive traits: health, religion, ethnicity, sexuality, immigration status.OursThe clerk refuses sensitive inference and offers a commercial reframe. Identity, belief and issue audiences are denied on every topic by the Qloo client itself.clerk · sensitive_inference · audience allowlist
No political targeting or persuasion.OursThe clerk refuses political targeting. Political audiences are denied on every topic, by family and by name.clerk · political_targeting · audience allowlist
No decisions about who gets housing, credit, employment or insurance.OursThe clerk refuses eligibility questions. Tenant fit carries a fixed limitation: commercial concept fit only, never a decision about a business owner or resident.clerk · eligibility · tenant.fit caveat
No residential leasing or tenant screening.OursThe clerk refuses residential screening; commercial tenant mix for a storefront is answered. Customer-identity tags are shown as venue-goer taste tags, never as residents.clerk · residential_screening · block_dna
Affinity is not sales, share, causation or an individual's probability.Kit · agent promptsEvery answer carries the line “Affinity ≠ sales, share or causation.” The checker rejects causal verbs and shares of customers, and forbids comparing raw affinity across calls. Each formula states its own limits.checker V4, V6 · FORMULAS caveats
No financial advice.OursBuy, sell and price questions are answered as taste-signal health and labelled “Analytics, not financial advice.” The checker rejects buy, sell and short calls, price targets and valuation words.clerk · financial_advice · checker V4
Match names exactly, and ask when a name is ambiguous.Kit · resolution policyThe resolution gate applies exact matches of name and type only. A near miss on the subject stops the run at a picker; on any other name it is dropped with a limitation. Popularity never decides a match.resolve_entities · D20
Keep provenance: say which request each result came from.Kit · provenance envelopeEvery number is a metric in the run's ledger, bound to its Qloo requests with request id, cache state and fetch time. The model cannot type a number; it cites tokens the checker resolves.ledger · tokens · checker V1–V3
Never present model knowledge as Qloo data.Kit · agent promptsWith too little evidence, or with Qloo off, the signal is forced to insufficient evidence. The model-alone column is always labelled as such.checker V7
Keep the API key secret.OursThe key lives in the server's environment only, never reaches the browser and is redacted from logs. A guard scans the built client bundle for server-only names before release.@ct/qloo · pnpm guard --bundle
Do not redistribute Qloo data.OursNo Qloo values or ids are committed to the repository: ids are resolved at run time and kept in the database, and a guard scans every commit. No Qloo images are shown.D29 · pnpm guard
Respect rate limits and quota.OursOne Qloo client per process with a rate limiter, a shared cache, a cap per answer and a daily cap on fresh requests. No bulk downloads, and Home fetches nothing on its own.@ct/qloo · limiter · quota
Keep Qloo entity ids on our server.OursThe server keeps the ids it needs in its database. Pages, live updates, saved answers and share cards carry readable names instead, and every number still opens its request: the endpoint, the parameters as names and the request id. A guard fails the build if an id appears in the browser code.scrubEntityIds · stream and page loaders · pnpm guard --bundle
Treat web pages as untrusted data.OursThe "From the web" block shows only sentences tied to a search result, each with its link, escaped as text. Page text never reaches the analysis, a candidate list or a number, and sentences that read like instructions are dropped.side context · web block
Keep model knowledge apart and free of numbers.Ours"What AI knows (not verified)" sits apart from the measured answer and is labelled not verified. Code drops any item that states a number, and the block never changes the verdict, a number or the confidence.side context · no-number rule
What we refuse
Decided before any request
The clerk reads every question before anything runs. A refused question makes no Qloo request; the reason and a group-level reframe take the answer's place. When several categories apply, the first in this list wins.
Instructions inside the questionRefused
Text that tries to change the instructions, reveal prompts, call tools or open links, even beside a real question.
Offered instead: The business question in it, without the instructions
Political targetingRefused
Voters, campaigns, persuasion, or anyone's politics.
Offered instead: Who an artist's audience is and what else it loves, for a commercial event
Sensitive traitsRefused
Inferring or targeting health, religion, ethnicity, sexuality, immigration status or similar traits, including siting a business by them.
Offered instead: Where a concept fits by taste, without reading who lives there
Residential screeningRefused
Choosing renters or residents. Commercial tenants for a storefront are a normal answer.
Offered instead: The group-level taste profile of a neighbourhood, for a commercial concept
Eligibility decisionsRefused
Deciding who gets housing, credit, employment or insurance.
Offered instead: Who a brand's audience is, for a commercial offer
Private individualsRefused
A named or identifiable private person, or picking individuals out of a group.
Offered instead: Who an artist's audience is, at group level
Out of scopeRefused
Questions that are not about taste, or that need data Culture Terminal does not have: sales, prices, rents, foot traffic, weather.
Offered instead: The brand's taste-signal health
Financial adviceAnswered, reframed
Buying, selling, shorting, price targets or valuation. Answered, never as advice.
Offered instead: The brand's taste-signal health, labelled not financial advice
A declined question makes no Qloo request and costs nothing. The reason and a question we can answer take its place.clerk · safety{allowed, category, reframe}
Audience allowlist
Checked inside the Qloo client
Qloo can read taste through audiences. Each topic may send only the audience families below; anything else is refused by the Qloo client before the request leaves the server, so even a faulty skill cannot send a denied segment.
Allowed per topic
Audience families each topic may use
Brands & investing
Hobbies and interests ·
Leisure ·
Spending habits ·
Professional area ·
Life stage ·
Investing interests
The six allowed families, for audience research on a brand's taste position.
Places
Hobbies and interests ·
Leisure ·
Spending habits ·
Professional area ·
Life stage ·
Investing interests
The same six families, only as taste contexts: what a group favours in an area, never who lives there.
Sponsors & tours
Hobbies and interests ·
Leisure ·
Spending habits ·
Professional area ·
Life stage ·
Investing interests
The same six families, for sponsor and market fit.
Audiences
Hobbies and interests ·
Leisure ·
Spending habits ·
Professional area ·
Life stage ·
Investing interests
The same six families, to describe an audience at group level.
Denied on every topic
CommunitiesIdentity groups: targeting them would be sensitive inference.
Political preferencesPolitical leanings: no political targeting.
Lifestyle preferences and beliefsBeliefs and convictions, religion included.
Global issuesStances on public issues: persuasion territory.
Also denied by name: Political junkie (leisure)
The allowlist lives inside the Qloo client and is mirrored in a config file for readers; a test keeps the two equal.packages/qloo · audiences.ts
Data handling
Group-level, dated, never in git
No individuals
Qloo's signals are aggregates of groups. Your question is never sent to Qloo, and neither is a private person or any personal detail: only the names of brands, artists, public figures and places, concept words for tag search, and areas.
Group level
Demographics are relative indices of age and gender groups, not shares of customers, and a claim about an audience's age needs a metric that measured it.
Snapshots
Every number carries the time it was fetched. Cached answers keep their original request id and show their age. Trend data comes from one fixed historical window and always says so.
Never in git
No Qloo values or ids live in the repository. They are resolved at run time and kept in the app's database; a guard scans the tree and its whole history for them.
There are no accounts. An answer you ask for is unlisted and kept out of search engines. Your answers are remembered in this browser only.
Snapshot framing is enforced in components: every chart says what it compares against, and has a table view and a Source.ChartCard · figures
Models and cost
Hard caps in code
Models
Who does what, and on which model
Clerk: reads the question
Haiku 5.5
Analyst: plans and writes
Sonnet 5.5
Economy analyst: once today's budget runs low
Haiku 5.5
Quant: computes every number
Code, not a model
Checker: reviews the draft
Code, not a model
Per answer
Qloo requests
At most 40 new requests, with a warning at 30; follow-ups share 8.
Model responses
At most 5, a nudge included.
Time
A nudge to finish at 120 s, a hard stop at 180 s.
Model spend
A wrap-up nudge at $0.40, a hard stop at $0.60.
Per day
Model budget
$10.00 a day across all answers, counted by UTC day. 40% of it is held for the judge lane, which hackathon judges open with a code; public answers never reach it.
Public answers
Sonnet 5.5 until today's spend reaches $4.50, then Haiku 5.5 until $5.94; past that, saved answers and replays only, until 00:00 UTC.
Judge lane
Sonnet 5.5 until today's spend reaches $7.50, then Haiku 5.5 until $9.94; past that, saved answers and replays only, until 00:00 UTC.
Before an answer
An answer holds $0.45 of today's budget before it starts ($0.06 on Haiku 5.5), and starts only while today's spend plus that stays within its lane's cap: $6.00 public, $10.00 judge.
Qloo budget
At most 1,900 fresh Qloo requests a day: 1,140 for public answers, 760 for the judge lane. Cached answers are free.
Replays, saved answers and repeated questions are served from the database: no Qloo request and no model cost.replay · answer cache
Coverage
18 place types · 15 sponsor categories
A place type or sponsor category is used only the way a live probe verified it. The gate names the check: G for the gating probe, P5 for the Part 5 probe, C1 and C2 for the coverage probe. Where no tag passed, the named fallback runs instead and the note says so.
Place types (find_tags, geo_lift)
Each place type's verified heatmap signal and venue filter
Place type
Heatmap signal
Venue filter
Restaurant
Verified G6
Not verified: no venue sample is drawn, so the competitor count is unknown
Cafe and coffee shop
Verified P5
Verified G10
Bar
Verified P5
Not verified: no venue sample is drawn, so the competitor count is unknown
Lounge
Verified C1
Verified C1
Wine bar
Verified C1
Verified C1
Record store
Verified C1
Verified C1
Ramen restaurant
Verified C1
Verified C1
Live music venue
Verified C1
Verified C1
Bakery
Verified C1
Verified C1
Brewery and taproom
Verified C1
Verified C1
Bookstore
Verified C1
Verified C1b
Clothing boutique
Verified C1
Verified C1
Gym
Verified C1
Verified C1
Beauty salon
Verified C1
Verified C1
Pizzeria
Verified C1
Verified C1b
Fitness studio
Verified C1
Verified C1
Burger restaurant
Verified C1
Verified C1
Sushi restaurant
Verified C1
Verified C1
Sponsor categories (sponsor_slate)
Each sponsor category's verified brand filter, or its fallback
Beer
Brand filter: verified P5
Spirits
Brand filter: verified C2
RTD and hard seltzer
Brand filter: verified C2
Outdoor and sporting retail
Fallback: found by semantic tag search at run time, labelled in the note
Apparel and footwear
Brand filter: verified C2
Quick-service restaurants
Brand filter: verified C2
Energy drinks
Brand filter: verified P5
Auto
Brand filter: verified C2
Telecom
Brand filter: verified C2
Fintech
Brand filter: verified C2
Beauty and personal care
Brand filter: verified C2
Gaming
Brand filter: verified C2
Travel
Brand filter: verified C2
Food delivery
Brand filter: verified C2
Consumer tech
Brand filter: verified C2
Lists and contexts
Named lists
Podcasts, TV shows and movies are scored on one scale over an exact list (C3), from seeds or by age; TV shows also by audience (C5).
Gender
Male and female audience contexts rank and share brands and persons (C4). Qloo's gender signal is binary.
Audiences
Segments of the six allowed families are read from Qloo, pinned and offered to the analyst; code refuses any other (C5, D21).
A gate is the probe check that passed live; the probe's raw answers stay out of the repository.config/categories.json · config/sponsor_categories.json · packages/qloo/src/allowlist.ts
Cost per use
Plan figures · measured where live runs exist
Plan figures from each feature's call plan, not measurements. Every note, screen and profile carries a receipt with what it actually spent. Cold: nothing cached yet; warm: the same request again inside the cache window. SEC EDGAR, US Census and OpenStreetMap calls are free and not counted. Screens and profiles draw from the same daily Qloo cap as answers.
Features · plan figures, measured where uses are recorded
Each feature's Qloo calls, cold and warm, and its model cost per use, as planned
Feature
Qloo, cold
Qloo, warm
Model
Following: re-runper re-runOne fresh run of the followed note's job, with that job's Qloo plan and one note's LLM cost. Listing follows and opening the latest note cost nothing.Spans the jobs below: one run of the followed note's job.
6–25
2–6
$0.10–0.30
Run queueper queued runWaiting for a slot costs nothing; a run that times out in the queue spends nothing.plan: no recorded use yet
0
0
$0
Brand screenerper screenLookup 1 (the category tag or seed brand), discovery 1 (its signal is the category tag or the seed, so it is also the one-scale scoring), age contexts 3, markets up to 4. Code only, no LLM. A repeat inside the cache window makes no network call.plan: no recorded use yet
5–9
0
$0
Category Taste Map on a noteper mapDrawn from the Substitution Map's similarity calls the note already made; no extra request.plan: no recorded use yet
0
0
$0
Category Taste Map on the screenerper mapTriangular similarity calls over the top k ≤ 14 brands: k − 1 calls, at most 13. It also fills the distinctiveness column.plan: no recorded use yet
2–13
0
$0
Brand profile (/d/[entity])per profileSearch 1, a pick's describe 0–1, audience DNA 2, four cultural-neighbour domains 4, travel taste 1; capped at 12. Code only, no LLM. A profile read again within an hour is served from memory.plan: no recorded use yet
8–9
0
$0
Verdict tagper noteTwo to five words written in the same report call as the rest of the note; no extra request or model call.plan: no recorded use yet
0
0
$0
Share cardper cardDrawn from a curated note already stored (a reader's own answer gets no card); no request or model call.plan: no recorded use yet
0
0
$0
Added to every answer
Every answer also runs these beside its analysis. None of them changes the measured answer, and none uses a Qloo call.
What each answer adds besides its job: the two context blocks and the OpenStreetMap places, with their Qloo calls and model cost
Feature
Qloo
Model
What AI knows (not verified)per answerOne small model call in parallel with the analysis, bounded by its token limit; cached 7 days per question. It never states a number and never changes the measured answer.
0
$0.005–0.02
From the webper answerOne small model call with up to 3 web searches ($0.01 a search), in parallel with the analysis; cached 24 hours per question. Off in economy mode.
0
$0.02–0.08
OpenStreetMap places nearbyper place questionOne to three OpenStreetMap (Overpass API) reads per call, at most six per answer, cached 30 days. Free; no model call.
0
$0
Answers, per job
Planned Qloo calls of each job's answer. Turn-2 follow-ups may add up to 8 more; an answer is capped at 40. A live (Sonnet) note's model cost is planned at $0.10–0.30; an economy (Haiku) note costs under a cent.
Measured: the median of this server's finished live answers of each job in the last 30 days, as fresh + cached Qloo calls and model cost.
Each job's planned Qloo calls per answer, and what this server's live answers measured
Job
Qloo, cold
Qloo, warm
Measured
Real competitors
25
6
22 + 0 · $0.27median of 1 run
Compare two brands
20
5
27 + 1 · $0.17median of 1 run
Where to open
7
2
6 + 3 · $0.19median of 4 runs
Read a neighbourhood
6
2
2 + 6 · $0.12median of 1 run
Best tenant for a space
6
2
3 + 6 · $0.13median of 2 runs
Sponsor fit
15–25
4
21 + 2 · $0.11median of 1 run
Launch & tour cities
17
4
12 + 0 · $0.13median of 1 run
Who they are
6
—
19 + 0 · $0.17median of 1 run
Find an area's twin
12
4
8 + 9 · $0.15median of 1 run
Brand collaborations
10
3
8 + 3 · $0.13median of 1 run
Artists & podcasts who fit
10
3
6 + 1 · $0.09median of 1 run
Test a new product
15
4
16 + 0 · $0.15median of 1 run
Compare cities
12
3
18 + 75 · $0.21median of 1 run
A measured figure counts this server's own answers; the plan stays beside it, so a drift between the two shows.packages/contracts/src/feature-costs.ts · runs table