Skip to content

How it works · Method

Every formula and rule

How an answer is made, how each number is checked, and what we refuse. Generated from the code every answer runs on.

On this page

Sources

62 formulas · 13 checker rules

Data
Qloo taste graph, group-level only
Calls
Search · Entities · Insights · Tags · Audiences · Trending
Public data
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

  1. 1InterpretThe question becomes an intent: topic, job, names and safety.Clerk · Haiku
  2. 2ResolveNames must match Qloo exactly; a near miss stops at a picker.Gate · code
  3. 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
  4. 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
  5. 5ComputeEvery figure is computed in code; the model types none.Quant · code
  6. 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
  7. 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 & investingBrands & investingReal competitorsSubstitution map · Audience DNA · Travel taste · Company filings
Brands & investingBrands & investingCompare two brandsSubstitution map · Ranking · Share of taste · Audience DNA · Company filings
Brands & investingBrands & investingTest a new productTaste tags · Taste tags · Concept check · Company filings
PlacesPlacesWhere to openTaste tags · Taste tags · Lift map · Area census · Places nearby
PlacesPlacesRead a neighbourhoodBlock DNA · Area census · Places nearby
PlacesPlacesBest tenant for a spaceBlock DNA · Area census · Places nearby
PlacesPlacesFind an area's twinTaste tags · Taste tags · Taste twins · Area census · Area census · Places nearby · Places nearby
PlacesPlacesCompare citiesTaste 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 & toursSponsors & toursSponsor fitSponsor slate · Cultural neighbourhood
Sponsors & toursSponsors & toursLaunch & tour citiesTravel taste · Share of taste
Sponsors & toursSponsors & toursBrand collaborationsCultural neighbourhood · Ranking · Audience DNA · Cultural neighbourhood
Sponsors & toursSponsors & toursArtists & podcasts who fitCultural neighbourhood · Ranking · Ranking
AudiencesAudiencesWho they areCultural 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
BadgeMeaningWeight
MeasuredReturned by Qloo as is: a popularity, a pair similarity, a demographic index.m = 1
DerivedExact arithmetic in code over measured values: a within-call percentile, a tilt, a lift.m = 1
EstimatedA fit or a model: a Theil–Sen residual, a robust z-score, a neighbourhood rollup.m = 0.6
HistoricalFrom Qloo's historical trending window, and always shown with that window.m = freshness F
Not measuredNo 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.

  1. V1Ids existEvery metric, evidence, dataset and prior the draft cites exists in this run.Rejects
  2. V2Tokens resolveEvery number token and evidence token resolves to the run's ledger.Rejects
  3. 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
  4. 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
  5. V5Citations chainEach argument cites a metric, each recommendation an argument, and each verdict on a prior a metric.Rejects
  6. V6One scale per claimNo claim compares two raw affinity scores from different Qloo calls.Rejects
  7. V7Enough evidenceWith fewer than 3 evidence bundles that came back ok, or with Qloo off, the signal becomes insufficient evidence.Forced by code
  8. V8History names its windowA historical metric appears with its trending window in the same argument.Added by code
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
Start100
A name was dropped or could not be matched−15 each
A step fell back to a simpler method (such as a point instead of an area outline)−10 each
Some area lift rests on a coarse heatmap grid−10 once
Momentum comes from a historical window only−20 once
A data call returned fewer than five rows−10 each
Very low-popularity results were dropped−5 each
The answer was accepted with a checker warning−5 each
Too little evidence to read a signal−60 once
The question was read as the nearest job, so part of it is not covered−5 each

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 mediumat most 70
The signal is weak, so confidence is lowat most 45
The headline rests on a small sample, so confidence stays at most mediumat most 70
The concept is not in the data; only its broader category was readat most 60

BandsHigh 75–100Medium 50–74Low 0–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.
  • Reads are cached 30 days and cost no Qloo call. Every figure carries the data's date and the credit "© OpenStreetMap contributors" under the Open Database License (ODbL).

Map data from OpenStreetMap, © OpenStreetMap contributors, available under the Open Database License (ODbL) 1.0, via the Overpass API.local_supply · osm.count

Formulas

Every number has one

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.

Shared primitives

Every skill

Within-call percentile (FIT)

