{"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] How has interest in hockey grown over time?"}, {"role": "assistant", "content": "{\"query\": \"How has interest in hockey grown over time?\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"trending\", \"method\": \"GET\", \"params\": {\"country\": \"united-states\", \"geography\": \"north-america\", \"passion_point[]\": \"31000356\"}, \"endpoint\": \"/v1/reports/trending\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] how do NFL fans break down by demographics"}, {"role": "assistant", "content": "{\"query\": \"how do NFL fans break down by demographics\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"top_segments\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000008\", \"pulse_category[]\": \"2\"}, \"endpoint\": \"/v1/reports/top-segments\", \"resolve_entity\": \"NFL\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] what are nhl fans into"}, {"role": "assistant", "content": "{\"query\": \"what are nhl fans into\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"top_segments\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000007\", \"pulse_category[]\": \"1\"}, \"endpoint\": \"/v1/reports/top-segments\", \"resolve_entity\": \"NHL\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-dual] what about the UFC?"}, {"role": "assistant", "content": "{\"query\": \"what about the UFC?\", \"route\": \"pulse-dual\", \"calls\": [{\"id\": \"discovery\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {}, \"endpoint\": \"/v1/filters/all-time/searchable-properties\"}, {\"id\": \"snapshot_wwe\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000012\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"WWE\"}, {\"id\": \"snapshot_ufc\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000018\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"UFC\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] which generations watch Stream TV Shows Online most?"}, {"role": "assistant", "content": "{\"query\": \"which generations watch Stream TV Shows Online most?\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"analyze\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"sort_by\": \"engaged\", \"geography\": \"north-america\", \"passion_point\": \"21000130\", \"sort_direction\": \"DESC\", \"pulse_category[]\": \"5\"}, \"endpoint\": \"/v1/reports/analyze\", \"depends_on\": \"discovery\", \"resolve_entity\": \"Stream TV Shows Online\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] How does the World Cup perform on fan passion?"}, {"role": "assistant", "content": "{\"query\": \"How does the World Cup perform on fan passion?\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000021\"}, \"endpoint\": \"/v1/reports/snapshot\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] Compare sports vs music passion"}, {"role": "assistant", "content": "{\"query\": \"Compare sports vs music passion\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"comparison\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"geography\": \"north-america\", \"passion_point[]\": [\"31000179\", \"31000234\"], \"pulse_category[]\": \"all\"}, \"endpoint\": \"/v1/reports/passion-point-comparison\", \"depends_on\": \"discovery\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] What percentage of women engage with the NHL?"}, {"role": "assistant", "content": "{\"query\": \"What percentage of women engage with the NHL?\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"pulse\": \"female--demographic\", \"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000007\"}, \"endpoint\": \"/v1/reports/snapshot\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] How big is gardening as a passion in North America?"}, {"role": "assistant", "content": "{\"query\": \"How big is gardening as a passion in North America?\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"geography\": \"north-america\", \"passion_point\": \"31000404\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"gardening\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] For credit card intenders, please take info and consider 5 go to market strategies to 1. capture peoples attention 2. offer something compelling 3. integrate through social, digital, in store 4 activation priorities. Write a concise overview for analytics"}, {"role": "assistant", "content": "{\"query\": \"For credit card intenders, please take info and consider 5 go to market strategies to 1. capture peoples attention 2. offer something compelling 3. integrate through social, digital, in store 4 activation priorities. Write a concise overview for analytics\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"united-states\", \"geography\": \"north-america\", \"passion_point\": \"31000475\"}, \"endpoint\": \"/v1/reports/snapshot\", \"resolve_entity\": \"credit card\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] what is the NHL opportunity score"}, {"role": "assistant", "content": "{\"query\": \"what is the NHL opportunity score\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000007\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"NHL\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] Which sports properties rank highest in Canada?"}, {"role": "assistant", "content": "{\"query\": \"Which sports properties rank highest in Canada?\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"ranked\", \"method\": \"GET\", \"params\": {\"page\": 1, \"country\": \"canada\", \"sort_by\": \"engagement\", \"geography\": \"placeholder\", \"sort_direction\": \"DESC\", \"passion_point_category[]\": \"all\"}, \"endpoint\": \"/v1/reports/compare\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] How is Tim Hortons trending with coffee drinkers?"}, {"role": "assistant", "content": "{\"query\": \"How is Tim Hortons trending with coffee drinkers?\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"trending\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"pulse_brand\": \"Tim Hortons\", \"passion_point\": \"41000098\"}, \"endpoint\": \"/v1/reports/trending\", \"resolve_entity\": \"coffee drinkers\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] Show me NHL fan engagement by US state"}, {"role": "assistant", "content": "{\"query\": \"Show me NHL fan engagement by US state\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {\"region\": null, \"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000007\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"NHL\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] how does Coca-Cola perform as a sponsor"}, {"role": "assistant", "content": "{\"query\": \"how does Coca-Cola perform as a sponsor\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"discovery\", \"method\": \"GET\", \"params\": {}, \"endpoint\": \"/v1/filters/all-time/searchable-properties\"}, {\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"pulse_brand\": \"Coca-Cola\"}, \"endpoint\": \"/v1/reports/snapshot\", \"resolve_entity\": \"Coca-Cola\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] mental health trends in the US"}, {"role": "assistant", "content": "{\"query\": \"mental health trends in the US\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"trending\", \"method\": \"GET\", \"params\": {\"country\": \"united-states\", \"geography\": \"north-america\", \"passion_point[]\": \"41000287\"}, \"endpoint\": \"/v1/reports/trending\", \"depends_on\": \"discovery\", \"resolve_entity\": \"mental health\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] How has interest in soccer grown over time?"}, {"role": "assistant", "content": "{\"query\": \"How has interest in soccer grown over time?\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"trending\", \"method\": \"GET\", \"params\": {\"country\": \"united-states\", \"geography\": \"north-america\", \"passion_point[]\": \"31000359\"}, \"endpoint\": \"/v1/reports/trending\", \"depends_on\": \"discovery\", \"resolve_entity\": \"soccer\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] tell me about formula 1 in the united kingdom"}, {"role": "assistant", "content": "{\"query\": \"tell me about formula 1 in the united kingdom\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"united_kingdom\", \"geography\": \"placeholder\", \"passion_point\": \"20000024\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"Formula 1\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] How has NHL fan passion trended over time?"}, {"role": "assistant", "content": "{\"query\": \"How has NHL fan passion trended over time?\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"trending\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point[]\": \"20000007\"}, \"endpoint\": \"/v1/reports/trending\", \"depends_on\": \"discovery\", \"resolve_entity\": \"NHL\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] list the hockey leagues you cover"}, {"role": "assistant", "content": "{\"query\": \"list the hockey leagues you cover\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"discovery\", \"method\": \"GET\", \"params\": {}, \"endpoint\": \"/v1/filters/all-time/searchable-properties\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] What are the top passion points in Ontario?"}, {"role": "assistant", "content": "{\"query\": \"What are the top passion points in Ontario?\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"ranked\", \"method\": \"GET\", \"params\": {\"page\": 1, \"region\": \"ontario\", \"country\": \"canada\", \"sort_by\": \"engaged\", \"geography\": \"north-america\", \"sort_direction\": \"DESC\", \"passion_point_category[]\": \"all\"}, \"endpoint\": \"/v1/reports/compare\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] How engaged are NHL fans in Canada?"}, {"role": "assistant", "content": "{\"query\": \"How engaged are NHL fans in Canada?\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"geography\": \"placeholder\", \"passion_point\": \"20000007\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"NHL\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] How engaged are fans with the all star game?"}, {"role": "assistant", "content": "{\"query\": \"How engaged are fans with the all star game?\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000225\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"all star game\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-dual] NFL vs NBA on opportunity score"}, {"role": "assistant", "content": "{\"query\": \"NFL vs NBA on opportunity score\", \"route\": \"pulse-dual\", \"calls\": [{\"id\": \"snapshot_nfl\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000008\"}, \"endpoint\": \"/v1/reports/snapshot\", \"resolve_entity\": \"NFL\"}, {\"id\": \"snapshot_nba\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000010\"}, \"endpoint\": \"/v1/reports/snapshot\", \"resolve_entity\": \"NBA\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] Give me 5 sponsorship ideas for esports"}, {"role": "assistant", "content": "{\"query\": \"Give me 5 sponsorship ideas for esports\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000368\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"esports\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] What would resonate with men ages 35-55 who are busy and health conscious when marketing a supplement?"}, {"role": "assistant", "content": "{\"query\": \"What would resonate with men ages 35-55 who are busy and health conscious when marketing a supplement?\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"discovery\", \"method\": \"GET\", \"params\": {\"country\": \"united-states\", \"geography\": \"north-america\"}, \"endpoint\": \"/v1/filters/all-time/geographic-availabilities\"}, {\"id\": \"segment_comparison\", \"method\": \"GET\", \"params\": {\"country\": \"united-states\", \"pulse[]\": [\"male_35_54\", \"male_55_64\"], \"geography\": \"north-america\", \"passion_point_category[]\": \"all\"}, \"endpoint\": \"/v1/reports/segment-comparison\", \"depends_on\": \"discovery\"}, {\"id\": \"exercise_snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"united-states\", \"geography\": \"north-america\", \"passion_point\": \"31000149\"}, \"endpoint\": \"/v1/reports/snapshot\", \"resolve_entity\": \"Exercise\"}, {\"id\": \"analyze_health_behaviors\", \"method\": \"GET\", \"params\": {\"country\": \"united-states\", \"geography\": \"north-america\", \"passion_point\": \"31000149\", \"pulse_category[]\": \"5\"}, \"endpoint\": \"/v1/reports/analyze\", \"resolve_entity\": \"Exercise\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-dual] Compare the NFL vs the NBA on fan passion in the US."}, {"role": "assistant", "content": "{\"query\": \"Compare the NFL vs the NBA on fan passion in the US.\", \"route\": \"pulse-dual\", \"calls\": [{\"id\": \"discovery\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {}, \"endpoint\": \"/v1/filters/all-time/searchable-properties\"}, {\"id\": \"snapshot_a\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000008\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"NFL\"}, {\"id\": \"snapshot_b\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000010\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"NBA\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] What is the NHL engagement rate in the US?"}, {"role": "assistant", "content": "{\"query\": \"What is the NHL engagement rate in the US?\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000007\"}, \"endpoint\": \"/v1/reports/snapshot\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] how engaged are NHL fans in canada"}, {"role": "assistant", "content": "{\"query\": \"how engaged are NHL fans in canada\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"geography\": \"placeholder\", \"passion_point\": \"20000007\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"NHL\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] compare passions of under $50k households vs $200k+ households in canada"}, {"role": "assistant", "content": "{\"query\": \"compare passions of under $50k households vs $200k+ households in canada\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"segment_comparison\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"pulse[]\": [\"under_$50k\", \"$200k+\"], \"geography\": \"north-america\", \"passion_point_category[]\": \"all\"}, \"endpoint\": \"/v1/reports/segment-comparison\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] how does the NHL perform in canada"}, {"role": "assistant", "content": "{\"query\": \"how does the NHL perform in canada\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"geography\": \"placeholder\", \"passion_point\": \"20000007\"}, \"endpoint\": \"/v1/reports/snapshot\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] NHL fans who also engage with streaming in canada"}, {"role": "assistant", "content": "{\"query\": \"NHL fans who also engage with streaming in canada\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"geography\": \"placeholder\", \"pulse_brand\": \"Stream TV Shows Online\", \"passion_point\": \"20000007\"}, \"endpoint\": \"/v1/reports/snapshot\", \"resolve_entity\": \"NHL\"}, {\"id\": \"top_segments\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"geography\": \"placeholder\", \"passion_point\": \"20000007\", \"pulse_category[]\": \"1\"}, \"endpoint\": \"/v1/reports/top-segments\", \"resolve_entity\": \"NHL\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] top sports in the US"}, {"role": "assistant", "content": "{\"query\": \"top sports in the US\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"ranked\", \"method\": \"GET\", \"params\": {\"page\": 1, \"country\": \"united_states\", \"sort_by\": \"engagement\", \"geography\": \"placeholder\", \"sort_direction\": \"DESC\", \"passion_point_category[]\": \"all\"}, \"endpoint\": \"/v1/reports/compare\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] how does coffee perform in canada"}, {"role": "assistant", "content": "{\"query\": \"how does coffee perform in canada\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"geography\": \"north-america\", \"passion_point\": \"41000098\"}, \"endpoint\": \"/v1/reports/snapshot\", \"resolve_entity\": \"coffee\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] NHL snapshot canada"}, {"role": "assistant", "content": "{\"query\": \"NHL snapshot canada\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"geography\": \"placeholder\", \"passion_point\": \"20000007\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"NHL\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] Give me 10 activation ideas for the Super Bowl."}, {"role": "assistant", "content": "{\"query\": \"Give me 10 activation ideas for the Super Bowl.\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"40000081\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"Super Bowl\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] what are people most into in canada vs united states"}, {"role": "assistant", "content": "{\"query\": \"what are people most into in canada vs united states\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"ranked_canada\", \"method\": \"GET\", \"params\": {\"page\": 1, \"country\": \"canada\", \"sort_by\": \"engaged\", \"geography\": \"north-america\", \"sort_direction\": \"DESC\", \"passion_point_category[]\": \"all\"}, \"endpoint\": \"/v1/reports/compare\"}, {\"id\": \"ranked_us\", \"method\": \"GET\", \"params\": {\"page\": 1, \"country\": \"united-states\", \"sort_by\": \"engaged\", \"geography\": \"north-america\", \"sort_direction\": \"DESC\", \"passion_point_category[]\": \"all\"}, \"endpoint\": \"/v1/reports/compare\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] How big is gaming as a passion across North America?"}, {"role": "assistant", "content": "{\"query\": \"How big is gaming as a passion across North America?\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"geography\": \"north-america\", \"passion_point\": \"31000353\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"gaming\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] What are the top consumer passions in the US?"}, {"role": "assistant", "content": "{\"query\": \"What are the top consumer passions in the US?\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"ranked\", \"method\": \"GET\", \"params\": {\"page\": 1, \"country\": \"united-states\", \"sort_by\": \"engaged\", \"geography\": \"north-america\", \"sort_direction\": \"DESC\", \"passion_point_category[]\": \"all\"}, \"endpoint\": \"/v1/reports/compare\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] what are the top sports and recreation activities people do"}, {"role": "assistant", "content": "{\"query\": \"what are the top sports and recreation activities people do\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"ranked\", \"method\": \"GET\", \"params\": {\"page\": 1, \"country\": \"united-states\", \"sort_by\": \"engaged\", \"geography\": \"north-america\", \"sort_direction\": \"DESC\", \"passion_point_category[]\": \"all\"}, \"endpoint\": \"/v1/reports/compare\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] NHL fan engagement"}, {"role": "assistant", "content": "{\"query\": \"NHL fan engagement\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000007\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"NHL\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] top purchase drivers in ontario"}, {"role": "assistant", "content": "{\"query\": \"top purchase drivers in ontario\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"ranked\", \"method\": \"GET\", \"params\": {\"page\": 1, \"region\": \"ontario\", \"country\": \"canada\", \"sort_by\": \"engaged\", \"geography\": \"north-america\", \"sort_direction\": \"DESC\", \"passion_point_category[]\": \"all\"}, \"endpoint\": \"/v1/reports/compare\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] give me 5 go-to-market strategies for Search for a new credit card in Canada: 1. capture attention, 2. compel learning, 3. social/digital/in-store integration ideas, 4. activation priorities. Write a concise overview for analytics."}, {"role": "assistant", "content": "{\"query\": \"give me 5 go-to-market strategies for Search for a new credit card in Canada: 1. capture attention, 2. compel learning, 3. social/digital/in-store integration ideas, 4. activation priorities. Write a concise overview for analytics.\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"geography\": \"north-america\", \"passion_point\": \"31000475\"}, \"endpoint\": \"/v1/reports/snapshot\", \"resolve_entity\": \"Search for a new credit card\"}, {\"id\": \"analyze\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"sort_by\": \"engaged\", \"geography\": \"north-america\", \"passion_point\": \"31000475\", \"sort_direction\": \"DESC\", \"pulse_code_category[]\": \"1\"}, \"endpoint\": \"/v1/reports/analyze\", \"resolve_entity\": \"Search for a new credit card\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] How engaged are NHL fans?"}, {"role": "assistant", "content": "{\"query\": \"How engaged are NHL fans?\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000007\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"NHL\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] top sustainability behaviours in canada"}, {"role": "assistant", "content": "{\"query\": \"top sustainability behaviours in canada\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"ranked\", \"method\": \"GET\", \"params\": {\"page\": 1, \"country\": \"canada\", \"sort_by\": \"engaged\", \"geography\": \"north-america\", \"sort_direction\": \"DESC\", \"passion_point_sub_category[]\": \"26\"}, \"endpoint\": \"/v1/reports/compare\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] How does the NWSL perform on fan passion in the US?"}, {"role": "assistant", "content": "{\"query\": \"How does the NWSL perform on fan passion in the US?\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000344\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"NWSL\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] Compare the NFL, NHL, NBA, and MLB"}, {"role": "assistant", "content": "{\"query\": \"Compare the NFL, NHL, NBA, and MLB\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"compare_sports\", \"method\": \"GET\", \"params\": {\"page\": 1, \"country\": \"united_states\", \"sort_by\": \"engagement\", \"geography\": \"placeholder\", \"sort_direction\": \"DESC\", \"passion_point[]\": [\"20000008\", \"20000007\", \"20000010\", \"20000009\"]}, \"endpoint\": \"/v1/reports/compare\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] how do Tim Hortons resonate with hockey fans in canada"}, {"role": "assistant", "content": "{\"query\": \"how do Tim Hortons resonate with hockey fans in canada\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"geography\": \"placeholder\", \"pulse_brand\": \"Tim Hortons\", \"passion_point\": \"20000007\"}, \"endpoint\": \"/v1/reports/snapshot\", \"resolve_entity\": \"hockey\"}, {\"id\": \"top_segments\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"geography\": \"placeholder\", \"passion_point\": \"20000007\", \"pulse_category[]\": \"1\"}, \"endpoint\": \"/v1/reports/top-segments\", \"resolve_entity\": \"hockey\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] How engaged are NFL fans?"}, {"role": "assistant", "content": "{\"query\": \"How engaged are NFL fans?\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000008\"}, \"endpoint\": \"/v1/reports/snapshot\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] How engaged are people who play hockey?"}, {"role": "assistant", "content": "{\"query\": \"How engaged are people who play hockey?\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"united-states\", \"geography\": \"north-america\", \"passion_point\": \"31000356\"}, \"endpoint\": \"/v1/reports/snapshot\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] Which brands do NHL fans over-index on, with exact index numbers?"}, {"role": "assistant", "content": "{\"query\": \"Which brands do NHL fans over-index on, with exact index numbers?\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"top_segments\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000007\", \"pulse_category[]\": \"1\"}, \"endpoint\": \"/v1/reports/top-segments\", \"resolve_entity\": \"NHL\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] How has NHL engagement trended over time in Canada?"}, {"role": "assistant", "content": "{\"query\": \"How has NHL engagement trended over time in Canada?\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"trending\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"geography\": \"placeholder\", \"passion_point[]\": \"20000007\"}, \"endpoint\": \"/v1/reports/trending\", \"depends_on\": \"discovery\", \"resolve_entity\": \"NHL\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] top streaming activities in the US"}, {"role": "assistant", "content": "{\"query\": \"top streaming activities in the US\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"ranked\", \"method\": \"GET\", \"params\": {\"page\": 1, \"country\": \"united-states\", \"sort_by\": \"engaged\", \"geography\": \"north-america\", \"sort_direction\": \"DESC\", \"passion_point_category[]\": \"2\"}, \"endpoint\": \"/v1/reports/compare\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] How popular are cruises?"}, {"role": "assistant", "content": "{\"query\": \"How popular are cruises?\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"ranked\", \"method\": \"GET\", \"params\": {\"page\": 1, \"country\": \"united-states\", \"sort_by\": \"engaged\", \"geography\": \"north-america\", \"sort_direction\": \"DESC\", \"passion_point_sub_category[]\": \"32\"}, \"endpoint\": \"/v1/reports/compare\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-dual] Compare NHL and NBA in Canada"}, {"role": "assistant", "content": "{\"query\": \"Compare NHL and NBA in Canada\", \"route\": \"pulse-dual\", \"calls\": [{\"id\": \"discovery\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {}, \"endpoint\": \"/v1/filters/all-time/searchable-properties\"}, {\"id\": \"snapshot_a\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"geography\": \"placeholder\", \"passion_point\": \"20000007\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"NHL\"}, {\"id\": \"snapshot_b\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"geography\": \"placeholder\", \"passion_point\": \"20000010\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"NBA\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] how should a sponsor activate around golf"}, {"role": "assistant", "content": "{\"query\": \"how should a sponsor activate around golf\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000015\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"golf\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] gen z vs boomers passions in canada"}, {"role": "assistant", "content": "{\"query\": \"gen z vs boomers passions in canada\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"discovery\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"geography\": \"north-america\"}, \"endpoint\": \"/v1/filters/all-time/geographic-availabilities\"}, {\"id\": \"segment_comparison\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"pulse[]\": [\"gen_z\", \"baby_boomer\"], \"geography\": \"north-america\", \"passion_point_category[]\": \"all\"}, \"endpoint\": \"/v1/reports/segment-comparison\", \"depends_on\": \"discovery\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] How does the WNBA perform on fan passion in the US?"}, {"role": "assistant", "content": "{\"query\": \"How does the WNBA perform on fan passion in the US?\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000033\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"WNBA\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] What are the top passion points among Gen Z in Canada"}, {"role": "assistant", "content": "{\"query\": \"What are the top passion points among Gen Z in Canada\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"discovery\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"geography\": \"north-america\"}, \"endpoint\": \"/v1/filters/all-time/geographic-availabilities\"}, {\"id\": \"segment_comparison\", \"method\": \"GET\", \"params\": {\"country\": \"canada\", \"pulse[]\": [\"gen_z\", \"all_respondents\"], \"geography\": \"north-america\", \"passion_point_category[]\": \"all\"}, \"endpoint\": \"/v1/reports/segment-comparison\", \"depends_on\": \"discovery\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] Is Listen To Spotify still rising?"}, {"role": "assistant", "content": "{\"query\": \"Is Listen To Spotify still rising?\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"trending\", \"method\": \"GET\", \"params\": {\"pulse\": \"80000001--brand_short_term_yes\", \"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point[]\": \"20000007\"}, \"endpoint\": \"/v1/reports/trending\", \"resolve_entity\": \"Listen To Spotify\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] How does the Champions League perform on fan passion in the US?"}, {"role": "assistant", "content": "{\"query\": \"How does the Champions League perform on fan passion in the US?\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000074\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"Champions League\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] How does the NFL perform in the United States?"}, {"role": "assistant", "content": "{\"query\": \"How does the NFL perform in the United States?\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000008\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"NFL\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-cp] Which generations watch Stream TV Shows Online?"}, {"role": "assistant", "content": "{\"query\": \"Which generations watch Stream TV Shows Online?\", \"route\": \"pulse-cp\", \"calls\": [{\"id\": \"analyze\", \"method\": \"GET\", \"params\": {\"country\": \"united-states\", \"sort_by\": \"engaged\", \"geography\": \"north-america\", \"passion_point\": \"21000130\", \"sort_direction\": \"DESC\", \"pulse_code_category[]\": \"2\"}, \"endpoint\": \"/v1/reports/analyze\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-dual] compare NHL and NBA fan engagement"}, {"role": "assistant", "content": "{\"query\": \"compare NHL and NBA fan engagement\", \"route\": \"pulse-dual\", \"calls\": [{\"id\": \"discovery\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {}, \"endpoint\": \"/v1/filters/all-time/searchable-properties\"}, {\"id\": \"snapshot_a\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000007\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"NHL\"}, {\"id\": \"snapshot_b\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000010\"}, \"endpoint\": \"/v1/reports/snapshot\", \"depends_on\": \"discovery\", \"resolve_entity\": \"NBA\"}]}"}]} {"messages": [{"role": "system", "content": "You are the DAG-builder for Pulse Chat. The ROUTE is ALREADY chosen (given as `[ROUTE: ]` on the input line). Do NOT re-decide it. Emit exactly one JSON `QueryEnvelope` whose `route` = the given route and whose `calls` are the correct API-call DAG. Output JSON only; it is Zod-validated.\n\n# Envelope\n`{\"query\":,\"route\":,\"calls\":[Call,...],\"intended_entity\":,\"answer_mode\":\"gtm\"(opt),\"fallback_reason\":}`\n`Call={\"id\":,\"base\":\"cp\"|\"sp\"(pulse-dual ONLY),\"endpoint\":,\"method\":\"GET\"|\"POST\",\"params\":,\"depends_on\":(iff params has a $ref)}`\n`params` is ALWAYS a JSON string. Array params repeat the key with `[]`. `sort_direction` default `\"DESC\"`. `calls:[]` for refusal ONLY.\n\n# Endpoints (emit ONLY these) + required params\n- `/v1/reports/snapshot` (one entity): `passion_point`,geo\n- `/v1/reports/compare` (ranking/plural SET): `passion_point_category[]:\"all\"`,`sort_by`,`sort_direction`,`page:1`,geo\n- `/v1/reports/trending` (over-time \u22645 PPs): `passion_point[]`,geo\n- `/v1/reports/analyze` (pulse-codes for ONE PP): `passion_point`,geo,`pulse_code_category[]:\"1\"`,`sort_by`\n- `/v1/reports/top-segments` (SP-ONLY demographics): `passion_point`,`pulse_category[]`(INT 1\u20134,default`\"2\"`),`placeholder`,`country`\n- `/v1/reports/compare-geography` (SP, one PP by sub-geo): `geography`,`passion_point`\n- `/v1/reports/similar-passion-points` (SP-ONLY): `passion_point`,`placeholder`,`country`\n- `/v1/reports/passion-point-comparison` (\u22652 PPs): \u22652 `passion_point[]`,geo,`pulse_category[]:\"all\"`\n- `/v1/reports/segment-comparison` (\u22652 pulse-codes): \u22652 `pulse[]`,geo,`passion_point_category[]:\"all\"`\n- `/v1/reports/passion-points/{id}/suggested-geography` (best geos for a PP)\n- `/v1/filters/all-time/geographic-availabilities` (CP discovery / list): geo\n- `/v1/filters/all-time/searchable-properties` (SP discovery): `params:\"{}\"`\n- `/v1/filters/all-time/` \u00b7 `/v1/filters/trending/` (reference) \u00b7 `/api/vanna/v2/chat_sse` (vanna only)\nNEVER `/v1/admin/*` or anything off this list.\n\n# Slug & param rules (CP=api.categorypulse.com, SP=sp-api.categorypulse.com)\n- `geography`: CP real continent `north-america`/`europe`/`asia`/`row`; SP literal `placeholder`. Required on reports.\n- `country` multi-word: CP HYPHENS (`united-states`,`united-kingdom`); SP UNDERSCORES (`united_states`,`united_kingdom`,`south_africa`). Single-word identical (`canada`,`mexico`,`australia`). `usa`/`us`\u2192`united-states`(CP)/`united_states`(SP). Wrong-base slug silently returns empty \u2014 always match base.\n- SP `snapshot`/`trending`/`top-segments`/`similar` MUST carry BOTH `geography:\"placeholder\"` AND `country:`. CP `country` optional. `searchable-properties` geo-agnostic \u2192 `params:\"{}\"`.\n- Geo: `geography`>`country`>`region`. No city/state/DMA. NEVER `state=`. City\u2192its country only, never guess region. Canada regions `atlantic,ontario,quebec,west`. Default country if none named: `united-states`(CP)/`united_states`(SP).\n- Sort keys \u2014 CP: `engaged,passion,daily_weekly,passion_rank,potential_tam,recommendation,more_interested`. SP: `engagement,daily_weekly,momentum,passion,excitement,consideration,favorability,opportunity_score`. Never mix (CP `engaged` / SP `engagement`).\n- Substitution ($ref): CP discovery = 3 levels `$.passion_point_categories[0].sub_categories[0].passion_points[0].code`; SP `searchable-properties` = 2 levels `$.passion_point_categories[0].passion_points[0].code`. Dot ids + integer `[N]` only. pulse-dual: each leg substitutes from its OWN discovery.\n- PLURAL/SET (\"brands\",\"teams\",\"categories\") \u2192 `compare`; SINGLE entity \u2192 `snapshot`. `top-segments`/`similar` SP-only (CP 501).\n\n# Route build\nrefusal \u2192 `calls:[]`, `fallback_reason:\"no_recipe_matches\"`(off-domain/admin) or `\"ambiguous_question\"`(fictional/underspecified).\nvanna \u2192 ONE call `{\"id\":\"vanna\",\"endpoint\":\"/api/vanna/v2/chat_sse\",\"method\":\"POST\",\"params\":\"{\\\"message\\\":\\\"\\\"}\"}`, `fallback_reason:\"requires_cross_survey_logic\"`, no `intended_entity`.\nDiscovery shape: REPORT ALONE when the code is catalog-known/literal, OR pulse-sp + MAJOR LEAGUE (NFL,NHL,NBA,MLB,EPL/Premier League,MLS,F1,UFC,NCAA) \u2192 snapshot/top-segments ALONE + `intended_entity`, NEVER add `searchable-properties`, OR `compare`/`*-comparison`/any call with no `$\u2026code`. DISCOVERY\u2192REPORT (+1 call, `depends_on`+`intended_entity`): CP specific PP/activity \u2192 `geographic-availabilities`(3-level); SP INDIVIDUAL TEAM (club/franchise), arbitrary property, or brand-in-context activity \u2192 `searchable-properties`(2-level) \u2014 a team is NEVER catalog. pulse-dual \u2192 ALWAYS BOTH discoveries (base:cp `geographic-availabilities` + base:sp `searchable-properties`), each substitutes its own.\nGTM (go-to-market/engage/activate/sponsor/reach/\"N ways to engage\"): emit the SAME report calls for that entity + set `intended_entity` AND `answer_mode:\"gtm\"`; multiple entities \u2192 pick the FIRST. Brand-with-context (\"how does do among fans\"): pulse-sp, ONE `snapshot`, `intended_entity`=ACTIVITY, add `\"pulse_brand\":\"\"`, resolve the activity via `searchable-properties`.\nSet `intended_entity` (user's core head noun, keep compound names) whenever a `$\u2026code` names a specific entity OR for a major-league SP snapshot/top-segments; NOT for open-ended rankings or discovery-only.\n\n# Few-shots\n[ROUTE: pulse-cp] what's the sample size for do laundry in canada\n{\"query\":\"what's the sample size for do laundry in canada\",\"route\":\"pulse-cp\",\"intended_entity\":\"do laundry\",\"calls\":[{\"id\":\"discovery\",\"endpoint\":\"/v1/filters/all-time/geographic-availabilities\",\"method\":\"GET\",\"params\":\"{\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\"},{\"id\":\"snapshot\",\"endpoint\":\"/v1/reports/snapshot\",\"method\":\"GET\",\"params\":\"{\\\"passion_point\\\":\\\"$discovery.passion_point_categories[0].sub_categories[0].passion_points[0].code\\\",\\\"geography\\\":\\\"north-america\\\",\\\"country\\\":\\\"canada\\\"}\",\"depends_on\":\"discovery\"}]}\n"}, {"role": "user", "content": "[ROUTE: pulse-sp] Give me 10 go-to-market recommendations for the NFL."}, {"role": "assistant", "content": "{\"query\": \"Give me 10 go-to-market recommendations for the NFL.\", \"route\": \"pulse-sp\", \"calls\": [{\"id\": \"snapshot\", \"base\": \"sp\", \"method\": \"GET\", \"params\": {\"country\": \"united_states\", \"geography\": \"placeholder\", \"passion_point\": \"20000008\"}, \"endpoint\": \"/v1/reports/snapshot\", \"resolve_entity\": \"NFL\"}]}"}]}