Simpatico

How Simpatico scores

Every number is computed in code from logged Qloo responses. Models argue and write; they never set a score or a verdict. Without Qloo, Simpatico refuses to score (“Simpatico doesn’t guess. Connect Qloo.”).

  1. Resolve every name to a Qloo brand entity; ambiguous ones wait for a human.
  2. Optionally discover candidates the buyer’s audience already over-indexes on.
  3. Screen the whole universe with one rank call; keep the top k (plus pinned brands).
  4. Analyse the shortlist on six metrics (about nine Qloo calls per target).
  5. Score in code: composite F, coverage, red flags, verdict.
  6. Bull and bear agents argue from the same evidence pack; a code judge validates every citation.
  7. Write the IC memo; a number checker blocks any figure not in the ledger.
  8. Act: pipeline board, approval-gated outreach, weekly monitor with alerts.

Qloo calls

EndpointKey parametersWhat Simpatico derives
/searchquery, types=urn:entity:brandResolve buyer, proxies and candidates. Ambiguous names become confirm chips.
/v2/tagsfilter.query, filter.tag.types=urn:tag:genre:brandCategory tags for discovery.
/v2/insightsfilter.type=urn:entity:brand, signal.interests.entities=buyer, filter.tags, filter.exclude.entities, filter.popularity.max, feature.explainabilityDiscover brands the buyer audience already over-indexes on.
/v2/insightsfilter.type=urn:entity:brand, signal.interests.entities=buyer, filter.results.entities=universe, feature.explainabilityStage-1 screen: forward affinity a for every candidate (one call), plus corporate profile (parent, positioning, competitors).
/v2/insightssignal.interests.entities=target, filter.results.entities=buyer brandsReverse affinity b (m1).
/v2/insightsfilter.type=urn:tag, filter.tag.types=music/media/place genres, take=50Taste profiles (m2).
/v2/insightsfilter.type=artist|tv_show|movie|podcast, signal=buyer, take=25; then the same types with signal=target, filter.results.entities=buyer top 25Cross-domain agreement (m3).
/v2/insightsfilter.type=urn:demographics, signal.interests.entities=buyer + shortlistAge and gender over-index (m4), one call for everyone.
/v2/insightsfilter.type=urn:heatmap, filter.location.query=United StatesGeographic footprint and white space (m5).
/v2/trendingfilter.type=urn:entity:brand, signal.interests.entities=one brand, filter.start_date, filter.end_dateMomentum (m6) for the buyer brands and every target.
/v2/analysis/comparea.signal.interests.entities=buyer, b.signal.interests.entities=targetShared catalogue categories (context for the debate).

REST against the hackathon host with the X-Api-Key header. Calls are rate-limited (4/s, 4 in flight), retried on 429/5xx/network errors with jittered backoff, and never replaced by a guess. Every call writes an evidence row; responses are cached privately on the server (24 h; 6 h for trending).

The six metrics

m1 Two-way audience affinity
a = buyer audience → target affinity; b = mean target audience → buyer-brand affinity; m1 = 2ab / (a + b). The harmonic mean punishes one-sided love.
m2 Taste-profile overlap
Weighted Jaccard Σ min(w) / Σ max(w) over both top-50 cultural tag profiles. Qloo’s tag affinities cluster at 0.98–1.00, so each tag is weighted by its position (top tag 1, 50th 0.02).
m3 Cross-domain agreement
For music, TV, film and podcasts: the mean affinity of the target’s audience for the buyer audience’s top-25 titles; m3 = mean over domains. Shows the titles both audiences embrace and the ones they don’t.
m4 Demographic alignment
Cosine of the age × gender over-index vectors (already centred), mapped to [0, 1] by (cos + 1) / 2.
m5 Geographic footprint
Heatmap cells summarised into 55 US metros (popularity-weighted affinity rank), minus the cohort mean per metro, then correlated: (r + 1) / 2. White space = metros in the target’s top quartile and the buyer’s bottom half.
m6 Momentum
−log10(trending rank) per week, minus the cohort median that week; z = (mean last 4 weeks − mean prior 8) / sd(prior 8), clipped to ±3; m6 = (z + 3) / 6. A window where nothing moved is “not measured”, never neutral.

