[{"data":1,"prerenderedAt":7855},["ShallowReactive",2],{"blog-/blog/best-slack-ai-data-analyst-tools-2026":3,"content-query-Bf6ZYOFnL6":1042,"content-query-s2NAyOCa9l":1822,"content-query-tx4dLMMeuR":2602},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"coverImage":10,"date":11,"readingTime":12,"category":13,"tags":14,"author":36,"body":40,"_type":1036,"_id":1037,"_source":1038,"_file":1039,"_stem":1040,"_extension":1041},"/blog/best-slack-ai-data-analyst-tools-2026","blog",false,"","The Best AI Data Analyst Tools for Slack in 2026","An honest 2026 guide to AI data analyst tools that live natively in Slack. Bruin, Dot, Querio, ThoughtSpot, Question Base, and Clearfeed compared, with pros, cons, and which one fits which kind of team.","/img/blog/best-slack-ai-data-analyst-tools-2026/cover.png","2026-04-07",14,"Comparison",[15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"ai data analyst","slack","slack ai","comparison","bruin","dot ai","querio","thoughtspot","question base","clearfeed","snowflake","bigquery","conversational ai","engineering","opinion","microsoft teams","whatsapp","discord","ai analytics","data warehouse","semantic layer",{"name":37,"role":38,"image":39},"Claude","Junior Copywriter","/img/blog/claude.webp",{"type":41,"children":42,"toc":1000},"root",[43,51,56,61,68,73,98,103,109,114,133,138,144,151,156,170,175,180,185,191,196,201,206,211,216,222,227,232,237,242,247,253,258,263,268,273,278,284,289,294,299,304,309,315,320,325,330,334,339,345,645,651,657,662,668,673,679,684,689,694,700,705,711,716,742,747,765,771,776,804,810,865,870,876,882,887,893,898,904,909,915,920,926,931,937,956,962,967,973,978,984,989,995],{"type":44,"tag":45,"props":46,"children":47},"element","p",{},[48],{"type":49,"value":50},"text","TL;DR: the best AI data analyst tools for Slack in 2026 are Bruin, Dot, Querio, ThoughtSpot, Question Base, and Clearfeed. Bruin is the most common pick for teams that want one tool for both the AI analyst and the data pipeline behind it. Dot and Querio are the cleanest Slack-only chat layers if your stack is already mature. ThoughtSpot is for enterprise BI replacement with a Slack bridge. Question Base and Clearfeed are good if your problem is more about answering recurring company questions than doing real warehouse analytics.",{"type":44,"tag":45,"props":52,"children":53},{},[54],{"type":49,"value":55},"If you've ever pinged the data team in Slack with \"hey, what was MRR last week?\", and watched it sit unanswered for two days, you already understand the pitch for Slack-native AI data analysts. They put answers exactly where the question was asked.",{"type":44,"tag":45,"props":57,"children":58},{},[59],{"type":49,"value":60},"In 2026, the category is mature enough that picking is no longer a coin-flip. Different tools genuinely solve different problems. Here is an honest read on which Slack-native AI analyst fits which kind of team.",{"type":44,"tag":62,"props":63,"children":65},"h2",{"id":64},"how-we-picked-these-tools",[66],{"type":49,"value":67},"How we picked these tools",{"type":44,"tag":45,"props":69,"children":70},{},[71],{"type":49,"value":72},"Six tools, not sixty. Every Slack app store search returns dozens of \"Slack AI\" results, most of them productivity assistants rather than data analysts. We kept the list to tools where:",{"type":44,"tag":74,"props":75,"children":76},"ul",{},[77,83,88,93],{"type":44,"tag":78,"props":79,"children":80},"li",{},[81],{"type":49,"value":82},"The product is purpose-built for asking data questions, not generic AI.",{"type":44,"tag":78,"props":84,"children":85},{},[86],{"type":49,"value":87},"Slack is a first-class surface, not an afterthought integration.",{"type":44,"tag":78,"props":89,"children":90},{},[91],{"type":49,"value":92},"The tool is in active production use by teams we know personally or whose case studies we've validated.",{"type":44,"tag":78,"props":94,"children":95},{},[96],{"type":49,"value":97},"Public pricing or transparent enterprise tiers are available, so you can actually evaluate them.",{"type":44,"tag":45,"props":99,"children":100},{},[101],{"type":49,"value":102},"We use Bruin ourselves, and we built Bruin, so we know our tool best. We've still tried to be honest about where each competitor wins. Tell us if we got something wrong and we'll update the piece.",{"type":44,"tag":62,"props":104,"children":106},{"id":105},"what-ai-data-analyst-for-slack-actually-means",[107],{"type":49,"value":108},"What \"AI data analyst for Slack\" actually means",{"type":44,"tag":45,"props":110,"children":111},{},[112],{"type":49,"value":113},"Three things, in order of importance:",{"type":44,"tag":115,"props":116,"children":117},"ol",{},[118,123,128],{"type":44,"tag":78,"props":119,"children":120},{},[121],{"type":49,"value":122},"It answers questions in plain English (\"what was net new MRR last week, by plan?\") and returns a chart or narrative answer in the Slack thread.",{"type":44,"tag":78,"props":124,"children":125},{},[126],{"type":49,"value":127},"It connects to your live data: the warehouse, the SaaS tools, the event stream. It runs queries against current data, not a snapshot you uploaded.",{"type":44,"tag":78,"props":129,"children":130},{},[131],{"type":49,"value":132},"Multiple people can use it from the same channel. There's a shared semantic layer or set of metric definitions, so two people asking the same question get the same answer.",{"type":44,"tag":45,"props":134,"children":135},{},[136],{"type":49,"value":137},"That third point is what separates a real AI data analyst from a glorified ChatGPT-on-CSV bolt-on. If your team can't trust the answers because everyone gets a different one, the tool is a toy.",{"type":44,"tag":62,"props":139,"children":141},{"id":140},"the-shortlist-for-slack-in-2026",[142],{"type":49,"value":143},"The shortlist for Slack in 2026",{"type":44,"tag":145,"props":146,"children":148},"h3",{"id":147},"_1-bruin",[149],{"type":49,"value":150},"1. Bruin",{"type":44,"tag":45,"props":152,"children":153},{},[154],{"type":49,"value":155},"What it is: a conversational AI data analyst that lives in Slack (plus Microsoft Teams, Discord, WhatsApp, and the browser), with a full data pipeline underneath. 200+ ingestion connectors, SQL and Python transformations, blocking quality checks, and column-level lineage.",{"type":44,"tag":45,"props":157,"children":158},{},[159,161,168],{"type":49,"value":160},"Why teams pick it for Slack: business teams ask ",{"type":44,"tag":162,"props":163,"children":165},"code",{"className":164},[],[166],{"type":49,"value":167},"@Bruin what was MRR by plan last week?",{"type":49,"value":169}," and get a chart in the thread. Sales, ops, customer success, and finance can all self-serve in the channels they already live in, without learning a new app. Engineering gets the unified pipeline so the answers stand on data they trust.",{"type":44,"tag":45,"props":171,"children":172},{},[173],{"type":49,"value":174},"Watch-outs: if you have a deeply curated Tableau or Looker deployment with hundreds of governed dashboards, you'll typically run Bruin alongside that for a quarter or two before consolidating.",{"type":44,"tag":45,"props":176,"children":177},{},[178],{"type":49,"value":179},"Pricing feel: open-source CLI core (free, MIT-licensed), affordable cloud plans, enterprise pricing that doesn't penalize broad read-only access.",{"type":44,"tag":45,"props":181,"children":182},{},[183],{"type":49,"value":184},"Best for: teams of 20 to 500 people who want Slack-native answers and don't want to maintain a separate ingestion + transformation + AI stack.",{"type":44,"tag":145,"props":186,"children":188},{"id":187},"_2-dot",[189],{"type":49,"value":190},"2. Dot",{"type":44,"tag":45,"props":192,"children":193},{},[194],{"type":49,"value":195},"What it is: a chat-first AI analyst focused on giving business teams fast answers inside Slack, Microsoft Teams, or email, layered on top of an existing data warehouse.",{"type":44,"tag":45,"props":197,"children":198},{},[199],{"type":49,"value":200},"Why teams pick it for Slack: clean Slack UX, strong \"any technical level\" positioning, decent semantic-layer support.",{"type":44,"tag":45,"props":202,"children":203},{},[204],{"type":49,"value":205},"Watch-outs: Dot is the analyst layer only. It assumes you already have ingestion (Fivetran/Airbyte), transformation (dbt), and orchestration (Airflow/Dagster) running. No WhatsApp or Discord support.",{"type":44,"tag":45,"props":207,"children":208},{},[209],{"type":49,"value":210},"Pricing feel: usage-based credits with unlimited users on paid tiers. Free tier available; Pro at $180/month, Team at $720/month, Enterprise custom.",{"type":44,"tag":45,"props":212,"children":213},{},[214],{"type":49,"value":215},"Best for: teams whose data pipeline is already mature and who only need a clean Slack chat layer on top.",{"type":44,"tag":145,"props":217,"children":219},{"id":218},"_3-querio",[220],{"type":49,"value":221},"3. Querio",{"type":44,"tag":45,"props":223,"children":224},{},[225],{"type":49,"value":226},"What it is: Slack-first AI BI bot positioned for founder-led teams who want analytics without setting up a full data team. Strong onboarding for early-stage companies.",{"type":44,"tag":45,"props":228,"children":229},{},[230],{"type":49,"value":231},"Why teams pick it for Slack: quick to set up if your warehouse is already in good shape, founder-friendly UX, active product team.",{"type":44,"tag":45,"props":233,"children":234},{},[235],{"type":49,"value":236},"Watch-outs: Slack-only. No native Microsoft Teams, Discord, or WhatsApp. No ingestion, transformation, quality, or lineage layers. Pure chat on top of your existing stack.",{"type":44,"tag":45,"props":238,"children":239},{},[240],{"type":49,"value":241},"Pricing feel: SaaS subscription, varies with usage tiers.",{"type":44,"tag":45,"props":243,"children":244},{},[245],{"type":49,"value":246},"Best for: founder-led teams already on Snowflake/BigQuery/Postgres who want a Slack chat layer and only Slack.",{"type":44,"tag":145,"props":248,"children":250},{"id":249},"_4-thoughtspot-with-slack-integration",[251],{"type":49,"value":252},"4. ThoughtSpot (with Slack integration)",{"type":44,"tag":45,"props":254,"children":255},{},[256],{"type":49,"value":257},"What it is: enterprise BI platform with AI-powered Spotter (search-driven analytics), plus a Slack bridge that lets users ping ThoughtSpot in Slack and get answers without leaving the channel.",{"type":44,"tag":45,"props":259,"children":260},{},[261],{"type":49,"value":262},"Why teams pick it for Slack: if you're already replacing Tableau or Looker with ThoughtSpot, the Slack bridge is a free distribution lift for the same investment.",{"type":44,"tag":45,"props":264,"children":265},{},[266],{"type":49,"value":267},"Watch-outs: Slack here is a thin bridge to the web app, not the primary surface. Most users still end up clicking back into the ThoughtSpot UI for follow-up questions.",{"type":44,"tag":45,"props":269,"children":270},{},[271],{"type":49,"value":272},"Pricing feel: Essentials starts at $25/user/month, Pro at $50/user/month. Enterprise custom, with five- to six-figure annual contracts at scale.",{"type":44,"tag":45,"props":274,"children":275},{},[276],{"type":49,"value":277},"Best for: mid-market and enterprise teams already on ThoughtSpot for full BI replacement.",{"type":44,"tag":145,"props":279,"children":281},{"id":280},"_5-question-base",[282],{"type":49,"value":283},"5. Question Base",{"type":44,"tag":45,"props":285,"children":286},{},[287],{"type":49,"value":288},"What it is: a Slack AI agent focused on answering recurring company questions (pricing, policy, process, brand voice) by indexing past conversations and documents. Edges into AI data analyst territory when teams use it for recurring metric questions.",{"type":44,"tag":45,"props":290,"children":291},{},[292],{"type":49,"value":293},"Why teams pick it for Slack: it solves a specific, real pain. Analysts and managers spend a lot of time re-answering the same questions. Question Base learns the answers once and serves them automatically.",{"type":44,"tag":45,"props":295,"children":296},{},[297],{"type":49,"value":298},"Watch-outs: it's not really a warehouse-native AI analyst. It's a knowledge-base-style agent that answers from indexed content. If you need genuine SQL-against-Snowflake analytics, this isn't it.",{"type":44,"tag":45,"props":300,"children":301},{},[302],{"type":49,"value":303},"Pricing feel: SaaS subscription.",{"type":44,"tag":45,"props":305,"children":306},{},[307],{"type":49,"value":308},"Best for: teams whose Slack pain is more about repetitive policy/process answers than warehouse analytics.",{"type":44,"tag":145,"props":310,"children":312},{"id":311},"_6-clearfeed",[313],{"type":49,"value":314},"6. Clearfeed",{"type":44,"tag":45,"props":316,"children":317},{},[318],{"type":49,"value":319},"What it is: Slack-first support and ops AI that handles ticket triage, customer support, and recurring internal-tool questions. Has a \"data Q&A\" mode that connects to selected data sources for limited analytics.",{"type":44,"tag":45,"props":321,"children":322},{},[323],{"type":49,"value":324},"Why teams pick it for Slack: strong for support workflows where some of the support response involves checking customer data.",{"type":44,"tag":45,"props":326,"children":327},{},[328],{"type":49,"value":329},"Watch-outs: Clearfeed is a support-and-ops platform first, an AI analyst second. If your primary need is data analytics, the analyst-first tools above will fit better.",{"type":44,"tag":45,"props":331,"children":332},{},[333],{"type":49,"value":303},{"type":44,"tag":45,"props":335,"children":336},{},[337],{"type":49,"value":338},"Best for: customer success and support teams whose Slack threads mix support questions with light data lookups.",{"type":44,"tag":62,"props":340,"children":342},{"id":341},"a-quick-comparison-table",[343],{"type":49,"value":344},"A quick comparison table",{"type":44,"tag":346,"props":347,"children":348},"table",{},[349,398],{"type":44,"tag":350,"props":351,"children":352},"thead",{},[353],{"type":44,"tag":354,"props":355,"children":356},"tr",{},[357,363,368,373,378,383,388,393],{"type":44,"tag":358,"props":359,"children":360},"th",{},[361],{"type":49,"value":362},"Tool",{"type":44,"tag":358,"props":364,"children":365},{},[366],{"type":49,"value":367},"Slack",{"type":44,"tag":358,"props":369,"children":370},{},[371],{"type":49,"value":372},"Other channels",{"type":44,"tag":358,"props":374,"children":375},{},[376],{"type":49,"value":377},"Pipeline included",{"type":44,"tag":358,"props":379,"children":380},{},[381],{"type":49,"value":382},"Open source",{"type":44,"tag":358,"props":384,"children":385},{},[386],{"type":49,"value":387},"Learning curve",{"type":44,"tag":358,"props":389,"children":390},{},[391],{"type":49,"value":392},"Best for",{"type":44,"tag":358,"props":394,"children":395},{},[396],{"type":49,"value":397},"Pricing feel",{"type":44,"tag":399,"props":400,"children":401},"tbody",{},[402,446,487,527,568,607],{"type":44,"tag":354,"props":403,"children":404},{},[405,411,416,421,426,431,436,441],{"type":44,"tag":406,"props":407,"children":408},"td",{},[409],{"type":49,"value":410},"Bruin",{"type":44,"tag":406,"props":412,"children":413},{},[414],{"type":49,"value":415},"Native",{"type":44,"tag":406,"props":417,"children":418},{},[419],{"type":49,"value":420},"Teams, Discord, WhatsApp, browser",{"type":44,"tag":406,"props":422,"children":423},{},[424],{"type":49,"value":425},"Yes (200+ connectors)",{"type":44,"tag":406,"props":427,"children":428},{},[429],{"type":49,"value":430},"Core yes",{"type":44,"tag":406,"props":432,"children":433},{},[434],{"type":49,"value":435},"Low. Chat in tools your team already uses",{"type":44,"tag":406,"props":437,"children":438},{},[439],{"type":49,"value":440},"Business + data teams",{"type":44,"tag":406,"props":442,"children":443},{},[444],{"type":49,"value":445},"Free core + cloud plans",{"type":44,"tag":354,"props":447,"children":448},{},[449,454,458,463,468,472,477,482],{"type":44,"tag":406,"props":450,"children":451},{},[452],{"type":49,"value":453},"Dot",{"type":44,"tag":406,"props":455,"children":456},{},[457],{"type":49,"value":415},{"type":44,"tag":406,"props":459,"children":460},{},[461],{"type":49,"value":462},"Teams, email",{"type":44,"tag":406,"props":464,"children":465},{},[466],{"type":49,"value":467},"No",{"type":44,"tag":406,"props":469,"children":470},{},[471],{"type":49,"value":467},{"type":44,"tag":406,"props":473,"children":474},{},[475],{"type":49,"value":476},"Low. Slack-native",{"type":44,"tag":406,"props":478,"children":479},{},[480],{"type":49,"value":481},"Slack-only chat layer",{"type":44,"tag":406,"props":483,"children":484},{},[485],{"type":49,"value":486},"Usage-based",{"type":44,"tag":354,"props":488,"children":489},{},[490,495,499,504,508,512,517,522],{"type":44,"tag":406,"props":491,"children":492},{},[493],{"type":49,"value":494},"Querio",{"type":44,"tag":406,"props":496,"children":497},{},[498],{"type":49,"value":415},{"type":44,"tag":406,"props":500,"children":501},{},[502],{"type":49,"value":503},"Browser",{"type":44,"tag":406,"props":505,"children":506},{},[507],{"type":49,"value":467},{"type":44,"tag":406,"props":509,"children":510},{},[511],{"type":49,"value":467},{"type":44,"tag":406,"props":513,"children":514},{},[515],{"type":49,"value":516},"Low. Chat-only",{"type":44,"tag":406,"props":518,"children":519},{},[520],{"type":49,"value":521},"Founder-led teams on existing stack",{"type":44,"tag":406,"props":523,"children":524},{},[525],{"type":49,"value":526},"SaaS subscription",{"type":44,"tag":354,"props":528,"children":529},{},[530,535,540,545,549,553,558,563],{"type":44,"tag":406,"props":531,"children":532},{},[533],{"type":49,"value":534},"ThoughtSpot",{"type":44,"tag":406,"props":536,"children":537},{},[538],{"type":49,"value":539},"Bridge",{"type":44,"tag":406,"props":541,"children":542},{},[543],{"type":49,"value":544},"Standalone web app",{"type":44,"tag":406,"props":546,"children":547},{},[548],{"type":49,"value":467},{"type":44,"tag":406,"props":550,"children":551},{},[552],{"type":49,"value":467},{"type":44,"tag":406,"props":554,"children":555},{},[556],{"type":49,"value":557},"Moderate",{"type":44,"tag":406,"props":559,"children":560},{},[561],{"type":49,"value":562},"Enterprise BI replacement",{"type":44,"tag":406,"props":564,"children":565},{},[566],{"type":49,"value":567},"From $25/user/mo",{"type":44,"tag":354,"props":569,"children":570},{},[571,576,580,585,589,593,598,603],{"type":44,"tag":406,"props":572,"children":573},{},[574],{"type":49,"value":575},"Question Base",{"type":44,"tag":406,"props":577,"children":578},{},[579],{"type":49,"value":415},{"type":44,"tag":406,"props":581,"children":582},{},[583],{"type":49,"value":584},"Slack-only",{"type":44,"tag":406,"props":586,"children":587},{},[588],{"type":49,"value":467},{"type":44,"tag":406,"props":590,"children":591},{},[592],{"type":49,"value":467},{"type":44,"tag":406,"props":594,"children":595},{},[596],{"type":49,"value":597},"Very low",{"type":44,"tag":406,"props":599,"children":600},{},[601],{"type":49,"value":602},"Recurring company-question answers",{"type":44,"tag":406,"props":604,"children":605},{},[606],{"type":49,"value":526},{"type":44,"tag":354,"props":608,"children":609},{},[610,615,619,623,627,631,636,641],{"type":44,"tag":406,"props":611,"children":612},{},[613],{"type":49,"value":614},"Clearfeed",{"type":44,"tag":406,"props":616,"children":617},{},[618],{"type":49,"value":415},{"type":44,"tag":406,"props":620,"children":621},{},[622],{"type":49,"value":584},{"type":44,"tag":406,"props":624,"children":625},{},[626],{"type":49,"value":467},{"type":44,"tag":406,"props":628,"children":629},{},[630],{"type":49,"value":467},{"type":44,"tag":406,"props":632,"children":633},{},[634],{"type":49,"value":635},"Low",{"type":44,"tag":406,"props":637,"children":638},{},[639],{"type":49,"value":640},"Support + ops with light analytics",{"type":44,"tag":406,"props":642,"children":643},{},[644],{"type":49,"value":526},{"type":44,"tag":62,"props":646,"children":648},{"id":647},"how-to-pick-four-questions",[649],{"type":49,"value":650},"How to pick: four questions",{"type":44,"tag":145,"props":652,"children":654},{"id":653},"_1-is-slack-the-only-channel",[655],{"type":49,"value":656},"1. Is Slack the only channel?",{"type":44,"tag":45,"props":658,"children":659},{},[660],{"type":49,"value":661},"If your team is split across Slack and Microsoft Teams, or you have field/sales teams on WhatsApp, a Slack-only tool is a permanent silo. Bruin is the only tool here with native support across Slack, Teams, Discord, and WhatsApp.",{"type":44,"tag":145,"props":663,"children":665},{"id":664},"_2-do-you-already-have-a-real-data-pipeline",[666],{"type":49,"value":667},"2. Do you already have a real data pipeline?",{"type":44,"tag":45,"props":669,"children":670},{},[671],{"type":49,"value":672},"If you're already running Fivetran, dbt, an orchestrator, and an observability tool, and they all work, adding Dot or Querio as a chat layer is the cleanest move. If you're stitching that stack together as you grow, replacing it with a unified platform like Bruin consolidates four to five vendor invoices into one.",{"type":44,"tag":145,"props":674,"children":676},{"id":675},"_3-are-the-questions-analytical-or-operational",[677],{"type":49,"value":678},"3. Are the questions analytical or operational?",{"type":44,"tag":45,"props":680,"children":681},{},[682],{"type":49,"value":683},"\"What's our MRR by plan?\" is analytical, so use Bruin, Dot, Querio, or ThoughtSpot.",{"type":44,"tag":45,"props":685,"children":686},{},[687],{"type":49,"value":688},"\"What's our refund policy for annual contracts that cancel mid-year?\" is operational/knowledge, so use Question Base or Clearfeed.",{"type":44,"tag":45,"props":690,"children":691},{},[692],{"type":49,"value":693},"A common mistake: buying a knowledge-base agent and expecting it to do warehouse analytics. The tools are different even when they both run in Slack.",{"type":44,"tag":145,"props":695,"children":697},{"id":696},"_4-what-does-the-bill-look-like-at-scale",[698],{"type":49,"value":699},"4. What does the bill look like at scale?",{"type":44,"tag":45,"props":701,"children":702},{},[703],{"type":49,"value":704},"Per-seat pricing is a perverse incentive when you want broad Slack adoption. Every viewer becomes a budget line. Bruin and Dot both use pricing models that don't penalize broad read-only access. ThoughtSpot's Slack bridge inherits its per-user model from the main app. Querio is per-team.",{"type":44,"tag":62,"props":706,"children":708},{"id":707},"what-a-good-slack-native-ai-demo-looks-like",[709],{"type":49,"value":710},"What a good Slack-native AI demo looks like",{"type":44,"tag":45,"props":712,"children":713},{},[714],{"type":49,"value":715},"When you evaluate, watch for three things demos cheat on:",{"type":44,"tag":115,"props":717,"children":718},{},[719,724,737],{"type":44,"tag":78,"props":720,"children":721},{},[722],{"type":49,"value":723},"The demo dataset is trivial. Real production data has 30+ tables, messy joins, partial keys, and conflicting metric definitions. Ask to demo against a realistic slice, or bring one of your own metrics with a real question.",{"type":44,"tag":78,"props":725,"children":726},{},[727,729,735],{"type":49,"value":728},"Only simple questions get demoed. Ask a hard one: ",{"type":44,"tag":730,"props":731,"children":732},"em",{},[733],{"type":49,"value":734},"\"NRR for customers acquired before our pricing change, excluding logos that churned within 90 days.\"",{"type":49,"value":736}," If the tool handles that gracefully in Slack, it'll handle the easy ones.",{"type":44,"tag":78,"props":738,"children":739},{},[740],{"type":49,"value":741},"No follow-ups. Conversation is where AI analysts live or die. Ask five or six follow-ups in a row and watch whether context is preserved between Slack messages.",{"type":44,"tag":45,"props":743,"children":744},{},[745],{"type":49,"value":746},"Also insist:",{"type":44,"tag":74,"props":748,"children":749},{},[750,755,760],{"type":44,"tag":78,"props":751,"children":752},{},[753],{"type":49,"value":754},"Show the SQL. Trust requires inspecting what ran. Tools that hide SQL in Slack are a red flag.",{"type":44,"tag":78,"props":756,"children":757},{},[758],{"type":49,"value":759},"Demonstrate channel-level access control. Different Slack channels should see different data. Watch the tool revoke a user's access mid-demo.",{"type":44,"tag":78,"props":761,"children":762},{},[763],{"type":49,"value":764},"Bring your own warehouse. If the only path to a \"real\" demo is a hosted sandbox, the tool isn't ready.",{"type":44,"tag":62,"props":766,"children":768},{"id":767},"where-most-teams-land",[769],{"type":49,"value":770},"Where most teams land",{"type":44,"tag":45,"props":772,"children":773},{},[774],{"type":49,"value":775},"After watching dozens of teams roll out a Slack AI data analyst, the pattern is consistent:",{"type":44,"tag":74,"props":777,"children":778},{},[779,784,789,794,799],{"type":44,"tag":78,"props":780,"children":781},{},[782],{"type":49,"value":783},"Series A to C (20 to 300 people): usually pick Bruin. Slack-native, business teams self-serve, pipeline included, open-source core lets engineering start free.",{"type":44,"tag":78,"props":785,"children":786},{},[787],{"type":49,"value":788},"Mature mid-market with an existing stack and Slack-only: Dot for Slack and Teams; Querio for Slack-only and founder-friendly UX.",{"type":44,"tag":78,"props":790,"children":791},{},[792],{"type":49,"value":793},"Enterprise replacing Tableau or Looker: ThoughtSpot with its Slack bridge.",{"type":44,"tag":78,"props":795,"children":796},{},[797],{"type":49,"value":798},"Recurring company-question fatigue (not warehouse analytics): Question Base.",{"type":44,"tag":78,"props":800,"children":801},{},[802],{"type":49,"value":803},"Customer support and ops Slack threads with light data: Clearfeed.",{"type":44,"tag":62,"props":805,"children":807},{"id":806},"getting-started-with-bruin-in-slack",[808],{"type":49,"value":809},"Getting started with Bruin in Slack",{"type":44,"tag":45,"props":811,"children":812},{},[813,815,822,824,832,834,840,842,848,849,855,857,863],{"type":49,"value":814},"If you want to see Bruin live in Slack, ",{"type":44,"tag":816,"props":817,"children":819},"a",{"href":818},"/book-a-demo",[820],{"type":49,"value":821},"book a demo",{"type":49,"value":823}," to see it against your own data, or ",{"type":44,"tag":816,"props":825,"children":829},{"href":826,"rel":827},"https://github.com/bruin-data/bruin",[828],"nofollow",[830],{"type":49,"value":831},"install the open-source CLI",{"type":49,"value":833}," free. We also keep honest head-to-head comparisons up to date for ",{"type":44,"tag":816,"props":835,"children":837},{"href":836},"/comparisons/dot-ai-vs-bruin/",[838],{"type":49,"value":839},"Dot AI vs Bruin",{"type":49,"value":841},", ",{"type":44,"tag":816,"props":843,"children":845},{"href":844},"/comparisons/querio-vs-bruin/",[846],{"type":49,"value":847},"Querio vs Bruin",{"type":49,"value":841},{"type":44,"tag":816,"props":850,"children":852},{"href":851},"/comparisons/thoughtspot-vs-bruin/",[853],{"type":49,"value":854},"ThoughtSpot vs Bruin",{"type":49,"value":856},", and ",{"type":44,"tag":816,"props":858,"children":860},{"href":859},"/comparisons/claude-vs-bruin/",[861],{"type":49,"value":862},"Claude vs Bruin",{"type":49,"value":864},".",{"type":44,"tag":45,"props":866,"children":867},{},[868],{"type":49,"value":869},"The short version: pick the tool whose distribution model matches how your team actually asks questions. In 2026, for most teams, that's Slack. If it's also Teams, WhatsApp, and Discord, that's Bruin.",{"type":44,"tag":62,"props":871,"children":873},{"id":872},"faq",[874],{"type":49,"value":875},"FAQ",{"type":44,"tag":145,"props":877,"children":879},{"id":878},"what-is-the-best-ai-data-analyst-for-slack-in-2026",[880],{"type":49,"value":881},"What is the best AI data analyst for Slack in 2026?",{"type":44,"tag":45,"props":883,"children":884},{},[885],{"type":49,"value":886},"For most teams in the 20 to 500 person range, Bruin is the best Slack-native AI data analyst. It includes the full data pipeline (so answers don't fall apart on broken data), works in Slack plus Teams, Discord, and WhatsApp natively, and prices without per-viewer penalties. Dot is a strong second if you only need Slack and Teams and already have a mature pipeline. Querio wins for founder-led teams on Slack only.",{"type":44,"tag":145,"props":888,"children":890},{"id":889},"which-ai-data-analysts-are-truly-slack-native-not-just-integrated",[891],{"type":49,"value":892},"Which AI data analysts are truly Slack-native, not just integrated?",{"type":44,"tag":45,"props":894,"children":895},{},[896],{"type":49,"value":897},"Bruin, Dot, Querio, Question Base, and Clearfeed all run primarily in Slack. ThoughtSpot has a Slack bridge but the primary experience is its web app, so you'll typically click out of Slack for follow-up questions.",{"type":44,"tag":145,"props":899,"children":901},{"id":900},"can-i-ask-snowflake-or-bigquery-questions-in-slack",[902],{"type":49,"value":903},"Can I ask Snowflake or BigQuery questions in Slack?",{"type":44,"tag":45,"props":905,"children":906},{},[907],{"type":49,"value":908},"Yes. Bruin, Dot, Querio, and ThoughtSpot all connect natively to Snowflake, BigQuery, Databricks, and Redshift. You ask a question in Slack and the tool runs SQL against your warehouse on the fly, returning a chart or narrative answer in the thread.",{"type":44,"tag":145,"props":910,"children":912},{"id":911},"how-much-does-a-slack-ai-data-analyst-cost",[913],{"type":49,"value":914},"How much does a Slack AI data analyst cost?",{"type":44,"tag":45,"props":916,"children":917},{},[918],{"type":49,"value":919},"Pricing varies widely. Bruin's open-source CLI is free; the managed cloud plans don't charge per viewer. Dot is usage-based credits with unlimited users (free tier; Pro $180/mo; Team $720/mo). Querio is a SaaS subscription. ThoughtSpot starts at $25/user/month. Question Base and Clearfeed are SaaS subscriptions in the lower three-figure range per month.",{"type":44,"tag":145,"props":921,"children":923},{"id":922},"which-slack-ai-analyst-includes-the-data-pipeline",[924],{"type":49,"value":925},"Which Slack AI analyst includes the data pipeline?",{"type":44,"tag":45,"props":927,"children":928},{},[929],{"type":49,"value":930},"Only Bruin. Every other tool on this list assumes you already have ingestion (Fivetran/Airbyte), transformation (dbt), and orchestration (Airflow) running separately. Bruin replaces that stack with one platform.",{"type":44,"tag":145,"props":932,"children":934},{"id":933},"whats-the-difference-between-bruin-and-question-base-in-slack",[935],{"type":49,"value":936},"What's the difference between Bruin and Question Base in Slack?",{"type":44,"tag":45,"props":938,"children":939},{},[940,942,947,949,954],{"type":49,"value":941},"Different problems. Bruin answers warehouse-backed analytical questions (",{"type":44,"tag":730,"props":943,"children":944},{},[945],{"type":49,"value":946},"\"what's our MRR by plan?\"",{"type":49,"value":948},"). Question Base answers recurring company-knowledge questions (",{"type":44,"tag":730,"props":950,"children":951},{},[952],{"type":49,"value":953},"\"what's our refund policy?\"",{"type":49,"value":955},"). Some teams use both.",{"type":44,"tag":145,"props":957,"children":959},{"id":958},"do-these-tools-support-slack-dms-and-channels-equally",[960],{"type":49,"value":961},"Do these tools support Slack DMs and channels equally?",{"type":44,"tag":45,"props":963,"children":964},{},[965],{"type":49,"value":966},"Most do. Bruin, Dot, and Querio all support both DMs and channels, with channel-level access control so different Slack channels see different data. Confirm this in your demo. It matters more than vendors usually highlight.",{"type":44,"tag":145,"props":968,"children":970},{"id":969},"can-a-slack-ai-data-analyst-replace-a-bi-tool-like-tableau",[971],{"type":49,"value":972},"Can a Slack AI data analyst replace a BI tool like Tableau?",{"type":44,"tag":45,"props":974,"children":975},{},[976],{"type":49,"value":977},"Partially. Slack AI analysts replace the long tail of ad-hoc questions that previously went through a BI request queue. Curated dashboards (the ones executives stare at every morning) survive. The 2026 pattern is one Slack AI analyst plus 10 well-chosen dashboards, not 10,000 half-used ones.",{"type":44,"tag":145,"props":979,"children":981},{"id":980},"whats-the-difference-between-an-ai-data-analyst-in-slack-and-just-using-chatgpt-on-uploaded-data",[982],{"type":49,"value":983},"What's the difference between an AI data analyst in Slack and just using ChatGPT on uploaded data?",{"type":44,"tag":45,"props":985,"children":986},{},[987],{"type":49,"value":988},"Three things: governance, persistence, and scope. ChatGPT on a CSV doesn't connect to your warehouse, doesn't enforce shared metric definitions, and doesn't have row-level access control. Two people asking the same question can get different answers, which at a growing company is how board meetings go sideways. A Slack AI data analyst connects to live data, enforces governance, and audits access.",{"type":44,"tag":145,"props":990,"children":992},{"id":991},"does-bruin-really-work-in-microsoft-teams-and-whatsapp-too-not-just-slack",[993],{"type":49,"value":994},"Does Bruin really work in Microsoft Teams and WhatsApp too, not just Slack?",{"type":44,"tag":45,"props":996,"children":997},{},[998],{"type":49,"value":999},"Yes. Same conversational AI analyst, four chat surfaces (Slack, Microsoft Teams, Discord, WhatsApp) plus a browser experience. Most competitors are Slack-only or Slack-plus-Teams.",{"title":7,"searchDepth":1001,"depth":1001,"links":1002},2,[1003,1004,1005,1014,1015,1021,1022,1023,1024],{"id":64,"depth":1001,"text":67},{"id":105,"depth":1001,"text":108},{"id":140,"depth":1001,"text":143,"children":1006},[1007,1009,1010,1011,1012,1013],{"id":147,"depth":1008,"text":150},3,{"id":187,"depth":1008,"text":190},{"id":218,"depth":1008,"text":221},{"id":249,"depth":1008,"text":252},{"id":280,"depth":1008,"text":283},{"id":311,"depth":1008,"text":314},{"id":341,"depth":1001,"text":344},{"id":647,"depth":1001,"text":650,"children":1016},[1017,1018,1019,1020],{"id":653,"depth":1008,"text":656},{"id":664,"depth":1008,"text":667},{"id":675,"depth":1008,"text":678},{"id":696,"depth":1008,"text":699},{"id":707,"depth":1001,"text":710},{"id":767,"depth":1001,"text":770},{"id":806,"depth":1001,"text":809},{"id":872,"depth":1001,"text":875,"children":1025},[1026,1027,1028,1029,1030,1031,1032,1033,1034,1035],{"id":878,"depth":1008,"text":881},{"id":889,"depth":1008,"text":892},{"id":900,"depth":1008,"text":903},{"id":911,"depth":1008,"text":914},{"id":922,"depth":1008,"text":925},{"id":933,"depth":1008,"text":936},{"id":958,"depth":1008,"text":961},{"id":969,"depth":1008,"text":972},{"id":980,"depth":1008,"text":983},{"id":991,"depth":1008,"text":994},"markdown","content:blog:best-slack-ai-data-analyst-tools-2026.md","content","blog/best-slack-ai-data-analyst-tools-2026.md","blog/best-slack-ai-data-analyst-tools-2026","md",{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"coverImage":10,"date":11,"readingTime":12,"category":13,"tags":1043,"author":1044,"body":1045,"_type":1036,"_id":1037,"_source":1038,"_file":1039,"_stem":1040,"_extension":1041},[15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],{"name":37,"role":38,"image":39},{"type":41,"children":1046,"toc":1788},[1047,1051,1055,1059,1063,1067,1086,1090,1094,1098,1113,1117,1121,1125,1129,1139,1143,1147,1151,1155,1159,1163,1167,1171,1175,1179,1183,1187,1191,1195,1199,1203,1207,1211,1215,1219,1223,1227,1231,1235,1239,1243,1247,1251,1255,1259,1263,1267,1271,1275,1529,1533,1537,1541,1545,1549,1553,1557,1561,1565,1569,1573,1577,1581,1601,1605,1620,1624,1628,1651,1655,1690,1694,1698,1702,1706,1710,1714,1718,1722,1726,1730,1734,1738,1742,1756,1760,1764,1768,1772,1776,1780,1784],{"type":44,"tag":45,"props":1048,"children":1049},{},[1050],{"type":49,"value":50},{"type":44,"tag":45,"props":1052,"children":1053},{},[1054],{"type":49,"value":55},{"type":44,"tag":45,"props":1056,"children":1057},{},[1058],{"type":49,"value":60},{"type":44,"tag":62,"props":1060,"children":1061},{"id":64},[1062],{"type":49,"value":67},{"type":44,"tag":45,"props":1064,"children":1065},{},[1066],{"type":49,"value":72},{"type":44,"tag":74,"props":1068,"children":1069},{},[1070,1074,1078,1082],{"type":44,"tag":78,"props":1071,"children":1072},{},[1073],{"type":49,"value":82},{"type":44,"tag":78,"props":1075,"children":1076},{},[1077],{"type":49,"value":87},{"type":44,"tag":78,"props":1079,"children":1080},{},[1081],{"type":49,"value":92},{"type":44,"tag":78,"props":1083,"children":1084},{},[1085],{"type":49,"value":97},{"type":44,"tag":45,"props":1087,"children":1088},{},[1089],{"type":49,"value":102},{"type":44,"tag":62,"props":1091,"children":1092},{"id":105},[1093],{"type":49,"value":108},{"type":44,"tag":45,"props":1095,"children":1096},{},[1097],{"type":49,"value":113},{"type":44,"tag":115,"props":1099,"children":1100},{},[1101,1105,1109],{"type":44,"tag":78,"props":1102,"children":1103},{},[1104],{"type":49,"value":122},{"type":44,"tag":78,"props":1106,"children":1107},{},[1108],{"type":49,"value":127},{"type":44,"tag":78,"props":1110,"children":1111},{},[1112],{"type":49,"value":132},{"type":44,"tag":45,"props":1114,"children":1115},{},[1116],{"type":49,"value":137},{"type":44,"tag":62,"props":1118,"children":1119},{"id":140},[1120],{"type":49,"value":143},{"type":44,"tag":145,"props":1122,"children":1123},{"id":147},[1124],{"type":49,"value":150},{"type":44,"tag":45,"props":1126,"children":1127},{},[1128],{"type":49,"value":155},{"type":44,"tag":45,"props":1130,"children":1131},{},[1132,1133,1138],{"type":49,"value":160},{"type":44,"tag":162,"props":1134,"children":1136},{"className":1135},[],[1137],{"type":49,"value":167},{"type":49,"value":169},{"type":44,"tag":45,"props":1140,"children":1141},{},[1142],{"type":49,"value":174},{"type":44,"tag":45,"props":1144,"children":1145},{},[1146],{"type":49,"value":179},{"type":44,"tag":45,"props":1148,"children":1149},{},[1150],{"type":49,"value":184},{"type":44,"tag":145,"props":1152,"children":1153},{"id":187},[1154],{"type":49,"value":190},{"type":44,"tag":45,"props":1156,"children":1157},{},[1158],{"type":49,"value":195},{"type":44,"tag":45,"props":1160,"children":1161},{},[1162],{"type":49,"value":200},{"type":44,"tag":45,"props":1164,"children":1165},{},[1166],{"type":49,"value":205},{"type":44,"tag":45,"props":1168,"children":1169},{},[1170],{"type":49,"value":210},{"type":44,"tag":45,"props":1172,"children":1173},{},[1174],{"type":49,"value":215},{"type":44,"tag":145,"props":1176,"children":1177},{"id":218},[1178],{"type":49,"value":221},{"type":44,"tag":45,"props":1180,"children":1181},{},[1182],{"type":49,"value":226},{"type":44,"tag":45,"props":1184,"children":1185},{},[1186],{"type":49,"value":231},{"type":44,"tag":45,"props":1188,"children":1189},{},[1190],{"type":49,"value":236},{"type":44,"tag":45,"props":1192,"children":1193},{},[1194],{"type":49,"value":241},{"type":44,"tag":45,"props":1196,"children":1197},{},[1198],{"type":49,"value":246},{"type":44,"tag":145,"props":1200,"children":1201},{"id":249},[1202],{"type":49,"value":252},{"type":44,"tag":45,"props":1204,"children":1205},{},[1206],{"type":49,"value":257},{"type":44,"tag":45,"props":1208,"children":1209},{},[1210],{"type":49,"value":262},{"type":44,"tag":45,"props":1212,"children":1213},{},[1214],{"type":49,"value":267},{"type":44,"tag":45,"props":1216,"children":1217},{},[1218],{"type":49,"value":272},{"type":44,"tag":45,"props":1220,"children":1221},{},[1222],{"type":49,"value":277},{"type":44,"tag":145,"props":1224,"children":1225},{"id":280},[1226],{"type":49,"value":283},{"type":44,"tag":45,"props":1228,"children":1229},{},[1230],{"type":49,"value":288},{"type":44,"tag":45,"props":1232,"children":1233},{},[1234],{"type":49,"value":293},{"type":44,"tag":45,"props":1236,"children":1237},{},[1238],{"type":49,"value":298},{"type":44,"tag":45,"props":1240,"children":1241},{},[1242],{"type":49,"value":303},{"type":44,"tag":45,"props":1244,"children":1245},{},[1246],{"type":49,"value":308},{"type":44,"tag":145,"props":1248,"children":1249},{"id":311},[1250],{"type":49,"value":314},{"type":44,"tag":45,"props":1252,"children":1253},{},[1254],{"type":49,"value":319},{"type":44,"tag":45,"props":1256,"children":1257},{},[1258],{"type":49,"value":324},{"type":44,"tag":45,"props":1260,"children":1261},{},[1262],{"type":49,"value":329},{"type":44,"tag":45,"props":1264,"children":1265},{},[1266],{"type":49,"value":303},{"type":44,"tag":45,"props":1268,"children":1269},{},[1270],{"type":49,"value":338},{"type":44,"tag":62,"props":1272,"children":1273},{"id":341},[1274],{"type":49,"value":344},{"type":44,"tag":346,"props":1276,"children":1277},{},[1278,1316],{"type":44,"tag":350,"props":1279,"children":1280},{},[1281],{"type":44,"tag":354,"props":1282,"children":1283},{},[1284,1288,1292,1296,1300,1304,1308,1312],{"type":44,"tag":358,"props":1285,"children":1286},{},[1287],{"type":49,"value":362},{"type":44,"tag":358,"props":1289,"children":1290},{},[1291],{"type":49,"value":367},{"type":44,"tag":358,"props":1293,"children":1294},{},[1295],{"type":49,"value":372},{"type":44,"tag":358,"props":1297,"children":1298},{},[1299],{"type":49,"value":377},{"type":44,"tag":358,"props":1301,"children":1302},{},[1303],{"type":49,"value":382},{"type":44,"tag":358,"props":1305,"children":1306},{},[1307],{"type":49,"value":387},{"type":44,"tag":358,"props":1309,"children":1310},{},[1311],{"type":49,"value":392},{"type":44,"tag":358,"props":1313,"children":1314},{},[1315],{"type":49,"value":397},{"type":44,"tag":399,"props":1317,"children":1318},{},[1319,1354,1389,1424,1459,1494],{"type":44,"tag":354,"props":1320,"children":1321},{},[1322,1326,1330,1334,1338,1342,1346,1350],{"type":44,"tag":406,"props":1323,"children":1324},{},[1325],{"type":49,"value":410},{"type":44,"tag":406,"props":1327,"children":1328},{},[1329],{"type":49,"value":415},{"type":44,"tag":406,"props":1331,"children":1332},{},[1333],{"type":49,"value":420},{"type":44,"tag":406,"props":1335,"children":1336},{},[1337],{"type":49,"value":425},{"type":44,"tag":406,"props":1339,"children":1340},{},[1341],{"type":49,"value":430},{"type":44,"tag":406,"props":1343,"children":1344},{},[1345],{"type":49,"value":435},{"type":44,"tag":406,"props":1347,"children":1348},{},[1349],{"type":49,"value":440},{"type":44,"tag":406,"props":1351,"children":1352},{},[1353],{"type":49,"value":445},{"type":44,"tag":354,"props":1355,"children":1356},{},[1357,1361,1365,1369,1373,1377,1381,1385],{"type":44,"tag":406,"props":1358,"children":1359},{},[1360],{"type":49,"value":453},{"type":44,"tag":406,"props":1362,"children":1363},{},[1364],{"type":49,"value":415},{"type":44,"tag":406,"props":1366,"children":1367},{},[1368],{"type":49,"value":462},{"type":44,"tag":406,"props":1370,"children":1371},{},[1372],{"type":49,"value":467},{"type":44,"tag":406,"props":1374,"children":1375},{},[1376],{"type":49,"value":467},{"type":44,"tag":406,"props":1378,"children":1379},{},[1380],{"type":49,"value":476},{"type":44,"tag":406,"props":1382,"children":1383},{},[1384],{"type":49,"value":481},{"type":44,"tag":406,"props":1386,"children":1387},{},[1388],{"type":49,"value":486},{"type":44,"tag":354,"props":1390,"children":1391},{},[1392,1396,1400,1404,1408,1412,1416,1420],{"type":44,"tag":406,"props":1393,"children":1394},{},[1395],{"type":49,"value":494},{"type":44,"tag":406,"props":1397,"children":1398},{},[1399],{"type":49,"value":415},{"type":44,"tag":406,"props":1401,"children":1402},{},[1403],{"type":49,"value":503},{"type":44,"tag":406,"props":1405,"children":1406},{},[1407],{"type":49,"value":467},{"type":44,"tag":406,"props":1409,"children":1410},{},[1411],{"type":49,"value":467},{"type":44,"tag":406,"props":1413,"children":1414},{},[1415],{"type":49,"value":516},{"type":44,"tag":406,"props":1417,"children":1418},{},[1419],{"type":49,"value":521},{"type":44,"tag":406,"props":1421,"children":1422},{},[1423],{"type":49,"value":526},{"type":44,"tag":354,"props":1425,"children":1426},{},[1427,1431,1435,1439,1443,1447,1451,1455],{"type":44,"tag":406,"props":1428,"children":1429},{},[1430],{"type":49,"value":534},{"type":44,"tag":406,"props":1432,"children":1433},{},[1434],{"type":49,"value":539},{"type":44,"tag":406,"props":1436,"children":1437},{},[1438],{"type":49,"value":544},{"type":44,"tag":406,"props":1440,"children":1441},{},[1442],{"type":49,"value":467},{"type":44,"tag":406,"props":1444,"children":1445},{},[1446],{"type":49,"value":467},{"type":44,"tag":406,"props":1448,"children":1449},{},[1450],{"type":49,"value":557},{"type":44,"tag":406,"props":1452,"children":1453},{},[1454],{"type":49,"value":562},{"type":44,"tag":406,"props":1456,"children":1457},{},[1458],{"type":49,"value":567},{"type":44,"tag":354,"props":1460,"children":1461},{},[1462,1466,1470,1474,1478,1482,1486,1490],{"type":44,"tag":406,"props":1463,"children":1464},{},[1465],{"type":49,"value":575},{"type":44,"tag":406,"props":1467,"children":1468},{},[1469],{"type":49,"value":415},{"type":44,"tag":406,"props":1471,"children":1472},{},[1473],{"type":49,"value":584},{"type":44,"tag":406,"props":1475,"children":1476},{},[1477],{"type":49,"value":467},{"type":44,"tag":406,"props":1479,"children":1480},{},[1481],{"type":49,"value":467},{"type":44,"tag":406,"props":1483,"children":1484},{},[1485],{"type":49,"value":597},{"type":44,"tag":406,"props":1487,"children":1488},{},[1489],{"type":49,"value":602},{"type":44,"tag":406,"props":1491,"children":1492},{},[1493],{"type":49,"value":526},{"type":44,"tag":354,"props":1495,"children":1496},{},[1497,1501,1505,1509,1513,1517,1521,1525],{"type":44,"tag":406,"props":1498,"children":1499},{},[1500],{"type":49,"value":614},{"type":44,"tag":406,"props":1502,"children":1503},{},[1504],{"type":49,"value":415},{"type":44,"tag":406,"props":1506,"children":1507},{},[1508],{"type":49,"value":584},{"type":44,"tag":406,"props":1510,"children":1511},{},[1512],{"type":49,"value":467},{"type":44,"tag":406,"props":1514,"children":1515},{},[1516],{"type":49,"value":467},{"type":44,"tag":406,"props":1518,"children":1519},{},[1520],{"type":49,"value":635},{"type":44,"tag":406,"props":1522,"children":1523},{},[1524],{"type":49,"value":640},{"type":44,"tag":406,"props":1526,"children":1527},{},[1528],{"type":49,"value":526},{"type":44,"tag":62,"props":1530,"children":1531},{"id":647},[1532],{"type":49,"value":650},{"type":44,"tag":145,"props":1534,"children":1535},{"id":653},[1536],{"type":49,"value":656},{"type":44,"tag":45,"props":1538,"children":1539},{},[1540],{"type":49,"value":661},{"type":44,"tag":145,"props":1542,"children":1543},{"id":664},[1544],{"type":49,"value":667},{"type":44,"tag":45,"props":1546,"children":1547},{},[1548],{"type":49,"value":672},{"type":44,"tag":145,"props":1550,"children":1551},{"id":675},[1552],{"type":49,"value":678},{"type":44,"tag":45,"props":1554,"children":1555},{},[1556],{"type":49,"value":683},{"type":44,"tag":45,"props":1558,"children":1559},{},[1560],{"type":49,"value":688},{"type":44,"tag":45,"props":1562,"children":1563},{},[1564],{"type":49,"value":693},{"type":44,"tag":145,"props":1566,"children":1567},{"id":696},[1568],{"type":49,"value":699},{"type":44,"tag":45,"props":1570,"children":1571},{},[1572],{"type":49,"value":704},{"type":44,"tag":62,"props":1574,"children":1575},{"id":707},[1576],{"type":49,"value":710},{"type":44,"tag":45,"props":1578,"children":1579},{},[1580],{"type":49,"value":715},{"type":44,"tag":115,"props":1582,"children":1583},{},[1584,1588,1597],{"type":44,"tag":78,"props":1585,"children":1586},{},[1587],{"type":49,"value":723},{"type":44,"tag":78,"props":1589,"children":1590},{},[1591,1592,1596],{"type":49,"value":728},{"type":44,"tag":730,"props":1593,"children":1594},{},[1595],{"type":49,"value":734},{"type":49,"value":736},{"type":44,"tag":78,"props":1598,"children":1599},{},[1600],{"type":49,"value":741},{"type":44,"tag":45,"props":1602,"children":1603},{},[1604],{"type":49,"value":746},{"type":44,"tag":74,"props":1606,"children":1607},{},[1608,1612,1616],{"type":44,"tag":78,"props":1609,"children":1610},{},[1611],{"type":49,"value":754},{"type":44,"tag":78,"props":1613,"children":1614},{},[1615],{"type":49,"value":759},{"type":44,"tag":78,"props":1617,"children":1618},{},[1619],{"type":49,"value":764},{"type":44,"tag":62,"props":1621,"children":1622},{"id":767},[1623],{"type":49,"value":770},{"type":44,"tag":45,"props":1625,"children":1626},{},[1627],{"type":49,"value":775},{"type":44,"tag":74,"props":1629,"children":1630},{},[1631,1635,1639,1643,1647],{"type":44,"tag":78,"props":1632,"children":1633},{},[1634],{"type":49,"value":783},{"type":44,"tag":78,"props":1636,"children":1637},{},[1638],{"type":49,"value":788},{"type":44,"tag":78,"props":1640,"children":1641},{},[1642],{"type":49,"value":793},{"type":44,"tag":78,"props":1644,"children":1645},{},[1646],{"type":49,"value":798},{"type":44,"tag":78,"props":1648,"children":1649},{},[1650],{"type":49,"value":803},{"type":44,"tag":62,"props":1652,"children":1653},{"id":806},[1654],{"type":49,"value":809},{"type":44,"tag":45,"props":1656,"children":1657},{},[1658,1659,1663,1664,1669,1670,1674,1675,1679,1680,1684,1685,1689],{"type":49,"value":814},{"type":44,"tag":816,"props":1660,"children":1661},{"href":818},[1662],{"type":49,"value":821},{"type":49,"value":823},{"type":44,"tag":816,"props":1665,"children":1667},{"href":826,"rel":1666},[828],[1668],{"type":49,"value":831},{"type":49,"value":833},{"type":44,"tag":816,"props":1671,"children":1672},{"href":836},[1673],{"type":49,"value":839},{"type":49,"value":841},{"type":44,"tag":816,"props":1676,"children":1677},{"href":844},[1678],{"type":49,"value":847},{"type":49,"value":841},{"type":44,"tag":816,"props":1681,"children":1682},{"href":851},[1683],{"type":49,"value":854},{"type":49,"value":856},{"type":44,"tag":816,"props":1686,"children":1687},{"href":859},[1688],{"type":49,"value":862},{"type":49,"value":864},{"type":44,"tag":45,"props":1691,"children":1692},{},[1693],{"type":49,"value":869},{"type":44,"tag":62,"props":1695,"children":1696},{"id":872},[1697],{"type":49,"value":875},{"type":44,"tag":145,"props":1699,"children":1700},{"id":878},[1701],{"type":49,"value":881},{"type":44,"tag":45,"props":1703,"children":1704},{},[1705],{"type":49,"value":886},{"type":44,"tag":145,"props":1707,"children":1708},{"id":889},[1709],{"type":49,"value":892},{"type":44,"tag":45,"props":1711,"children":1712},{},[1713],{"type":49,"value":897},{"type":44,"tag":145,"props":1715,"children":1716},{"id":900},[1717],{"type":49,"value":903},{"type":44,"tag":45,"props":1719,"children":1720},{},[1721],{"type":49,"value":908},{"type":44,"tag":145,"props":1723,"children":1724},{"id":911},[1725],{"type":49,"value":914},{"type":44,"tag":45,"props":1727,"children":1728},{},[1729],{"type":49,"value":919},{"type":44,"tag":145,"props":1731,"children":1732},{"id":922},[1733],{"type":49,"value":925},{"type":44,"tag":45,"props":1735,"children":1736},{},[1737],{"type":49,"value":930},{"type":44,"tag":145,"props":1739,"children":1740},{"id":933},[1741],{"type":49,"value":936},{"type":44,"tag":45,"props":1743,"children":1744},{},[1745,1746,1750,1751,1755],{"type":49,"value":941},{"type":44,"tag":730,"props":1747,"children":1748},{},[1749],{"type":49,"value":946},{"type":49,"value":948},{"type":44,"tag":730,"props":1752,"children":1753},{},[1754],{"type":49,"value":953},{"type":49,"value":955},{"type":44,"tag":145,"props":1757,"children":1758},{"id":958},[1759],{"type":49,"value":961},{"type":44,"tag":45,"props":1761,"children":1762},{},[1763],{"type":49,"value":966},{"type":44,"tag":145,"props":1765,"children":1766},{"id":969},[1767],{"type":49,"value":972},{"type":44,"tag":45,"props":1769,"children":1770},{},[1771],{"type":49,"value":977},{"type":44,"tag":145,"props":1773,"children":1774},{"id":980},[1775],{"type":49,"value":983},{"type":44,"tag":45,"props":1777,"children":1778},{},[1779],{"type":49,"value":988},{"type":44,"tag":145,"props":1781,"children":1782},{"id":991},[1783],{"type":49,"value":994},{"type":44,"tag":45,"props":1785,"children":1786},{},[1787],{"type":49,"value":999},{"title":7,"searchDepth":1001,"depth":1001,"links":1789},[1790,1791,1792,1800,1801,1807,1808,1809,1810],{"id":64,"depth":1001,"text":67},{"id":105,"depth":1001,"text":108},{"id":140,"depth":1001,"text":143,"children":1793},[1794,1795,1796,1797,1798,1799],{"id":147,"depth":1008,"text":150},{"id":187,"depth":1008,"text":190},{"id":218,"depth":1008,"text":221},{"id":249,"depth":1008,"text":252},{"id":280,"depth":1008,"text":283},{"id":311,"depth":1008,"text":314},{"id":341,"depth":1001,"text":344},{"id":647,"depth":1001,"text":650,"children":1802},[1803,1804,1805,1806],{"id":653,"depth":1008,"text":656},{"id":664,"depth":1008,"text":667},{"id":675,"depth":1008,"text":678},{"id":696,"depth":1008,"text":699},{"id":707,"depth":1001,"text":710},{"id":767,"depth":1001,"text":770},{"id":806,"depth":1001,"text":809},{"id":872,"depth":1001,"text":875,"children":1811},[1812,1813,1814,1815,1816,1817,1818,1819,1820,1821],{"id":878,"depth":1008,"text":881},{"id":889,"depth":1008,"text":892},{"id":900,"depth":1008,"text":903},{"id":911,"depth":1008,"text":914},{"id":922,"depth":1008,"text":925},{"id":933,"depth":1008,"text":936},{"id":958,"depth":1008,"text":961},{"id":969,"depth":1008,"text":972},{"id":980,"depth":1008,"text":983},{"id":991,"depth":1008,"text":994},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"coverImage":10,"date":11,"readingTime":12,"category":13,"tags":1823,"author":1824,"body":1825,"_type":1036,"_id":1037,"_source":1038,"_file":1039,"_stem":1040,"_extension":1041},[15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],{"name":37,"role":38,"image":39},{"type":41,"children":1826,"toc":2568},[1827,1831,1835,1839,1843,1847,1866,1870,1874,1878,1893,1897,1901,1905,1909,1919,1923,1927,1931,1935,1939,1943,1947,1951,1955,1959,1963,1967,1971,1975,1979,1983,1987,1991,1995,1999,2003,2007,2011,2015,2019,2023,2027,2031,2035,2039,2043,2047,2051,2055,2309,2313,2317,2321,2325,2329,2333,2337,2341,2345,2349,2353,2357,2361,2381,2385,2400,2404,2408,2431,2435,2470,2474,2478,2482,2486,2490,2494,2498,2502,2506,2510,2514,2518,2522,2536,2540,2544,2548,2552,2556,2560,2564],{"type":44,"tag":45,"props":1828,"children":1829},{},[1830],{"type":49,"value":50},{"type":44,"tag":45,"props":1832,"children":1833},{},[1834],{"type":49,"value":55},{"type":44,"tag":45,"props":1836,"children":1837},{},[1838],{"type":49,"value":60},{"type":44,"tag":62,"props":1840,"children":1841},{"id":64},[1842],{"type":49,"value":67},{"type":44,"tag":45,"props":1844,"children":1845},{},[1846],{"type":49,"value":72},{"type":44,"tag":74,"props":1848,"children":1849},{},[1850,1854,1858,1862],{"type":44,"tag":78,"props":1851,"children":1852},{},[1853],{"type":49,"value":82},{"type":44,"tag":78,"props":1855,"children":1856},{},[1857],{"type":49,"value":87},{"type":44,"tag":78,"props":1859,"children":1860},{},[1861],{"type":49,"value":92},{"type":44,"tag":78,"props":1863,"children":1864},{},[1865],{"type":49,"value":97},{"type":44,"tag":45,"props":1867,"children":1868},{},[1869],{"type":49,"value":102},{"type":44,"tag":62,"props":1871,"children":1872},{"id":105},[1873],{"type":49,"value":108},{"type":44,"tag":45,"props":1875,"children":1876},{},[1877],{"type":49,"value":113},{"type":44,"tag":115,"props":1879,"children":1880},{},[1881,1885,1889],{"type":44,"tag":78,"props":1882,"children":1883},{},[1884],{"type":49,"value":122},{"type":44,"tag":78,"props":1886,"children":1887},{},[1888],{"type":49,"value":127},{"type":44,"tag":78,"props":1890,"children":1891},{},[1892],{"type":49,"value":132},{"type":44,"tag":45,"props":1894,"children":1895},{},[1896],{"type":49,"value":137},{"type":44,"tag":62,"props":1898,"children":1899},{"id":140},[1900],{"type":49,"value":143},{"type":44,"tag":145,"props":1902,"children":1903},{"id":147},[1904],{"type":49,"value":150},{"type":44,"tag":45,"props":1906,"children":1907},{},[1908],{"type":49,"value":155},{"type":44,"tag":45,"props":1910,"children":1911},{},[1912,1913,1918],{"type":49,"value":160},{"type":44,"tag":162,"props":1914,"children":1916},{"className":1915},[],[1917],{"type":49,"value":167},{"type":49,"value":169},{"type":44,"tag":45,"props":1920,"children":1921},{},[1922],{"type":49,"value":174},{"type":44,"tag":45,"props":1924,"children":1925},{},[1926],{"type":49,"value":179},{"type":44,"tag":45,"props":1928,"children":1929},{},[1930],{"type":49,"value":184},{"type":44,"tag":145,"props":1932,"children":1933},{"id":187},[1934],{"type":49,"value":190},{"type":44,"tag":45,"props":1936,"children":1937},{},[1938],{"type":49,"value":195},{"type":44,"tag":45,"props":1940,"children":1941},{},[1942],{"type":49,"value":200},{"type":44,"tag":45,"props":1944,"children":1945},{},[1946],{"type":49,"value":205},{"type":44,"tag":45,"props":1948,"children":1949},{},[1950],{"type":49,"value":210},{"type":44,"tag":45,"props":1952,"children":1953},{},[1954],{"type":49,"value":215},{"type":44,"tag":145,"props":1956,"children":1957},{"id":218},[1958],{"type":49,"value":221},{"type":44,"tag":45,"props":1960,"children":1961},{},[1962],{"type":49,"value":226},{"type":44,"tag":45,"props":1964,"children":1965},{},[1966],{"type":49,"value":231},{"type":44,"tag":45,"props":1968,"children":1969},{},[1970],{"type":49,"value":236},{"type":44,"tag":45,"props":1972,"children":1973},{},[1974],{"type":49,"value":241},{"type":44,"tag":45,"props":1976,"children":1977},{},[1978],{"type":49,"value":246},{"type":44,"tag":145,"props":1980,"children":1981},{"id":249},[1982],{"type":49,"value":252},{"type":44,"tag":45,"props":1984,"children":1985},{},[1986],{"type":49,"value":257},{"type":44,"tag":45,"props":1988,"children":1989},{},[1990],{"type":49,"value":262},{"type":44,"tag":45,"props":1992,"children":1993},{},[1994],{"type":49,"value":267},{"type":44,"tag":45,"props":1996,"children":1997},{},[1998],{"type":49,"value":272},{"type":44,"tag":45,"props":2000,"children":2001},{},[2002],{"type":49,"value":277},{"type":44,"tag":145,"props":2004,"children":2005},{"id":280},[2006],{"type":49,"value":283},{"type":44,"tag":45,"props":2008,"children":2009},{},[2010],{"type":49,"value":288},{"type":44,"tag":45,"props":2012,"children":2013},{},[2014],{"type":49,"value":293},{"type":44,"tag":45,"props":2016,"children":2017},{},[2018],{"type":49,"value":298},{"type":44,"tag":45,"props":2020,"children":2021},{},[2022],{"type":49,"value":303},{"type":44,"tag":45,"props":2024,"children":2025},{},[2026],{"type":49,"value":308},{"type":44,"tag":145,"props":2028,"children":2029},{"id":311},[2030],{"type":49,"value":314},{"type":44,"tag":45,"props":2032,"children":2033},{},[2034],{"type":49,"value":319},{"type":44,"tag":45,"props":2036,"children":2037},{},[2038],{"type":49,"value":324},{"type":44,"tag":45,"props":2040,"children":2041},{},[2042],{"type":49,"value":329},{"type":44,"tag":45,"props":2044,"children":2045},{},[2046],{"type":49,"value":303},{"type":44,"tag":45,"props":2048,"children":2049},{},[2050],{"type":49,"value":338},{"type":44,"tag":62,"props":2052,"children":2053},{"id":341},[2054],{"type":49,"value":344},{"type":44,"tag":346,"props":2056,"children":2057},{},[2058,2096],{"type":44,"tag":350,"props":2059,"children":2060},{},[2061],{"type":44,"tag":354,"props":2062,"children":2063},{},[2064,2068,2072,2076,2080,2084,2088,2092],{"type":44,"tag":358,"props":2065,"children":2066},{},[2067],{"type":49,"value":362},{"type":44,"tag":358,"props":2069,"children":2070},{},[2071],{"type":49,"value":367},{"type":44,"tag":358,"props":2073,"children":2074},{},[2075],{"type":49,"value":372},{"type":44,"tag":358,"props":2077,"children":2078},{},[2079],{"type":49,"value":377},{"type":44,"tag":358,"props":2081,"children":2082},{},[2083],{"type":49,"value":382},{"type":44,"tag":358,"props":2085,"children":2086},{},[2087],{"type":49,"value":387},{"type":44,"tag":358,"props":2089,"children":2090},{},[2091],{"type":49,"value":392},{"type":44,"tag":358,"props":2093,"children":2094},{},[2095],{"type":49,"value":397},{"type":44,"tag":399,"props":2097,"children":2098},{},[2099,2134,2169,2204,2239,2274],{"type":44,"tag":354,"props":2100,"children":2101},{},[2102,2106,2110,2114,2118,2122,2126,2130],{"type":44,"tag":406,"props":2103,"children":2104},{},[2105],{"type":49,"value":410},{"type":44,"tag":406,"props":2107,"children":2108},{},[2109],{"type":49,"value":415},{"type":44,"tag":406,"props":2111,"children":2112},{},[2113],{"type":49,"value":420},{"type":44,"tag":406,"props":2115,"children":2116},{},[2117],{"type":49,"value":425},{"type":44,"tag":406,"props":2119,"children":2120},{},[2121],{"type":49,"value":430},{"type":44,"tag":406,"props":2123,"children":2124},{},[2125],{"type":49,"value":435},{"type":44,"tag":406,"props":2127,"children":2128},{},[2129],{"type":49,"value":440},{"type":44,"tag":406,"props":2131,"children":2132},{},[2133],{"type":49,"value":445},{"type":44,"tag":354,"props":2135,"children":2136},{},[2137,2141,2145,2149,2153,2157,2161,2165],{"type":44,"tag":406,"props":2138,"children":2139},{},[2140],{"type":49,"value":453},{"type":44,"tag":406,"props":2142,"children":2143},{},[2144],{"type":49,"value":415},{"type":44,"tag":406,"props":2146,"children":2147},{},[2148],{"type":49,"value":462},{"type":44,"tag":406,"props":2150,"children":2151},{},[2152],{"type":49,"value":467},{"type":44,"tag":406,"props":2154,"children":2155},{},[2156],{"type":49,"value":467},{"type":44,"tag":406,"props":2158,"children":2159},{},[2160],{"type":49,"value":476},{"type":44,"tag":406,"props":2162,"children":2163},{},[2164],{"type":49,"value":481},{"type":44,"tag":406,"props":2166,"children":2167},{},[2168],{"type":49,"value":486},{"type":44,"tag":354,"props":2170,"children":2171},{},[2172,2176,2180,2184,2188,2192,2196,2200],{"type":44,"tag":406,"props":2173,"children":2174},{},[2175],{"type":49,"value":494},{"type":44,"tag":406,"props":2177,"children":2178},{},[2179],{"type":49,"value":415},{"type":44,"tag":406,"props":2181,"children":2182},{},[2183],{"type":49,"value":503},{"type":44,"tag":406,"props":2185,"children":2186},{},[2187],{"type":49,"value":467},{"type":44,"tag":406,"props":2189,"children":2190},{},[2191],{"type":49,"value":467},{"type":44,"tag":406,"props":2193,"children":2194},{},[2195],{"type":49,"value":516},{"type":44,"tag":406,"props":2197,"children":2198},{},[2199],{"type":49,"value":521},{"type":44,"tag":406,"props":2201,"children":2202},{},[2203],{"type":49,"value":526},{"type":44,"tag":354,"props":2205,"children":2206},{},[2207,2211,2215,2219,2223,2227,2231,2235],{"type":44,"tag":406,"props":2208,"children":2209},{},[2210],{"type":49,"value":534},{"type":44,"tag":406,"props":2212,"children":2213},{},[2214],{"type":49,"value":539},{"type":44,"tag":406,"props":2216,"children":2217},{},[2218],{"type":49,"value":544},{"type":44,"tag":406,"props":2220,"children":2221},{},[2222],{"type":49,"value":467},{"type":44,"tag":406,"props":2224,"children":2225},{},[2226],{"type":49,"value":467},{"type":44,"tag":406,"props":2228,"children":2229},{},[2230],{"type":49,"value":557},{"type":44,"tag":406,"props":2232,"children":2233},{},[2234],{"type":49,"value":562},{"type":44,"tag":406,"props":2236,"children":2237},{},[2238],{"type":49,"value":567},{"type":44,"tag":354,"props":2240,"children":2241},{},[2242,2246,2250,2254,2258,2262,2266,2270],{"type":44,"tag":406,"props":2243,"children":2244},{},[2245],{"type":49,"value":575},{"type":44,"tag":406,"props":2247,"children":2248},{},[2249],{"type":49,"value":415},{"type":44,"tag":406,"props":2251,"children":2252},{},[2253],{"type":49,"value":584},{"type":44,"tag":406,"props":2255,"children":2256},{},[2257],{"type":49,"value":467},{"type":44,"tag":406,"props":2259,"children":2260},{},[2261],{"type":49,"value":467},{"type":44,"tag":406,"props":2263,"children":2264},{},[2265],{"type":49,"value":597},{"type":44,"tag":406,"props":2267,"children":2268},{},[2269],{"type":49,"value":602},{"type":44,"tag":406,"props":2271,"children":2272},{},[2273],{"type":49,"value":526},{"type":44,"tag":354,"props":2275,"children":2276},{},[2277,2281,2285,2289,2293,2297,2301,2305],{"type":44,"tag":406,"props":2278,"children":2279},{},[2280],{"type":49,"value":614},{"type":44,"tag":406,"props":2282,"children":2283},{},[2284],{"type":49,"value":415},{"type":44,"tag":406,"props":2286,"children":2287},{},[2288],{"type":49,"value":584},{"type":44,"tag":406,"props":2290,"children":2291},{},[2292],{"type":49,"value":467},{"type":44,"tag":406,"props":2294,"children":2295},{},[2296],{"type":49,"value":467},{"type":44,"tag":406,"props":2298,"children":2299},{},[2300],{"type":49,"value":635},{"type":44,"tag":406,"props":2302,"children":2303},{},[2304],{"type":49,"value":640},{"type":44,"tag":406,"props":2306,"children":2307},{},[2308],{"type":49,"value":526},{"type":44,"tag":62,"props":2310,"children":2311},{"id":647},[2312],{"type":49,"value":650},{"type":44,"tag":145,"props":2314,"children":2315},{"id":653},[2316],{"type":49,"value":656},{"type":44,"tag":45,"props":2318,"children":2319},{},[2320],{"type":49,"value":661},{"type":44,"tag":145,"props":2322,"children":2323},{"id":664},[2324],{"type":49,"value":667},{"type":44,"tag":45,"props":2326,"children":2327},{},[2328],{"type":49,"value":672},{"type":44,"tag":145,"props":2330,"children":2331},{"id":675},[2332],{"type":49,"value":678},{"type":44,"tag":45,"props":2334,"children":2335},{},[2336],{"type":49,"value":683},{"type":44,"tag":45,"props":2338,"children":2339},{},[2340],{"type":49,"value":688},{"type":44,"tag":45,"props":2342,"children":2343},{},[2344],{"type":49,"value":693},{"type":44,"tag":145,"props":2346,"children":2347},{"id":696},[2348],{"type":49,"value":699},{"type":44,"tag":45,"props":2350,"children":2351},{},[2352],{"type":49,"value":704},{"type":44,"tag":62,"props":2354,"children":2355},{"id":707},[2356],{"type":49,"value":710},{"type":44,"tag":45,"props":2358,"children":2359},{},[2360],{"type":49,"value":715},{"type":44,"tag":115,"props":2362,"children":2363},{},[2364,2368,2377],{"type":44,"tag":78,"props":2365,"children":2366},{},[2367],{"type":49,"value":723},{"type":44,"tag":78,"props":2369,"children":2370},{},[2371,2372,2376],{"type":49,"value":728},{"type":44,"tag":730,"props":2373,"children":2374},{},[2375],{"type":49,"value":734},{"type":49,"value":736},{"type":44,"tag":78,"props":2378,"children":2379},{},[2380],{"type":49,"value":741},{"type":44,"tag":45,"props":2382,"children":2383},{},[2384],{"type":49,"value":746},{"type":44,"tag":74,"props":2386,"children":2387},{},[2388,2392,2396],{"type":44,"tag":78,"props":2389,"children":2390},{},[2391],{"type":49,"value":754},{"type":44,"tag":78,"props":2393,"children":2394},{},[2395],{"type":49,"value":759},{"type":44,"tag":78,"props":2397,"children":2398},{},[2399],{"type":49,"value":764},{"type":44,"tag":62,"props":2401,"children":2402},{"id":767},[2403],{"type":49,"value":770},{"type":44,"tag":45,"props":2405,"children":2406},{},[2407],{"type":49,"value":775},{"type":44,"tag":74,"props":2409,"children":2410},{},[2411,2415,2419,2423,2427],{"type":44,"tag":78,"props":2412,"children":2413},{},[2414],{"type":49,"value":783},{"type":44,"tag":78,"props":2416,"children":2417},{},[2418],{"type":49,"value":788},{"type":44,"tag":78,"props":2420,"children":2421},{},[2422],{"type":49,"value":793},{"type":44,"tag":78,"props":2424,"children":2425},{},[2426],{"type":49,"value":798},{"type":44,"tag":78,"props":2428,"children":2429},{},[2430],{"type":49,"value":803},{"type":44,"tag":62,"props":2432,"children":2433},{"id":806},[2434],{"type":49,"value":809},{"type":44,"tag":45,"props":2436,"children":2437},{},[2438,2439,2443,2444,2449,2450,2454,2455,2459,2460,2464,2465,2469],{"type":49,"value":814},{"type":44,"tag":816,"props":2440,"children":2441},{"href":818},[2442],{"type":49,"value":821},{"type":49,"value":823},{"type":44,"tag":816,"props":2445,"children":2447},{"href":826,"rel":2446},[828],[2448],{"type":49,"value":831},{"type":49,"value":833},{"type":44,"tag":816,"props":2451,"children":2452},{"href":836},[2453],{"type":49,"value":839},{"type":49,"value":841},{"type":44,"tag":816,"props":2456,"children":2457},{"href":844},[2458],{"type":49,"value":847},{"type":49,"value":841},{"type":44,"tag":816,"props":2461,"children":2462},{"href":851},[2463],{"type":49,"value":854},{"type":49,"value":856},{"type":44,"tag":816,"props":2466,"children":2467},{"href":859},[2468],{"type":49,"value":862},{"type":49,"value":864},{"type":44,"tag":45,"props":2471,"children":2472},{},[2473],{"type":49,"value":869},{"type":44,"tag":62,"props":2475,"children":2476},{"id":872},[2477],{"type":49,"value":875},{"type":44,"tag":145,"props":2479,"children":2480},{"id":878},[2481],{"type":49,"value":881},{"type":44,"tag":45,"props":2483,"children":2484},{},[2485],{"type":49,"value":886},{"type":44,"tag":145,"props":2487,"children":2488},{"id":889},[2489],{"type":49,"value":892},{"type":44,"tag":45,"props":2491,"children":2492},{},[2493],{"type":49,"value":897},{"type":44,"tag":145,"props":2495,"children":2496},{"id":900},[2497],{"type":49,"value":903},{"type":44,"tag":45,"props":2499,"children":2500},{},[2501],{"type":49,"value":908},{"type":44,"tag":145,"props":2503,"children":2504},{"id":911},[2505],{"type":49,"value":914},{"type":44,"tag":45,"props":2507,"children":2508},{},[2509],{"type":49,"value":919},{"type":44,"tag":145,"props":2511,"children":2512},{"id":922},[2513],{"type":49,"value":925},{"type":44,"tag":45,"props":2515,"children":2516},{},[2517],{"type":49,"value":930},{"type":44,"tag":145,"props":2519,"children":2520},{"id":933},[2521],{"type":49,"value":936},{"type":44,"tag":45,"props":2523,"children":2524},{},[2525,2526,2530,2531,2535],{"type":49,"value":941},{"type":44,"tag":730,"props":2527,"children":2528},{},[2529],{"type":49,"value":946},{"type":49,"value":948},{"type":44,"tag":730,"props":2532,"children":2533},{},[2534],{"type":49,"value":953},{"type":49,"value":955},{"type":44,"tag":145,"props":2537,"children":2538},{"id":958},[2539],{"type":49,"value":961},{"type":44,"tag":45,"props":2541,"children":2542},{},[2543],{"type":49,"value":966},{"type":44,"tag":145,"props":2545,"children":2546},{"id":969},[2547],{"type":49,"value":972},{"type":44,"tag":45,"props":2549,"children":2550},{},[2551],{"type":49,"value":977},{"type":44,"tag":145,"props":2553,"children":2554},{"id":980},[2555],{"type":49,"value":983},{"type":44,"tag":45,"props":2557,"children":2558},{},[2559],{"type":49,"value":988},{"type":44,"tag":145,"props":2561,"children":2562},{"id":991},[2563],{"type":49,"value":994},{"type":44,"tag":45,"props":2565,"children":2566},{},[2567],{"type":49,"value":999},{"title":7,"searchDepth":1001,"depth":1001,"links":2569},[2570,2571,2572,2580,2581,2587,2588,2589,2590],{"id":64,"depth":1001,"text":67},{"id":105,"depth":1001,"text":108},{"id":140,"depth":1001,"text":143,"children":2573},[2574,2575,2576,2577,2578,2579],{"id":147,"depth":1008,"text":150},{"id":187,"depth":1008,"text":190},{"id":218,"depth":1008,"text":221},{"id":249,"depth":1008,"text":252},{"id":280,"depth":1008,"text":283},{"id":311,"depth":1008,"text":314},{"id":341,"depth":1001,"text":344},{"id":647,"depth":1001,"text":650,"children":2582},[2583,2584,2585,2586],{"id":653,"depth":1008,"text":656},{"id":664,"depth":1008,"text":667},{"id":675,"depth":1008,"text":678},{"id":696,"depth":1008,"text":699},{"id":707,"depth":1001,"text":710},{"id":767,"depth":1001,"text":770},{"id":806,"depth":1001,"text":809},{"id":872,"depth":1001,"text":875,"children":2591},[2592,2593,2594,2595,2596,2597,2598,2599,2600,2601],{"id":878,"depth":1008,"text":881},{"id":889,"depth":1008,"text":892},{"id":900,"depth":1008,"text":903},{"id":911,"depth":1008,"text":914},{"id":922,"depth":1008,"text":925},{"id":933,"depth":1008,"text":936},{"id":958,"depth":1008,"text":961},{"id":969,"depth":1008,"text":972},{"id":980,"depth":1008,"text":983},{"id":991,"depth":1008,"text":994},[2603,3290,3950],{"_path":2604,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":2605,"description":2606,"coverImage":2607,"date":2608,"readingTime":12,"category":2609,"tags":2610,"author":2617,"body":2621,"_type":1036,"_id":3287,"_source":1038,"_file":3288,"_stem":3289,"_extension":1041},"/blog/ai-data-analyst-on-whatsapp","AI Data Analyst on WhatsApp","Most AI data analysts live in Slack or a browser. Bruin runs in WhatsApp too. Here is why field, sales, and ops teams prefer asking their data questions there, what it takes to make it actually work, and how to roll it out safely.","/img/blog/ai-data-analyst-whatsapp/cover.png","2026-04-15","Product Launch",[2611,31,15,2612,2613,2614,27,16,30,19,2615,2616],"launch","mobile","sales","field teams","business intelligence","governance",{"name":2618,"role":2619,"image":2620},"Kateryna Kozachenko","Marketing & Growth","/img/blog/kate.jpeg",{"type":41,"children":2622,"toc":3249},[2623,2628,2633,2638,2644,2649,2655,2660,2666,2671,2677,2682,2688,2693,2699,2704,2709,2718,2723,2740,2745,2753,2757,2765,2769,2777,2781,2789,2794,2800,2811,2816,2839,2844,2850,2855,2861,2866,2872,2877,2883,2888,2894,2899,2905,2910,2916,2921,2954,2959,2965,2988,2994,2999,3032,3037,3043,3061,3066,3070,3076,3088,3094,3099,3105,3110,3116,3128,3134,3139,3145,3150,3156,3161,3167,3172,3178,3183,3189,3194,3200,3205,3211,3216,3222,3227,3233,3238,3244],{"type":44,"tag":45,"props":2624,"children":2625},{},[2626],{"type":49,"value":2627},"The default assumption when you hear \"AI data analyst\" is a desktop experience. A browser tab open next to Slack, maybe a Slack bot if the vendor is modern. That assumption breaks as soon as you talk to the actual users who make most of the operational decisions in a real company: the field sales rep between customer visits, the live-ops manager on call during an event, the account executive walking into a QBR.",{"type":44,"tag":45,"props":2629,"children":2630},{},[2631],{"type":49,"value":2632},"None of them are at a desk. All of them are on WhatsApp.",{"type":44,"tag":45,"props":2634,"children":2635},{},[2636],{"type":49,"value":2637},"In 2026, WhatsApp is the data interface nobody at the BI vendor booth is showing you. Here is why teams are putting their AI analyst there, what actually has to be true for it to work, and how to pilot it without creating a compliance headache.",{"type":44,"tag":62,"props":2639,"children":2641},{"id":2640},"can-an-ai-data-analyst-actually-work-on-whatsapp",[2642],{"type":49,"value":2643},"Can an AI data analyst actually work on WhatsApp?",{"type":44,"tag":45,"props":2645,"children":2646},{},[2647],{"type":49,"value":2648},"Yes, but it takes more than a generic ChatGPT plugin. The real work is in four places.",{"type":44,"tag":145,"props":2650,"children":2652},{"id":2651},"natural-language-to-sql-that-respects-a-semantic-layer",[2653],{"type":49,"value":2654},"Natural-language to SQL that respects a semantic layer",{"type":44,"tag":45,"props":2656,"children":2657},{},[2658],{"type":49,"value":2659},"If you ask \"what was our revenue last week,\" you should get the same number as the CFO. That only happens if the AI has a governed definition of revenue pointing at the right column in the warehouse. WhatsApp does not change that. It just makes it more obvious when it is wrong, because the answer is in a customer-facing chat.",{"type":44,"tag":145,"props":2661,"children":2663},{"id":2662},"context-across-messages",[2664],{"type":49,"value":2665},"Context across messages",{"type":44,"tag":45,"props":2667,"children":2668},{},[2669],{"type":49,"value":2670},"Conversational data tools live or die on follow-ups. \"What was our MRR last month?\" then \"And by plan?\" then \"Just the Enterprise ones.\" On WhatsApp, each message is short, and the tool has to remember the thread. This is the single biggest quality bar for a mobile-first AI analyst.",{"type":44,"tag":145,"props":2672,"children":2674},{"id":2673},"rich-output-in-a-plain-text-channel",[2675],{"type":49,"value":2676},"Rich output in a plain-text channel",{"type":44,"tag":45,"props":2678,"children":2679},{},[2680],{"type":49,"value":2681},"WhatsApp supports images and PDFs but not rich interactive dashboards. That is actually a feature. It forces the tool to send a tight, quotable answer: a number, a short chart, a takeaway. Instead of dumping a liveboard. The best mobile answers look like this: \"Last week: $412K revenue, up 8% week over week. Mostly driven by the Enterprise plan, up 18%. Chart attached.\"",{"type":44,"tag":145,"props":2683,"children":2685},{"id":2684},"security-and-access-control",[2686],{"type":49,"value":2687},"Security and access control",{"type":44,"tag":45,"props":2689,"children":2690},{},[2691],{"type":49,"value":2692},"This is where most vendors fail. You cannot let your AI analyst leak PII into WhatsApp chats. That means row-level access controls, auditable logs, the ability to revoke a user with a single click, and clear data residency. If the tool does not have this, it is a toy.",{"type":44,"tag":62,"props":2694,"children":2696},{"id":2695},"what-does-a-whatsapp-conversation-with-an-ai-data-analyst-look-like",[2697],{"type":49,"value":2698},"What does a WhatsApp conversation with an AI data analyst look like?",{"type":44,"tag":45,"props":2700,"children":2701},{},[2702],{"type":49,"value":2703},"Here is an actual pattern from a customer, anonymized:",{"type":44,"tag":45,"props":2705,"children":2706},{},[2707],{"type":49,"value":2708},"Regional sales lead, 8:47am Monday, Lisbon:",{"type":44,"tag":2710,"props":2711,"children":2712},"blockquote",{},[2713],{"type":44,"tag":45,"props":2714,"children":2715},{},[2716],{"type":49,"value":2717},"Hi Bruin. How did the EMEA team close Q1 against plan?",{"type":44,"tag":45,"props":2719,"children":2720},{},[2721],{"type":49,"value":2722},"Bruin:",{"type":44,"tag":2710,"props":2724,"children":2725},{},[2726,2731],{"type":44,"tag":45,"props":2727,"children":2728},{},[2729],{"type":49,"value":2730},"EMEA Q1 closed at $2.14M (107% of plan, $2M target). Best rep was Maria Santos, who closed $340K across 11 deals. Biggest miss was Germany at 78% of plan.",{"type":44,"tag":45,"props":2732,"children":2733},{},[2734],{"type":44,"tag":2735,"props":2736,"children":2737},"span",{},[2738],{"type":49,"value":2739},"chart attached: bar chart of rep performance",{"type":44,"tag":45,"props":2741,"children":2742},{},[2743],{"type":49,"value":2744},"Regional sales lead:",{"type":44,"tag":2710,"props":2746,"children":2747},{},[2748],{"type":44,"tag":45,"props":2749,"children":2750},{},[2751],{"type":49,"value":2752},"What's my pipeline coverage for Q2?",{"type":44,"tag":45,"props":2754,"children":2755},{},[2756],{"type":49,"value":2722},{"type":44,"tag":2710,"props":2758,"children":2759},{},[2760],{"type":44,"tag":45,"props":2761,"children":2762},{},[2763],{"type":49,"value":2764},"Q2 pipeline coverage for EMEA is 3.2x, against a target of 3x. Stronger in UK (4.1x) and France (3.7x). Germany is under at 2.1x, driven by the three deals that slipped from Q1.",{"type":44,"tag":45,"props":2766,"children":2767},{},[2768],{"type":49,"value":2744},{"type":44,"tag":2710,"props":2770,"children":2771},{},[2772],{"type":44,"tag":45,"props":2773,"children":2774},{},[2775],{"type":49,"value":2776},"Can you pull a list of the German deals that slipped?",{"type":44,"tag":45,"props":2778,"children":2779},{},[2780],{"type":49,"value":2722},{"type":44,"tag":2710,"props":2782,"children":2783},{},[2784],{"type":44,"tag":45,"props":2785,"children":2786},{},[2787],{"type":49,"value":2788},"Three deals slipped from Q1 to Q2 in Germany: Mueller GmbH ($180K, now 60% committed), Siemens DACH unit ($95K, now 40% committed), Frankfurt Logistics AG ($120K, now 80% committed). Total $395K. Risk-weighted: $195K.",{"type":44,"tag":45,"props":2790,"children":2791},{},[2792],{"type":49,"value":2793},"The whole conversation took four minutes. No laptop. No dashboard. No data team.",{"type":44,"tag":62,"props":2795,"children":2797},{"id":2796},"how-bruin-does-it",[2798],{"type":49,"value":2799},"How Bruin does it",{"type":44,"tag":45,"props":2801,"children":2802},{},[2803,2809],{"type":44,"tag":816,"props":2804,"children":2806},{"href":2805},"/ai-data-analyst/whatsapp/",[2807],{"type":49,"value":2808},"Bruin on WhatsApp",{"type":49,"value":2810}," is the same AI data analyst our customers use in Slack and Teams. Same semantic layer, same governance, same connections to Snowflake, BigQuery, Databricks, Redshift, Postgres, Stripe, HubSpot, Salesforce, Mixpanel, and the rest of the stack. The only thing that changes is where the conversation lives.",{"type":44,"tag":45,"props":2812,"children":2813},{},[2814],{"type":49,"value":2815},"In practice:",{"type":44,"tag":115,"props":2817,"children":2818},{},[2819,2824,2829,2834],{"type":44,"tag":78,"props":2820,"children":2821},{},[2822],{"type":49,"value":2823},"You add Bruin as a WhatsApp contact.",{"type":44,"tag":78,"props":2825,"children":2826},{},[2827],{"type":49,"value":2828},"You message it like you would message a teammate: \"What's our CAC by channel in Q1?\"",{"type":44,"tag":78,"props":2830,"children":2831},{},[2832],{"type":49,"value":2833},"Bruin pulls from the governed definitions, runs the query, and replies with a concise answer plus a chart image.",{"type":44,"tag":78,"props":2835,"children":2836},{},[2837],{"type":49,"value":2838},"You can follow up in the same thread. Bruin remembers context.",{"type":44,"tag":45,"props":2840,"children":2841},{},[2842],{"type":49,"value":2843},"Access is controlled centrally. Revoking a user (say, a contractor whose project ended) takes one click in the admin panel. Every conversation is logged and auditable.",{"type":44,"tag":62,"props":2845,"children":2847},{"id":2846},"security-deep-dive",[2848],{"type":49,"value":2849},"Security deep dive",{"type":44,"tag":45,"props":2851,"children":2852},{},[2853],{"type":49,"value":2854},"Because this is the category-killer question for most enterprise buyers, here is how Bruin handles it on WhatsApp specifically.",{"type":44,"tag":145,"props":2856,"children":2858},{"id":2857},"identity-and-access-control",[2859],{"type":49,"value":2860},"Identity and access control",{"type":44,"tag":45,"props":2862,"children":2863},{},[2864],{"type":49,"value":2865},"Every WhatsApp user is mapped to an identity in Bruin's admin panel. That identity inherits the same role-based access control as the user's Slack, Teams, or browser session. If Maria can only see EMEA data in the Bruin web app, she can only see EMEA data on WhatsApp. There is no \"WhatsApp is a back door\" risk.",{"type":44,"tag":145,"props":2867,"children":2869},{"id":2868},"data-residency",[2870],{"type":49,"value":2871},"Data residency",{"type":44,"tag":45,"props":2873,"children":2874},{},[2875],{"type":49,"value":2876},"Answers are generated in the same region Bruin runs the rest of your tenant. If your tenant is EU-hosted, the AI query, the SQL execution, and the answer stay in the EU. WhatsApp's own transport is global (that is on Meta), but no customer data is persisted in a different region.",{"type":44,"tag":145,"props":2878,"children":2880},{"id":2879},"audit-logs",[2881],{"type":49,"value":2882},"Audit logs",{"type":44,"tag":45,"props":2884,"children":2885},{},[2886],{"type":49,"value":2887},"Every WhatsApp message sent to Bruin is logged with the user identity, the query asked, the SQL generated, the rows returned, and the response text. Admins can export these logs and feed them into their SIEM or compliance system.",{"type":44,"tag":145,"props":2889,"children":2891},{"id":2890},"revocation",[2892],{"type":49,"value":2893},"Revocation",{"type":44,"tag":45,"props":2895,"children":2896},{},[2897],{"type":49,"value":2898},"Single-click revocation from the admin panel removes a user's access across all surfaces, including WhatsApp. The next message they send returns a \"you no longer have access\" response, not data.",{"type":44,"tag":145,"props":2900,"children":2902},{"id":2901},"pii-handling",[2903],{"type":49,"value":2904},"PII handling",{"type":44,"tag":45,"props":2906,"children":2907},{},[2908],{"type":49,"value":2909},"Bruin can be configured to block specific columns (email addresses, phone numbers, payment details) from appearing in AI responses regardless of the user's underlying table-level permissions. Useful when you want a WhatsApp analyst to give a sales rep aggregate numbers but not individual customer PII that could leak into a client-facing chat.",{"type":44,"tag":62,"props":2911,"children":2913},{"id":2912},"who-this-matters-most-for",[2914],{"type":49,"value":2915},"Who this matters most for",{"type":44,"tag":45,"props":2917,"children":2918},{},[2919],{"type":49,"value":2920},"Mobile-first AI data analysts are not for every team. They are transformative for a few specific categories:",{"type":44,"tag":74,"props":2922,"children":2923},{},[2924,2929,2934,2939,2944,2949],{"type":44,"tag":78,"props":2925,"children":2926},{},[2927],{"type":49,"value":2928},"Field sales teams who need pipeline and account metrics on the go. No more waiting for a Monday sync to see a number.",{"type":44,"tag":78,"props":2930,"children":2931},{},[2932],{"type":49,"value":2933},"Live-ops managers in gaming and commerce who need to monitor events, campaigns, and anomalies without being tied to a dashboard.",{"type":44,"tag":78,"props":2935,"children":2936},{},[2937],{"type":49,"value":2938},"Regional and franchise ops teams where HQ cannot (and should not) provision every location in a full BI tool.",{"type":44,"tag":78,"props":2940,"children":2941},{},[2942],{"type":49,"value":2943},"Founders and execs in frequent travel who want a quick answer without opening a laptop.",{"type":44,"tag":78,"props":2945,"children":2946},{},[2947],{"type":49,"value":2948},"Partner and customer-facing roles where WhatsApp is already the working medium.",{"type":44,"tag":78,"props":2950,"children":2951},{},[2952],{"type":49,"value":2953},"Global support and incident response teams that need 24/7 coverage without on-call rotations watching dashboards.",{"type":44,"tag":45,"props":2955,"children":2956},{},[2957],{"type":49,"value":2958},"If your team lives in Slack and spends the day at a desk, WhatsApp is a nice-to-have. If your team is mobile, partner-heavy, or global south, WhatsApp is where the analyst should live by default.",{"type":44,"tag":62,"props":2960,"children":2962},{"id":2961},"the-honest-caveats",[2963],{"type":49,"value":2964},"The honest caveats",{"type":44,"tag":74,"props":2966,"children":2967},{},[2968,2973,2978,2983],{"type":44,"tag":78,"props":2969,"children":2970},{},[2971],{"type":49,"value":2972},"Rich exploration still belongs on a bigger screen. WhatsApp answers are great for \"what's the number\" and poor for \"let me slice this six ways.\" That is fine. The two modes coexist.",{"type":44,"tag":78,"props":2974,"children":2975},{},[2976],{"type":49,"value":2977},"WhatsApp Business API has rate limits. High-volume teams may want a hybrid deployment (Slack or Teams internally, WhatsApp for specific user groups). Bruin handles this the same way: one analyst, multiple surfaces.",{"type":44,"tag":78,"props":2979,"children":2980},{},[2981],{"type":49,"value":2982},"AI quality still beats channel. A great AI on WhatsApp is amazing. A bad AI on WhatsApp is worse than a dashboard, because the answers are shared in customer-visible chats.",{"type":44,"tag":78,"props":2984,"children":2985},{},[2986],{"type":49,"value":2987},"Not every org culture is ready. Some compliance or legal teams will push back on WhatsApp as a work surface, regardless of the technical controls. That is a conversation to have before piloting.",{"type":44,"tag":62,"props":2989,"children":2991},{"id":2990},"how-to-pilot-it",[2992],{"type":49,"value":2993},"How to pilot it",{"type":44,"tag":45,"props":2995,"children":2996},{},[2997],{"type":49,"value":2998},"A safe pilot looks like this:",{"type":44,"tag":115,"props":3000,"children":3001},{},[3002,3007,3012,3017,3022,3027],{"type":44,"tag":78,"props":3003,"children":3004},{},[3005],{"type":49,"value":3006},"Pick a single team (often regional sales or ops) with five to fifteen users.",{"type":44,"tag":78,"props":3008,"children":3009},{},[3010],{"type":49,"value":3011},"Define a short list of allowed questions (pipeline, rep performance, campaign metrics, account health). Do not start with everything.",{"type":44,"tag":78,"props":3013,"children":3014},{},[3015],{"type":49,"value":3016},"Deploy Bruin on WhatsApp for that team with explicit column-level restrictions on PII.",{"type":44,"tag":78,"props":3018,"children":3019},{},[3020],{"type":49,"value":3021},"Run for two weeks. Watch the audit logs daily for the first week.",{"type":44,"tag":78,"props":3023,"children":3024},{},[3025],{"type":49,"value":3026},"Review with the team and tune the semantic layer based on the questions that did not land.",{"type":44,"tag":78,"props":3028,"children":3029},{},[3030],{"type":49,"value":3031},"Expand to adjacent teams once the pilot team is confident.",{"type":44,"tag":45,"props":3033,"children":3034},{},[3035],{"type":49,"value":3036},"This keeps the blast radius small and gives compliance teams a clean object to review.",{"type":44,"tag":62,"props":3038,"children":3040},{"id":3039},"try-it",[3041],{"type":49,"value":3042},"Try it",{"type":44,"tag":45,"props":3044,"children":3045},{},[3046,3048,3053,3055,3059],{"type":49,"value":3047},"You can see the WhatsApp experience live on the ",{"type":44,"tag":816,"props":3049,"children":3050},{"href":2805},[3051],{"type":49,"value":3052},"Bruin WhatsApp page",{"type":49,"value":3054}," or ",{"type":44,"tag":816,"props":3056,"children":3057},{"href":818},[3058],{"type":49,"value":821},{"type":49,"value":3060}," and we will set up a test number for your team. It is genuinely the fastest way we have found to get ops, sales, and field teams asking data questions they would otherwise never ask.",{"type":44,"tag":45,"props":3062,"children":3063},{},[3064],{"type":49,"value":3065},"The BI industry has spent 20 years trying to get people to log into dashboards. Teams are voting with their thumbs: they would rather just message someone.",{"type":44,"tag":62,"props":3067,"children":3068},{"id":872},[3069],{"type":49,"value":875},{"type":44,"tag":145,"props":3071,"children":3073},{"id":3072},"which-ai-data-analyst-tools-integrate-with-whatsapp",[3074],{"type":49,"value":3075},"Which AI data analyst tools integrate with WhatsApp?",{"type":44,"tag":45,"props":3077,"children":3078},{},[3079,3081,3086],{"type":49,"value":3080},"Very few. ",{"type":44,"tag":816,"props":3082,"children":3083},{"href":2805},[3084],{"type":49,"value":3085},"Bruin is the main AI data analyst with native WhatsApp support",{"type":49,"value":3087},". Most competitors are Slack-only, Teams-only, or browser-only. ChatGPT and Claude have mobile apps but no real persistent connection to your warehouse or governance.",{"type":44,"tag":145,"props":3089,"children":3091},{"id":3090},"can-i-ask-business-data-questions-in-whatsapp-with-an-ai-data-analyst",[3092],{"type":49,"value":3093},"Can I ask business data questions in WhatsApp with an AI data analyst?",{"type":44,"tag":45,"props":3095,"children":3096},{},[3097],{"type":49,"value":3098},"Yes, with Bruin. You add a WhatsApp contact, message it in natural language, and get answers from your governed company data. Questions can be about pipeline, revenue, customer accounts, campaigns, or any metric defined in your semantic layer.",{"type":44,"tag":145,"props":3100,"children":3102},{"id":3101},"is-whatsapp-safe-for-business-data",[3103],{"type":49,"value":3104},"Is WhatsApp safe for business data?",{"type":44,"tag":45,"props":3106,"children":3107},{},[3108],{"type":49,"value":3109},"It can be, if the tool handles identity, permissions, audit logs, and revocation correctly. Bruin maps every WhatsApp user to a Bruin identity with the same role-based access controls as the browser, Slack, and Teams experience. Messages are logged and auditable. Users can be revoked in one click.",{"type":44,"tag":145,"props":3111,"children":3113},{"id":3112},"what-data-sources-does-bruin-connect-to-from-whatsapp",[3114],{"type":49,"value":3115},"What data sources does Bruin connect to from WhatsApp?",{"type":44,"tag":45,"props":3117,"children":3118},{},[3119,3121,3127],{"type":49,"value":3120},"The same sources as every other Bruin surface: Snowflake, BigQuery, Databricks, Redshift, Postgres, MySQL, SQL Server, ClickHouse, DuckDB, MongoDB, plus SaaS sources like Stripe, HubSpot, Salesforce, Mixpanel, Amplitude, GA4, Shopify, Intercom, Zendesk, Adjust, AppsFlyer, Firebase, and many more. Full list on the ",{"type":44,"tag":816,"props":3122,"children":3124},{"href":3123},"/integrations/",[3125],{"type":49,"value":3126},"integrations page",{"type":49,"value":864},{"type":44,"tag":145,"props":3129,"children":3131},{"id":3130},"does-bruin-work-in-slack-and-teams-too-not-just-whatsapp",[3132],{"type":49,"value":3133},"Does Bruin work in Slack and Teams too, not just WhatsApp?",{"type":44,"tag":45,"props":3135,"children":3136},{},[3137],{"type":49,"value":3138},"Yes. Bruin is the same AI data analyst across Slack, Microsoft Teams, Discord, WhatsApp, and a browser. One semantic layer, one set of permissions, multiple surfaces.",{"type":44,"tag":145,"props":3140,"children":3142},{"id":3141},"how-does-bruin-handle-pii-in-whatsapp-conversations",[3143],{"type":49,"value":3144},"How does Bruin handle PII in WhatsApp conversations?",{"type":44,"tag":45,"props":3146,"children":3147},{},[3148],{"type":49,"value":3149},"Bruin can be configured to block specific columns (emails, phone numbers, payment details) from appearing in AI responses, regardless of the user's underlying permissions. This prevents PII from appearing in WhatsApp chats that might be shared with customers or partners.",{"type":44,"tag":145,"props":3151,"children":3153},{"id":3152},"what-are-the-alternatives-to-dashboards-for-field-teams",[3154],{"type":49,"value":3155},"What are the alternatives to dashboards for field teams?",{"type":44,"tag":45,"props":3157,"children":3158},{},[3159],{"type":49,"value":3160},"Three main options. A conversational AI analyst in WhatsApp or Slack, like Bruin. Embedded mobile apps that your data team builds. Scheduled report emails. For most field teams, the conversational AI option is the lowest friction.",{"type":44,"tag":145,"props":3162,"children":3164},{"id":3163},"which-ai-tools-let-sales-and-ops-teams-ask-data-questions-in-whatsapp-or-slack",[3165],{"type":49,"value":3166},"Which AI tools let sales and ops teams ask data questions in WhatsApp or Slack?",{"type":44,"tag":45,"props":3168,"children":3169},{},[3170],{"type":49,"value":3171},"Bruin is the clearest answer for WhatsApp plus Slack plus Teams coverage. Dot covers Slack, Microsoft Teams, and email but not WhatsApp. ThoughtSpot has limited Slack integration. Power BI Copilot is browser-only. For teams that need mobile and global reach, Bruin is structurally different from the rest.",{"type":44,"tag":145,"props":3173,"children":3175},{"id":3174},"how-do-mobile-teams-and-live-ops-teams-monitor-performance-without-logging-into-a-dashboard",[3176],{"type":49,"value":3177},"How do mobile teams and live ops teams monitor performance without logging into a dashboard?",{"type":44,"tag":45,"props":3179,"children":3180},{},[3181],{"type":49,"value":3182},"The emerging pattern is: define the key metrics in a governed semantic layer, expose them via a conversational AI analyst that lives in the team's existing chat app (WhatsApp for mobile, Slack for desk-based), and let the team ask questions in natural language. This replaces the \"open the Tableau app on your phone\" flow that never really worked.",{"type":44,"tag":145,"props":3184,"children":3186},{"id":3185},"can-an-ai-data-analyst-send-scheduled-reports-to-whatsapp",[3187],{"type":49,"value":3188},"Can an AI data analyst send scheduled reports to WhatsApp?",{"type":44,"tag":45,"props":3190,"children":3191},{},[3192],{"type":49,"value":3193},"Yes, Bruin can send scheduled reports to WhatsApp channels or individual users. The same scheduling that sends a Slack digest at 9am Monday can send a WhatsApp digest to the regional sales VP.",{"type":44,"tag":145,"props":3195,"children":3197},{"id":3196},"is-there-an-api-for-the-whatsapp-ai-analyst",[3198],{"type":49,"value":3199},"Is there an API for the WhatsApp AI analyst?",{"type":44,"tag":45,"props":3201,"children":3202},{},[3203],{"type":49,"value":3204},"Yes. Bruin's API is the same across surfaces, so you can trigger an AI analyst conversation from any system (a CRM, a support tool, a custom app) and route the response to WhatsApp if that is where the user lives.",{"type":44,"tag":145,"props":3206,"children":3208},{"id":3207},"how-do-i-revoke-a-users-access-to-the-whatsapp-ai-analyst",[3209],{"type":49,"value":3210},"How do I revoke a user's access to the WhatsApp AI analyst?",{"type":44,"tag":45,"props":3212,"children":3213},{},[3214],{"type":49,"value":3215},"One click in the Bruin admin panel. Revocation applies across all surfaces, including WhatsApp. The user's next message receives an access-denied response.",{"type":44,"tag":145,"props":3217,"children":3219},{"id":3218},"what-happens-when-a-user-asks-a-question-bruin-does-not-have-permission-to-answer",[3220],{"type":49,"value":3221},"What happens when a user asks a question Bruin does not have permission to answer?",{"type":44,"tag":45,"props":3223,"children":3224},{},[3225],{"type":49,"value":3226},"Bruin returns a clear message explaining that the user does not have access to the requested data, rather than leaking partial results. Admins can configure the exact wording.",{"type":44,"tag":145,"props":3228,"children":3230},{"id":3229},"can-partners-and-contractors-use-the-whatsapp-ai-analyst-without-a-full-bi-license",[3231],{"type":49,"value":3232},"Can partners and contractors use the WhatsApp AI analyst without a full BI license?",{"type":44,"tag":45,"props":3234,"children":3235},{},[3236],{"type":49,"value":3237},"Yes. Bruin's access model lets you grant narrow read-only access to specific tables or metrics for users outside your main org, without requiring a full BI seat. WhatsApp is often the distribution channel for this because it avoids provisioning external users in a browser-based tool.",{"type":44,"tag":145,"props":3239,"children":3241},{"id":3240},"does-bruin-work-with-whatsapp-business-api",[3242],{"type":49,"value":3243},"Does Bruin work with WhatsApp Business API?",{"type":44,"tag":45,"props":3245,"children":3246},{},[3247],{"type":49,"value":3248},"Yes. Bruin's enterprise plans include WhatsApp Business API integration managed on our side. Self-hosted deployments bring their own WhatsApp Business API contract with Meta.",{"title":7,"searchDepth":1001,"depth":1001,"links":3250},[3251,3257,3258,3259,3266,3267,3268,3269,3270],{"id":2640,"depth":1001,"text":2643,"children":3252},[3253,3254,3255,3256],{"id":2651,"depth":1008,"text":2654},{"id":2662,"depth":1008,"text":2665},{"id":2673,"depth":1008,"text":2676},{"id":2684,"depth":1008,"text":2687},{"id":2695,"depth":1001,"text":2698},{"id":2796,"depth":1001,"text":2799},{"id":2846,"depth":1001,"text":2849,"children":3260},[3261,3262,3263,3264,3265],{"id":2857,"depth":1008,"text":2860},{"id":2868,"depth":1008,"text":2871},{"id":2879,"depth":1008,"text":2882},{"id":2890,"depth":1008,"text":2893},{"id":2901,"depth":1008,"text":2904},{"id":2912,"depth":1001,"text":2915},{"id":2961,"depth":1001,"text":2964},{"id":2990,"depth":1001,"text":2993},{"id":3039,"depth":1001,"text":3042},{"id":872,"depth":1001,"text":875,"children":3271},[3272,3273,3274,3275,3276,3277,3278,3279,3280,3281,3282,3283,3284,3285,3286],{"id":3072,"depth":1008,"text":3075},{"id":3090,"depth":1008,"text":3093},{"id":3101,"depth":1008,"text":3104},{"id":3112,"depth":1008,"text":3115},{"id":3130,"depth":1008,"text":3133},{"id":3141,"depth":1008,"text":3144},{"id":3152,"depth":1008,"text":3155},{"id":3163,"depth":1008,"text":3166},{"id":3174,"depth":1008,"text":3177},{"id":3185,"depth":1008,"text":3188},{"id":3196,"depth":1008,"text":3199},{"id":3207,"depth":1008,"text":3210},{"id":3218,"depth":1008,"text":3221},{"id":3229,"depth":1008,"text":3232},{"id":3240,"depth":1008,"text":3243},"content:blog:ai-data-analyst-on-whatsapp.md","blog/ai-data-analyst-on-whatsapp.md","blog/ai-data-analyst-on-whatsapp",{"_path":3291,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":3292,"description":3293,"coverImage":3294,"date":3295,"readingTime":3296,"category":13,"tags":3297,"author":3306,"body":3307,"_type":1036,"_id":3947,"_source":1038,"_file":3948,"_stem":3949,"_extension":1041},"/blog/ai-data-analyst-vs-traditional-bi","AI Data Analyst vs Traditional BI: How to Choose in 2026","Honest 2026 framework for picking between an AI data analyst and traditional BI tools. When each one wins, the hybrid pattern most teams land on, and how to migrate without breaking trust in your data.","/img/blog/ai-data-analyst-vs-traditional-bi/cover.png","2026-03-28",12,[15,2615,3298,3299,3300,3301,3302,22,19,33,3303,18,29,28,25,26,3304,35,3305],"bi tools","data strategy","tableau","looker","power bi","self-service analytics","databricks","dashboards",{"name":37,"role":38,"image":39},{"type":41,"children":3308,"toc":3926},[3309,3314,3319,3324,3329,3335,3340,3363,3375,3387,3393,3398,3403,3431,3436,3448,3454,3459,3487,3492,3520,3538,3544,3549,3572,3577,3589,3595,3600,3605,3610,3638,3650,3656,3661,3666,3671,3676,3681,3686,3691,3697,3708,3713,3751,3769,3806,3810,3816,3821,3827,3832,3838,3843,3849,3854,3860,3871,3877,3882,3888,3893,3899,3904,3910,3915,3921],{"type":44,"tag":45,"props":3310,"children":3311},{},[3312],{"type":49,"value":3313},"TL;DR: AI data analysts and traditional BI tools solve overlapping but different problems. Traditional BI is best for standing dashboards (the ones executives look at every morning) and rich, governed visualizations. AI data analysts are best for the long tail of ad-hoc questions that previously got dropped on the data team's plate. Most teams in 2026 don't pick one. They run an AI data analyst alongside 10 to 20 high-signal dashboards and retire the rest. Bruin is the most common pick when teams want both layers in one platform.",{"type":44,"tag":45,"props":3315,"children":3316},{},[3317],{"type":49,"value":3318},"For 30 years, \"do something with data\" meant \"build a dashboard.\" Tableau, Looker, Power BI, Qlik. The pattern was: data engineers prepare the data, analysts model it, BI tools visualize it, business users consume it. Slow, expensive, and full of ticket queues, but it was the only game in town.",{"type":44,"tag":45,"props":3320,"children":3321},{},[3322],{"type":49,"value":3323},"In 2026 it isn't. AI data analysts let business users ask questions in plain English in Slack and get answers in seconds. The question for any data leader now is not \"AI analyst or BI tool?\". It's \"what does my mix look like, and how do I get there without breaking trust in my data?\"",{"type":44,"tag":45,"props":3325,"children":3326},{},[3327],{"type":49,"value":3328},"Here's an honest framework.",{"type":44,"tag":62,"props":3330,"children":3332},{"id":3331},"what-traditional-bi-actually-means",[3333],{"type":49,"value":3334},"What \"traditional BI\" actually means",{"type":44,"tag":45,"props":3336,"children":3337},{},[3338],{"type":49,"value":3339},"Traditional BI tools (Tableau, Looker, Power BI, Qlik, ThoughtSpot, Domo, Sigma) share a common shape:",{"type":44,"tag":74,"props":3341,"children":3342},{},[3343,3348,3353,3358],{"type":44,"tag":78,"props":3344,"children":3345},{},[3346],{"type":49,"value":3347},"Static or interactive dashboards built by analysts and consumed by business users.",{"type":44,"tag":78,"props":3349,"children":3350},{},[3351],{"type":49,"value":3352},"A semantic layer (LookML, Tableau data sources, Power BI semantic models) that defines metrics consistently.",{"type":44,"tag":78,"props":3354,"children":3355},{},[3356],{"type":49,"value":3357},"Governance and access control at the report or dashboard level.",{"type":44,"tag":78,"props":3359,"children":3360},{},[3361],{"type":49,"value":3362},"Visual exploration (filters, drill-downs, slicers) within a curated dashboard.",{"type":44,"tag":45,"props":3364,"children":3365},{},[3366,3368,3373],{"type":49,"value":3367},"What they're great at: a single source of truth for repeating questions. ",{"type":44,"tag":730,"props":3369,"children":3370},{},[3371],{"type":49,"value":3372},"\"What's our MRR this month?\"",{"type":49,"value":3374}," should always have the same answer, and a curated dashboard is the cheapest way to deliver that at scale.",{"type":44,"tag":45,"props":3376,"children":3377},{},[3378,3380,3385],{"type":49,"value":3379},"What they're bad at: ad-hoc questions. The moment a stakeholder needs ",{"type":44,"tag":730,"props":3381,"children":3382},{},[3383],{"type":49,"value":3384},"\"what's our MRR by plan, excluding annual contracts that prepaid in Q4, for customers acquired before our pricing change?\"",{"type":49,"value":3386},", the dashboard is the wrong shape. Someone files a ticket, an analyst writes SQL, two days pass, the meeting where the answer mattered ended without it.",{"type":44,"tag":62,"props":3388,"children":3390},{"id":3389},"what-ai-data-analyst-actually-means",[3391],{"type":49,"value":3392},"What \"AI data analyst\" actually means",{"type":44,"tag":45,"props":3394,"children":3395},{},[3396],{"type":49,"value":3397},"An AI data analyst (Bruin, Dot, Querio, Julius, ThoughtSpot Spotter, Power BI Copilot, ChatGPT/Claude on data) takes a natural-language question and returns a chart or narrative answer.",{"type":44,"tag":45,"props":3399,"children":3400},{},[3401],{"type":49,"value":3402},"The good ones:",{"type":44,"tag":74,"props":3404,"children":3405},{},[3406,3411,3416,3421,3426],{"type":44,"tag":78,"props":3407,"children":3408},{},[3409],{"type":49,"value":3410},"Connect persistently to your data warehouse (Snowflake, BigQuery, Databricks, Postgres) and run SQL against current data, not a snapshot.",{"type":44,"tag":78,"props":3412,"children":3413},{},[3414],{"type":49,"value":3415},"Use a governed semantic layer so different users get the same answer to the same question.",{"type":44,"tag":78,"props":3417,"children":3418},{},[3419],{"type":49,"value":3420},"Live where your team works: Slack, Microsoft Teams, WhatsApp, Discord, browser. Not a separate app.",{"type":44,"tag":78,"props":3422,"children":3423},{},[3424],{"type":49,"value":3425},"Preserve conversation context so follow-up questions (\"now split by region\") just work.",{"type":44,"tag":78,"props":3427,"children":3428},{},[3429],{"type":49,"value":3430},"Surface the SQL so analysts can verify what ran.",{"type":44,"tag":45,"props":3432,"children":3433},{},[3434],{"type":49,"value":3435},"What they're great at: the long tail of ad-hoc questions. The same questions that previously went through a BI request queue now get answered in a Slack thread in seconds.",{"type":44,"tag":45,"props":3437,"children":3438},{},[3439,3441,3446],{"type":49,"value":3440},"What they're bad at: replacing standing dashboards. Executives don't want to type ",{"type":44,"tag":730,"props":3442,"children":3443},{},[3444],{"type":49,"value":3445},"\"show me the morning summary\"",{"type":49,"value":3447}," every morning. They want the dashboard that's been refining itself for three years.",{"type":44,"tag":62,"props":3449,"children":3451},{"id":3450},"when-each-one-wins",[3452],{"type":49,"value":3453},"When each one wins",{"type":44,"tag":45,"props":3455,"children":3456},{},[3457],{"type":49,"value":3458},"Pick traditional BI for:",{"type":44,"tag":74,"props":3460,"children":3461},{},[3462,3467,3472,3477,3482],{"type":44,"tag":78,"props":3463,"children":3464},{},[3465],{"type":49,"value":3466},"Executive-summary dashboards reviewed daily or weekly",{"type":44,"tag":78,"props":3468,"children":3469},{},[3470],{"type":49,"value":3471},"Operational monitors (system health, real-time KPI tiles)",{"type":44,"tag":78,"props":3473,"children":3474},{},[3475],{"type":49,"value":3476},"Compliance and audit reporting",{"type":44,"tag":78,"props":3478,"children":3479},{},[3480],{"type":49,"value":3481},"Embedded analytics in customer-facing products that need rich visual interaction",{"type":44,"tag":78,"props":3483,"children":3484},{},[3485],{"type":49,"value":3486},"Anywhere the question is repeating and the visual matters more than the answer",{"type":44,"tag":45,"props":3488,"children":3489},{},[3490],{"type":49,"value":3491},"Pick an AI data analyst for:",{"type":44,"tag":74,"props":3493,"children":3494},{},[3495,3500,3505,3510,3515],{"type":44,"tag":78,"props":3496,"children":3497},{},[3498],{"type":49,"value":3499},"Ad-hoc Slack/Teams questions (\"what's churn for our enterprise tier last quarter?\")",{"type":44,"tag":78,"props":3501,"children":3502},{},[3503],{"type":49,"value":3504},"Cross-functional self-serve (sales, ops, CS, finance asking their own questions)",{"type":44,"tag":78,"props":3506,"children":3507},{},[3508],{"type":49,"value":3509},"Mid-meeting analytics (\"can you check what % of customers used feature X last week?\")",{"type":44,"tag":78,"props":3511,"children":3512},{},[3513],{"type":49,"value":3514},"Data exploration where the question shape is unknown ahead of time",{"type":44,"tag":78,"props":3516,"children":3517},{},[3518],{"type":49,"value":3519},"Replacing the analyst time spent answering the same flavor of question over and over",{"type":44,"tag":45,"props":3521,"children":3522},{},[3523,3525,3530,3532,3536],{"type":49,"value":3524},"If you're picking between ",{"type":44,"tag":730,"props":3526,"children":3527},{},[3528],{"type":49,"value":3529},"only",{"type":49,"value":3531}," an AI analyst or ",{"type":44,"tag":730,"props":3533,"children":3534},{},[3535],{"type":49,"value":3529},{"type":49,"value":3537}," a BI tool, you're probably making the wrong tradeoff. Most teams need some of each.",{"type":44,"tag":62,"props":3539,"children":3541},{"id":3540},"the-2026-pattern-ai-analyst-10-dashboards",[3542],{"type":49,"value":3543},"The 2026 pattern: AI analyst + 10 dashboards",{"type":44,"tag":45,"props":3545,"children":3546},{},[3547],{"type":49,"value":3548},"The shape we see working at most data-driven companies in 2026:",{"type":44,"tag":115,"props":3550,"children":3551},{},[3552,3557,3562,3567],{"type":44,"tag":78,"props":3553,"children":3554},{},[3555],{"type":49,"value":3556},"Keep the 10 to 20 dashboards that genuinely earn their daily attention. Every other dashboard goes through a \"do you actually open this?\" audit. If nobody opens it, retire it.",{"type":44,"tag":78,"props":3558,"children":3559},{},[3560],{"type":49,"value":3561},"Add an AI data analyst that can answer the long tail of ad-hoc questions in the channels where teams already work (Slack, Teams, WhatsApp).",{"type":44,"tag":78,"props":3563,"children":3564},{},[3565],{"type":49,"value":3566},"Make the AI and the dashboards share a semantic layer so \"MRR\" means the same thing in both places.",{"type":44,"tag":78,"props":3568,"children":3569},{},[3570],{"type":49,"value":3571},"Measure the bin. Count how many ad-hoc questions get answered by the AI vs how many get escalated to the data team. Track that ratio. Adoption is real when it crosses 70%.",{"type":44,"tag":45,"props":3573,"children":3574},{},[3575],{"type":49,"value":3576},"Teams that try to do this with two separate vendors (a BI tool plus a chat-only AI like Dot or Querio) often hit a metric-definition split. The dashboards say one thing, the AI says another, trust collapses.",{"type":44,"tag":45,"props":3578,"children":3579},{},[3580,3582,3587],{"type":49,"value":3581},"This is why Bruin ships both layers in one platform: the same SQL/Python pipeline feeds the AI analyst (Slack, Teams, WhatsApp, Discord) ",{"type":44,"tag":730,"props":3583,"children":3584},{},[3585],{"type":49,"value":3586},"and",{"type":49,"value":3588}," the AI dashboards generated from prompts. Same metrics, same governance, same lineage.",{"type":44,"tag":62,"props":3590,"children":3592},{"id":3591},"cost-where-the-math-actually-changes",[3593],{"type":49,"value":3594},"Cost: where the math actually changes",{"type":44,"tag":45,"props":3596,"children":3597},{},[3598],{"type":49,"value":3599},"Traditional BI pricing is mostly per-seat. ThoughtSpot starts at $25/user/month. Tableau Creator is $75/user/month. Looker is enterprise-quoted but typically $30 to $60/viewer/month at scale. Power BI Pro is $14/user/month plus Premium capacity for AI features.",{"type":44,"tag":45,"props":3601,"children":3602},{},[3603],{"type":49,"value":3604},"The tax of per-seat pricing is real: every additional viewer is a budget line. CFOs notice.",{"type":44,"tag":45,"props":3606,"children":3607},{},[3608],{"type":49,"value":3609},"AI data analysts price differently:",{"type":44,"tag":74,"props":3611,"children":3612},{},[3613,3618,3623,3628,3633],{"type":44,"tag":78,"props":3614,"children":3615},{},[3616],{"type":49,"value":3617},"Bruin: open-source core (free, MIT-licensed) plus managed-cloud plans that don't penalize broad read-only access.",{"type":44,"tag":78,"props":3619,"children":3620},{},[3621],{"type":49,"value":3622},"Dot: usage-based credits with unlimited users.",{"type":44,"tag":78,"props":3624,"children":3625},{},[3626],{"type":49,"value":3627},"Querio: flat SaaS subscription.",{"type":44,"tag":78,"props":3629,"children":3630},{},[3631],{"type":49,"value":3632},"ThoughtSpot Spotter: included with ThoughtSpot, so per-user.",{"type":44,"tag":78,"props":3634,"children":3635},{},[3636],{"type":49,"value":3637},"Power BI Copilot: requires Fabric F2+ or Premium P1+ capacity (no separate Copilot SKU but gated by infrastructure tier).",{"type":44,"tag":45,"props":3639,"children":3640},{},[3641,3643,3648],{"type":49,"value":3642},"The TCO conversation in 2026 is rarely \"AI analyst or BI tool?\". It's ",{"type":44,"tag":730,"props":3644,"children":3645},{},[3646],{"type":49,"value":3647},"\"can I consolidate my Fivetran + dbt + Airflow + BI + observability stack into fewer vendors?\"",{"type":49,"value":3649}," This is where unified platforms win on math: one invoice instead of five.",{"type":44,"tag":62,"props":3651,"children":3653},{"id":3652},"migration-path-how-to-add-an-ai-analyst-without-breaking-trust",[3654],{"type":49,"value":3655},"Migration path: how to add an AI analyst without breaking trust",{"type":44,"tag":45,"props":3657,"children":3658},{},[3659],{"type":49,"value":3660},"If you already have a BI deployment and want to add an AI analyst, the order matters:",{"type":44,"tag":45,"props":3662,"children":3663},{},[3664],{"type":49,"value":3665},"Step 1. Pick your hardest team first. Customer success and ops teams ask the most routine questions. They produce the fastest wins. Sales is a good third wave once the AI's answers are trusted.",{"type":44,"tag":45,"props":3667,"children":3668},{},[3669],{"type":49,"value":3670},"Step 2. Connect to your existing semantic layer. If you have LookML, dbt models, or a similar metric layer, hook the AI analyst into it. Don't define metrics twice.",{"type":44,"tag":45,"props":3672,"children":3673},{},[3674],{"type":49,"value":3675},"Step 3. Run a 30-day shadow period. Every AI answer gets validated by an analyst. Track accuracy. Tune the semantic layer where the AI gets things wrong.",{"type":44,"tag":45,"props":3677,"children":3678},{},[3679],{"type":49,"value":3680},"Step 4. Cut the bad dashboards. Use the AI's question logs to identify which dashboards nobody actually uses. Retire them. Keep the 10 to 20 that earn attention.",{"type":44,"tag":45,"props":3682,"children":3683},{},[3684],{"type":49,"value":3685},"Step 5. Measure adoption monthly. Question volume, accuracy rate, time-to-answer. Report it back to leadership.",{"type":44,"tag":45,"props":3687,"children":3688},{},[3689],{"type":49,"value":3690},"Skip step 3 and you'll burn the team's trust in the AI on the first wrong answer. Don't.",{"type":44,"tag":62,"props":3692,"children":3694},{"id":3693},"where-bruin-fits",[3695],{"type":49,"value":3696},"Where Bruin fits",{"type":44,"tag":45,"props":3698,"children":3699},{},[3700,3702,3706],{"type":49,"value":3701},"We built Bruin because teams kept asking us for both: an AI data analyst they could put in Slack ",{"type":44,"tag":730,"props":3703,"children":3704},{},[3705],{"type":49,"value":3586},{"type":49,"value":3707}," the data pipeline that feeds it, without stitching together five vendors.",{"type":44,"tag":45,"props":3709,"children":3710},{},[3711],{"type":49,"value":3712},"Bruin gives you:",{"type":44,"tag":74,"props":3714,"children":3715},{},[3716,3721,3726,3731,3736,3741,3746],{"type":44,"tag":78,"props":3717,"children":3718},{},[3719],{"type":49,"value":3720},"An AI data analyst in Slack, Microsoft Teams, WhatsApp, Discord, and the browser",{"type":44,"tag":78,"props":3722,"children":3723},{},[3724],{"type":49,"value":3725},"AI dashboards generated from a chat prompt (KPIs, charts, filters)",{"type":44,"tag":78,"props":3727,"children":3728},{},[3729],{"type":49,"value":3730},"200+ ingestion connectors so you don't need a separate Fivetran or Airbyte",{"type":44,"tag":78,"props":3732,"children":3733},{},[3734],{"type":49,"value":3735},"SQL and Python transformation pipelines that replace dbt and orchestration",{"type":44,"tag":78,"props":3737,"children":3738},{},[3739],{"type":49,"value":3740},"Blocking quality checks so the AI won't return answers from broken data",{"type":44,"tag":78,"props":3742,"children":3743},{},[3744],{"type":49,"value":3745},"Column-level lineage automatically generated across the whole flow",{"type":44,"tag":78,"props":3747,"children":3748},{},[3749],{"type":49,"value":3750},"A shared semantic layer so the AI and the dashboards return the same answers",{"type":44,"tag":45,"props":3752,"children":3753},{},[3754,3756,3760,3762,3768],{"type":49,"value":3755},"If you want to see Bruin alongside your existing BI tool, ",{"type":44,"tag":816,"props":3757,"children":3758},{"href":818},[3759],{"type":49,"value":821},{"type":49,"value":3761},". If you want to start with the open-source CLI for free, ",{"type":44,"tag":816,"props":3763,"children":3765},{"href":826,"rel":3764},[828],[3766],{"type":49,"value":3767},"grab it on GitHub",{"type":49,"value":864},{"type":44,"tag":45,"props":3770,"children":3771},{},[3772,3774,3778,3779,3785,3786,3792,3793,3797,3799,3805],{"type":49,"value":3773},"For specific head-to-head reads, see ",{"type":44,"tag":816,"props":3775,"children":3776},{"href":851},[3777],{"type":49,"value":854},{"type":49,"value":841},{"type":44,"tag":816,"props":3780,"children":3782},{"href":3781},"/comparisons/power-bi-copilot-vs-bruin/",[3783],{"type":49,"value":3784},"Power BI Copilot vs Bruin",{"type":49,"value":841},{"type":44,"tag":816,"props":3787,"children":3789},{"href":3788},"/comparisons/hex-vs-bruin/",[3790],{"type":49,"value":3791},"Hex vs Bruin",{"type":49,"value":841},{"type":44,"tag":816,"props":3794,"children":3795},{"href":836},[3796],{"type":49,"value":839},{"type":49,"value":3798},", and the ",{"type":44,"tag":816,"props":3800,"children":3802},{"href":3801},"/comparisons/ai-data-analyst-tools/",[3803],{"type":49,"value":3804},"8-tool side-by-side comparison",{"type":49,"value":864},{"type":44,"tag":62,"props":3807,"children":3808},{"id":872},[3809],{"type":49,"value":875},{"type":44,"tag":145,"props":3811,"children":3813},{"id":3812},"whats-the-difference-between-an-ai-data-analyst-and-a-bi-tool",[3814],{"type":49,"value":3815},"What's the difference between an AI data analyst and a BI tool?",{"type":44,"tag":45,"props":3817,"children":3818},{},[3819],{"type":49,"value":3820},"A BI tool builds dashboards and reports for repeating questions. An AI data analyst answers ad-hoc questions in plain English, in real time, against your live data. Typically in Slack, Teams, or a browser. The same data warehouse can feed both. Most teams in 2026 use both.",{"type":44,"tag":145,"props":3822,"children":3824},{"id":3823},"can-an-ai-data-analyst-replace-tableau-looker-or-power-bi",[3825],{"type":49,"value":3826},"Can an AI data analyst replace Tableau, Looker, or Power BI?",{"type":44,"tag":45,"props":3828,"children":3829},{},[3830],{"type":49,"value":3831},"Partially. AI analysts replace the long tail of ad-hoc questions that previously went through a BI request queue. Curated dashboards (the ones executives review daily) survive. The 2026 pattern is one AI analyst plus 10 to 20 well-chosen dashboards, not 10,000 half-used ones.",{"type":44,"tag":145,"props":3833,"children":3835},{"id":3834},"are-ai-data-analysts-accurate-enough-to-trust",[3836],{"type":49,"value":3837},"Are AI data analysts accurate enough to trust?",{"type":44,"tag":45,"props":3839,"children":3840},{},[3841],{"type":49,"value":3842},"The good ones, yes, when paired with a governed semantic layer and quality checks on the underlying data. Tools like Bruin run blocking quality checks before answers are returned and surface column-level lineage so analysts can verify what ran. Tools without that infrastructure (a chat layer on a fragile pipeline) will produce wrong answers when the source data is broken.",{"type":44,"tag":145,"props":3844,"children":3846},{"id":3845},"what-does-governed-semantic-layer-mean-and-why-does-it-matter",[3847],{"type":49,"value":3848},"What does \"governed semantic layer\" mean and why does it matter?",{"type":44,"tag":45,"props":3850,"children":3851},{},[3852],{"type":49,"value":3853},"A semantic layer is the central definition of your business metrics: what \"MRR\" or \"active customer\" actually means. Without one, two analysts asking the same question get different answers. With one, the AI and the dashboards both compute the same numbers. This is the single biggest factor in whether teams trust their AI analyst's answers.",{"type":44,"tag":145,"props":3855,"children":3857},{"id":3856},"do-ai-data-analysts-work-in-slack",[3858],{"type":49,"value":3859},"Do AI data analysts work in Slack?",{"type":44,"tag":45,"props":3861,"children":3862},{},[3863,3865,3870],{"type":49,"value":3864},"Many do. Bruin, Dot, Querio, and ThoughtSpot all have Slack integrations. Bruin additionally works in Microsoft Teams, Discord, WhatsApp, and a browser. See ",{"type":44,"tag":816,"props":3866,"children":3867},{"href":4},[3868],{"type":49,"value":3869},"the dedicated guide on Slack AI data analysts",{"type":49,"value":864},{"type":44,"tag":145,"props":3872,"children":3874},{"id":3873},"whats-cheaper-bi-tools-or-ai-data-analysts",[3875],{"type":49,"value":3876},"What's cheaper, BI tools or AI data analysts?",{"type":44,"tag":45,"props":3878,"children":3879},{},[3880],{"type":49,"value":3881},"Depends on adoption. BI tools price per-seat, which becomes expensive when you want broad self-service. AI data analysts price by usage, by team, or are open-source-cored, typically cheaper for broad read-only access. The TCO conversation in 2026 is usually about stack consolidation: how many tools can one platform replace?",{"type":44,"tag":145,"props":3883,"children":3885},{"id":3884},"can-i-use-both-an-ai-data-analyst-and-a-bi-tool",[3886],{"type":49,"value":3887},"Can I use both an AI data analyst and a BI tool?",{"type":44,"tag":45,"props":3889,"children":3890},{},[3891],{"type":49,"value":3892},"Yes, and most teams do. The pattern is: keep your highest-signal dashboards, add an AI data analyst for ad-hoc questions, make sure both share the same semantic layer. The risk is metric drift between the two layers if the semantic definitions live in different places.",{"type":44,"tag":145,"props":3894,"children":3896},{"id":3895},"will-an-ai-data-analyst-replace-data-analysts-and-analytics-engineers",[3897],{"type":49,"value":3898},"Will an AI data analyst replace data analysts and analytics engineers?",{"type":44,"tag":45,"props":3900,"children":3901},{},[3902],{"type":49,"value":3903},"No. It eliminates the time analysts spend on repetitive ticket-style questions, freeing them for higher-value work: building the semantic layer, designing pipelines, doing strategic analysis. Teams that adopt AI data analysts typically don't shrink the data team. They rebalance it toward higher-leverage work.",{"type":44,"tag":145,"props":3905,"children":3907},{"id":3906},"how-long-does-it-take-to-roll-out-an-ai-data-analyst",[3908],{"type":49,"value":3909},"How long does it take to roll out an AI data analyst?",{"type":44,"tag":45,"props":3911,"children":3912},{},[3913],{"type":49,"value":3914},"Days to first pilot, weeks to broad adoption if you follow the migration path: pick one team first (customer success or ops), shadow the AI's answers for 30 days, tune the semantic layer, then expand to other teams.",{"type":44,"tag":145,"props":3916,"children":3918},{"id":3917},"whats-the-biggest-mistake-teams-make-when-picking-between-ai-analysts-and-bi-tools",[3919],{"type":49,"value":3920},"What's the biggest mistake teams make when picking between AI analysts and BI tools?",{"type":44,"tag":45,"props":3922,"children":3923},{},[3924],{"type":49,"value":3925},"Picking only one. Teams that go all-in on AI analysts and retire all dashboards lose the standing morning views executives rely on. Teams that stay 100% on BI tools never solve the ad-hoc question problem. The right answer is a hybrid: a few high-signal dashboards plus an AI analyst, both connected to the same governed data.",{"title":7,"searchDepth":1001,"depth":1001,"links":3927},[3928,3929,3930,3931,3932,3933,3934,3935],{"id":3331,"depth":1001,"text":3334},{"id":3389,"depth":1001,"text":3392},{"id":3450,"depth":1001,"text":3453},{"id":3540,"depth":1001,"text":3543},{"id":3591,"depth":1001,"text":3594},{"id":3652,"depth":1001,"text":3655},{"id":3693,"depth":1001,"text":3696},{"id":872,"depth":1001,"text":875,"children":3936},[3937,3938,3939,3940,3941,3942,3943,3944,3945,3946],{"id":3812,"depth":1008,"text":3815},{"id":3823,"depth":1008,"text":3826},{"id":3834,"depth":1008,"text":3837},{"id":3845,"depth":1008,"text":3848},{"id":3856,"depth":1008,"text":3859},{"id":3873,"depth":1008,"text":3876},{"id":3884,"depth":1008,"text":3887},{"id":3895,"depth":1008,"text":3898},{"id":3906,"depth":1008,"text":3909},{"id":3917,"depth":1008,"text":3920},"content:blog:ai-data-analyst-vs-traditional-bi.md","blog/ai-data-analyst-vs-traditional-bi.md","blog/ai-data-analyst-vs-traditional-bi",{"_path":3951,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":3952,"description":3953,"coverImage":3954,"coverPosition":3955,"date":3956,"readingTime":3957,"category":3958,"tags":3959,"author":3969,"body":3973,"_type":1036,"_id":7852,"_source":1038,"_file":7853,"_stem":7854,"_extension":1041},"/blog/ai-skepticism-in-data-engineering","Why It's Reasonable to Be Skeptical About AI in Data - and Why It's Fixable","A practical framework for building an AI context layer using open-source tools, turning skepticism about AI in data engineering into a working solution with self-healing pipelines and iterative team adoption.","/img/blog/covers/ai-skepticism.png","bottom","2026-04-21",25,"Opinion",[3960,3961,3962,3963,3964,3965,3966,3967,29,3968,28,15],"AI","data engineering","data quality","context layer","self-healing pipelines","open source","MCP","data governance","technical",{"name":3970,"role":3971,"image":3972},"Arsalan Noorafkan","Developer Advocate","/img/blog/arsalan.png",{"type":41,"children":3974,"toc":7820},[3975,3980,3985,3990,3995,3999,4005,4010,4015,4020,4025,4030,4033,4039,4044,4049,4054,4059,4062,4068,4073,4114,4119,4124,4129,4152,4158,4163,4192,4197,4210,4215,4220,4225,4292,4295,4301,4306,4311,4316,4322,4327,4334,4383,4389,4457,4463,4468,4512,4525,4783,4789,4801,4819,4824,4852,5477,5490,5496,5501,5506,5963,5968,6080,6086,6091,6096,6261,6267,6272,6447,6450,6456,6461,6466,6471,6476,6481,6486,6492,6510,6516,6529,6534,6660,6666,6684,6690,6695,6700,6705,6820,6823,6829,6858,6863,6868,6873,6878,6935,7372,7393,7396,7402,7407,7413,7418,7423,7428,7433,7496,7501,7507,7512,7517,7522,7534,7539,7544,7572,7577,7583,7588,7593,7598,7603,7617,7622,7627,7630,7636,7641,7646,7651,7674,7679,7684,7690,7695,7700,7713,7718,7731,7737,7742,7770,7775,7781,7786,7804,7809,7814],{"type":44,"tag":45,"props":3976,"children":3977},{},[3978],{"type":49,"value":3979},"I was quite skeptical about AI coding agents, and honestly for a while I think I was right to be. I'd try them, the agent would hallucinate something that doesn't exist or generate 400 lines of code I couldn't even meaningfully review. Every time I'd walk away thinking \"this just created more work for me\". What changed was realizing the problem wasn't the agent, it was me. I was throwing it at a codebase with zero context and expecting magic, which is something I would never do with a real engineer joining the team.",{"type":44,"tag":45,"props":3981,"children":3982},{},[3983],{"type":49,"value":3984},"This is the key difference between AI in data versus software engineering - in software, the code breaks or the result is visibly wrong, but in data the agent returns a confident response and validating it takes longer, so people either blindly trust it or become too skeptical to even try it. The problem is rooted in the inability to create and maintain the context layer - and this is usually a time constraint, not a money one.",{"type":44,"tag":45,"props":3986,"children":3987},{},[3988],{"type":49,"value":3989},"Most teams don't have proper documentation or data governance, so when a new hire joins they read the pipeline code, query the tables, and ask questions. That's exactly what an LLM needs to do too. Your existing pipelines, models, and data warehouse already have most of the context you need, and you just have to organize it. This framework proposes giving agents access to existing open-source tools and a set of specific instructions that utilize the agents' ability to perform a constant loop of scanning pipelines, querying tables, and reading metadata and logs to update the model/assets files inside pipelines with descriptions, definitions, tags, quality checks, and additional metadata. This way your context also lives right inside the files that contain the SQL, Python, YML, etc. files in your pipeline - instead of creating a separate system, database, knowledge base, or some other vendor-locked format.",{"type":44,"tag":45,"props":3991,"children":3992},{},[3993],{"type":49,"value":3994},"In this post I'll break down why the skepticism is valid, why the root cause is missing context and not model quality, and then walk through how to actually build that context layer using open-source CLI tools, SQL, Python, and LLMs. We'll also get into self-healing pipeline tasks that keep the data and context healthy, and how to manage the transition with your team and stakeholders - because the technical solution is only half of it.",{"type":44,"tag":3996,"props":3997,"children":3998},"hr",{},[],{"type":44,"tag":62,"props":4000,"children":4002},{"id":4001},"why-the-skepticism-is-reasonable",[4003],{"type":49,"value":4004},"Why the Skepticism Is Reasonable",{"type":44,"tag":45,"props":4006,"children":4007},{},[4008],{"type":49,"value":4009},"Trust is essential when it comes to working with data - if you lose the trust of the data consumers, then all the pipelines, tables, and reports lose their value. This was already an issue even when only humans were involved, but now with the introduction of AI agents trying to make changes to pipelines and tables or creating dashboards and reports, the issue has reached a critical point.",{"type":44,"tag":45,"props":4011,"children":4012},{},[4013],{"type":49,"value":4014},"Here's how my journey started... 8 months ago I wanted to troubleshoot some missing data. I finally set up Bruin MCP in Cursor (also after resisting to use Cursor in the first place), asked it to query every table in the downstream lineage of the raw table to find where the missing data happens. It almost correctly found where the problem was but without me asking it, it changed the query by changing an inner join to a left join, in addition to completely messing up all the existing inline comments and asset definitions. I was so frustrated I immediately deleted the branch, opened VS Code and created a new branch and went back to doing it myself. Every time I tried it, I was disappointed. But to be honest, I was testing its limits by giving a vague prompt and expecting magic - and quite frankly, that's exactly how I'd feel with interns and juniors too, I give them a task like \"investigate the missing data\" without giving them any context and then they submit a PR where they ALSO changed the inner to right join.",{"type":44,"tag":45,"props":4016,"children":4017},{},[4018],{"type":49,"value":4019},"Around 2 months after my first attempt with AI, I was in the process of completing a major pipeline redesign that was a business critical and operational pipeline. It also coincided with my knowledge transfer and offboarding from the company. So I finally did it - I locked myself in my office at home for a week and as I built the new pipeline (this time with some help from Cursor) but I really put effort into writing down all the business context inside a pipeline readme file with also full explanation of the pipeline schedule & orchestration logic, as well as inline comments to each CTE explaining what/why of the logic and custom quality checks that acted as unit tests so that if a future person/agent makes a change that fundamentally changes the table then the check would fail (e.g. the aggregation level). This was not easy but by the end of it, I was able to ask Cursor to query the data for me, enhance the table & column level descriptions, run the pipeline, and even finally help with investigations and troubleshooting.",{"type":44,"tag":45,"props":4021,"children":4022},{},[4023],{"type":49,"value":4024},"Albeit the models and MCP servers have improved since then, but I learned that patience is key - the same way that hiring and onboarding a new engineer would be. A week or two of handholding will go a long way.",{"type":44,"tag":45,"props":4026,"children":4027},{},[4028],{"type":49,"value":4029},"My journey from extreme skepticism to now using Conductor to have a dozen different agents working like minions on different things has been transformational and quite shocking to myself even. Now let's dive deeper into the details.",{"type":44,"tag":3996,"props":4031,"children":4032},{},[],{"type":44,"tag":62,"props":4034,"children":4036},{"id":4035},"the-root-problem-bad-context-is-a-symptom-not-the-problem",[4037],{"type":49,"value":4038},"The Root Problem: Bad Context is a Symptom, Not the Problem",{"type":44,"tag":45,"props":4040,"children":4041},{},[4042],{"type":49,"value":4043},"Missing or weak context is not the root problem but rather just a symptom. The problem is rooted in the inability to create and maintain the context layer - and this is usually a time constraint, not a money one. Even expensive and sophisticated services require a substantial investment of time and effort to deploy and maintain. Even when it is done, new models and frameworks fundamentally disrupt previous implementations and make them obsolete.",{"type":44,"tag":45,"props":4045,"children":4046},{},[4047],{"type":49,"value":4048},"There have been attempts at building context managers for data stacks, but they are quite often made obsolete with new models that handle context better. This normally involves complex processes to extract information from the pipelines and warehouse, as well as people's minds, and loading them into isolated systems (very often vendor-locked) that are solely set up for context management - think of vector DBs, RAGs, MCPs, etc. Separate systems are hard to integrate into the existing workflows and processes of data teams and architecture, which demands a significant commitment of time and effort; especially when such systems are threatened by disruptive models.",{"type":44,"tag":45,"props":4050,"children":4051},{},[4052],{"type":49,"value":4053},"There's also a contrary belief that new models with bigger context windows can sift through all the pipelines and warehouse metadata to obtain the context - but setting aside the needle in a haystack problem, this doesn't solve the problem of stale or wrong information and if the agents were to validate everything by querying every table, they would then have to do this every time a session is started and the warehouse costs will explode (not even considering how slow it would be).",{"type":44,"tag":45,"props":4055,"children":4056},{},[4057],{"type":49,"value":4058},"The \"inability\" to create and maintain a context layer is also a symptom of what data engineers' roles have become. In between adhoc requests, fixing broken pipelines, integrating new data sources, and so on... it becomes difficult to allocate time to such things. But I still think that the \"inability\" is tied into the complexity, effort, and prioritization constraints caused by using the wrong tools, and even more importantly the weak change management and implementation plan. Which is why we will dive deeper into \"what\" tools to use and \"how\" to implement it.",{"type":44,"tag":3996,"props":4060,"children":4061},{},[],{"type":44,"tag":62,"props":4063,"children":4065},{"id":4064},"onboard-your-ai-like-a-new-hire",[4066],{"type":49,"value":4067},"Onboard Your AI Like a New Hire",{"type":44,"tag":45,"props":4069,"children":4070},{},[4071],{"type":49,"value":4072},"Here's the classic onboarding process of a new data engineer, scientist, or analyst:",{"type":44,"tag":74,"props":4074,"children":4075},{},[4076,4081,4086,4099,4104,4109],{"type":44,"tag":78,"props":4077,"children":4078},{},[4079],{"type":49,"value":4080},"they start with getting access to the repo, pipelines, warehouse, and any available documentation",{"type":44,"tag":78,"props":4082,"children":4083},{},[4084],{"type":49,"value":4085},"they ask \"what should I focus on\" - in other words, what are the current active/operational pipelines and tables",{"type":44,"tag":78,"props":4087,"children":4088},{},[4089,4091,4097],{"type":49,"value":4090},"they start with opening a table and running a ",{"type":44,"tag":162,"props":4092,"children":4094},{"className":4093},[],[4095],{"type":49,"value":4096},"select * from xyz limit 10",{"type":49,"value":4098}," to see what the table looks like",{"type":44,"tag":78,"props":4100,"children":4101},{},[4102],{"type":49,"value":4103},"they cross-reference the table with the pipeline and lineage to understand where the data comes from and how it is processed",{"type":44,"tag":78,"props":4105,"children":4106},{},[4107],{"type":49,"value":4108},"they will start investigating the why/how - so they start running a few more queries, checking the Python & SQL code, and reading table/column descriptions and any inline comments and documentations",{"type":44,"tag":78,"props":4110,"children":4111},{},[4112],{"type":49,"value":4113},"lastly, they will talk to data consumers and read the queries coming from users and dashboards to understand where/how the data is actually used",{"type":44,"tag":45,"props":4115,"children":4116},{},[4117],{"type":49,"value":4118},"This framework proposes giving agents access to tools and a set of specific instructions that utilize the agents' ability to perform a constant loop of scanning pipelines, querying tables, and reading metadata and logs to update the model/assets files inside pipelines with descriptions, definitions, tags, quality checks, and additional metadata. This task can be built into the pipeline itself so that it constantly updates the context. Essentially identical to the exact same process a new hire does - they don't read the documentation (there usually isn't any), they read the pipeline code, query the tables, and then ask questions.",{"type":44,"tag":45,"props":4120,"children":4121},{},[4122],{"type":49,"value":4123},"I'll be honest, anytime I hired someone (or even when I joined a company myself) the first task was to create/update the docs in the pipeline. This is a great way to create and maintain docs, but if it takes a new hire to do, then it's definitely not a reliable solution. Also, let's be honest, after the initial onboarding everyone is too busy to really maintain the docs which is why it becomes stale - and this is very dangerous for AI because it assumes the docs are correct and will rely on them to generate text-to-sql, resulting in garbage output.",{"type":44,"tag":45,"props":4125,"children":4126},{},[4127],{"type":49,"value":4128},"There are a few core principles of this framework:",{"type":44,"tag":74,"props":4130,"children":4131},{},[4132,4137,4142,4147],{"type":44,"tag":78,"props":4133,"children":4134},{},[4135],{"type":49,"value":4136},"keep it simple (no new tech)",{"type":44,"tag":78,"props":4138,"children":4139},{},[4140],{"type":49,"value":4141},"keep it inside existing systems (no extra configs)",{"type":44,"tag":78,"props":4143,"children":4144},{},[4145],{"type":49,"value":4146},"keep it iterative (no magic pill)",{"type":44,"tag":78,"props":4148,"children":4149},{},[4150],{"type":49,"value":4151},"keep it human (no black box)",{"type":44,"tag":145,"props":4153,"children":4155},{"id":4154},"the-socratic-method-require-the-agent-to-ask-questions",[4156],{"type":49,"value":4157},"The Socratic Method: Require the Agent to Ask Questions",{"type":44,"tag":45,"props":4159,"children":4160},{},[4161],{"type":49,"value":4162},"Building these tasks inside the pipelines allows the agents to get 90% of the metadata and context under control, while delivering the 10% as a set of questions and tasks that someone in the data team should resolve. It is also important to build this step into existing workflows - for example, sending a message in Slack and tagging the team that can answer. It will look something like:",{"type":44,"tag":74,"props":4164,"children":4165},{},[4166,4179],{"type":44,"tag":78,"props":4167,"children":4168},{},[4169,4171],{"type":49,"value":4170},"@marketing-emea is the Q2 ARPDAU target increase for Germany really 500%?\n",{"type":44,"tag":74,"props":4172,"children":4173},{},[4174],{"type":44,"tag":78,"props":4175,"children":4176},{},[4177],{"type":49,"value":4178},"marketing-emea: yes that is normal, we launched a new marketing campaign (ID: 1234) and we increased the target",{"type":44,"tag":78,"props":4180,"children":4181},{},[4182,4184],{"type":49,"value":4183},"@data-eng is it normal that table xyz_f hasn't been updated since last month?\n",{"type":44,"tag":74,"props":4185,"children":4186},{},[4187],{"type":44,"tag":78,"props":4188,"children":4189},{},[4190],{"type":49,"value":4191},"data-eng: yes that is normal, that is a legacy table and the correct table is xyz_t",{"type":44,"tag":45,"props":4193,"children":4194},{},[4195],{"type":49,"value":4196},"The ultimate goal is not to eliminate the human involvement in managing the context, but reducing it down to a digestible amount. This helps breakdown the tasks/questions into 2 categories:",{"type":44,"tag":74,"props":4198,"children":4199},{},[4200,4205],{"type":44,"tag":78,"props":4201,"children":4202},{},[4203],{"type":49,"value":4204},"ones that are answered naturally through conversations like in Slack",{"type":44,"tag":78,"props":4206,"children":4207},{},[4208],{"type":49,"value":4209},"creates a backlog of tasks (in Jira, Linear, GitHub Issues) for the data team to address",{"type":44,"tag":45,"props":4211,"children":4212},{},[4213],{"type":49,"value":4214},"The key here is that the agent should be instructed to ask questions when it encounters ambiguity rather than guessing - and those questions need to be surfaced to the right people, whether that's a Slack message, a PR comment, or a ticket in Linear. This is exactly what a good new hire does, they ask a lot of questions early on and that's a good thing. The difference is that every time someone answers one of these questions, the answer gets written back into the asset metadata or the glossary as a permanent record. So the context layer doesn't just get built once, it gets built continuously through every interaction and every question that gets answered.",{"type":44,"tag":45,"props":4216,"children":4217},{},[4218],{"type":49,"value":4219},"I'm sorry for being blunt, but AI is not lazy like us humans - if you instruct it to always follow the same process and update the docs then it will do it, there's no \"oh I forgot\" or \"I'll do that later\".",{"type":44,"tag":45,"props":4221,"children":4222},{},[4223],{"type":49,"value":4224},"Here's a concrete example of this socratic method:",{"type":44,"tag":74,"props":4226,"children":4227},{},[4228,4247,4252,4272,4277,4282,4287],{"type":44,"tag":78,"props":4229,"children":4230},{},[4231,4233,4239,4241],{"type":49,"value":4232},"the agent is analyzing the ",{"type":44,"tag":162,"props":4234,"children":4236},{"className":4235},[],[4237],{"type":49,"value":4238},"orders",{"type":49,"value":4240}," table and sees a column called ",{"type":44,"tag":162,"props":4242,"children":4244},{"className":4243},[],[4245],{"type":49,"value":4246},"total_amount",{"type":44,"tag":78,"props":4248,"children":4249},{},[4250],{"type":49,"value":4251},"it doesn't know if this is gross revenue or net revenue after refunds",{"type":44,"tag":78,"props":4253,"children":4254},{},[4255,4257,4262,4264,4270],{"type":49,"value":4256},"instead of assuming, it flags it: \"the column ",{"type":44,"tag":162,"props":4258,"children":4260},{"className":4259},[],[4261],{"type":49,"value":4246},{"type":49,"value":4263}," in ",{"type":44,"tag":162,"props":4265,"children":4267},{"className":4266},[],[4268],{"type":49,"value":4269},"analytics.orders",{"type":49,"value":4271}," has no description - is this gross or net revenue? should refunded orders be excluded?\"",{"type":44,"tag":78,"props":4273,"children":4274},{},[4275],{"type":49,"value":4276},"data team answers in Slack \"net revenue after refunds, exclude cancelled orders\"",{"type":44,"tag":78,"props":4278,"children":4279},{},[4280],{"type":49,"value":4281},"that answer then gets written back into the asset file as the column description and into the glossary under the Revenue entity",{"type":44,"tag":78,"props":4283,"children":4284},{},[4285],{"type":49,"value":4286},"based on the permissions and instructions, it will push it or make a PR for review",{"type":44,"tag":78,"props":4288,"children":4289},{},[4290],{"type":49,"value":4291},"next time any agent or any new hire encounters that column, the answer is already there",{"type":44,"tag":3996,"props":4293,"children":4294},{},[],{"type":44,"tag":62,"props":4296,"children":4298},{"id":4297},"building-the-context-layer-a-technical-deep-dive",[4299],{"type":49,"value":4300},"Building the Context Layer: A Technical Deep Dive",{"type":44,"tag":45,"props":4302,"children":4303},{},[4304],{"type":49,"value":4305},"I know it is easier said than done and I'd be lying if I said it is magic, it definitely is not. The goal here is to make it easier and faster to get started on building the semantic layer, but more importantly making it easier to maintain.",{"type":44,"tag":45,"props":4307,"children":4308},{},[4309],{"type":49,"value":4310},"In the example below I will utilize Bruin's open-source CLI features but the same principles and methodology apply to any tool out there.",{"type":44,"tag":45,"props":4312,"children":4313},{},[4314],{"type":49,"value":4315},"If you're already using Bruin for your data pipelines, step 1 and 2 will be irrelevant since you already have pipelines and tables/assets.",{"type":44,"tag":145,"props":4317,"children":4319},{"id":4318},"step-1-scaffold-and-connect",[4320],{"type":49,"value":4321},"Step 1: Scaffold and Connect",{"type":44,"tag":45,"props":4323,"children":4324},{},[4325],{"type":49,"value":4326},"Set up your connection to your database/warehouse - keep in mind that this connection and its permissions will be used by the agent so make sure it is secure.",{"type":44,"tag":4328,"props":4329,"children":4331},"h4",{"id":4330},"create-a-new-projectrepo",[4332],{"type":49,"value":4333},"Create a new project/repo",{"type":44,"tag":4335,"props":4336,"children":4340},"pre",{"className":4337,"code":4338,"language":4339,"meta":7,"style":7},"language-bash shiki shiki-themes github-dark","bruin init empty my-analytics\ncd my-analytics\n","bash",[4341],{"type":44,"tag":162,"props":4342,"children":4343},{"__ignoreMap":7},[4344,4370],{"type":44,"tag":2735,"props":4345,"children":4348},{"class":4346,"line":4347},"line",1,[4349,4354,4360,4365],{"type":44,"tag":2735,"props":4350,"children":4352},{"style":4351},"--shiki-default:#B392F0",[4353],{"type":49,"value":19},{"type":44,"tag":2735,"props":4355,"children":4357},{"style":4356},"--shiki-default:#9ECBFF",[4358],{"type":49,"value":4359}," init",{"type":44,"tag":2735,"props":4361,"children":4362},{"style":4356},[4363],{"type":49,"value":4364}," empty",{"type":44,"tag":2735,"props":4366,"children":4367},{"style":4356},[4368],{"type":49,"value":4369}," my-analytics\n",{"type":44,"tag":2735,"props":4371,"children":4372},{"class":4346,"line":1001},[4373,4379],{"type":44,"tag":2735,"props":4374,"children":4376},{"style":4375},"--shiki-default:#79B8FF",[4377],{"type":49,"value":4378},"cd",{"type":44,"tag":2735,"props":4380,"children":4381},{"style":4356},[4382],{"type":49,"value":4369},{"type":44,"tag":4328,"props":4384,"children":4386},{"id":4385},"create-the-connection",[4387],{"type":49,"value":4388},"Create the connection",{"type":44,"tag":4335,"props":4390,"children":4392},{"className":4337,"code":4391,"language":4339,"meta":7,"style":7},"bruin connections add --type bigquery --name my-dwh\nbruin connections test --name my-dwh\n",[4393],{"type":44,"tag":162,"props":4394,"children":4395},{"__ignoreMap":7},[4396,4433],{"type":44,"tag":2735,"props":4397,"children":4398},{"class":4346,"line":4347},[4399,4403,4408,4413,4418,4423,4428],{"type":44,"tag":2735,"props":4400,"children":4401},{"style":4351},[4402],{"type":49,"value":19},{"type":44,"tag":2735,"props":4404,"children":4405},{"style":4356},[4406],{"type":49,"value":4407}," connections",{"type":44,"tag":2735,"props":4409,"children":4410},{"style":4356},[4411],{"type":49,"value":4412}," add",{"type":44,"tag":2735,"props":4414,"children":4415},{"style":4375},[4416],{"type":49,"value":4417}," --type",{"type":44,"tag":2735,"props":4419,"children":4420},{"style":4356},[4421],{"type":49,"value":4422}," bigquery",{"type":44,"tag":2735,"props":4424,"children":4425},{"style":4375},[4426],{"type":49,"value":4427}," --name",{"type":44,"tag":2735,"props":4429,"children":4430},{"style":4356},[4431],{"type":49,"value":4432}," my-dwh\n",{"type":44,"tag":2735,"props":4434,"children":4435},{"class":4346,"line":1001},[4436,4440,4444,4449,4453],{"type":44,"tag":2735,"props":4437,"children":4438},{"style":4351},[4439],{"type":49,"value":19},{"type":44,"tag":2735,"props":4441,"children":4442},{"style":4356},[4443],{"type":49,"value":4407},{"type":44,"tag":2735,"props":4445,"children":4446},{"style":4356},[4447],{"type":49,"value":4448}," test",{"type":44,"tag":2735,"props":4450,"children":4451},{"style":4375},[4452],{"type":49,"value":4427},{"type":44,"tag":2735,"props":4454,"children":4455},{"style":4356},[4456],{"type":49,"value":4432},{"type":44,"tag":145,"props":4458,"children":4460},{"id":4459},"step-2-import-your-existing-schema",[4461],{"type":49,"value":4462},"Step 2: Import Your Existing Schema",{"type":44,"tag":45,"props":4464,"children":4465},{},[4466],{"type":49,"value":4467},"Let's get started by bringing in the basic schema of our tables, this will create a skeleton \"pipeline\" which consists of empty assets (no SQL code) that represent each table.",{"type":44,"tag":4335,"props":4469,"children":4471},{"className":4337,"code":4470,"language":4339,"meta":7,"style":7},"bruin import database --connection my-dwh --schema analytics\n",[4472],{"type":44,"tag":162,"props":4473,"children":4474},{"__ignoreMap":7},[4475],{"type":44,"tag":2735,"props":4476,"children":4477},{"class":4346,"line":4347},[4478,4482,4487,4492,4497,4502,4507],{"type":44,"tag":2735,"props":4479,"children":4480},{"style":4351},[4481],{"type":49,"value":19},{"type":44,"tag":2735,"props":4483,"children":4484},{"style":4356},[4485],{"type":49,"value":4486}," import",{"type":44,"tag":2735,"props":4488,"children":4489},{"style":4356},[4490],{"type":49,"value":4491}," database",{"type":44,"tag":2735,"props":4493,"children":4494},{"style":4375},[4495],{"type":49,"value":4496}," --connection",{"type":44,"tag":2735,"props":4498,"children":4499},{"style":4356},[4500],{"type":49,"value":4501}," my-dwh",{"type":44,"tag":2735,"props":4503,"children":4504},{"style":4375},[4505],{"type":49,"value":4506}," --schema",{"type":44,"tag":2735,"props":4508,"children":4509},{"style":4356},[4510],{"type":49,"value":4511}," analytics\n",{"type":44,"tag":45,"props":4513,"children":4514},{},[4515,4517,4523],{"type":49,"value":4516},"The ",{"type":44,"tag":162,"props":4518,"children":4520},{"className":4519},[],[4521],{"type":49,"value":4522},"bruin import database",{"type":49,"value":4524}," will create empty assets like this:",{"type":44,"tag":4335,"props":4526,"children":4530},{"className":4527,"code":4528,"language":4529,"meta":7,"style":7},"language-yaml shiki shiki-themes github-dark","# assets/analytics/orders.asset.yml (before enhancement)\nname: analytics.orders\ntype: bq.source\ncolumns:\n  - name: order_id\n    type: INTEGER\n  - name: customer_id\n    type: INTEGER\n  - name: status\n    type: VARCHAR\n  - name: total_amount\n    type: FLOAT\n  - name: created_at\n    type: TIMESTAMP\n","yaml",[4531],{"type":44,"tag":162,"props":4532,"children":4533},{"__ignoreMap":7},[4534,4543,4563,4580,4594,4616,4634,4655,4671,4692,4709,4730,4746,4767],{"type":44,"tag":2735,"props":4535,"children":4536},{"class":4346,"line":4347},[4537],{"type":44,"tag":2735,"props":4538,"children":4540},{"style":4539},"--shiki-default:#6A737D",[4541],{"type":49,"value":4542},"# assets/analytics/orders.asset.yml (before enhancement)\n",{"type":44,"tag":2735,"props":4544,"children":4545},{"class":4346,"line":1001},[4546,4552,4558],{"type":44,"tag":2735,"props":4547,"children":4549},{"style":4548},"--shiki-default:#85E89D",[4550],{"type":49,"value":4551},"name",{"type":44,"tag":2735,"props":4553,"children":4555},{"style":4554},"--shiki-default:#E1E4E8",[4556],{"type":49,"value":4557},": ",{"type":44,"tag":2735,"props":4559,"children":4560},{"style":4356},[4561],{"type":49,"value":4562},"analytics.orders\n",{"type":44,"tag":2735,"props":4564,"children":4565},{"class":4346,"line":1008},[4566,4571,4575],{"type":44,"tag":2735,"props":4567,"children":4568},{"style":4548},[4569],{"type":49,"value":4570},"type",{"type":44,"tag":2735,"props":4572,"children":4573},{"style":4554},[4574],{"type":49,"value":4557},{"type":44,"tag":2735,"props":4576,"children":4577},{"style":4356},[4578],{"type":49,"value":4579},"bq.source\n",{"type":44,"tag":2735,"props":4581,"children":4583},{"class":4346,"line":4582},4,[4584,4589],{"type":44,"tag":2735,"props":4585,"children":4586},{"style":4548},[4587],{"type":49,"value":4588},"columns",{"type":44,"tag":2735,"props":4590,"children":4591},{"style":4554},[4592],{"type":49,"value":4593},":\n",{"type":44,"tag":2735,"props":4595,"children":4597},{"class":4346,"line":4596},5,[4598,4603,4607,4611],{"type":44,"tag":2735,"props":4599,"children":4600},{"style":4554},[4601],{"type":49,"value":4602},"  - ",{"type":44,"tag":2735,"props":4604,"children":4605},{"style":4548},[4606],{"type":49,"value":4551},{"type":44,"tag":2735,"props":4608,"children":4609},{"style":4554},[4610],{"type":49,"value":4557},{"type":44,"tag":2735,"props":4612,"children":4613},{"style":4356},[4614],{"type":49,"value":4615},"order_id\n",{"type":44,"tag":2735,"props":4617,"children":4619},{"class":4346,"line":4618},6,[4620,4625,4629],{"type":44,"tag":2735,"props":4621,"children":4622},{"style":4548},[4623],{"type":49,"value":4624},"    type",{"type":44,"tag":2735,"props":4626,"children":4627},{"style":4554},[4628],{"type":49,"value":4557},{"type":44,"tag":2735,"props":4630,"children":4631},{"style":4356},[4632],{"type":49,"value":4633},"INTEGER\n",{"type":44,"tag":2735,"props":4635,"children":4637},{"class":4346,"line":4636},7,[4638,4642,4646,4650],{"type":44,"tag":2735,"props":4639,"children":4640},{"style":4554},[4641],{"type":49,"value":4602},{"type":44,"tag":2735,"props":4643,"children":4644},{"style":4548},[4645],{"type":49,"value":4551},{"type":44,"tag":2735,"props":4647,"children":4648},{"style":4554},[4649],{"type":49,"value":4557},{"type":44,"tag":2735,"props":4651,"children":4652},{"style":4356},[4653],{"type":49,"value":4654},"customer_id\n",{"type":44,"tag":2735,"props":4656,"children":4658},{"class":4346,"line":4657},8,[4659,4663,4667],{"type":44,"tag":2735,"props":4660,"children":4661},{"style":4548},[4662],{"type":49,"value":4624},{"type":44,"tag":2735,"props":4664,"children":4665},{"style":4554},[4666],{"type":49,"value":4557},{"type":44,"tag":2735,"props":4668,"children":4669},{"style":4356},[4670],{"type":49,"value":4633},{"type":44,"tag":2735,"props":4672,"children":4674},{"class":4346,"line":4673},9,[4675,4679,4683,4687],{"type":44,"tag":2735,"props":4676,"children":4677},{"style":4554},[4678],{"type":49,"value":4602},{"type":44,"tag":2735,"props":4680,"children":4681},{"style":4548},[4682],{"type":49,"value":4551},{"type":44,"tag":2735,"props":4684,"children":4685},{"style":4554},[4686],{"type":49,"value":4557},{"type":44,"tag":2735,"props":4688,"children":4689},{"style":4356},[4690],{"type":49,"value":4691},"status\n",{"type":44,"tag":2735,"props":4693,"children":4695},{"class":4346,"line":4694},10,[4696,4700,4704],{"type":44,"tag":2735,"props":4697,"children":4698},{"style":4548},[4699],{"type":49,"value":4624},{"type":44,"tag":2735,"props":4701,"children":4702},{"style":4554},[4703],{"type":49,"value":4557},{"type":44,"tag":2735,"props":4705,"children":4706},{"style":4356},[4707],{"type":49,"value":4708},"VARCHAR\n",{"type":44,"tag":2735,"props":4710,"children":4712},{"class":4346,"line":4711},11,[4713,4717,4721,4725],{"type":44,"tag":2735,"props":4714,"children":4715},{"style":4554},[4716],{"type":49,"value":4602},{"type":44,"tag":2735,"props":4718,"children":4719},{"style":4548},[4720],{"type":49,"value":4551},{"type":44,"tag":2735,"props":4722,"children":4723},{"style":4554},[4724],{"type":49,"value":4557},{"type":44,"tag":2735,"props":4726,"children":4727},{"style":4356},[4728],{"type":49,"value":4729},"total_amount\n",{"type":44,"tag":2735,"props":4731,"children":4732},{"class":4346,"line":3296},[4733,4737,4741],{"type":44,"tag":2735,"props":4734,"children":4735},{"style":4548},[4736],{"type":49,"value":4624},{"type":44,"tag":2735,"props":4738,"children":4739},{"style":4554},[4740],{"type":49,"value":4557},{"type":44,"tag":2735,"props":4742,"children":4743},{"style":4356},[4744],{"type":49,"value":4745},"FLOAT\n",{"type":44,"tag":2735,"props":4747,"children":4749},{"class":4346,"line":4748},13,[4750,4754,4758,4762],{"type":44,"tag":2735,"props":4751,"children":4752},{"style":4554},[4753],{"type":49,"value":4602},{"type":44,"tag":2735,"props":4755,"children":4756},{"style":4548},[4757],{"type":49,"value":4551},{"type":44,"tag":2735,"props":4759,"children":4760},{"style":4554},[4761],{"type":49,"value":4557},{"type":44,"tag":2735,"props":4763,"children":4764},{"style":4356},[4765],{"type":49,"value":4766},"created_at\n",{"type":44,"tag":2735,"props":4768,"children":4769},{"class":4346,"line":12},[4770,4774,4778],{"type":44,"tag":2735,"props":4771,"children":4772},{"style":4548},[4773],{"type":49,"value":4624},{"type":44,"tag":2735,"props":4775,"children":4776},{"style":4554},[4777],{"type":49,"value":4557},{"type":44,"tag":2735,"props":4779,"children":4780},{"style":4356},[4781],{"type":49,"value":4782},"TIMESTAMP\n",{"type":44,"tag":145,"props":4784,"children":4786},{"id":4785},"step-3-ai-powered-metadata-enrichment",[4787],{"type":49,"value":4788},"Step 3: AI-Powered Metadata Enrichment",{"type":44,"tag":45,"props":4790,"children":4791},{},[4792,4793,4799],{"type":49,"value":4516},{"type":44,"tag":162,"props":4794,"children":4796},{"className":4795},[],[4797],{"type":49,"value":4798},"ai enhance",{"type":49,"value":4800}," command analyzes each table as a data analyst would traditionally do, everything from checking min/max/unique values for each column to finding the aggregation level and so on, then adding all that metadata to the context files it creates.",{"type":44,"tag":45,"props":4802,"children":4803},{},[4804,4806,4811,4813],{"type":49,"value":4805},"At its core, this ",{"type":44,"tag":162,"props":4807,"children":4809},{"className":4808},[],[4810],{"type":49,"value":4798},{"type":49,"value":4812}," feature is just a long prompt to the agent instructing it to analyze the data - you can check out the repo to see the prompt: ",{"type":44,"tag":816,"props":4814,"children":4816},{"href":826,"rel":4815},[828],[4817],{"type":49,"value":4818},"github.com/bruin-data/bruin",{"type":44,"tag":45,"props":4820,"children":4821},{},[4822],{"type":49,"value":4823},"This function will generate table and column level descriptions, tags, quality checks, and table metadata.",{"type":44,"tag":4335,"props":4825,"children":4827},{"className":4337,"code":4826,"language":4339,"meta":7,"style":7},"bruin ai enhance my-analytics\n",[4828],{"type":44,"tag":162,"props":4829,"children":4830},{"__ignoreMap":7},[4831],{"type":44,"tag":2735,"props":4832,"children":4833},{"class":4346,"line":4347},[4834,4838,4843,4848],{"type":44,"tag":2735,"props":4835,"children":4836},{"style":4351},[4837],{"type":49,"value":19},{"type":44,"tag":2735,"props":4839,"children":4840},{"style":4356},[4841],{"type":49,"value":4842}," ai",{"type":44,"tag":2735,"props":4844,"children":4845},{"style":4356},[4846],{"type":49,"value":4847}," enhance",{"type":44,"tag":2735,"props":4849,"children":4850},{"style":4356},[4851],{"type":49,"value":4369},{"type":44,"tag":4335,"props":4853,"children":4855},{"className":4527,"code":4854,"language":4529,"meta":7,"style":7},"# assets/analytics/orders.asset.yml (after enhancement)\nname: analytics.orders\ntype: bq.source\ndescription: \"Customer orders with purchase details and fulfillment status. One row per order. Granularity: order-level.\"\ntags:\n  - ecommerce\n  - transactions\ncolumns:\n  - name: order_id\n    type: INTEGER\n    description: \"Unique identifier for each order\"\n    checks:\n      - name: not_null\n      - name: unique\n  - name: customer_id\n    type: INTEGER\n    description: \"Foreign key to analytics.customers\"\n    checks:\n      - name: not_null\n  - name: status\n    type: VARCHAR\n    description: \"Current fulfillment status of the order\"\n    checks:\n      - name: accepted_values\n        value: [\"pending\", \"shipped\", \"delivered\", \"refunded\"]\n  - name: total_amount\n    type: FLOAT\n    description: \"Net order total in USD after discounts, before tax\"\n    checks:\n      - name: not_null\n      - name: positive\n  - name: created_at\n    type: TIMESTAMP\n    description: \"Timestamp when the order was placed (UTC)\"\n    checks:\n      - name: not_null\n",[4856],{"type":44,"tag":162,"props":4857,"children":4858},{"__ignoreMap":7},[4859,4867,4882,4897,4914,4926,4938,4950,4961,4980,4995,5012,5024,5045,5065,5085,5101,5118,5130,5150,5170,5186,5203,5215,5236,5286,5306,5322,5339,5351,5371,5392,5412,5428,5445,5457],{"type":44,"tag":2735,"props":4860,"children":4861},{"class":4346,"line":4347},[4862],{"type":44,"tag":2735,"props":4863,"children":4864},{"style":4539},[4865],{"type":49,"value":4866},"# assets/analytics/orders.asset.yml (after enhancement)\n",{"type":44,"tag":2735,"props":4868,"children":4869},{"class":4346,"line":1001},[4870,4874,4878],{"type":44,"tag":2735,"props":4871,"children":4872},{"style":4548},[4873],{"type":49,"value":4551},{"type":44,"tag":2735,"props":4875,"children":4876},{"style":4554},[4877],{"type":49,"value":4557},{"type":44,"tag":2735,"props":4879,"children":4880},{"style":4356},[4881],{"type":49,"value":4562},{"type":44,"tag":2735,"props":4883,"children":4884},{"class":4346,"line":1008},[4885,4889,4893],{"type":44,"tag":2735,"props":4886,"children":4887},{"style":4548},[4888],{"type":49,"value":4570},{"type":44,"tag":2735,"props":4890,"children":4891},{"style":4554},[4892],{"type":49,"value":4557},{"type":44,"tag":2735,"props":4894,"children":4895},{"style":4356},[4896],{"type":49,"value":4579},{"type":44,"tag":2735,"props":4898,"children":4899},{"class":4346,"line":4582},[4900,4905,4909],{"type":44,"tag":2735,"props":4901,"children":4902},{"style":4548},[4903],{"type":49,"value":4904},"description",{"type":44,"tag":2735,"props":4906,"children":4907},{"style":4554},[4908],{"type":49,"value":4557},{"type":44,"tag":2735,"props":4910,"children":4911},{"style":4356},[4912],{"type":49,"value":4913},"\"Customer orders with purchase details and fulfillment status. One row per order. Granularity: order-level.\"\n",{"type":44,"tag":2735,"props":4915,"children":4916},{"class":4346,"line":4596},[4917,4922],{"type":44,"tag":2735,"props":4918,"children":4919},{"style":4548},[4920],{"type":49,"value":4921},"tags",{"type":44,"tag":2735,"props":4923,"children":4924},{"style":4554},[4925],{"type":49,"value":4593},{"type":44,"tag":2735,"props":4927,"children":4928},{"class":4346,"line":4618},[4929,4933],{"type":44,"tag":2735,"props":4930,"children":4931},{"style":4554},[4932],{"type":49,"value":4602},{"type":44,"tag":2735,"props":4934,"children":4935},{"style":4356},[4936],{"type":49,"value":4937},"ecommerce\n",{"type":44,"tag":2735,"props":4939,"children":4940},{"class":4346,"line":4636},[4941,4945],{"type":44,"tag":2735,"props":4942,"children":4943},{"style":4554},[4944],{"type":49,"value":4602},{"type":44,"tag":2735,"props":4946,"children":4947},{"style":4356},[4948],{"type":49,"value":4949},"transactions\n",{"type":44,"tag":2735,"props":4951,"children":4952},{"class":4346,"line":4657},[4953,4957],{"type":44,"tag":2735,"props":4954,"children":4955},{"style":4548},[4956],{"type":49,"value":4588},{"type":44,"tag":2735,"props":4958,"children":4959},{"style":4554},[4960],{"type":49,"value":4593},{"type":44,"tag":2735,"props":4962,"children":4963},{"class":4346,"line":4673},[4964,4968,4972,4976],{"type":44,"tag":2735,"props":4965,"children":4966},{"style":4554},[4967],{"type":49,"value":4602},{"type":44,"tag":2735,"props":4969,"children":4970},{"style":4548},[4971],{"type":49,"value":4551},{"type":44,"tag":2735,"props":4973,"children":4974},{"style":4554},[4975],{"type":49,"value":4557},{"type":44,"tag":2735,"props":4977,"children":4978},{"style":4356},[4979],{"type":49,"value":4615},{"type":44,"tag":2735,"props":4981,"children":4982},{"class":4346,"line":4694},[4983,4987,4991],{"type":44,"tag":2735,"props":4984,"children":4985},{"style":4548},[4986],{"type":49,"value":4624},{"type":44,"tag":2735,"props":4988,"children":4989},{"style":4554},[4990],{"type":49,"value":4557},{"type":44,"tag":2735,"props":4992,"children":4993},{"style":4356},[4994],{"type":49,"value":4633},{"type":44,"tag":2735,"props":4996,"children":4997},{"class":4346,"line":4711},[4998,5003,5007],{"type":44,"tag":2735,"props":4999,"children":5000},{"style":4548},[5001],{"type":49,"value":5002},"    description",{"type":44,"tag":2735,"props":5004,"children":5005},{"style":4554},[5006],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5008,"children":5009},{"style":4356},[5010],{"type":49,"value":5011},"\"Unique identifier for each order\"\n",{"type":44,"tag":2735,"props":5013,"children":5014},{"class":4346,"line":3296},[5015,5020],{"type":44,"tag":2735,"props":5016,"children":5017},{"style":4548},[5018],{"type":49,"value":5019},"    checks",{"type":44,"tag":2735,"props":5021,"children":5022},{"style":4554},[5023],{"type":49,"value":4593},{"type":44,"tag":2735,"props":5025,"children":5026},{"class":4346,"line":4748},[5027,5032,5036,5040],{"type":44,"tag":2735,"props":5028,"children":5029},{"style":4554},[5030],{"type":49,"value":5031},"      - ",{"type":44,"tag":2735,"props":5033,"children":5034},{"style":4548},[5035],{"type":49,"value":4551},{"type":44,"tag":2735,"props":5037,"children":5038},{"style":4554},[5039],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5041,"children":5042},{"style":4356},[5043],{"type":49,"value":5044},"not_null\n",{"type":44,"tag":2735,"props":5046,"children":5047},{"class":4346,"line":12},[5048,5052,5056,5060],{"type":44,"tag":2735,"props":5049,"children":5050},{"style":4554},[5051],{"type":49,"value":5031},{"type":44,"tag":2735,"props":5053,"children":5054},{"style":4548},[5055],{"type":49,"value":4551},{"type":44,"tag":2735,"props":5057,"children":5058},{"style":4554},[5059],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5061,"children":5062},{"style":4356},[5063],{"type":49,"value":5064},"unique\n",{"type":44,"tag":2735,"props":5066,"children":5068},{"class":4346,"line":5067},15,[5069,5073,5077,5081],{"type":44,"tag":2735,"props":5070,"children":5071},{"style":4554},[5072],{"type":49,"value":4602},{"type":44,"tag":2735,"props":5074,"children":5075},{"style":4548},[5076],{"type":49,"value":4551},{"type":44,"tag":2735,"props":5078,"children":5079},{"style":4554},[5080],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5082,"children":5083},{"style":4356},[5084],{"type":49,"value":4654},{"type":44,"tag":2735,"props":5086,"children":5088},{"class":4346,"line":5087},16,[5089,5093,5097],{"type":44,"tag":2735,"props":5090,"children":5091},{"style":4548},[5092],{"type":49,"value":4624},{"type":44,"tag":2735,"props":5094,"children":5095},{"style":4554},[5096],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5098,"children":5099},{"style":4356},[5100],{"type":49,"value":4633},{"type":44,"tag":2735,"props":5102,"children":5104},{"class":4346,"line":5103},17,[5105,5109,5113],{"type":44,"tag":2735,"props":5106,"children":5107},{"style":4548},[5108],{"type":49,"value":5002},{"type":44,"tag":2735,"props":5110,"children":5111},{"style":4554},[5112],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5114,"children":5115},{"style":4356},[5116],{"type":49,"value":5117},"\"Foreign key to analytics.customers\"\n",{"type":44,"tag":2735,"props":5119,"children":5121},{"class":4346,"line":5120},18,[5122,5126],{"type":44,"tag":2735,"props":5123,"children":5124},{"style":4548},[5125],{"type":49,"value":5019},{"type":44,"tag":2735,"props":5127,"children":5128},{"style":4554},[5129],{"type":49,"value":4593},{"type":44,"tag":2735,"props":5131,"children":5133},{"class":4346,"line":5132},19,[5134,5138,5142,5146],{"type":44,"tag":2735,"props":5135,"children":5136},{"style":4554},[5137],{"type":49,"value":5031},{"type":44,"tag":2735,"props":5139,"children":5140},{"style":4548},[5141],{"type":49,"value":4551},{"type":44,"tag":2735,"props":5143,"children":5144},{"style":4554},[5145],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5147,"children":5148},{"style":4356},[5149],{"type":49,"value":5044},{"type":44,"tag":2735,"props":5151,"children":5153},{"class":4346,"line":5152},20,[5154,5158,5162,5166],{"type":44,"tag":2735,"props":5155,"children":5156},{"style":4554},[5157],{"type":49,"value":4602},{"type":44,"tag":2735,"props":5159,"children":5160},{"style":4548},[5161],{"type":49,"value":4551},{"type":44,"tag":2735,"props":5163,"children":5164},{"style":4554},[5165],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5167,"children":5168},{"style":4356},[5169],{"type":49,"value":4691},{"type":44,"tag":2735,"props":5171,"children":5173},{"class":4346,"line":5172},21,[5174,5178,5182],{"type":44,"tag":2735,"props":5175,"children":5176},{"style":4548},[5177],{"type":49,"value":4624},{"type":44,"tag":2735,"props":5179,"children":5180},{"style":4554},[5181],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5183,"children":5184},{"style":4356},[5185],{"type":49,"value":4708},{"type":44,"tag":2735,"props":5187,"children":5189},{"class":4346,"line":5188},22,[5190,5194,5198],{"type":44,"tag":2735,"props":5191,"children":5192},{"style":4548},[5193],{"type":49,"value":5002},{"type":44,"tag":2735,"props":5195,"children":5196},{"style":4554},[5197],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5199,"children":5200},{"style":4356},[5201],{"type":49,"value":5202},"\"Current fulfillment status of the order\"\n",{"type":44,"tag":2735,"props":5204,"children":5206},{"class":4346,"line":5205},23,[5207,5211],{"type":44,"tag":2735,"props":5208,"children":5209},{"style":4548},[5210],{"type":49,"value":5019},{"type":44,"tag":2735,"props":5212,"children":5213},{"style":4554},[5214],{"type":49,"value":4593},{"type":44,"tag":2735,"props":5216,"children":5218},{"class":4346,"line":5217},24,[5219,5223,5227,5231],{"type":44,"tag":2735,"props":5220,"children":5221},{"style":4554},[5222],{"type":49,"value":5031},{"type":44,"tag":2735,"props":5224,"children":5225},{"style":4548},[5226],{"type":49,"value":4551},{"type":44,"tag":2735,"props":5228,"children":5229},{"style":4554},[5230],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5232,"children":5233},{"style":4356},[5234],{"type":49,"value":5235},"accepted_values\n",{"type":44,"tag":2735,"props":5237,"children":5238},{"class":4346,"line":3957},[5239,5244,5249,5254,5258,5263,5267,5272,5276,5281],{"type":44,"tag":2735,"props":5240,"children":5241},{"style":4548},[5242],{"type":49,"value":5243},"        value",{"type":44,"tag":2735,"props":5245,"children":5246},{"style":4554},[5247],{"type":49,"value":5248},": [",{"type":44,"tag":2735,"props":5250,"children":5251},{"style":4356},[5252],{"type":49,"value":5253},"\"pending\"",{"type":44,"tag":2735,"props":5255,"children":5256},{"style":4554},[5257],{"type":49,"value":841},{"type":44,"tag":2735,"props":5259,"children":5260},{"style":4356},[5261],{"type":49,"value":5262},"\"shipped\"",{"type":44,"tag":2735,"props":5264,"children":5265},{"style":4554},[5266],{"type":49,"value":841},{"type":44,"tag":2735,"props":5268,"children":5269},{"style":4356},[5270],{"type":49,"value":5271},"\"delivered\"",{"type":44,"tag":2735,"props":5273,"children":5274},{"style":4554},[5275],{"type":49,"value":841},{"type":44,"tag":2735,"props":5277,"children":5278},{"style":4356},[5279],{"type":49,"value":5280},"\"refunded\"",{"type":44,"tag":2735,"props":5282,"children":5283},{"style":4554},[5284],{"type":49,"value":5285},"]\n",{"type":44,"tag":2735,"props":5287,"children":5289},{"class":4346,"line":5288},26,[5290,5294,5298,5302],{"type":44,"tag":2735,"props":5291,"children":5292},{"style":4554},[5293],{"type":49,"value":4602},{"type":44,"tag":2735,"props":5295,"children":5296},{"style":4548},[5297],{"type":49,"value":4551},{"type":44,"tag":2735,"props":5299,"children":5300},{"style":4554},[5301],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5303,"children":5304},{"style":4356},[5305],{"type":49,"value":4729},{"type":44,"tag":2735,"props":5307,"children":5309},{"class":4346,"line":5308},27,[5310,5314,5318],{"type":44,"tag":2735,"props":5311,"children":5312},{"style":4548},[5313],{"type":49,"value":4624},{"type":44,"tag":2735,"props":5315,"children":5316},{"style":4554},[5317],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5319,"children":5320},{"style":4356},[5321],{"type":49,"value":4745},{"type":44,"tag":2735,"props":5323,"children":5325},{"class":4346,"line":5324},28,[5326,5330,5334],{"type":44,"tag":2735,"props":5327,"children":5328},{"style":4548},[5329],{"type":49,"value":5002},{"type":44,"tag":2735,"props":5331,"children":5332},{"style":4554},[5333],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5335,"children":5336},{"style":4356},[5337],{"type":49,"value":5338},"\"Net order total in USD after discounts, before tax\"\n",{"type":44,"tag":2735,"props":5340,"children":5342},{"class":4346,"line":5341},29,[5343,5347],{"type":44,"tag":2735,"props":5344,"children":5345},{"style":4548},[5346],{"type":49,"value":5019},{"type":44,"tag":2735,"props":5348,"children":5349},{"style":4554},[5350],{"type":49,"value":4593},{"type":44,"tag":2735,"props":5352,"children":5354},{"class":4346,"line":5353},30,[5355,5359,5363,5367],{"type":44,"tag":2735,"props":5356,"children":5357},{"style":4554},[5358],{"type":49,"value":5031},{"type":44,"tag":2735,"props":5360,"children":5361},{"style":4548},[5362],{"type":49,"value":4551},{"type":44,"tag":2735,"props":5364,"children":5365},{"style":4554},[5366],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5368,"children":5369},{"style":4356},[5370],{"type":49,"value":5044},{"type":44,"tag":2735,"props":5372,"children":5374},{"class":4346,"line":5373},31,[5375,5379,5383,5387],{"type":44,"tag":2735,"props":5376,"children":5377},{"style":4554},[5378],{"type":49,"value":5031},{"type":44,"tag":2735,"props":5380,"children":5381},{"style":4548},[5382],{"type":49,"value":4551},{"type":44,"tag":2735,"props":5384,"children":5385},{"style":4554},[5386],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5388,"children":5389},{"style":4356},[5390],{"type":49,"value":5391},"positive\n",{"type":44,"tag":2735,"props":5393,"children":5395},{"class":4346,"line":5394},32,[5396,5400,5404,5408],{"type":44,"tag":2735,"props":5397,"children":5398},{"style":4554},[5399],{"type":49,"value":4602},{"type":44,"tag":2735,"props":5401,"children":5402},{"style":4548},[5403],{"type":49,"value":4551},{"type":44,"tag":2735,"props":5405,"children":5406},{"style":4554},[5407],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5409,"children":5410},{"style":4356},[5411],{"type":49,"value":4766},{"type":44,"tag":2735,"props":5413,"children":5415},{"class":4346,"line":5414},33,[5416,5420,5424],{"type":44,"tag":2735,"props":5417,"children":5418},{"style":4548},[5419],{"type":49,"value":4624},{"type":44,"tag":2735,"props":5421,"children":5422},{"style":4554},[5423],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5425,"children":5426},{"style":4356},[5427],{"type":49,"value":4782},{"type":44,"tag":2735,"props":5429,"children":5431},{"class":4346,"line":5430},34,[5432,5436,5440],{"type":44,"tag":2735,"props":5433,"children":5434},{"style":4548},[5435],{"type":49,"value":5002},{"type":44,"tag":2735,"props":5437,"children":5438},{"style":4554},[5439],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5441,"children":5442},{"style":4356},[5443],{"type":49,"value":5444},"\"Timestamp when the order was placed (UTC)\"\n",{"type":44,"tag":2735,"props":5446,"children":5448},{"class":4346,"line":5447},35,[5449,5453],{"type":44,"tag":2735,"props":5450,"children":5451},{"style":4548},[5452],{"type":49,"value":5019},{"type":44,"tag":2735,"props":5454,"children":5455},{"style":4554},[5456],{"type":49,"value":4593},{"type":44,"tag":2735,"props":5458,"children":5460},{"class":4346,"line":5459},36,[5461,5465,5469,5473],{"type":44,"tag":2735,"props":5462,"children":5463},{"style":4554},[5464],{"type":49,"value":5031},{"type":44,"tag":2735,"props":5466,"children":5467},{"style":4548},[5468],{"type":49,"value":4551},{"type":44,"tag":2735,"props":5470,"children":5471},{"style":4554},[5472],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5474,"children":5475},{"style":4356},[5476],{"type":49,"value":5044},{"type":44,"tag":45,"props":5478,"children":5479},{},[5480,5482,5488],{"type":49,"value":5481},"What surprised me most was how much the metadata mattered. The first version of the agent answered poorly because it had no context. After running ",{"type":44,"tag":162,"props":5483,"children":5485},{"className":5484},[],[5486],{"type":49,"value":5487},"bruin ai enhance",{"type":49,"value":5489},", the descriptions, column tags, and quality checks made the agent far more reliable. I spent more time cleaning metadata than tweaking prompts, and it paid off.",{"type":44,"tag":145,"props":5491,"children":5493},{"id":5492},"step-4-build-a-business-glossary",[5494],{"type":49,"value":5495},"Step 4: Build a Business Glossary",{"type":44,"tag":45,"props":5497,"children":5498},{},[5499],{"type":49,"value":5500},"Bruin also has a feature called Glossary and right now we're working on integrating that into this as well, with also built-in integrations into your knowledge base (Confluence, Notion, etc.) so that it can create a glossary/dictionary of all your key metrics, terminology, definitions, etc.",{"type":44,"tag":45,"props":5502,"children":5503},{},[5504],{"type":49,"value":5505},"Here's what the glossary looks like:",{"type":44,"tag":4335,"props":5507,"children":5509},{"className":4527,"code":5508,"language":4529,"meta":7,"style":7},"# glossary.yml\ndomains:\n  finance:\n    description: Revenue, costs, and margin analysis\n    owners:\n      - \"Finance Team\"\n    contact:\n      - type: \"slack\"\n        address: \"#finance-data\"\n\nentities:\n  Revenue:\n    description: Net revenue after refunds and discounts, in USD.\n    domains:\n      - finance\n    attributes:\n      Monthly:\n        type: decimal\n        description: \"Sum of total_amount for delivered orders in a calendar month\"\n      Gross:\n        type: decimal\n        description: \"Sum of total_amount before refunds\"\n\n  Customer:\n    description: An individual or business that has completed at least one purchase.\n    domains:\n      - finance\n    attributes:\n      ID:\n        type: integer\n        description: The unique identifier of the customer in our systems.\n      LTV:\n        type: decimal\n        description: \"Lifetime value: total revenue attributed to this customer\"\n",[5510],{"type":44,"tag":162,"props":5511,"children":5512},{"__ignoreMap":7},[5513,5521,5533,5545,5561,5573,5585,5597,5617,5634,5643,5655,5667,5683,5695,5707,5719,5731,5748,5765,5777,5792,5808,5815,5827,5843,5854,5865,5876,5888,5904,5920,5932,5947],{"type":44,"tag":2735,"props":5514,"children":5515},{"class":4346,"line":4347},[5516],{"type":44,"tag":2735,"props":5517,"children":5518},{"style":4539},[5519],{"type":49,"value":5520},"# glossary.yml\n",{"type":44,"tag":2735,"props":5522,"children":5523},{"class":4346,"line":1001},[5524,5529],{"type":44,"tag":2735,"props":5525,"children":5526},{"style":4548},[5527],{"type":49,"value":5528},"domains",{"type":44,"tag":2735,"props":5530,"children":5531},{"style":4554},[5532],{"type":49,"value":4593},{"type":44,"tag":2735,"props":5534,"children":5535},{"class":4346,"line":1008},[5536,5541],{"type":44,"tag":2735,"props":5537,"children":5538},{"style":4548},[5539],{"type":49,"value":5540},"  finance",{"type":44,"tag":2735,"props":5542,"children":5543},{"style":4554},[5544],{"type":49,"value":4593},{"type":44,"tag":2735,"props":5546,"children":5547},{"class":4346,"line":4582},[5548,5552,5556],{"type":44,"tag":2735,"props":5549,"children":5550},{"style":4548},[5551],{"type":49,"value":5002},{"type":44,"tag":2735,"props":5553,"children":5554},{"style":4554},[5555],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5557,"children":5558},{"style":4356},[5559],{"type":49,"value":5560},"Revenue, costs, and margin analysis\n",{"type":44,"tag":2735,"props":5562,"children":5563},{"class":4346,"line":4596},[5564,5569],{"type":44,"tag":2735,"props":5565,"children":5566},{"style":4548},[5567],{"type":49,"value":5568},"    owners",{"type":44,"tag":2735,"props":5570,"children":5571},{"style":4554},[5572],{"type":49,"value":4593},{"type":44,"tag":2735,"props":5574,"children":5575},{"class":4346,"line":4618},[5576,5580],{"type":44,"tag":2735,"props":5577,"children":5578},{"style":4554},[5579],{"type":49,"value":5031},{"type":44,"tag":2735,"props":5581,"children":5582},{"style":4356},[5583],{"type":49,"value":5584},"\"Finance Team\"\n",{"type":44,"tag":2735,"props":5586,"children":5587},{"class":4346,"line":4636},[5588,5593],{"type":44,"tag":2735,"props":5589,"children":5590},{"style":4548},[5591],{"type":49,"value":5592},"    contact",{"type":44,"tag":2735,"props":5594,"children":5595},{"style":4554},[5596],{"type":49,"value":4593},{"type":44,"tag":2735,"props":5598,"children":5599},{"class":4346,"line":4657},[5600,5604,5608,5612],{"type":44,"tag":2735,"props":5601,"children":5602},{"style":4554},[5603],{"type":49,"value":5031},{"type":44,"tag":2735,"props":5605,"children":5606},{"style":4548},[5607],{"type":49,"value":4570},{"type":44,"tag":2735,"props":5609,"children":5610},{"style":4554},[5611],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5613,"children":5614},{"style":4356},[5615],{"type":49,"value":5616},"\"slack\"\n",{"type":44,"tag":2735,"props":5618,"children":5619},{"class":4346,"line":4673},[5620,5625,5629],{"type":44,"tag":2735,"props":5621,"children":5622},{"style":4548},[5623],{"type":49,"value":5624},"        address",{"type":44,"tag":2735,"props":5626,"children":5627},{"style":4554},[5628],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5630,"children":5631},{"style":4356},[5632],{"type":49,"value":5633},"\"#finance-data\"\n",{"type":44,"tag":2735,"props":5635,"children":5636},{"class":4346,"line":4694},[5637],{"type":44,"tag":2735,"props":5638,"children":5640},{"emptyLinePlaceholder":5639},true,[5641],{"type":49,"value":5642},"\n",{"type":44,"tag":2735,"props":5644,"children":5645},{"class":4346,"line":4711},[5646,5651],{"type":44,"tag":2735,"props":5647,"children":5648},{"style":4548},[5649],{"type":49,"value":5650},"entities",{"type":44,"tag":2735,"props":5652,"children":5653},{"style":4554},[5654],{"type":49,"value":4593},{"type":44,"tag":2735,"props":5656,"children":5657},{"class":4346,"line":3296},[5658,5663],{"type":44,"tag":2735,"props":5659,"children":5660},{"style":4548},[5661],{"type":49,"value":5662},"  Revenue",{"type":44,"tag":2735,"props":5664,"children":5665},{"style":4554},[5666],{"type":49,"value":4593},{"type":44,"tag":2735,"props":5668,"children":5669},{"class":4346,"line":4748},[5670,5674,5678],{"type":44,"tag":2735,"props":5671,"children":5672},{"style":4548},[5673],{"type":49,"value":5002},{"type":44,"tag":2735,"props":5675,"children":5676},{"style":4554},[5677],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5679,"children":5680},{"style":4356},[5681],{"type":49,"value":5682},"Net revenue after refunds and discounts, in USD.\n",{"type":44,"tag":2735,"props":5684,"children":5685},{"class":4346,"line":12},[5686,5691],{"type":44,"tag":2735,"props":5687,"children":5688},{"style":4548},[5689],{"type":49,"value":5690},"    domains",{"type":44,"tag":2735,"props":5692,"children":5693},{"style":4554},[5694],{"type":49,"value":4593},{"type":44,"tag":2735,"props":5696,"children":5697},{"class":4346,"line":5067},[5698,5702],{"type":44,"tag":2735,"props":5699,"children":5700},{"style":4554},[5701],{"type":49,"value":5031},{"type":44,"tag":2735,"props":5703,"children":5704},{"style":4356},[5705],{"type":49,"value":5706},"finance\n",{"type":44,"tag":2735,"props":5708,"children":5709},{"class":4346,"line":5087},[5710,5715],{"type":44,"tag":2735,"props":5711,"children":5712},{"style":4548},[5713],{"type":49,"value":5714},"    attributes",{"type":44,"tag":2735,"props":5716,"children":5717},{"style":4554},[5718],{"type":49,"value":4593},{"type":44,"tag":2735,"props":5720,"children":5721},{"class":4346,"line":5103},[5722,5727],{"type":44,"tag":2735,"props":5723,"children":5724},{"style":4548},[5725],{"type":49,"value":5726},"      Monthly",{"type":44,"tag":2735,"props":5728,"children":5729},{"style":4554},[5730],{"type":49,"value":4593},{"type":44,"tag":2735,"props":5732,"children":5733},{"class":4346,"line":5120},[5734,5739,5743],{"type":44,"tag":2735,"props":5735,"children":5736},{"style":4548},[5737],{"type":49,"value":5738},"        type",{"type":44,"tag":2735,"props":5740,"children":5741},{"style":4554},[5742],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5744,"children":5745},{"style":4356},[5746],{"type":49,"value":5747},"decimal\n",{"type":44,"tag":2735,"props":5749,"children":5750},{"class":4346,"line":5132},[5751,5756,5760],{"type":44,"tag":2735,"props":5752,"children":5753},{"style":4548},[5754],{"type":49,"value":5755},"        description",{"type":44,"tag":2735,"props":5757,"children":5758},{"style":4554},[5759],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5761,"children":5762},{"style":4356},[5763],{"type":49,"value":5764},"\"Sum of total_amount for delivered orders in a calendar month\"\n",{"type":44,"tag":2735,"props":5766,"children":5767},{"class":4346,"line":5152},[5768,5773],{"type":44,"tag":2735,"props":5769,"children":5770},{"style":4548},[5771],{"type":49,"value":5772},"      Gross",{"type":44,"tag":2735,"props":5774,"children":5775},{"style":4554},[5776],{"type":49,"value":4593},{"type":44,"tag":2735,"props":5778,"children":5779},{"class":4346,"line":5172},[5780,5784,5788],{"type":44,"tag":2735,"props":5781,"children":5782},{"style":4548},[5783],{"type":49,"value":5738},{"type":44,"tag":2735,"props":5785,"children":5786},{"style":4554},[5787],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5789,"children":5790},{"style":4356},[5791],{"type":49,"value":5747},{"type":44,"tag":2735,"props":5793,"children":5794},{"class":4346,"line":5188},[5795,5799,5803],{"type":44,"tag":2735,"props":5796,"children":5797},{"style":4548},[5798],{"type":49,"value":5755},{"type":44,"tag":2735,"props":5800,"children":5801},{"style":4554},[5802],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5804,"children":5805},{"style":4356},[5806],{"type":49,"value":5807},"\"Sum of total_amount before refunds\"\n",{"type":44,"tag":2735,"props":5809,"children":5810},{"class":4346,"line":5205},[5811],{"type":44,"tag":2735,"props":5812,"children":5813},{"emptyLinePlaceholder":5639},[5814],{"type":49,"value":5642},{"type":44,"tag":2735,"props":5816,"children":5817},{"class":4346,"line":5217},[5818,5823],{"type":44,"tag":2735,"props":5819,"children":5820},{"style":4548},[5821],{"type":49,"value":5822},"  Customer",{"type":44,"tag":2735,"props":5824,"children":5825},{"style":4554},[5826],{"type":49,"value":4593},{"type":44,"tag":2735,"props":5828,"children":5829},{"class":4346,"line":3957},[5830,5834,5838],{"type":44,"tag":2735,"props":5831,"children":5832},{"style":4548},[5833],{"type":49,"value":5002},{"type":44,"tag":2735,"props":5835,"children":5836},{"style":4554},[5837],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5839,"children":5840},{"style":4356},[5841],{"type":49,"value":5842},"An individual or business that has completed at least one purchase.\n",{"type":44,"tag":2735,"props":5844,"children":5845},{"class":4346,"line":5288},[5846,5850],{"type":44,"tag":2735,"props":5847,"children":5848},{"style":4548},[5849],{"type":49,"value":5690},{"type":44,"tag":2735,"props":5851,"children":5852},{"style":4554},[5853],{"type":49,"value":4593},{"type":44,"tag":2735,"props":5855,"children":5856},{"class":4346,"line":5308},[5857,5861],{"type":44,"tag":2735,"props":5858,"children":5859},{"style":4554},[5860],{"type":49,"value":5031},{"type":44,"tag":2735,"props":5862,"children":5863},{"style":4356},[5864],{"type":49,"value":5706},{"type":44,"tag":2735,"props":5866,"children":5867},{"class":4346,"line":5324},[5868,5872],{"type":44,"tag":2735,"props":5869,"children":5870},{"style":4548},[5871],{"type":49,"value":5714},{"type":44,"tag":2735,"props":5873,"children":5874},{"style":4554},[5875],{"type":49,"value":4593},{"type":44,"tag":2735,"props":5877,"children":5878},{"class":4346,"line":5341},[5879,5884],{"type":44,"tag":2735,"props":5880,"children":5881},{"style":4548},[5882],{"type":49,"value":5883},"      ID",{"type":44,"tag":2735,"props":5885,"children":5886},{"style":4554},[5887],{"type":49,"value":4593},{"type":44,"tag":2735,"props":5889,"children":5890},{"class":4346,"line":5353},[5891,5895,5899],{"type":44,"tag":2735,"props":5892,"children":5893},{"style":4548},[5894],{"type":49,"value":5738},{"type":44,"tag":2735,"props":5896,"children":5897},{"style":4554},[5898],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5900,"children":5901},{"style":4356},[5902],{"type":49,"value":5903},"integer\n",{"type":44,"tag":2735,"props":5905,"children":5906},{"class":4346,"line":5373},[5907,5911,5915],{"type":44,"tag":2735,"props":5908,"children":5909},{"style":4548},[5910],{"type":49,"value":5755},{"type":44,"tag":2735,"props":5912,"children":5913},{"style":4554},[5914],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5916,"children":5917},{"style":4356},[5918],{"type":49,"value":5919},"The unique identifier of the customer in our systems.\n",{"type":44,"tag":2735,"props":5921,"children":5922},{"class":4346,"line":5394},[5923,5928],{"type":44,"tag":2735,"props":5924,"children":5925},{"style":4548},[5926],{"type":49,"value":5927},"      LTV",{"type":44,"tag":2735,"props":5929,"children":5930},{"style":4554},[5931],{"type":49,"value":4593},{"type":44,"tag":2735,"props":5933,"children":5934},{"class":4346,"line":5414},[5935,5939,5943],{"type":44,"tag":2735,"props":5936,"children":5937},{"style":4548},[5938],{"type":49,"value":5738},{"type":44,"tag":2735,"props":5940,"children":5941},{"style":4554},[5942],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5944,"children":5945},{"style":4356},[5946],{"type":49,"value":5747},{"type":44,"tag":2735,"props":5948,"children":5949},{"class":4346,"line":5430},[5950,5954,5958],{"type":44,"tag":2735,"props":5951,"children":5952},{"style":4548},[5953],{"type":49,"value":5755},{"type":44,"tag":2735,"props":5955,"children":5956},{"style":4554},[5957],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5959,"children":5960},{"style":4356},[5961],{"type":49,"value":5962},"\"Lifetime value: total revenue attributed to this customer\"\n",{"type":44,"tag":45,"props":5964,"children":5965},{},[5966],{"type":49,"value":5967},"Inside an asset you can extend the glossary definitions and attributes like this:",{"type":44,"tag":4335,"props":5969,"children":5971},{"className":4527,"code":5970,"language":4529,"meta":7,"style":7},"# assets/analytics/orders.asset.yml - linking to glossary\nname: analytics.orders\ncolumns:\n  - name: customer_id\n    extends: Customer.ID\n  - name: total_amount\n    extends: Revenue.Gross\n",[5972],{"type":44,"tag":162,"props":5973,"children":5974},{"__ignoreMap":7},[5975,5983,5998,6009,6028,6045,6064],{"type":44,"tag":2735,"props":5976,"children":5977},{"class":4346,"line":4347},[5978],{"type":44,"tag":2735,"props":5979,"children":5980},{"style":4539},[5981],{"type":49,"value":5982},"# assets/analytics/orders.asset.yml - linking to glossary\n",{"type":44,"tag":2735,"props":5984,"children":5985},{"class":4346,"line":1001},[5986,5990,5994],{"type":44,"tag":2735,"props":5987,"children":5988},{"style":4548},[5989],{"type":49,"value":4551},{"type":44,"tag":2735,"props":5991,"children":5992},{"style":4554},[5993],{"type":49,"value":4557},{"type":44,"tag":2735,"props":5995,"children":5996},{"style":4356},[5997],{"type":49,"value":4562},{"type":44,"tag":2735,"props":5999,"children":6000},{"class":4346,"line":1008},[6001,6005],{"type":44,"tag":2735,"props":6002,"children":6003},{"style":4548},[6004],{"type":49,"value":4588},{"type":44,"tag":2735,"props":6006,"children":6007},{"style":4554},[6008],{"type":49,"value":4593},{"type":44,"tag":2735,"props":6010,"children":6011},{"class":4346,"line":4582},[6012,6016,6020,6024],{"type":44,"tag":2735,"props":6013,"children":6014},{"style":4554},[6015],{"type":49,"value":4602},{"type":44,"tag":2735,"props":6017,"children":6018},{"style":4548},[6019],{"type":49,"value":4551},{"type":44,"tag":2735,"props":6021,"children":6022},{"style":4554},[6023],{"type":49,"value":4557},{"type":44,"tag":2735,"props":6025,"children":6026},{"style":4356},[6027],{"type":49,"value":4654},{"type":44,"tag":2735,"props":6029,"children":6030},{"class":4346,"line":4596},[6031,6036,6040],{"type":44,"tag":2735,"props":6032,"children":6033},{"style":4548},[6034],{"type":49,"value":6035},"    extends",{"type":44,"tag":2735,"props":6037,"children":6038},{"style":4554},[6039],{"type":49,"value":4557},{"type":44,"tag":2735,"props":6041,"children":6042},{"style":4356},[6043],{"type":49,"value":6044},"Customer.ID\n",{"type":44,"tag":2735,"props":6046,"children":6047},{"class":4346,"line":4618},[6048,6052,6056,6060],{"type":44,"tag":2735,"props":6049,"children":6050},{"style":4554},[6051],{"type":49,"value":4602},{"type":44,"tag":2735,"props":6053,"children":6054},{"style":4548},[6055],{"type":49,"value":4551},{"type":44,"tag":2735,"props":6057,"children":6058},{"style":4554},[6059],{"type":49,"value":4557},{"type":44,"tag":2735,"props":6061,"children":6062},{"style":4356},[6063],{"type":49,"value":4729},{"type":44,"tag":2735,"props":6065,"children":6066},{"class":4346,"line":4636},[6067,6071,6075],{"type":44,"tag":2735,"props":6068,"children":6069},{"style":4548},[6070],{"type":49,"value":6035},{"type":44,"tag":2735,"props":6072,"children":6073},{"style":4554},[6074],{"type":49,"value":4557},{"type":44,"tag":2735,"props":6076,"children":6077},{"style":4356},[6078],{"type":49,"value":6079},"Revenue.Gross\n",{"type":44,"tag":145,"props":6081,"children":6083},{"id":6082},"step-5-write-agent-instructions",[6084],{"type":49,"value":6085},"Step 5: Write Agent Instructions",{"type":44,"tag":45,"props":6087,"children":6088},{},[6089],{"type":49,"value":6090},"It is always best practice to set up general instructions, rules, restrictions, and context that the agent can follow - the best way to do this is by creating an AGENTS.md file.",{"type":44,"tag":45,"props":6092,"children":6093},{},[6094],{"type":49,"value":6095},"In this file, you will give the agent general instructions on which tools to use and how to use them, but also include some general business context - although, it is best to keep business context inside the pipeline itself, either in the glossary, asset, or pipeline readme file.",{"type":44,"tag":4335,"props":6097,"children":6100},{"className":6098,"code":6099,"language":1036,"meta":7,"style":7},"language-markdown shiki shiki-themes github-dark","# AGENTS.md\n\n## Data access\n- Utilize Bruin MCP and Bruin CLI to connect to the warehouse and query the data.\n- Use `bruin query --connection my-dwh --query \"\u003CSQL>\"` for all data access\n- Always show the SQL query and explain your reasoning before executing it\n- Use LIMIT 10 when exploring unfamiliar tables or testing complex queries\n- Read the `assets/` directory to understand available tables and their schemas before querying\n- This is a **read-only** environment - never run INSERT, UPDATE, DELETE, or DROP statements\n\n## Domain context\n- \"Revenue\" always means net revenue after refunds unless explicitly stated otherwise\n- All timestamps are stored in UTC\n- The `status` field in orders uses: pending, shipped, delivered, refunded\n- Q1 = Jan-Mar, Q2 = Apr-Jun, Q3 = Jul-Sep, Q4 = Oct-Dec (calendar year)\n\n## When you're unsure\n- If a metric definition is ambiguous, check the glossary.yml first\n- If the glossary doesn't have the answer, ASK - do not guess\n- Format questions as: \"I found X in the data but expected Y - should I interpret this as Z?\"\n",[6101],{"type":44,"tag":162,"props":6102,"children":6103},{"__ignoreMap":7},[6104,6112,6119,6127,6135,6143,6151,6159,6167,6175,6182,6190,6198,6206,6214,6222,6229,6237,6245,6253],{"type":44,"tag":2735,"props":6105,"children":6106},{"class":4346,"line":4347},[6107],{"type":44,"tag":2735,"props":6108,"children":6109},{},[6110],{"type":49,"value":6111},"# AGENTS.md\n",{"type":44,"tag":2735,"props":6113,"children":6114},{"class":4346,"line":1001},[6115],{"type":44,"tag":2735,"props":6116,"children":6117},{"emptyLinePlaceholder":5639},[6118],{"type":49,"value":5642},{"type":44,"tag":2735,"props":6120,"children":6121},{"class":4346,"line":1008},[6122],{"type":44,"tag":2735,"props":6123,"children":6124},{},[6125],{"type":49,"value":6126},"## Data access\n",{"type":44,"tag":2735,"props":6128,"children":6129},{"class":4346,"line":4582},[6130],{"type":44,"tag":2735,"props":6131,"children":6132},{},[6133],{"type":49,"value":6134},"- Utilize Bruin MCP and Bruin CLI to connect to the warehouse and query the data.\n",{"type":44,"tag":2735,"props":6136,"children":6137},{"class":4346,"line":4596},[6138],{"type":44,"tag":2735,"props":6139,"children":6140},{},[6141],{"type":49,"value":6142},"- Use `bruin query --connection my-dwh --query \"\u003CSQL>\"` for all data access\n",{"type":44,"tag":2735,"props":6144,"children":6145},{"class":4346,"line":4618},[6146],{"type":44,"tag":2735,"props":6147,"children":6148},{},[6149],{"type":49,"value":6150},"- Always show the SQL query and explain your reasoning before executing it\n",{"type":44,"tag":2735,"props":6152,"children":6153},{"class":4346,"line":4636},[6154],{"type":44,"tag":2735,"props":6155,"children":6156},{},[6157],{"type":49,"value":6158},"- Use LIMIT 10 when exploring unfamiliar tables or testing complex queries\n",{"type":44,"tag":2735,"props":6160,"children":6161},{"class":4346,"line":4657},[6162],{"type":44,"tag":2735,"props":6163,"children":6164},{},[6165],{"type":49,"value":6166},"- Read the `assets/` directory to understand available tables and their schemas before querying\n",{"type":44,"tag":2735,"props":6168,"children":6169},{"class":4346,"line":4673},[6170],{"type":44,"tag":2735,"props":6171,"children":6172},{},[6173],{"type":49,"value":6174},"- This is a **read-only** environment - never run INSERT, UPDATE, DELETE, or DROP statements\n",{"type":44,"tag":2735,"props":6176,"children":6177},{"class":4346,"line":4694},[6178],{"type":44,"tag":2735,"props":6179,"children":6180},{"emptyLinePlaceholder":5639},[6181],{"type":49,"value":5642},{"type":44,"tag":2735,"props":6183,"children":6184},{"class":4346,"line":4711},[6185],{"type":44,"tag":2735,"props":6186,"children":6187},{},[6188],{"type":49,"value":6189},"## Domain context\n",{"type":44,"tag":2735,"props":6191,"children":6192},{"class":4346,"line":3296},[6193],{"type":44,"tag":2735,"props":6194,"children":6195},{},[6196],{"type":49,"value":6197},"- \"Revenue\" always means net revenue after refunds unless explicitly stated otherwise\n",{"type":44,"tag":2735,"props":6199,"children":6200},{"class":4346,"line":4748},[6201],{"type":44,"tag":2735,"props":6202,"children":6203},{},[6204],{"type":49,"value":6205},"- All timestamps are stored in UTC\n",{"type":44,"tag":2735,"props":6207,"children":6208},{"class":4346,"line":12},[6209],{"type":44,"tag":2735,"props":6210,"children":6211},{},[6212],{"type":49,"value":6213},"- The `status` field in orders uses: pending, shipped, delivered, refunded\n",{"type":44,"tag":2735,"props":6215,"children":6216},{"class":4346,"line":5067},[6217],{"type":44,"tag":2735,"props":6218,"children":6219},{},[6220],{"type":49,"value":6221},"- Q1 = Jan-Mar, Q2 = Apr-Jun, Q3 = Jul-Sep, Q4 = Oct-Dec (calendar year)\n",{"type":44,"tag":2735,"props":6223,"children":6224},{"class":4346,"line":5087},[6225],{"type":44,"tag":2735,"props":6226,"children":6227},{"emptyLinePlaceholder":5639},[6228],{"type":49,"value":5642},{"type":44,"tag":2735,"props":6230,"children":6231},{"class":4346,"line":5103},[6232],{"type":44,"tag":2735,"props":6233,"children":6234},{},[6235],{"type":49,"value":6236},"## When you're unsure\n",{"type":44,"tag":2735,"props":6238,"children":6239},{"class":4346,"line":5120},[6240],{"type":44,"tag":2735,"props":6241,"children":6242},{},[6243],{"type":49,"value":6244},"- If a metric definition is ambiguous, check the glossary.yml first\n",{"type":44,"tag":2735,"props":6246,"children":6247},{"class":4346,"line":5132},[6248],{"type":44,"tag":2735,"props":6249,"children":6250},{},[6251],{"type":49,"value":6252},"- If the glossary doesn't have the answer, ASK - do not guess\n",{"type":44,"tag":2735,"props":6254,"children":6255},{"class":4346,"line":5152},[6256],{"type":44,"tag":2735,"props":6257,"children":6258},{},[6259],{"type":49,"value":6260},"- Format questions as: \"I found X in the data but expected Y - should I interpret this as Z?\"\n",{"type":44,"tag":145,"props":6262,"children":6264},{"id":6263},"step-6-connect-the-agent-via-mcp",[6265],{"type":49,"value":6266},"Step 6: Connect the Agent via MCP",{"type":44,"tag":45,"props":6268,"children":6269},{},[6270],{"type":49,"value":6271},"Add Bruin MCP to your agent so that it knows how to use Bruin's functions. If you're using another tool, then connect that tool's MCP.",{"type":44,"tag":4335,"props":6273,"children":6275},{"className":4337,"code":6274,"language":4339,"meta":7,"style":7},"# For Claude Code\nclaude mcp add bruin -- bruin mcp\n\n# For Cursor (.cursor/mcp.json)\n{\n  \"mcpServers\": {\n    \"bruin\": {\n      \"command\": \"bruin\",\n      \"args\": [\"mcp\"]\n    }\n  }\n}\n",[6276],{"type":44,"tag":162,"props":6277,"children":6278},{"__ignoreMap":7},[6279,6287,6323,6330,6338,6346,6364,6380,6397,6423,6431,6439],{"type":44,"tag":2735,"props":6280,"children":6281},{"class":4346,"line":4347},[6282],{"type":44,"tag":2735,"props":6283,"children":6284},{"style":4539},[6285],{"type":49,"value":6286},"# For Claude Code\n",{"type":44,"tag":2735,"props":6288,"children":6289},{"class":4346,"line":1001},[6290,6295,6300,6304,6309,6314,6318],{"type":44,"tag":2735,"props":6291,"children":6292},{"style":4351},[6293],{"type":49,"value":6294},"claude",{"type":44,"tag":2735,"props":6296,"children":6297},{"style":4356},[6298],{"type":49,"value":6299}," mcp",{"type":44,"tag":2735,"props":6301,"children":6302},{"style":4356},[6303],{"type":49,"value":4412},{"type":44,"tag":2735,"props":6305,"children":6306},{"style":4356},[6307],{"type":49,"value":6308}," bruin",{"type":44,"tag":2735,"props":6310,"children":6311},{"style":4375},[6312],{"type":49,"value":6313}," --",{"type":44,"tag":2735,"props":6315,"children":6316},{"style":4356},[6317],{"type":49,"value":6308},{"type":44,"tag":2735,"props":6319,"children":6320},{"style":4356},[6321],{"type":49,"value":6322}," mcp\n",{"type":44,"tag":2735,"props":6324,"children":6325},{"class":4346,"line":1008},[6326],{"type":44,"tag":2735,"props":6327,"children":6328},{"emptyLinePlaceholder":5639},[6329],{"type":49,"value":5642},{"type":44,"tag":2735,"props":6331,"children":6332},{"class":4346,"line":4582},[6333],{"type":44,"tag":2735,"props":6334,"children":6335},{"style":4539},[6336],{"type":49,"value":6337},"# For Cursor (.cursor/mcp.json)\n",{"type":44,"tag":2735,"props":6339,"children":6340},{"class":4346,"line":4596},[6341],{"type":44,"tag":2735,"props":6342,"children":6343},{"style":4554},[6344],{"type":49,"value":6345},"{\n",{"type":44,"tag":2735,"props":6347,"children":6348},{"class":4346,"line":4618},[6349,6354,6359],{"type":44,"tag":2735,"props":6350,"children":6351},{"style":4351},[6352],{"type":49,"value":6353},"  \"mcpServers\"",{"type":44,"tag":2735,"props":6355,"children":6356},{"style":4375},[6357],{"type":49,"value":6358},":",{"type":44,"tag":2735,"props":6360,"children":6361},{"style":4356},[6362],{"type":49,"value":6363}," {\n",{"type":44,"tag":2735,"props":6365,"children":6366},{"class":4346,"line":4636},[6367,6372,6376],{"type":44,"tag":2735,"props":6368,"children":6369},{"style":4351},[6370],{"type":49,"value":6371},"    \"bruin\"",{"type":44,"tag":2735,"props":6373,"children":6374},{"style":4375},[6375],{"type":49,"value":6358},{"type":44,"tag":2735,"props":6377,"children":6378},{"style":4356},[6379],{"type":49,"value":6363},{"type":44,"tag":2735,"props":6381,"children":6382},{"class":4346,"line":4657},[6383,6388,6392],{"type":44,"tag":2735,"props":6384,"children":6385},{"style":4351},[6386],{"type":49,"value":6387},"      \"command\"",{"type":44,"tag":2735,"props":6389,"children":6390},{"style":4375},[6391],{"type":49,"value":6358},{"type":44,"tag":2735,"props":6393,"children":6394},{"style":4356},[6395],{"type":49,"value":6396}," \"bruin\",\n",{"type":44,"tag":2735,"props":6398,"children":6399},{"class":4346,"line":4673},[6400,6405,6409,6414,6419],{"type":44,"tag":2735,"props":6401,"children":6402},{"style":4351},[6403],{"type":49,"value":6404},"      \"args\"",{"type":44,"tag":2735,"props":6406,"children":6407},{"style":4375},[6408],{"type":49,"value":6358},{"type":44,"tag":2735,"props":6410,"children":6411},{"style":4554},[6412],{"type":49,"value":6413}," [",{"type":44,"tag":2735,"props":6415,"children":6416},{"style":4356},[6417],{"type":49,"value":6418},"\"mcp\"",{"type":44,"tag":2735,"props":6420,"children":6421},{"style":4554},[6422],{"type":49,"value":5285},{"type":44,"tag":2735,"props":6424,"children":6425},{"class":4346,"line":4694},[6426],{"type":44,"tag":2735,"props":6427,"children":6428},{"style":4554},[6429],{"type":49,"value":6430},"    }\n",{"type":44,"tag":2735,"props":6432,"children":6433},{"class":4346,"line":4711},[6434],{"type":44,"tag":2735,"props":6435,"children":6436},{"style":4554},[6437],{"type":49,"value":6438},"  }\n",{"type":44,"tag":2735,"props":6440,"children":6441},{"class":4346,"line":3296},[6442],{"type":44,"tag":2735,"props":6443,"children":6444},{"style":4554},[6445],{"type":49,"value":6446},"}\n",{"type":44,"tag":3996,"props":6448,"children":6449},{},[],{"type":44,"tag":62,"props":6451,"children":6453},{"id":6452},"self-healing-pipeline-tasks",[6454],{"type":49,"value":6455},"Self-Healing Pipeline Tasks",{"type":44,"tag":45,"props":6457,"children":6458},{},[6459],{"type":49,"value":6460},"A context layer is only as good as the data underneath it - if the pipelines are broken or the data is stale, the context is wrong and the agents reach the wrong conclusions. The classic garbage-in & garbage-out pitfall is in full effect here.",{"type":44,"tag":45,"props":6462,"children":6463},{},[6464],{"type":49,"value":6465},"Since the method I introduced above requires clean and healthy data for the agent to build the context layer on top of, it becomes quintessential for your pipelines and tables to be accurate and reliable. Hence all the buzz around \"self-healing pipelines\", but let's look into what that actually looks like.",{"type":44,"tag":45,"props":6467,"children":6468},{},[6469],{"type":49,"value":6470},"Building processes inside pipelines that trigger agents to complete specific tasks to check the health of pipelines, models, and data itself is important. A set of rule-based and scope-restricted tasks allow agents to automatically address common issues or flag, triage, and quarantine for human review.",{"type":44,"tag":45,"props":6472,"children":6473},{},[6474],{"type":49,"value":6475},"Data contracts might be useful here too. Sometimes it is needed to define specific behaviour based on a quality check or fallback plan. For example if table xyz has less than avg 100 data points per minute per location, then don't insert and instead use table abc (for example to prevent ML pipelines making inference with low quality data). Most of the times you can implement dynamic pipelines with your existing pipeline orchestrator, whether it supports it out of the box or needs to be handled manually.",{"type":44,"tag":45,"props":6477,"children":6478},{},[6479],{"type":49,"value":6480},"Let's explore some examples of how self-healing pipelines work - what the agent investigates and triages, how it communicates it to the team, and what steps are taken to resolve the issue.",{"type":44,"tag":45,"props":6482,"children":6483},{},[6484],{"type":49,"value":6485},"Keep in mind, in all these examples the agent is responsible for the initial investigation and proposed solution(s), but depending on the permissions/instructions the agent will either send a message to the team, create a ticket or PR, or just merge the fix. This all depends on your risk appetite and how much freedom and autonomy you want to give to the agent.",{"type":44,"tag":145,"props":6487,"children":6489},{"id":6488},"schema-drift-handling",[6490],{"type":49,"value":6491},"Schema Drift Handling",{"type":44,"tag":74,"props":6493,"children":6494},{},[6495,6500,6505],{"type":44,"tag":78,"props":6496,"children":6497},{},[6498],{"type":49,"value":6499},"new column appears, downstream does a select star -> update to explicitly select columns used downstream",{"type":44,"tag":78,"props":6501,"children":6502},{},[6503],{"type":49,"value":6504},"column type changes -> auto-cast or query the data to infer the type",{"type":44,"tag":78,"props":6506,"children":6507},{},[6508],{"type":49,"value":6509},"column renamed -> match by similarity and refactor references",{"type":44,"tag":145,"props":6511,"children":6513},{"id":6512},"freshness-and-staleness",[6514],{"type":49,"value":6515},"Freshness and Staleness",{"type":44,"tag":74,"props":6517,"children":6518},{},[6519,6524],{"type":44,"tag":78,"props":6520,"children":6521},{},[6522],{"type":49,"value":6523},"scheduled ingestion delayed -> run a backfill run of transformation jobs to catch up",{"type":44,"tag":78,"props":6525,"children":6526},{},[6527],{"type":49,"value":6528},"only 1 new row in source table -> check expected rows and run backfill or flag for review",{"type":44,"tag":45,"props":6530,"children":6531},{},[6532],{"type":49,"value":6533},"Here's a pseudo-code example of what a check could look like with pre-defined actions for the agent.",{"type":44,"tag":4335,"props":6535,"children":6537},{"className":4527,"code":6536,"language":4529,"meta":7,"style":7},"# Freshness check in an asset file\nchecks:\n  - name: freshness\n    params:\n      column: created_at\n      max_delay: \"2 hours\"\n      action: run-backfill\n      alert: data-eng\n",[6538],{"type":44,"tag":162,"props":6539,"children":6540},{"__ignoreMap":7},[6541,6549,6561,6581,6593,6609,6626,6643],{"type":44,"tag":2735,"props":6542,"children":6543},{"class":4346,"line":4347},[6544],{"type":44,"tag":2735,"props":6545,"children":6546},{"style":4539},[6547],{"type":49,"value":6548},"# Freshness check in an asset file\n",{"type":44,"tag":2735,"props":6550,"children":6551},{"class":4346,"line":1001},[6552,6557],{"type":44,"tag":2735,"props":6553,"children":6554},{"style":4548},[6555],{"type":49,"value":6556},"checks",{"type":44,"tag":2735,"props":6558,"children":6559},{"style":4554},[6560],{"type":49,"value":4593},{"type":44,"tag":2735,"props":6562,"children":6563},{"class":4346,"line":1008},[6564,6568,6572,6576],{"type":44,"tag":2735,"props":6565,"children":6566},{"style":4554},[6567],{"type":49,"value":4602},{"type":44,"tag":2735,"props":6569,"children":6570},{"style":4548},[6571],{"type":49,"value":4551},{"type":44,"tag":2735,"props":6573,"children":6574},{"style":4554},[6575],{"type":49,"value":4557},{"type":44,"tag":2735,"props":6577,"children":6578},{"style":4356},[6579],{"type":49,"value":6580},"freshness\n",{"type":44,"tag":2735,"props":6582,"children":6583},{"class":4346,"line":4582},[6584,6589],{"type":44,"tag":2735,"props":6585,"children":6586},{"style":4548},[6587],{"type":49,"value":6588},"    params",{"type":44,"tag":2735,"props":6590,"children":6591},{"style":4554},[6592],{"type":49,"value":4593},{"type":44,"tag":2735,"props":6594,"children":6595},{"class":4346,"line":4596},[6596,6601,6605],{"type":44,"tag":2735,"props":6597,"children":6598},{"style":4548},[6599],{"type":49,"value":6600},"      column",{"type":44,"tag":2735,"props":6602,"children":6603},{"style":4554},[6604],{"type":49,"value":4557},{"type":44,"tag":2735,"props":6606,"children":6607},{"style":4356},[6608],{"type":49,"value":4766},{"type":44,"tag":2735,"props":6610,"children":6611},{"class":4346,"line":4618},[6612,6617,6621],{"type":44,"tag":2735,"props":6613,"children":6614},{"style":4548},[6615],{"type":49,"value":6616},"      max_delay",{"type":44,"tag":2735,"props":6618,"children":6619},{"style":4554},[6620],{"type":49,"value":4557},{"type":44,"tag":2735,"props":6622,"children":6623},{"style":4356},[6624],{"type":49,"value":6625},"\"2 hours\"\n",{"type":44,"tag":2735,"props":6627,"children":6628},{"class":4346,"line":4636},[6629,6634,6638],{"type":44,"tag":2735,"props":6630,"children":6631},{"style":4548},[6632],{"type":49,"value":6633},"      action",{"type":44,"tag":2735,"props":6635,"children":6636},{"style":4554},[6637],{"type":49,"value":4557},{"type":44,"tag":2735,"props":6639,"children":6640},{"style":4356},[6641],{"type":49,"value":6642},"run-backfill\n",{"type":44,"tag":2735,"props":6644,"children":6645},{"class":4346,"line":4657},[6646,6651,6655],{"type":44,"tag":2735,"props":6647,"children":6648},{"style":4548},[6649],{"type":49,"value":6650},"      alert",{"type":44,"tag":2735,"props":6652,"children":6653},{"style":4554},[6654],{"type":49,"value":4557},{"type":44,"tag":2735,"props":6656,"children":6657},{"style":4356},[6658],{"type":49,"value":6659},"data-eng\n",{"type":44,"tag":145,"props":6661,"children":6663},{"id":6662},"data-quality-governance",[6664],{"type":49,"value":6665},"Data Quality & Governance",{"type":44,"tag":74,"props":6667,"children":6668},{},[6669,6674,6679],{"type":44,"tag":78,"props":6670,"children":6671},{},[6672],{"type":49,"value":6673},"volume anomaly in source table -> halt run and escalate",{"type":44,"tag":78,"props":6675,"children":6676},{},[6677],{"type":49,"value":6678},"date format changes -> auto-detect pattern",{"type":44,"tag":78,"props":6680,"children":6681},{},[6682],{"type":49,"value":6683},"new column without description -> auto-generate description or flag",{"type":44,"tag":145,"props":6685,"children":6687},{"id":6686},"monitoring",[6688],{"type":49,"value":6689},"Monitoring",{"type":44,"tag":45,"props":6691,"children":6692},{},[6693],{"type":49,"value":6694},"In terms of monitoring, one thing I've done before and I'm not sure if it's the best way, is to create tasks in between other SQL tasks (or inside a python task) that logs specific things inside a table (e.g. pipeline status, error logs, row counts, quality check status, etc), and then connect those tables to Grafana to create monitoring dashboards and alerts.",{"type":44,"tag":45,"props":6696,"children":6697},{},[6698],{"type":49,"value":6699},"One way of utilizing these monitoring tables is to create scheduled agent tasks (e.g. daily) that check these tables and if there is something that needs to be escalated, it will send a message in Slack with charts and graphs visualizing the logs - this is much more efficient than setting a reminder to check the monitoring dashboards. This is similar to classic alerting systems but it goes a step further because the agent comes to you with not just an alert, but the data visualized and analyzed, and even with a proposed solution and a PR ready for review.",{"type":44,"tag":45,"props":6701,"children":6702},{},[6703],{"type":49,"value":6704},"Here's an example:",{"type":44,"tag":74,"props":6706,"children":6707},{},[6708,6713,6726,6746,6774,6815],{"type":44,"tag":78,"props":6709,"children":6710},{},[6711],{"type":49,"value":6712},"a weekly scheduled agent task runs every Monday morning to check for anomalies in website traffic",{"type":44,"tag":78,"props":6714,"children":6715},{},[6716,6718,6724],{"type":49,"value":6717},"this week it notices that ",{"type":44,"tag":162,"props":6719,"children":6721},{"className":6720},[],[6722],{"type":49,"value":6723},"paid_social",{"type":49,"value":6725}," traffic has been declining day over day for 7 days",{"type":44,"tag":78,"props":6727,"children":6728},{},[6729,6731,6737,6738,6744],{"type":49,"value":6730},"at the same time, a new UTM appeared (",{"type":44,"tag":162,"props":6732,"children":6734},{"className":6733},[],[6735],{"type":49,"value":6736},"utm_source=fb_spring25",{"type":49,"value":841},{"type":44,"tag":162,"props":6739,"children":6741},{"className":6740},[],[6742],{"type":49,"value":6743},"utm_medium=NULL",{"type":49,"value":6745},") and its traffic has been growing at roughly the same rate",{"type":44,"tag":78,"props":6747,"children":6748},{},[6749,6751,6757,6759,6765,6767,6772],{"type":49,"value":6750},"because ",{"type":44,"tag":162,"props":6752,"children":6754},{"className":6753},[],[6755],{"type":49,"value":6756},"utm_medium",{"type":49,"value":6758}," is null, this traffic gets bucketed into the ",{"type":44,"tag":162,"props":6760,"children":6762},{"className":6761},[],[6763],{"type":49,"value":6764},"not set",{"type":49,"value":6766}," channel instead of ",{"type":44,"tag":162,"props":6768,"children":6770},{"className":6769},[],[6771],{"type":49,"value":6723},{"type":49,"value":6773}," - so the traffic didn't actually drop, it was just misattributed",{"type":44,"tag":78,"props":6775,"children":6776},{},[6777,6779,6785,6787,6792,6794,6800,6802,6808,6810],{"type":49,"value":6778},"the agent sends a message in ",{"type":44,"tag":162,"props":6780,"children":6782},{"className":6781},[],[6783],{"type":49,"value":6784},"#marketing-data",{"type":49,"value":6786}," with a chart showing both trends side by side, identifies that the campaign links were likely updated around April 14 with the new UTMs missing ",{"type":44,"tag":162,"props":6788,"children":6790},{"className":6789},[],[6791],{"type":49,"value":6756},{"type":49,"value":6793}," and ",{"type":44,"tag":162,"props":6795,"children":6797},{"className":6796},[],[6798],{"type":49,"value":6799},"utm_campaign",{"type":49,"value":6801},", and proposes a fix: either update the campaign links or add a mapping rule in the pipeline that maps ",{"type":44,"tag":162,"props":6803,"children":6805},{"className":6804},[],[6806],{"type":49,"value":6807},"fb_spring25",{"type":49,"value":6809}," to ",{"type":44,"tag":162,"props":6811,"children":6813},{"className":6812},[],[6814],{"type":49,"value":6723},{"type":44,"tag":78,"props":6816,"children":6817},{},[6818],{"type":49,"value":6819},"without this agent, the marketing team would notice the drop in their weekly report, open a ticket, the data team would investigate and it would take days to figure out it was just a UTM tagging issue",{"type":44,"tag":3996,"props":6821,"children":6822},{},[],{"type":44,"tag":62,"props":6824,"children":6826},{"id":6825},"strategies-and-methods-for-helping-agents-query-data",[6827],{"type":49,"value":6828},"Strategies and Methods for Helping Agents Query Data",{"type":44,"tag":45,"props":6830,"children":6831},{},[6832,6834,6840,6842,6848,6850,6856],{"type":49,"value":6833},"Most databases and warehouses support some form of table-valued functions (TVFs) - in BigQuery it's called ",{"type":44,"tag":162,"props":6835,"children":6837},{"className":6836},[],[6838],{"type":49,"value":6839},"TABLE FUNCTION",{"type":49,"value":6841},", in Snowflake it's ",{"type":44,"tag":162,"props":6843,"children":6845},{"className":6844},[],[6846],{"type":49,"value":6847},"UDTF",{"type":49,"value":6849},", in PostgreSQL it's a function with ",{"type":44,"tag":162,"props":6851,"children":6853},{"className":6852},[],[6854],{"type":49,"value":6855},"RETURNS TABLE",{"type":49,"value":6857},", and SQL Server has had TVFs for a long time. The naming is different but the concept is the same, you define a function that takes specific parameters and returns a table as a result.",{"type":44,"tag":45,"props":6859,"children":6860},{},[6861],{"type":49,"value":6862},"One interesting method that I found effective is the use of TVF as the interface between your agent and the data - you essentially define a function that is used to query tables, think of it as an API interface for the table(s). This way you only expose these TVFs to the agents and they have to provide the specific parameters to get a result back.",{"type":44,"tag":45,"props":6864,"children":6865},{},[6866],{"type":49,"value":6867},"In other words, instead of trusting that the agent will query the table the correct way, you offload some of that responsibility to a built-in function that enforces it. This is especially important when querying large tables that must be filtered by partition, otherwise you'll have agents querying TBs of data just to answer a simple question.",{"type":44,"tag":45,"props":6869,"children":6870},{},[6871],{"type":49,"value":6872},"The reason this works so well for agents is that some tables have very specific query logic that needs to be followed - certain filters that must always be applied, certain joins that need to happen in a specific order, certain aggregation levels that shouldn't be changed. If you let an agent write a raw SQL query against these tables, there's a real chance it will miss a critical filter or join incorrectly and return results that look right but are wrong. By wrapping the table in a TVF, you bake in the correct logic and the agent just has to provide the parameters - it literally cannot query the data the wrong way.",{"type":44,"tag":45,"props":6874,"children":6875},{},[6876],{"type":49,"value":6877},"Here's a concrete example:",{"type":44,"tag":74,"props":6879,"children":6880},{},[6881,6909,6922],{"type":44,"tag":78,"props":6882,"children":6883},{},[6884,6886,6891,6893,6899,6901,6907],{"type":49,"value":6885},"you have an ",{"type":44,"tag":162,"props":6887,"children":6889},{"className":6888},[],[6890],{"type":49,"value":4269},{"type":49,"value":6892}," table that should always be filtered by date range, should always exclude test orders (",{"type":44,"tag":162,"props":6894,"children":6896},{"className":6895},[],[6897],{"type":49,"value":6898},"is_test = false",{"type":49,"value":6900},"), and should always join with ",{"type":44,"tag":162,"props":6902,"children":6904},{"className":6903},[],[6905],{"type":49,"value":6906},"analytics.customers",{"type":49,"value":6908}," to get the customer region",{"type":44,"tag":78,"props":6910,"children":6911},{},[6912,6914,6920],{"type":49,"value":6913},"without a TVF, the agent might run ",{"type":44,"tag":162,"props":6915,"children":6917},{"className":6916},[],[6918],{"type":49,"value":6919},"SELECT * FROM analytics.orders WHERE created_at > '2025-01-01'",{"type":49,"value":6921}," and get results that include test orders and have no region info",{"type":44,"tag":78,"props":6923,"children":6924},{},[6925,6927,6933],{"type":49,"value":6926},"with a TVF, the agent calls ",{"type":44,"tag":162,"props":6928,"children":6930},{"className":6929},[],[6931],{"type":49,"value":6932},"SELECT * FROM analytics.fn_orders(start_date, end_date, region)",{"type":49,"value":6934}," and the function handles the test order filter, the customer join, and the date range logic internally",{"type":44,"tag":4335,"props":6936,"children":6940},{"className":6937,"code":6938,"language":6939,"meta":7,"style":7},"language-sql shiki shiki-themes github-dark","-- BigQuery example\nCREATE TABLE FUNCTION analytics.fn_orders(\n  start_date DATE,\n  end_date DATE,\n  region STRING\n)\nAS (\n  SELECT\n    o.order_id,\n    o.customer_id,\n    c.region,\n    o.status,\n    o.total_amount,\n    o.created_at\n  FROM analytics.orders o\n  JOIN analytics.customers c ON o.customer_id = c.customer_id\n  WHERE o.is_test = false\n    AND o.created_at BETWEEN start_date AND end_date\n    AND c.region = region\n);\n","sql",[6941],{"type":44,"tag":162,"props":6942,"children":6943},{"__ignoreMap":7},[6944,6952,6990,7008,7025,7033,7041,7054,7062,7083,7103,7124,7144,7163,7178,7203,7265,7295,7336,7364],{"type":44,"tag":2735,"props":6945,"children":6946},{"class":4346,"line":4347},[6947],{"type":44,"tag":2735,"props":6948,"children":6949},{"style":4539},[6950],{"type":49,"value":6951},"-- BigQuery example\n",{"type":44,"tag":2735,"props":6953,"children":6954},{"class":4346,"line":1001},[6955,6961,6966,6971,6976,6980,6985],{"type":44,"tag":2735,"props":6956,"children":6958},{"style":6957},"--shiki-default:#F97583",[6959],{"type":49,"value":6960},"CREATE",{"type":44,"tag":2735,"props":6962,"children":6963},{"style":6957},[6964],{"type":49,"value":6965}," TABLE",{"type":44,"tag":2735,"props":6967,"children":6968},{"style":4351},[6969],{"type":49,"value":6970}," FUNCTION",{"type":44,"tag":2735,"props":6972,"children":6973},{"style":4375},[6974],{"type":49,"value":6975}," analytics",{"type":44,"tag":2735,"props":6977,"children":6978},{"style":4554},[6979],{"type":49,"value":864},{"type":44,"tag":2735,"props":6981,"children":6982},{"style":4375},[6983],{"type":49,"value":6984},"fn_orders",{"type":44,"tag":2735,"props":6986,"children":6987},{"style":4554},[6988],{"type":49,"value":6989},"(\n",{"type":44,"tag":2735,"props":6991,"children":6992},{"class":4346,"line":1008},[6993,6998,7003],{"type":44,"tag":2735,"props":6994,"children":6995},{"style":6957},[6996],{"type":49,"value":6997},"  start_date",{"type":44,"tag":2735,"props":6999,"children":7000},{"style":6957},[7001],{"type":49,"value":7002}," DATE",{"type":44,"tag":2735,"props":7004,"children":7005},{"style":4554},[7006],{"type":49,"value":7007},",\n",{"type":44,"tag":2735,"props":7009,"children":7010},{"class":4346,"line":4582},[7011,7016,7021],{"type":44,"tag":2735,"props":7012,"children":7013},{"style":4554},[7014],{"type":49,"value":7015},"  end_date ",{"type":44,"tag":2735,"props":7017,"children":7018},{"style":6957},[7019],{"type":49,"value":7020},"DATE",{"type":44,"tag":2735,"props":7022,"children":7023},{"style":4554},[7024],{"type":49,"value":7007},{"type":44,"tag":2735,"props":7026,"children":7027},{"class":4346,"line":4596},[7028],{"type":44,"tag":2735,"props":7029,"children":7030},{"style":4554},[7031],{"type":49,"value":7032},"  region STRING\n",{"type":44,"tag":2735,"props":7034,"children":7035},{"class":4346,"line":4618},[7036],{"type":44,"tag":2735,"props":7037,"children":7038},{"style":4554},[7039],{"type":49,"value":7040},")\n",{"type":44,"tag":2735,"props":7042,"children":7043},{"class":4346,"line":4636},[7044,7049],{"type":44,"tag":2735,"props":7045,"children":7046},{"style":6957},[7047],{"type":49,"value":7048},"AS",{"type":44,"tag":2735,"props":7050,"children":7051},{"style":4554},[7052],{"type":49,"value":7053}," (\n",{"type":44,"tag":2735,"props":7055,"children":7056},{"class":4346,"line":4657},[7057],{"type":44,"tag":2735,"props":7058,"children":7059},{"style":6957},[7060],{"type":49,"value":7061},"  SELECT\n",{"type":44,"tag":2735,"props":7063,"children":7064},{"class":4346,"line":4673},[7065,7070,7074,7079],{"type":44,"tag":2735,"props":7066,"children":7067},{"style":4375},[7068],{"type":49,"value":7069},"    o",{"type":44,"tag":2735,"props":7071,"children":7072},{"style":4554},[7073],{"type":49,"value":864},{"type":44,"tag":2735,"props":7075,"children":7076},{"style":4375},[7077],{"type":49,"value":7078},"order_id",{"type":44,"tag":2735,"props":7080,"children":7081},{"style":4554},[7082],{"type":49,"value":7007},{"type":44,"tag":2735,"props":7084,"children":7085},{"class":4346,"line":4694},[7086,7090,7094,7099],{"type":44,"tag":2735,"props":7087,"children":7088},{"style":4375},[7089],{"type":49,"value":7069},{"type":44,"tag":2735,"props":7091,"children":7092},{"style":4554},[7093],{"type":49,"value":864},{"type":44,"tag":2735,"props":7095,"children":7096},{"style":4375},[7097],{"type":49,"value":7098},"customer_id",{"type":44,"tag":2735,"props":7100,"children":7101},{"style":4554},[7102],{"type":49,"value":7007},{"type":44,"tag":2735,"props":7104,"children":7105},{"class":4346,"line":4711},[7106,7111,7115,7120],{"type":44,"tag":2735,"props":7107,"children":7108},{"style":4375},[7109],{"type":49,"value":7110},"    c",{"type":44,"tag":2735,"props":7112,"children":7113},{"style":4554},[7114],{"type":49,"value":864},{"type":44,"tag":2735,"props":7116,"children":7117},{"style":4375},[7118],{"type":49,"value":7119},"region",{"type":44,"tag":2735,"props":7121,"children":7122},{"style":4554},[7123],{"type":49,"value":7007},{"type":44,"tag":2735,"props":7125,"children":7126},{"class":4346,"line":3296},[7127,7131,7135,7140],{"type":44,"tag":2735,"props":7128,"children":7129},{"style":4375},[7130],{"type":49,"value":7069},{"type":44,"tag":2735,"props":7132,"children":7133},{"style":4554},[7134],{"type":49,"value":864},{"type":44,"tag":2735,"props":7136,"children":7137},{"style":4375},[7138],{"type":49,"value":7139},"status",{"type":44,"tag":2735,"props":7141,"children":7142},{"style":4554},[7143],{"type":49,"value":7007},{"type":44,"tag":2735,"props":7145,"children":7146},{"class":4346,"line":4748},[7147,7151,7155,7159],{"type":44,"tag":2735,"props":7148,"children":7149},{"style":4375},[7150],{"type":49,"value":7069},{"type":44,"tag":2735,"props":7152,"children":7153},{"style":4554},[7154],{"type":49,"value":864},{"type":44,"tag":2735,"props":7156,"children":7157},{"style":4375},[7158],{"type":49,"value":4246},{"type":44,"tag":2735,"props":7160,"children":7161},{"style":4554},[7162],{"type":49,"value":7007},{"type":44,"tag":2735,"props":7164,"children":7165},{"class":4346,"line":12},[7166,7170,7174],{"type":44,"tag":2735,"props":7167,"children":7168},{"style":4375},[7169],{"type":49,"value":7069},{"type":44,"tag":2735,"props":7171,"children":7172},{"style":4554},[7173],{"type":49,"value":864},{"type":44,"tag":2735,"props":7175,"children":7176},{"style":4375},[7177],{"type":49,"value":4766},{"type":44,"tag":2735,"props":7179,"children":7180},{"class":4346,"line":5067},[7181,7186,7190,7194,7198],{"type":44,"tag":2735,"props":7182,"children":7183},{"style":6957},[7184],{"type":49,"value":7185},"  FROM",{"type":44,"tag":2735,"props":7187,"children":7188},{"style":4375},[7189],{"type":49,"value":6975},{"type":44,"tag":2735,"props":7191,"children":7192},{"style":4554},[7193],{"type":49,"value":864},{"type":44,"tag":2735,"props":7195,"children":7196},{"style":4375},[7197],{"type":49,"value":4238},{"type":44,"tag":2735,"props":7199,"children":7200},{"style":4554},[7201],{"type":49,"value":7202}," o\n",{"type":44,"tag":2735,"props":7204,"children":7205},{"class":4346,"line":5087},[7206,7211,7215,7219,7224,7229,7234,7239,7243,7247,7252,7257,7261],{"type":44,"tag":2735,"props":7207,"children":7208},{"style":6957},[7209],{"type":49,"value":7210},"  JOIN",{"type":44,"tag":2735,"props":7212,"children":7213},{"style":4375},[7214],{"type":49,"value":6975},{"type":44,"tag":2735,"props":7216,"children":7217},{"style":4554},[7218],{"type":49,"value":864},{"type":44,"tag":2735,"props":7220,"children":7221},{"style":4375},[7222],{"type":49,"value":7223},"customers",{"type":44,"tag":2735,"props":7225,"children":7226},{"style":4554},[7227],{"type":49,"value":7228}," c ",{"type":44,"tag":2735,"props":7230,"children":7231},{"style":6957},[7232],{"type":49,"value":7233},"ON",{"type":44,"tag":2735,"props":7235,"children":7236},{"style":4375},[7237],{"type":49,"value":7238}," o",{"type":44,"tag":2735,"props":7240,"children":7241},{"style":4554},[7242],{"type":49,"value":864},{"type":44,"tag":2735,"props":7244,"children":7245},{"style":4375},[7246],{"type":49,"value":7098},{"type":44,"tag":2735,"props":7248,"children":7249},{"style":6957},[7250],{"type":49,"value":7251}," =",{"type":44,"tag":2735,"props":7253,"children":7254},{"style":4375},[7255],{"type":49,"value":7256}," c",{"type":44,"tag":2735,"props":7258,"children":7259},{"style":4554},[7260],{"type":49,"value":864},{"type":44,"tag":2735,"props":7262,"children":7263},{"style":4375},[7264],{"type":49,"value":4654},{"type":44,"tag":2735,"props":7266,"children":7267},{"class":4346,"line":5103},[7268,7273,7277,7281,7286,7290],{"type":44,"tag":2735,"props":7269,"children":7270},{"style":6957},[7271],{"type":49,"value":7272},"  WHERE",{"type":44,"tag":2735,"props":7274,"children":7275},{"style":4375},[7276],{"type":49,"value":7238},{"type":44,"tag":2735,"props":7278,"children":7279},{"style":4554},[7280],{"type":49,"value":864},{"type":44,"tag":2735,"props":7282,"children":7283},{"style":4375},[7284],{"type":49,"value":7285},"is_test",{"type":44,"tag":2735,"props":7287,"children":7288},{"style":6957},[7289],{"type":49,"value":7251},{"type":44,"tag":2735,"props":7291,"children":7292},{"style":4554},[7293],{"type":49,"value":7294}," false\n",{"type":44,"tag":2735,"props":7296,"children":7297},{"class":4346,"line":5120},[7298,7303,7307,7311,7316,7321,7326,7331],{"type":44,"tag":2735,"props":7299,"children":7300},{"style":6957},[7301],{"type":49,"value":7302},"    AND",{"type":44,"tag":2735,"props":7304,"children":7305},{"style":4375},[7306],{"type":49,"value":7238},{"type":44,"tag":2735,"props":7308,"children":7309},{"style":4554},[7310],{"type":49,"value":864},{"type":44,"tag":2735,"props":7312,"children":7313},{"style":4375},[7314],{"type":49,"value":7315},"created_at",{"type":44,"tag":2735,"props":7317,"children":7318},{"style":6957},[7319],{"type":49,"value":7320}," BETWEEN",{"type":44,"tag":2735,"props":7322,"children":7323},{"style":6957},[7324],{"type":49,"value":7325}," start_date",{"type":44,"tag":2735,"props":7327,"children":7328},{"style":6957},[7329],{"type":49,"value":7330}," AND",{"type":44,"tag":2735,"props":7332,"children":7333},{"style":4554},[7334],{"type":49,"value":7335}," end_date\n",{"type":44,"tag":2735,"props":7337,"children":7338},{"class":4346,"line":5132},[7339,7343,7347,7351,7355,7359],{"type":44,"tag":2735,"props":7340,"children":7341},{"style":6957},[7342],{"type":49,"value":7302},{"type":44,"tag":2735,"props":7344,"children":7345},{"style":4375},[7346],{"type":49,"value":7256},{"type":44,"tag":2735,"props":7348,"children":7349},{"style":4554},[7350],{"type":49,"value":864},{"type":44,"tag":2735,"props":7352,"children":7353},{"style":4375},[7354],{"type":49,"value":7119},{"type":44,"tag":2735,"props":7356,"children":7357},{"style":6957},[7358],{"type":49,"value":7251},{"type":44,"tag":2735,"props":7360,"children":7361},{"style":4554},[7362],{"type":49,"value":7363}," region\n",{"type":44,"tag":2735,"props":7365,"children":7366},{"class":4346,"line":5152},[7367],{"type":44,"tag":2735,"props":7368,"children":7369},{"style":4554},[7370],{"type":49,"value":7371},");\n",{"type":44,"tag":45,"props":7373,"children":7374},{},[7375,7377,7383,7385,7391],{"type":49,"value":7376},"Then in your ",{"type":44,"tag":162,"props":7378,"children":7380},{"className":7379},[],[7381],{"type":49,"value":7382},"AGENTS.md",{"type":49,"value":7384}," you just tell the agent to use ",{"type":44,"tag":162,"props":7386,"children":7388},{"className":7387},[],[7389],{"type":49,"value":7390},"analytics.fn_orders",{"type":49,"value":7392}," instead of querying the raw table directly - the agent doesn't need to know about the test order filter or the customer join, it just provides the date range and region and gets clean results back.",{"type":44,"tag":3996,"props":7394,"children":7395},{},[],{"type":44,"tag":62,"props":7397,"children":7399},{"id":7398},"managing-the-transition-teams-and-stakeholders",[7400],{"type":49,"value":7401},"Managing the Transition: Teams and Stakeholders",{"type":44,"tag":45,"props":7403,"children":7404},{},[7405],{"type":49,"value":7406},"Everything above is the technical solution, but that's only half the battle. The other half is getting your team and stakeholders on board with this new way of working. You can build the best context layer in the world but if your data engineers don't trust the agents and your stakeholders don't understand what's changing then it won't matter.",{"type":44,"tag":145,"props":7408,"children":7410},{"id":7409},"start-with-your-data-engineering-team",[7411],{"type":49,"value":7412},"Start With Your Data Engineering Team",{"type":44,"tag":45,"props":7414,"children":7415},{},[7416],{"type":49,"value":7417},"The pattern I've seen work well is a gradual ramp up. It usually starts with using MCP integrations with cursor or claude code to just lookup the data platforms' documentation and query the warehouse to find the specific part of a query or script that was causing some issue. Then after creating some extensive agent rules/instructions documentation as well as creating a readme for each pipeline that contains some business context, the team can start relying on agents to build pipelines or make major changes.",{"type":44,"tag":45,"props":7419,"children":7420},{},[7421],{"type":49,"value":7422},"The next step is usually a more structured workflow that involves AI agents completing some tasks - such as linting, automated pipeline runs, code review, and most importantly updating the documentation.",{"type":44,"tag":45,"props":7424,"children":7425},{},[7426],{"type":49,"value":7427},"The data engineering team must act as role models. No other team will trust AI if the team responsible for creating the data infrastructure doesn't. This is also the time to test things internally before giving data consumers access.",{"type":44,"tag":45,"props":7429,"children":7430},{},[7431],{"type":49,"value":7432},"Here's an overview of what an iterative roll-out internally within the data eng team looks like:",{"type":44,"tag":74,"props":7434,"children":7435},{},[7436,7441,7446,7451,7456,7461,7466,7478,7483],{"type":44,"tag":78,"props":7437,"children":7438},{},[7439],{"type":49,"value":7440},"set up agents and MCPs with access to your pipelines and repos",{"type":44,"tag":78,"props":7442,"children":7443},{},[7444],{"type":49,"value":7445},"ask the agents to help with basic auto-fill, syntax, and documentation lookup tasks",{"type":44,"tag":78,"props":7447,"children":7448},{},[7449],{"type":49,"value":7450},"ask the agents to query the data and investigate reported issues, only helping with the preliminary investigation",{"type":44,"tag":78,"props":7452,"children":7453},{},[7454],{"type":49,"value":7455},"ask the agents to write inline comments, table/column level descriptions, and create readme files for each pipeline",{"type":44,"tag":78,"props":7457,"children":7458},{},[7459],{"type":49,"value":7460},"create an AGENTS.md file that acts as your Data Engineering Bible - consolidation of your data architecture, styleguide, best practices, and design principles",{"type":44,"tag":78,"props":7462,"children":7463},{},[7464],{"type":49,"value":7465},"ask the agents to help with proposing solutions to problems, optimize queries, and create the skeleton of new pipelines/assets",{"type":44,"tag":78,"props":7467,"children":7468},{},[7469,7471,7476],{"type":49,"value":7470},"create the 1.0 version of the context layer - run the ",{"type":44,"tag":162,"props":7472,"children":7474},{"className":7473},[],[7475],{"type":49,"value":4798},{"type":49,"value":7477}," or similar functions to complete any missing documentation, metadata, and context",{"type":44,"tag":78,"props":7479,"children":7480},{},[7481],{"type":49,"value":7482},"build more strict and consistent tasks for constantly updating/maintaining your documentation and context (don't hold back here, be relentless and keep going until every pipeline, table, column, and even CTE is documented)",{"type":44,"tag":78,"props":7484,"children":7485},{},[7486,7488],{"type":49,"value":7487},"start putting everything to the test - ask the agent to query and analyze, investigate and troubleshoot, propose ideas and solutions, and even build a pipeline end-to-end (this is the only way to truly put it to the test)\n",{"type":44,"tag":74,"props":7489,"children":7490},{},[7491],{"type":44,"tag":78,"props":7492,"children":7493},{},[7494],{"type":49,"value":7495},"important reminder: during this stage, you will be frustrated, impatient, and feel like giving up but try to take the failures as feedback that needs to be addressed - the same way when a new hire makes a mistake, you don't immediately fire them, it is a signal that there's a lack of context or tools to do their job",{"type":44,"tag":45,"props":7497,"children":7498},{},[7499],{"type":49,"value":7500},"This not a step-by-step guide but it is a general overview of the journey I've been through and noticed other teams experience as well. This is also not the finish line, it's just the first checkpoint before you get the data consumers involved.",{"type":44,"tag":145,"props":7502,"children":7504},{"id":7503},"partnering-with-stakeholders",[7505],{"type":49,"value":7506},"Partnering With Stakeholders",{"type":44,"tag":45,"props":7508,"children":7509},{},[7510],{"type":49,"value":7511},"After the internal data engineering effort is done, you will reach the point where domain expertise really matters.",{"type":44,"tag":45,"props":7513,"children":7514},{},[7515],{"type":49,"value":7516},"One of the important things to keep in mind when you get to this phase is to avoid investing into a costly, vendor locked-in, and effortful solution. You still haven't proven the efficacy of an AI agent to justify the investment. That's why using free open-source tools is the answer.",{"type":44,"tag":45,"props":7518,"children":7519},{},[7520],{"type":49,"value":7521},"This might require you to find a few champions in the analytics, marketing, product, and other teams where you will hop on a call with them, install cursor or claude code, set up the MCP and warehouse connection, and show them how to ask questions and get an answer.",{"type":44,"tag":45,"props":7523,"children":7524},{},[7525,7527],{"type":49,"value":7526},"There are many tools you can use to implement a simple solution like this, for Bruin I've put together this tutorial to set up the whole thing end-to-end: ",{"type":44,"tag":816,"props":7528,"children":7531},{"href":7529,"rel":7530},"https://getbruin.com/learn/ai-data-analyst",[828],[7532],{"type":49,"value":7533},"getbruin.com/learn/ai-data-analyst",{"type":44,"tag":45,"props":7535,"children":7536},{},[7537],{"type":49,"value":7538},"Get these early-adopters and champions to put it to the test, share feedback, and (again) most importantly improve the context but this time from a business domain perspective.",{"type":44,"tag":45,"props":7540,"children":7541},{},[7542],{"type":49,"value":7543},"For example, a product marketing analyst might:",{"type":44,"tag":74,"props":7545,"children":7546},{},[7547,7552,7557,7562,7567],{"type":44,"tag":78,"props":7548,"children":7549},{},[7550],{"type":49,"value":7551},"ask the agent \"what was our conversion rate from the spring campaign by region?\"",{"type":44,"tag":78,"props":7553,"children":7554},{},[7555],{"type":49,"value":7556},"the agent queries the data and returns a result, but the analyst notices something off - the agent included free trial signups in the conversion calculation",{"type":44,"tag":78,"props":7558,"children":7559},{},[7560],{"type":49,"value":7561},"the analyst corrects it: \"conversions should only count paid signups, free trials are tracked separately\"",{"type":44,"tag":78,"props":7563,"children":7564},{},[7565],{"type":49,"value":7566},"that feedback gets written back into the glossary under the Conversion entity: \"Conversion: a completed paid signup. Free trial signups are excluded and tracked under the Trial entity.\"",{"type":44,"tag":78,"props":7568,"children":7569},{},[7570],{"type":49,"value":7571},"from this point on, every agent and every new team member knows the correct definition",{"type":44,"tag":45,"props":7573,"children":7574},{},[7575],{"type":49,"value":7576},"This is the kind of context that the data engineering team would never have on their own - it lives in the heads of the domain experts. The whole point of involving these champions early is to extract that knowledge and bake it into the context layer so that the agents can actually be useful to the broader team.",{"type":44,"tag":145,"props":7578,"children":7580},{"id":7579},"moving-towards-self-service",[7581],{"type":49,"value":7582},"Moving Towards Self-Service",{"type":44,"tag":45,"props":7584,"children":7585},{},[7586],{"type":49,"value":7587},"At this point you've got the context layer built, the data engineering team is on board, and a few champions from other teams have been testing it. Now you want to roll this out to the rest of the company - but it doesn't make sense to set up cursor or claude code locally for every data consumer, that's not scalable and most of them won't bother with the setup anyway. You need something that lives where people already work, like Slack or Teams or even WhatsApp.",{"type":44,"tag":45,"props":7589,"children":7590},{},[7591],{"type":49,"value":7592},"The agent should be self-learning, meaning that every conversation it has with a data consumer is an opportunity to improve the context. When someone corrects the agent or provides a clarification, that gets written back into the documentation. But here's where it gets interesting, the agent also needs to detect conflicts. If person A from marketing says \"conversion means paid signups only\" but person B from product says \"conversion includes free trials\", the agent should detect this conflict and escalate it rather than just overwriting the previous definition. Not every correction should be treated equally either - you need to set up specific permissions and rules for who's response is actionable. Asset owners should have the authority to make changes to the context for their assets, but a random person in sales shouldn't be able to override a definition set by the finance team.",{"type":44,"tag":45,"props":7594,"children":7595},{},[7596],{"type":49,"value":7597},"Access management is also critical here. Each team or department's agent should only have access to the data they are allowed to access - marketing shouldn't be able to query finance and HR tables, and the product team shouldn't have access to raw customer PII unless they have the right permissions. This is where the connection and warehouse level permissions come into play, you can create separate connections with different access levels and assign them to the agents for each team.",{"type":44,"tag":45,"props":7599,"children":7600},{},[7601],{"type":49,"value":7602},"Beyond just asking questions and getting responses, teams will also want to access traditional dashboards and scheduled reports, but at this point they want an \"agentic\" way to create them and ask follow up questions. Imagine a product manager creates an entire dashboard by just asking question to the agent, and then one day they realize a specific trend and want to further analyze it, so they tag that specific chart (essentially adding the chart's query and metadata) and ask a follow up question - this basically mimics the exact same interaction that a product manager and a product analyst would normally have.",{"type":44,"tag":45,"props":7604,"children":7605},{},[7606,7608,7615],{"type":49,"value":7607},"Bruin Cloud supports this out of the box: ",{"type":44,"tag":816,"props":7609,"children":7612},{"href":7610,"rel":7611},"https://getbruin.com/dashboards/",[828],[7613],{"type":49,"value":7614},"getbruin.com/dashboards",{"type":49,"value":7616}," - but regardless of the tool you use, the important thing is that data consumers can go from asking a question to saving it as a recurring report without needing to involve the data engineering team every time.",{"type":44,"tag":45,"props":7618,"children":7619},{},[7620],{"type":49,"value":7621},"And inevitably, teams will find issues - whether it's a wrong number in a response, a broken chart in a dashboard, or a report that doesn't look right. The agent should be able to take the context from the conversation and create a detailed ticket in Jira, Linear, or GitHub Issues. Not just a vague \"data looks wrong\" ticket but an actual detailed issue with the query that ran, the expected vs actual result, the tables involved, and even a preliminary investigation into what might be causing it (e.g. in the asset reports.sales_emea the CTE \"dedup_customers\" is missing \"transaction_id\" in the QUALIFY statement). This by itself will save a ton of back-n-forth between data consumers and the data engineering team because normally the first 3-4 messages in a ticket are just the data engineer asking which table? which column? what date range? what did you expect? - the agent already has all of that context from the conversation.",{"type":44,"tag":45,"props":7623,"children":7624},{},[7625],{"type":49,"value":7626},"The ultimate question that remains is how to convince the C-suite, executives, and management to get onboard. That's exactly why I propose this iterative and \"start small, free, and minimal-effort\" solution because it is much more convincing when you go and say \"here's what we've done so far, here's the impact, here's the adoption rate\" instead of just proposing a hypothetical plan with arbitrary targets. Setting aside IT restrictions for now, a proof-of-concept and minimal viable product is the easiest way to prove the value of such a solution before investing more time and money.",{"type":44,"tag":3996,"props":7628,"children":7629},{},[],{"type":44,"tag":62,"props":7631,"children":7633},{"id":7632},"conclusion",[7634],{"type":49,"value":7635},"Conclusion",{"type":44,"tag":45,"props":7637,"children":7638},{},[7639],{"type":49,"value":7640},"Using AI in data engineering and data analysis is inevitable, but it is also facing the most amount of resistance because agents can return results that look plausible when they are completely wrong - data is used to make decisions, and quite often they are decisions that can make or break a company. That's why the level of skepticism and hesitation from data teams to rely on AI is understandable.",{"type":44,"tag":45,"props":7642,"children":7643},{},[7644],{"type":49,"value":7645},"Every company wants to solve this problem because they understand the value, but the data team is saying \"context is broken\" and they don't have the time and effort to invest into fixing it.",{"type":44,"tag":45,"props":7647,"children":7648},{},[7649],{"type":49,"value":7650},"That's why a ground-up, iterative, and patient approach is necessary:",{"type":44,"tag":74,"props":7652,"children":7653},{},[7654,7659,7664,7669],{"type":44,"tag":78,"props":7655,"children":7656},{},[7657],{"type":49,"value":7658},"start small and onboard your AI agent like a new hire, get it to analyze the data, read your pipeline code, and explore - focus on the existing knowledge, not that 10% of context that lives outside the pipelines",{"type":44,"tag":78,"props":7660,"children":7661},{},[7662],{"type":49,"value":7663},"stress test the agent internally in the data engineering team using free open-source tools that require minimal set up - focus on improving data quality and documentation, not the smartest or fastest LLM model",{"type":44,"tag":78,"props":7665,"children":7666},{},[7667],{"type":49,"value":7668},"roll out the agent to a few champions across different teams - focus on translating their business domain into context (the 10% left from before), not some fancy expensive \"semantic tool\"",{"type":44,"tag":78,"props":7670,"children":7671},{},[7672],{"type":49,"value":7673},"integrate the agent inside the communication channels and workflows already in use (Slack, Teams, WhatsApp, etc.) - focus on the feedback loop that feels \"human\", not a cold robot that no one wants to talk to",{"type":44,"tag":45,"props":7675,"children":7676},{},[7677],{"type":49,"value":7678},"In this article, we've gone through the journey from an individual data engineer, the entire data engineering team, the early adopters in your organization, all the data consumers, and finally the executives and decision makers.",{"type":44,"tag":45,"props":7680,"children":7681},{},[7682],{"type":49,"value":7683},"Let's recap the key points below.",{"type":44,"tag":145,"props":7685,"children":7687},{"id":7686},"problem-solution",[7688],{"type":49,"value":7689},"Problem & Solution",{"type":44,"tag":45,"props":7691,"children":7692},{},[7693],{"type":49,"value":7694},"The problem isn't the model, it's the inability to create and maintain a context layer - and that inability is a time and tooling problem, not a money one.",{"type":44,"tag":45,"props":7696,"children":7697},{},[7698],{"type":49,"value":7699},"The problem:",{"type":44,"tag":74,"props":7701,"children":7702},{},[7703,7708],{"type":44,"tag":78,"props":7704,"children":7705},{},[7706],{"type":49,"value":7707},"agents return confident but wrong answers because they don't have the context to know for example how \"revenue\" is defined in different teams or which table is stale or which join is required - they guess instead of ask",{"type":44,"tag":78,"props":7709,"children":7710},{},[7711],{"type":49,"value":7712},"existing solutions like vector DBs, RAGs, and other vendor-locked context managers are complex to set up, hard to maintain, made obsolete every time a new model drops, but more importantly require too much effort to get started and prove its value",{"type":44,"tag":45,"props":7714,"children":7715},{},[7716],{"type":49,"value":7717},"The solution:",{"type":44,"tag":74,"props":7719,"children":7720},{},[7721,7726],{"type":44,"tag":78,"props":7722,"children":7723},{},[7724],{"type":49,"value":7725},"start simple with open-source free tools to improve the context using the knowledge that already exists inside your pipelines and infrastructure - asset definitions, glossaries, inline comments, quality checks, all living directly in your pipeline files so it stays close to the code and gets maintained as part of the normal workflow",{"type":44,"tag":78,"props":7727,"children":7728},{},[7729],{"type":49,"value":7730},"roll it out step-by-step, at each step enhancing the context using business domain knowledge from the people who actually use the data - this way you prove the value using an MVP before approaching execs with a big proposal",{"type":44,"tag":145,"props":7732,"children":7734},{"id":7733},"technical-plan",[7735],{"type":49,"value":7736},"Technical Plan",{"type":44,"tag":45,"props":7738,"children":7739},{},[7740],{"type":49,"value":7741},"Onboard the agent like a new hire - give it access to your existing pipelines and warehouse and let it explore.",{"type":44,"tag":74,"props":7743,"children":7744},{},[7745,7750,7755,7760,7765],{"type":44,"tag":78,"props":7746,"children":7747},{},[7748],{"type":49,"value":7749},"map out the tables and schema, write basic descriptions, improve docs and inline comments - get the agent to do the heavy lifting here by analyzing the data and generating the initial metadata",{"type":44,"tag":78,"props":7751,"children":7752},{},[7753],{"type":49,"value":7754},"back-n-forth with the data eng team to improve the context and metadata - treat every wrong answer as a signal that something is missing and fill in the gap (reminder: BE PATIENT)",{"type":44,"tag":78,"props":7756,"children":7757},{},[7758],{"type":49,"value":7759},"set up self-healing tasks inside the pipelines to make sure the underlying data is healthy and accurate - the context layer is useless if the data underneath it is broken",{"type":44,"tag":78,"props":7761,"children":7762},{},[7763],{"type":49,"value":7764},"roll it out to champions that have most of the domain expertise (and data literacy), this will further close the gap in the missing context that the data engineering team wouldn't have on their own",{"type":44,"tag":78,"props":7766,"children":7767},{},[7768],{"type":49,"value":7769},"integrate the agent inside existing communication channels where data consumers can ask questions, create dashboards, and schedule reports",{"type":44,"tag":45,"props":7771,"children":7772},{},[7773],{"type":49,"value":7774},"Next step is to take this proof-of-concept to the execs and show them the value.",{"type":44,"tag":145,"props":7776,"children":7778},{"id":7777},"implementation-plan",[7779],{"type":49,"value":7780},"Implementation Plan",{"type":44,"tag":45,"props":7782,"children":7783},{},[7784],{"type":49,"value":7785},"Start with the data engineering team, expand to domain champions, then roll it out to the rest of the company through the channels they already use.",{"type":44,"tag":74,"props":7787,"children":7788},{},[7789,7794,7799],{"type":44,"tag":78,"props":7790,"children":7791},{},[7792],{"type":49,"value":7793},"get the data eng team comfortable first - start with documentation lookup and investigation, then gradually expand to pipeline building and code review until the 1.0 context layer is solid enough to put in front of other teams",{"type":44,"tag":78,"props":7795,"children":7796},{},[7797],{"type":49,"value":7798},"find champions in marketing, product, finance, etc. and let them break it - their corrections and feedback must be treated gracefully and patiently, involve them as design partners and not just data consumers",{"type":44,"tag":78,"props":7800,"children":7801},{},[7802],{"type":49,"value":7803},"roll it out to the rest of the company via the common communication channels - focus on proper access management, conflict detection, self-service dashboards and reports, and automatic ticket creation and troubleshooting",{"type":44,"tag":45,"props":7805,"children":7806},{},[7807],{"type":49,"value":7808},"Don't go to the C-suite with a hypothetical plan and arbitrary targets - go with a working proof-of-concept, real adoption numbers, and concrete examples of time saved.",{"type":44,"tag":45,"props":7810,"children":7811},{},[7812],{"type":49,"value":7813},"Start small, start free, prove the value, then scale.",{"type":44,"tag":7815,"props":7816,"children":7817},"style",{},[7818],{"type":49,"value":7819},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":1001,"depth":1001,"links":7821},[7822,7823,7824,7827,7835,7841,7842,7847],{"id":4001,"depth":1001,"text":4004},{"id":4035,"depth":1001,"text":4038},{"id":4064,"depth":1001,"text":4067,"children":7825},[7826],{"id":4154,"depth":1008,"text":4157},{"id":4297,"depth":1001,"text":4300,"children":7828},[7829,7830,7831,7832,7833,7834],{"id":4318,"depth":1008,"text":4321},{"id":4459,"depth":1008,"text":4462},{"id":4785,"depth":1008,"text":4788},{"id":5492,"depth":1008,"text":5495},{"id":6082,"depth":1008,"text":6085},{"id":6263,"depth":1008,"text":6266},{"id":6452,"depth":1001,"text":6455,"children":7836},[7837,7838,7839,7840],{"id":6488,"depth":1008,"text":6491},{"id":6512,"depth":1008,"text":6515},{"id":6662,"depth":1008,"text":6665},{"id":6686,"depth":1008,"text":6689},{"id":6825,"depth":1001,"text":6828},{"id":7398,"depth":1001,"text":7401,"children":7843},[7844,7845,7846],{"id":7409,"depth":1008,"text":7412},{"id":7503,"depth":1008,"text":7506},{"id":7579,"depth":1008,"text":7582},{"id":7632,"depth":1001,"text":7635,"children":7848},[7849,7850,7851],{"id":7686,"depth":1008,"text":7689},{"id":7733,"depth":1008,"text":7736},{"id":7777,"depth":1008,"text":7780},"content:blog:ai-skepticism-in-data-engineering.md","blog/ai-skepticism-in-data-engineering.md","blog/ai-skepticism-in-data-engineering",1777374621881]