pct.within_call
pct_i = 1 − (r_i − 1)/(n − 1); r_i = 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).
Badge
Derived

Quality gate

quality_gate
keep j ⇔ p_j ≥ 0.01

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.
Badge
None: a rule: it decides, it produces no number

Popularity (reach)

popularity
p_j ∈ [0, 1]

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

Exact-match resolution

resolve.exact_match
match(m, e) ⇔ norm(m) = norm(name_e) ∧ type_e = t_m

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

Pairwise taste similarity

subs.similarity
sim_ij = affinity(j | signal = i) = sim_ji

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.
Badge
Measured

Rank in row

subs.rank_in_row
rr_ij = 1 + #{ k ≠ i : sim_ik scored, sim_ik > sim_ij }; (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.
Badge
Derived

Hub score

subs.hub
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 ⌉)

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.
Badge
Derived

Distinctiveness

subs.distinctiveness
D_i = 1 − max_(j ≠ i) sim_ij

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.
Badge
Derived

Near-substitutes

subs.near_substitutes
r̄_ij = r̄_ji = 1 ∧ sim_ij ≥ Q_0.9({ sim_kl : 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.
Badge
Measured

Taste island

subs.taste_island
(#{ i ≠ t : t ranks last in row i })/(#{ i ≠ t : t is scored in row i }) ≥ 0.75; with 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

Share-of-Taste percentile

share.pct
pct_cj = 1 − (r_cj − 1)/(n_c − 1); r_cj = rank of j among the n_c 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.
Badge
Derived

Youth tilt

share.youth_tilt
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 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.
Badge
Derived

Metros won

share.metros_won
W_j = #{ m : r_mj = 1 }; H_j = #{ m : pct_mj ≥ 0.5 }

The number of metros where the entity ranks first in the set, together with how many metros place it in the top half (top-half in K of M).

Reads
  • Ranks and percentiles in each metro context that ranked the set
Caveats
  • Metro context is a Qloo locality taste signal, not residence, attendance or sales.
  • Only the metros queried in this run that ranked the set count.
  • Percentiles compare candidates inside one Qloo call only; never compare them across calls.
  • An entity no metro ranked has no count, never 0; one ranked in only some metros shows how many ranked it.
Badge
Derived

Pair split (who wins where)

share.pair_split
s_c = (a_(c,1))/(a_(c,1) + a_(c,2)); 1 − s_c 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

Age affinity index

dna.age_index
a_b ∈ [−1, 1]; b ∈ { ≤ 24, 25–29, 30–34, 35–44, 45–54, 55+ }

Qloo's relative affinity of each age group for the entity, from −1 (well below average) through 0 (average) to 1 (well above average).

Reads
  • Qloo demographics for the entity: six age groups
Caveats
  • Relative affinity indices from −1 to 1, not population shares.
  • Aggregated group-level taste signals; no individual-level inference.
  • An entity without a demographics block is shown as not measured.
Badge
Measured

Gender affinity index

dna.gender_index
g_s ∈ [−1, 1]; s ∈ { male, female }

Qloo's relative affinity of each gender group for the entity, on the same −1 to 1 scale as the age index.

Reads
  • Qloo demographics for the entity: two gender groups
Caveats
  • Relative affinity indices from −1 to 1, not population shares.
  • Gender is binary in the source data.
  • Aggregated group-level taste signals; no individual-level inference.
Badge
Measured

Youth index (Y)

dna.youth_index
Y = 1/2(a_(≤ 24) + a_(25–29)) − 1/2(a_(45–54) + a_(55+))

The average age index of the two youngest groups minus that of the two oldest. Positive means the entity's audience taste leans younger.

Reads
  • Age indices of the two youngest and the two oldest groups
Caveats
  • Relative affinity indices from −1 to 1, not population shares.
  • Aggregated group-level taste signals; no individual-level inference.
Badge
Derived

Distinctive tags

dna.distinctive_tags
{ τ ∈ T_t : #{ p ∈ P : τ ∈ T_p } < |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

26-week momentum

mom.delta_26w
Δpct_26w = 26 · median_(i < j) (y_j − y_i)/(t_j − t_i); y = 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.
Badge
Historical

Mann–Kendall trend test

mom.mann_kendall
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|))

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.
Badge
Historical

Momentum label

mom.label
Rising if Δ ≥ 0.02 ∧ p < 0.1; Declining if Δ ≤ −0.02 ∧ p < 0.1; otherwise 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.
Badge
Historical

Freshness

mom.freshness
F = exp(−m / 12); m = months since the trending window ended

How recent the trending window is: 1 at the end of the window, falling to about 0.37 after twelve months.

Reads
  • The end of the trending window
  • Today's date
Caveats
  • Describes the age of the data, not the strength of the trend.
Badge
Historical

Travel taste

TRVL · destination_affinityOpening scan: Real competitors · Launch & tour cities

Travel taste quadrant

trvl.quadrant
A_d = pct(affinity_d); HEARTLAND: A_d ≥ Ã, p_d ≥ p̃; HIDDEN POCKET: A_d ≥ Ã, p_d < p̃; MASS: A_d < Ã, p_d ≥ p̃; COLD otherwise

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.
Badge
Derived

Hidden-pocket score

trvl.hidden_pocket
H_d = Φ^(−1)(3/4) · (e_d − median(e))/(MAD(e)); e_d = A_d − (α + β p_d); (α, β) = 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

Cell lift

lift.cell
L_c = (u_c + 0.05)/(v_c + 0.05); for cells with u_c ≥ 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.
Badge
Derived

Neighbourhood lift

lift.area
Lift_N = exp( 1/(n_N) Σ_(c ∈ N) ln L_c ); n_N ≥ 5 gated cells

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.
Badge
Estimated

Lift confidence

lift.confidence
Conf_N = min(1, n_N / 12) · prec; prec = 1 (gh7), 0.8 (gh6), 0.5 (gh5), 0 (gh4 or coarser)

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.
Badge
Derived

White space

lift.white_space
WS_N = Demand_pct_N · (1 − Supply_pct_N)

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.
Badge
Estimated

Where it is already popular

lift.area_popularity
raw_N = 1/(n_N) Σ_(c ∈ N) u_c; rawPct_N = percentile of raw_N 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

Block rank delta

block.rank_delta
Δ_t = rank_city(t) − rank_area(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.
Badge
Derived

NEW tag

block.new_tag
t is NEW ⇔ t ∉ Top50_city ∧ t ∈ Top20_area

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.
  • Commercial concept fit only.
Badge
Derived

Map-city panel rank (city fingerprint)

block.panel_rank
r̄(t) = 1/(|P|) Σ_(c ∈ P) rank_c(t); rank_panel(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.
Badge
Derived

Concept tag rank (Block DNA)

block.concept_rank
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 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

Rank shift (site vs city)

tenant.rank_shift
Δ_j = pct_(site, j) − pct_(city, j); both 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.
  • Commercial concept fit only.
Badge
Derived

Tenant fit

tenant.fit
TenantFit_j = 100 · ( 0.6 · pct_(site, j) + 0.4 · clip(Δ_j + 0.5, 0, 1) )

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.
Badge
Derived

Rank shift (between contexts)

rank.shift
Δ_j = pct_(last, j) − pct_(first, j); both 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

UNDER-THE-RADAR (cultural neighbourhood)

xdom.under_the_radar
U_n = A_n − p_n; pick = arg max_(n: A_n ≥ median(A), p_n < min(median(p), 0.85), U_n > 0) U_n

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.
Badge
Derived

Explainability edge

xdom.edge
edge(s, n) ⇔ K ≥ 2 ∧ share_(s,n) · K ≥ 1.1; K = 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

Partners in one category (brand collaboration)

xdom.partners_one_category
fires ⇔ N ≥ 5 ∧ max_c N_c / N ≥ 0.6; N = scored partners, N_c = 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.
Badge
None: a rule: it decides, it produces no number

Sponsor slate

SLATE · sponsor_slateOpening scan: Sponsor fit

Best fit per category

slate.best_fit
j_c^* = arg max_(j ∈ c) A_j; A_j = 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.
Badge
Derived

UNDER-THE-RADAR fit (sponsor)

slate.under_the_radar
UTR_j ⇔ A_j ≥ median(A) ∧ p_j < min(median(p), 0.85)

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.
Badge
Derived

Market alignment

slate.market_alignment
Δ_jm = pct_jm − A_j^(m); A_j^(m) = national percentile of j among S_m

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

Taste twin resemblance (Spearman rho)

twin.rho
ρ_a = Spearman(Δ_src(t), Δ_a(t))_(t ∈ U); Δ_x(t) = rank_(city(x))(t) − rank_x(t)

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.
Badge
Derived

Shared NEW tags

twin.shared_new
SharedNew_a = |{t : t NEW in the source area ∧ t NEW in a}|

Tags that both areas hold in their top 20 while their own cities' top-50 lists do not: the most distinctive taste the two areas have in common.

Reads
  • The NEW tags of the source area and of each checked area
Caveats
  • Taste signals of venue-goers, not residents or census data.
Badge
Derived

Concept check

CNPT · concept_vectorOpening scan: Test a new product

Concept anchor (s50)

cnpt.s50
s_50 = 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.
Badge
Measured

KEEP / VETO / ADD

cnpt.verdict
KEEP ⇔ A_j ≥ A_(s_50); VETO ⇔ A_j < A_(s_50); A = 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.
Badge
None: a rule: it decides, it produces no number

Analog precision

cnpt.precision
Precision = (#KEEP)/(#KEEP + #VETO)

The share of your scored analogs that the concept's taste keeps. Analogs without a score do not count either way.

Reads
  • The KEEP and VETO verdicts
Caveats
  • A share of a few analogs moves in large steps; read it with the count (k of n).
Badge
Derived

Company financials (SEC EDGAR)

FIN · company_financialsOpening scan: Real competitors · Compare two brands · Test a new product

Reported revenue

fin.revenue
R_p = 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.
Badge
Measured

Gross and operating margin

fin.margin
GM_p = (GrossProfit_p)/(R_p); OM_p = (OperatingIncomeLoss_p)/(R_p)

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.
Badge
Derived

Year-over-year revenue change

fin.yoy
YoY_p = (R_p)/(R_(p − 1 yr)) − 1

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

Area count (residents, households, workers)

econ.count
N_A = Σ_(u ∈ A) N_u; u = 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.
Badge
Derived

Area median (approximate)

econ.median
m̃_A = (Σ_(u ∈ A) P_u m_u)/(Σ_(u ∈ A) P_u); P_u = 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.
Badge
Estimated

Commute mode share

econ.share
share_(A, k) = (Σ_(u ∈ A) W_(u, k))/(Σ_(u ∈ A) W_u); W = 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

Places counted (OpenStreetMap)

osm.count
N_(A,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.
Badge
Measured

Places per square kilometre

osm.density
D_(A,t) = N_(A,t) / km_A^2

The count divided by the area's land size, so areas of different sizes compare fairly. A market's area is the circle of its 5 km radius.

Reads
  • The count
  • The area's size in km² from the gazetteer, or the circle's
Caveats
  • OpenStreetMap is mapped by volunteers: counts are a floor, not a census.
  • Neighbourhood sizes come from our gazetteer outlines and are approximate.
Badge
Derived

Against the city

osm.density_index
I_(A,t) = D_(A,t) / D_(city,t); about 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.
Badge
Derived

Street activity

osm.activity_density
S_A = (#{shops, food and drink places in A})/(km_A^2)

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.
Badge
Derived

Brand screener

The screener (/screener), in code with no model

Screened set

screen.universe
U = the first n brands of the discovery call for the category tag or the seed brand; n ≤ 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

UNDER-THE-RADAR (screener)

screen.under_the_radar
U_j = FIT_j − p_j; flag ⇔ FIT_j ≥ median(FIT) ∧ p_j < min(median(p), 0.85)

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

Category Taste Map (classical MDS)

taste_map_mds
d_ij = 1 − sim_ij; B = −1/2 J D^(2) J; X = V_2 Λ_2^(1/2); stress = √(Σ_(i<j) (d_ij − ‖ x_i − x_j ‖)^2)/(Σ_(i<j) d_ij^2)

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.
Badge
Estimated

Report level

The report assembler

Run confidence

confidence.run
C = min(max(0, 100 − 15 n_dropped − 10 n_fallback − 10 [coarse] − 20 [stale momentum cited] − 10 n_thin − 5 n_gate − 5 n_warn − 60 [insufficient] − 5 [nearest job]), min_(r fired) cap_r)

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.
Badge
None: a score about the run, not a measurement

Metric confidence

confidence.metric
conf = m_badge · (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.

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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.

  1. 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

  2. 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

  3. 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

  4. 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

  5. Eligibility decisionsRefused

    Deciding who gets housing, credit, employment or insurance.

    Offered instead: Who a brand's audience is, for a commercial offer

  6. 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

  7. 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

  8. 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.
OpenStreetMap
Place counts come from OpenStreetMap through the public Overpass API, © OpenStreetMap contributors, under the Open Database License (ODbL) 1.0. Every count names its data date and the credit, and is labelled a floor: volunteers map it, so places can be missing.
Your answers
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 questionHaiku 5.5
Analyst: plans and writesSonnet 5.5
Economy analyst: once today's budget runs lowHaiku 5.5
Quant: computes every numberCode, not a model
Checker: reviews the draftCode, 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 typeHeatmap signalVenue filter
RestaurantVerified G6Not verified: no venue sample is drawn, so the competitor count is unknown
Cafe and coffee shopVerified P5Verified G10
BarVerified P5Not verified: no venue sample is drawn, so the competitor count is unknown
LoungeVerified C1Verified C1
Wine barVerified C1Verified C1
Record storeVerified C1Verified C1
Ramen restaurantVerified C1Verified C1
Live music venueVerified C1Verified C1
BakeryVerified C1Verified C1
Brewery and taproomVerified C1Verified C1
BookstoreVerified C1Verified C1b
Clothing boutiqueVerified C1Verified C1
GymVerified C1Verified C1
Beauty salonVerified C1Verified C1
PizzeriaVerified C1Verified C1b
Fitness studioVerified C1Verified C1
Burger restaurantVerified C1Verified C1
Sushi restaurantVerified C1Verified C1

Sponsor categories (sponsor_slate)

Each sponsor category's verified brand filter, or its fallback
BeerBrand filter: verified P5
SpiritsBrand filter: verified C2
RTD and hard seltzerBrand filter: verified C2
Outdoor and sporting retailFallback: found by semantic tag search at run time, labelled in the note
Apparel and footwearBrand filter: verified C2
Quick-service restaurantsBrand filter: verified C2
Energy drinksBrand filter: verified P5
AutoBrand filter: verified C2
TelecomBrand filter: verified C2
FintechBrand filter: verified C2
Beauty and personal careBrand filter: verified C2
GamingBrand filter: verified C2
TravelBrand filter: verified C2
Food deliveryBrand filter: verified C2
Consumer techBrand 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
FeatureQloo, coldQloo, warmModel
Following: re-run per 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–252–6$0.10–0.30
Run queue per queued runWaiting for a slot costs nothing; a run that times out in the queue spends nothing.plan: no recorded use yet00$0
Brand screener per 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 yet5–90$0
Category Taste Map on a note per mapDrawn from the Substitution Map's similarity calls the note already made; no extra request.plan: no recorded use yet00$0
Category Taste Map on the screener per 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 yet2–130$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 yet8–90$0
Verdict tag per 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 yet00$0
Share card per cardDrawn from a curated note already stored (a reader's own answer gets no card); no request or model call.plan: no recorded use yet00$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
FeatureQlooModel
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 web per 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 nearby per 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
JobQloo, coldQloo, warmMeasured
Real competitors25622 + 0 · $0.27median of 1 run
Compare two brands20527 + 1 · $0.17median of 1 run
Where to open726 + 3 · $0.19median of 4 runs
Read a neighbourhood622 + 6 · $0.12median of 1 run
Best tenant for a space623 + 6 · $0.13median of 2 runs
Sponsor fit15–25421 + 2 · $0.11median of 1 run
Launch & tour cities17412 + 0 · $0.13median of 1 run
Who they are6—19 + 0 · $0.17median of 1 run
Find an area's twin1248 + 9 · $0.15median of 1 run
Brand collaborations1038 + 3 · $0.13median of 1 run
Artists & podcasts who fit1036 + 1 · $0.09median of 1 run
Test a new product15416 + 0 · $0.15median of 1 run
Compare cities12318 + 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