Composite, coverage and verdicts

F = 100 × Σ w·c·x / Σ w·c, where c is coverage (1 measured, 0.5 partial, 0 not measured). Unmeasured metrics drop out instead of counting as zero. If Σ w·c < 0.6, the verdict is INSUFFICIENT_COVERAGE and there is no score.

Weightsm1m2m3m4m5m6
M&A bolt-on0.300.200.150.150.100.10
Licensing / co-brand0.350.100.200.100.200.05
VC thesis0.250.150.100.100.100.30
  • ADVANCE: F ≥ 67 and no red flag.
  • WATCH: F ≥ 62, with no flag or exactly one FADING / NO_GEO_OVERLAP flag mitigated by a validated bull claim.
  • PASS: anything else.

Red flags (code rules)

  • AUDIENCE_ONE_SIDED: min(a, b) / max(a, b) < 0.4
  • TASTE_CLASH: more than 50% of the buyer’s top-20 tags missing from the target’s top 50, and m2 < 0.15
  • DEMOGRAPHIC_MISMATCH: m4 < 0.35
  • FADING: momentum z < -1.5
  • NO_GEO_OVERLAP: m5 < 0.2 (licensing only)

Editable on the settings page.

Debate and the code judge

Bull and bear get the same evidence pack (metric rows with ids such as t3-m1, the composite, the code’s flags and Qloo’s entity profile) and nothing else: no web search. Each writes up to five claims, and each claim cites numbers as evidenceId.path = value. The judge rejects a claim when the evidence id is not in this target’s ledger, the path does not resolve to a number, the value differs by more than 0.01, a strength is cited below the shortlist average (or a weakness above it), or a flag is invented. A shortlist average may be cited too, checked the same way, but only next to one of the target’s own values. Each side is given the code’s reading of every compared value (strength, weakness or average) and only the flags the code raised, so it doesn’t have to guess. Rejected claims stay visible with the reason. Validated bear claims become diligence questions.

Memo checks

Every number in a memo must match a ledger value (to the precision written, or as a percentage) or be a small rank or count. Unmatched numbers are highlighted and the memo cannot be exported. A language guard rejects causal or individual-level wording (“will buy”, “customers will”, “causes”, “probability that a person”). An LLM memo gets one repair pass; without an LLM, memos are written from the ledger template.

Actions and safety

  • Outreach is drafted for ADVANCE targets and sends only after a human approves it. The approval is bound to the recipient, subject and SHA-256 of the body; any edit voids it.
  • Sandbox mode is forced on in production: every email goes to the builder’s inbox and names the intended recipient, who is never contacted.
  • The monitor re-scores watched deals weekly (signed GitHub Actions cron) and alerts on rank moves, momentum crossings and verdict changes.
  • Only brand and cultural-entity names and ids go to Qloo: no personal data. Outreach recipients never go to Qloo.
  • Results are aggregate audience affinities, not predictions about individuals and not causal claims.

Known limitations

  • Qloo’s /v2/trending series on the hackathon dataset has not moved since mid-October 2025, and earlier history has universe-wide rank shifts. Momentum is therefore cohort-relative and reported as not measured for flat windows; the monitor’s historical replay uses 2024 history.
  • /v2/analysis/compare compares catalogue tags, not audiences, so cross-domain agreement (m3) is built from cross-rank calls instead.
  • Qloo’s graph is today’s graph: any back-test (e.g. brands PepsiCo has since bought) is look-ahead biased. It is a sanity check, not a prediction.
  • Small or new brands can have thin coverage; Simpatico reports that instead of guessing.
  • Verdict bands were set once from the pooled score distribution of the showcase screens, not tuned per scenario.
  • Geographic footprint covers 55 US metros. Not investment advice.