<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Harshit Chouhan</title>
    <description>The latest articles on DEV Community by Harshit Chouhan (@harshit_colrows).</description>
    <link>https://dev.to/harshit_colrows</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3981145%2F43b9166d-c789-43f4-866c-df4d81cc75b8.png</url>
      <title>DEV Community: Harshit Chouhan</title>
      <link>https://dev.to/harshit_colrows</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/harshit_colrows"/>
    <language>en</language>
    <item>
      <title>MCP for Business Intelligence: How AI Agents Should Query Enterprise Data</title>
      <dc:creator>Harshit Chouhan</dc:creator>
      <pubDate>Wed, 23 Sep 2026 14:41:48 +0000</pubDate>
      <link>https://dev.to/harshit_colrows/mcp-for-business-intelligence-how-ai-agents-should-query-enterprise-data-1cgn</link>
      <guid>https://dev.to/harshit_colrows/mcp-for-business-intelligence-how-ai-agents-should-query-enterprise-data-1cgn</guid>
      <description>&lt;p&gt;Wiring an agent straight to your warehouse over MCP takes about an afternoon.&lt;/p&gt;

&lt;p&gt;Explaining to your auditor what it did takes considerably longer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The design decision hiding inside a config file
&lt;/h2&gt;

&lt;p&gt;MCP makes the connection trivial, which is exactly why what sits behind the server matters more now, not less. There are two ways to build it and they look identical from the outside.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expose the tables.&lt;/strong&gt; The agent gets raw schema access and infers meaning. Fast to build, impossible to govern, and every answer is a guess with good grammar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expose the semantics.&lt;/strong&gt; The agent sends intent. The server resolves entities against a typed graph, proves the join path, applies policy for the caller's identity, compiles SQL, and returns a governed result with lineage.&lt;/p&gt;

&lt;h2&gt;
  
  
  What that changes in practice
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Schema-exposed&lt;/th&gt;
&lt;th&gt;Semantics-exposed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;revenue&lt;/code&gt; means&lt;/td&gt;
&lt;td&gt;Whatever column matched&lt;/td&gt;
&lt;td&gt;One versioned definition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Join across 3 tables&lt;/td&gt;
&lt;td&gt;Model picks a path&lt;/td&gt;
&lt;td&gt;Path proven or request fails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two callers, different rights&lt;/td&gt;
&lt;td&gt;Same rows&lt;/td&gt;
&lt;td&gt;Different SQL, correct for each&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auditor asks "what ran?"&lt;/td&gt;
&lt;td&gt;Connection logs&lt;/td&gt;
&lt;td&gt;Question → SQL → predicates → result&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The BI-specific part
&lt;/h2&gt;

&lt;p&gt;Business intelligence has a property most agent use cases don't: the output feeds decisions that get defended later. A dashboard number that's wrong gets corrected. A number an agent surfaced into a board pack and nobody can reconstruct is a different category of problem.&lt;/p&gt;

&lt;p&gt;So for BI over MCP the requirement isn't "can the agent query" — it's "can we reproduce this answer, with the definitions that were in force, six months from now."&lt;/p&gt;

&lt;p&gt;That's not a protocol feature. It's what the layer behind the protocol does.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the server architecture, tool surface design, and how governed results are shaped — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/mcp-business-intelligence/" rel="noopener noreferrer"&gt;MCP for Business Intelligence: How AI Agents Should Query Enterprise Data&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://colrows.com/blogs/mcp-business-intelligence/" rel="noopener noreferrer"&gt;colrows.com/blogs/mcp-business-intelligence&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>architecture</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Conversational BI Tools in 2026, Scored on Governance, Determinism, and Reach</title>
      <dc:creator>Harshit Chouhan</dc:creator>
      <pubDate>Wed, 16 Sep 2026 15:14:57 +0000</pubDate>
      <link>https://dev.to/harshit_colrows/conversational-bi-tools-in-2026-scored-on-governance-determinism-and-reach-2393</link>
      <guid>https://dev.to/harshit_colrows/conversational-bi-tools-in-2026-scored-on-governance-determinism-and-reach-2393</guid>
      <description>&lt;p&gt;Every BI vendor now ships a chat box. Almost none will tell you their accuracy on a real schema.&lt;/p&gt;

&lt;p&gt;Here's how to score them on the questions that actually break things.&lt;/p&gt;

&lt;h2&gt;
  
  
  The demo question vs the real ones
&lt;/h2&gt;

&lt;p&gt;The demo is always single-table: &lt;em&gt;"show me revenue by region."&lt;/em&gt; Every tool passes.&lt;/p&gt;

&lt;p&gt;These are the ones your business actually asks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A metric requiring a join across three tables, one of which has a near-duplicate&lt;/li&gt;
&lt;li&gt;A time comparison where the fiscal calendar isn't the calendar year&lt;/li&gt;
&lt;li&gt;A question two people are entitled to different answers to&lt;/li&gt;
&lt;li&gt;The same question, asked twice, an hour apart&lt;/li&gt;
&lt;li&gt;A question with no valid answer&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What each question reveals
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test&lt;/th&gt;
&lt;th&gt;What a failure tells you&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Multi-table join&lt;/td&gt;
&lt;td&gt;The tool guesses join paths&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fiscal calendar&lt;/td&gt;
&lt;td&gt;Business rules aren't in the model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two entitlements&lt;/td&gt;
&lt;td&gt;Governance is applied after execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repeat question&lt;/td&gt;
&lt;td&gt;The pipeline is probabilistic end to end&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unanswerable&lt;/td&gt;
&lt;td&gt;It will invent rather than refuse&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Number five separates the field more than the other four combined. A tool that cannot say &lt;em&gt;"I don't know"&lt;/em&gt; is a liability in any regulated workflow, because you can never identify which answer was the fabricated one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The structural read
&lt;/h2&gt;

&lt;p&gt;Conversational BI splits into two architectures dressed the same way. One infers meaning from a dataset model at query time. The other resolves intent against a typed semantic graph, proves the join, applies policy, then compiles SQL.&lt;/p&gt;

&lt;p&gt;The first is faster to buy. The second is the only one that survives an audit — and on real enterprise schemas the accuracy gap between them is not marginal, it's the difference between the low teens and the high nineties.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the scored comparison across the current field, with the governance and determinism criteria applied consistently — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/conversational-bi-tools/" rel="noopener noreferrer"&gt;Conversational BI Tools in 2026, Scored on Governance, Determinism, and Reach&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://colrows.com/blogs/conversational-bi-tools/" rel="noopener noreferrer"&gt;colrows.com/blogs/conversational-bi-tools&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>database</category>
      <category>ai</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Generative BI (GenBI): What It Is, and the Tools That Do It Well in 2026</title>
      <dc:creator>Harshit Chouhan</dc:creator>
      <pubDate>Mon, 14 Sep 2026 15:16:50 +0000</pubDate>
      <link>https://dev.to/harshit_colrows/generative-bi-genbi-what-it-is-and-the-tools-that-do-it-well-in-2026-3jn9</link>
      <guid>https://dev.to/harshit_colrows/generative-bi-genbi-what-it-is-and-the-tools-that-do-it-well-in-2026-3jn9</guid>
      <description>&lt;p&gt;GenBI is the year's most oversubscribed label. Everyone claims it; almost nobody defines it.&lt;/p&gt;

&lt;p&gt;Here's the line that separates a real one from a chat box bolted onto a dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  What generative BI should mean
&lt;/h2&gt;

&lt;p&gt;The system generates the &lt;strong&gt;analysis&lt;/strong&gt; — the query, the visualisation, and the explanation — from intent alone. Not selection from pre-built content. Generation.&lt;/p&gt;

&lt;p&gt;Most products labelled GenBI generate one of those three and hard-code the other two.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four test questions
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Weak GenBI&lt;/th&gt;
&lt;th&gt;Real GenBI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Does it generate the query?&lt;/td&gt;
&lt;td&gt;Picks from saved content&lt;/td&gt;
&lt;td&gt;Compiles from intent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can it answer something unmodelled?&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes, or refuses explicitly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Does the explanation describe the executed logic?&lt;/td&gt;
&lt;td&gt;Narrates the chart&lt;/td&gt;
&lt;td&gt;Describes the actual SQL and joins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What happens when it can't answer?&lt;/td&gt;
&lt;td&gt;Produces something anyway&lt;/td&gt;
&lt;td&gt;Says so&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Row three is the quiet one. An "explanation" that describes what the chart shows is a caption. An explanation that tells you which tables were joined, which filters applied, and which policy predicates were injected is an audit artefact.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap is the layer underneath
&lt;/h2&gt;

&lt;p&gt;The distance between "generates SQL" and "generates trustworthy analysis" is exactly the semantic layer.&lt;/p&gt;

&lt;p&gt;Without one, generation is pattern-matching against column names. With one, the model handles language and the graph handles meaning: entities and metrics resolved, join path proven, policy compiled in, dialect-perfect SQL emitted.&lt;/p&gt;

&lt;p&gt;The category is real and the good implementations are genuinely useful. Just evaluate on whether the thing generating your analysis has any structural knowledge of your business — or is inferring it, fluently, every single time.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — what GenBI means precisely, the current landscape, and who clears the bar — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/generative-bi-tools/" rel="noopener noreferrer"&gt;Generative BI (GenBI): What It Is, and the Tools That Do It Well in 2026&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://colrows.com/blogs/generative-bi-tools/" rel="noopener noreferrer"&gt;colrows.com/blogs/generative-bi-tools&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>database</category>
      <category>ai</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Token Cost: Why Brittle Semantic Layers Bleed Capital</title>
      <dc:creator>Harshit Chouhan</dc:creator>
      <pubDate>Wed, 09 Sep 2026 16:45:07 +0000</pubDate>
      <link>https://dev.to/harshit_colrows/token-cost-why-brittle-semantic-layers-bleed-capital-jh5</link>
      <guid>https://dev.to/harshit_colrows/token-cost-why-brittle-semantic-layers-bleed-capital-jh5</guid>
      <description>&lt;p&gt;If your agent's token spend keeps climbing, the model isn't the problem.&lt;/p&gt;

&lt;p&gt;You are paying, per query, to re-explain your schema to something that should already know it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the money actually goes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Schema in every prompt&lt;/td&gt;
&lt;td&gt;No resolved context layer&lt;/td&gt;
&lt;td&gt;Resolve against the graph, not the prompt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retry loops&lt;/td&gt;
&lt;td&gt;Generated SQL fails or returns empty&lt;/td&gt;
&lt;td&gt;Prove the join before execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-turn clarification&lt;/td&gt;
&lt;td&gt;Ambiguity handled in conversation&lt;/td&gt;
&lt;td&gt;Typed intent resolves it in one pass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bigger model tier&lt;/td&gt;
&lt;td&gt;Bought to compensate for missing context&lt;/td&gt;
&lt;td&gt;Fix the context instead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warehouse compute&lt;/td&gt;
&lt;td&gt;Failed and re-run queries&lt;/td&gt;
&lt;td&gt;Fewer, correct queries&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Notice that four of the five are the same root cause wearing different clothes: the model is being asked to do work that belongs upstream.&lt;/p&gt;

&lt;h2&gt;
  
  
  The arithmetic
&lt;/h2&gt;

&lt;p&gt;Stuff a schema dump into the context window and every question re-pays for it. Add retries and you pay several times per question. Then someone proposes a larger model to improve accuracy, and the per-token price goes up on a volume that was already inflated.&lt;/p&gt;

&lt;p&gt;Teams read that curve as "AI is expensive." It isn't. Re-deriving meaning at inference time is expensive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compiled context inverts the economics
&lt;/h2&gt;

&lt;p&gt;When resolution happens against a &lt;strong&gt;semantic graph&lt;/strong&gt; instead of inside the prompt, the model receives a small typed intent rather than your entire warehouse. Fewer tokens in, fewer retries, smaller model sufficient.&lt;/p&gt;

&lt;p&gt;The bill drops and accuracy rises for the same reason — the work moved to the layer that can do it deterministically.&lt;/p&gt;

&lt;p&gt;That is the part worth internalising: token cost and accuracy are not a trade-off you have to manage. They are both downstream of the same architectural decision.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the cost model, worked examples of prompt-side vs compile-side resolution, and where the savings actually land — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/token-cost-hidden-tax-semantic-layer/" rel="noopener noreferrer"&gt;Token Cost: Why Brittle Semantic Layers Bleed Capital&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://colrows.com/blogs/token-cost-hidden-tax-semantic-layer/" rel="noopener noreferrer"&gt;colrows.com/blogs/token-cost-hidden-tax-semantic-layer&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>dataengineering</category>
      <category>architecture</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Semantic Layer for BigQuery: Governed, Deterministic SQL for Your AI Agents</title>
      <dc:creator>Harshit Chouhan</dc:creator>
      <pubDate>Mon, 07 Sep 2026 16:58:21 +0000</pubDate>
      <link>https://dev.to/harshit_colrows/semantic-layer-for-bigquery-governed-deterministic-sql-for-your-ai-agents-1df4</link>
      <guid>https://dev.to/harshit_colrows/semantic-layer-for-bigquery-governed-deterministic-sql-for-your-ai-agents-1df4</guid>
      <description>&lt;p&gt;BigQuery will happily execute whatever SQL your agent invents.&lt;/p&gt;

&lt;p&gt;That is the feature and the failure mode, in one sentence.&lt;/p&gt;

&lt;h2&gt;
  
  
  The engine has no opinion on meaning
&lt;/h2&gt;

&lt;p&gt;BigQuery's job is execution and it is excellent at it — petabyte scans, sub-second aggregates, separated storage and compute. It has no view on whether the query it just ran meant what the asker intended.&lt;/p&gt;

&lt;p&gt;Point an agent at it directly and you get fast, expensive, confidently wrong answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the missing layer has to supply
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Need&lt;/th&gt;
&lt;th&gt;Why BigQuery alone doesn't cover it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Resolved definitions&lt;/td&gt;
&lt;td&gt;Column names are not business meaning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proven join paths&lt;/td&gt;
&lt;td&gt;Including across datasets and outside BigQuery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compile-time policy&lt;/td&gt;
&lt;td&gt;Authorised views are per-view, not per-intent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dialect-perfect GoogleSQL&lt;/td&gt;
&lt;td&gt;Generic SQL loses BigQuery-specific semantics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slot cost control&lt;/td&gt;
&lt;td&gt;An agent retry loop is a billing event&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The cross-dataset row matters more than it looks. Authorised views and row-level policies work well inside BigQuery — but they stop at the BigQuery boundary, and your estate almost certainly doesn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The shape that works
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Intent → context resolution → constrained planning → governed execution.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An agent sends intent. The semantic graph resolves which entities and metrics are involved, at which grain. The planner proves a join path exists — and fails compilation if it doesn't, rather than improvising one. RBAC and ABAC predicates are injected for the caller. Only then is GoogleSQL emitted and run.&lt;/p&gt;

&lt;p&gt;Get that right and BigQuery becomes a very strong execution engine for agent workloads. Skip it and you have built a high-throughput way to be wrong at scale, with a slot bill to match.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the reference architecture, GoogleSQL generation specifics, and how policy composes with authorised views — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/semantic-layer-for-bigquery/" rel="noopener noreferrer"&gt;Semantic Layer for BigQuery: Governed, Deterministic SQL for Your AI Agents&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://colrows.com/blogs/semantic-layer-for-bigquery/" rel="noopener noreferrer"&gt;colrows.com/blogs/semantic-layer-for-bigquery&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>database</category>
      <category>ai</category>
      <category>cloud</category>
    </item>
    <item>
      <title>MCP Is Not Enough: Why Enterprise AI Agents Need a Governed Semantic Layer</title>
      <dc:creator>Harshit Chouhan</dc:creator>
      <pubDate>Wed, 02 Sep 2026 16:23:34 +0000</pubDate>
      <link>https://dev.to/harshit_colrows/mcp-is-not-enough-why-enterprise-ai-agents-need-a-governed-semantic-layer-ec9</link>
      <guid>https://dev.to/harshit_colrows/mcp-is-not-enough-why-enterprise-ai-agents-need-a-governed-semantic-layer-ec9</guid>
      <description>&lt;p&gt;MCP solves the AI plumbing crisis flawlessly.&lt;/p&gt;

&lt;p&gt;It also gives your agents a direct line to confidently wrong answers, and nothing in the protocol prevents that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The protocol moves the request. It doesn't govern the truth.
&lt;/h2&gt;

&lt;p&gt;MCP standardises how an agent reaches a tool. That problem is now genuinely solved — 10,000+ public MCP servers and roughly 97M SDK downloads a month settle the adoption question.&lt;/p&gt;

&lt;p&gt;What MCP says nothing about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether two agents on the same wire agree what &lt;code&gt;revenue&lt;/code&gt; means&lt;/li&gt;
&lt;li&gt;Whether the requester was entitled to ask&lt;/li&gt;
&lt;li&gt;Whether the join the agent needed actually exists&lt;/li&gt;
&lt;li&gt;How you reconstruct, months later, what ran and why&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Connectivity without comprehension is a faster path to the same wrong number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two ways to build the server
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Expose the schema&lt;/th&gt;
&lt;th&gt;Expose the semantics&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Agent receives&lt;/td&gt;
&lt;td&gt;Raw tables and columns&lt;/td&gt;
&lt;td&gt;A resolved, typed intent surface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meaning&lt;/td&gt;
&lt;td&gt;Inferred by the model&lt;/td&gt;
&lt;td&gt;Resolved against a semantic graph&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joins&lt;/td&gt;
&lt;td&gt;Guessed&lt;/td&gt;
&lt;td&gt;Proven, or the request fails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permissions&lt;/td&gt;
&lt;td&gt;Whatever the connection has&lt;/td&gt;
&lt;td&gt;Compiled per person, per query&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build time&lt;/td&gt;
&lt;td&gt;An afternoon&lt;/td&gt;
&lt;td&gt;Longer — and the reason it ships&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit&lt;/td&gt;
&lt;td&gt;Connection logs&lt;/td&gt;
&lt;td&gt;Question → SQL → policies → result&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same protocol. Completely different risk profile. Both look identical in a demo.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the semantic layer adds behind MCP
&lt;/h2&gt;

&lt;p&gt;The agent sends intent. The server resolves entities and metrics against a versioned graph, proves the join path, injects RBAC and ABAC predicates for the caller's identity, compiles dialect-perfect SQL, and returns a governed result with lineage.&lt;/p&gt;

&lt;p&gt;Same question. Same answer. Every agent. Every time.&lt;/p&gt;

&lt;p&gt;MCP is the wire. The semantic layer is the meaning. To build boardroom-ready AI you need both — and the wire is the easy half.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the architecture behind an MCP server that enforces governance, with the request/response shape — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/mcp-governed-semantic-layer/" rel="noopener noreferrer"&gt;MCP Is Not Enough: Why Enterprise AI Agents Need a Governed Semantic Layer&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://colrows.com/blogs/mcp-governed-semantic-layer/" rel="noopener noreferrer"&gt;colrows.com/blogs/mcp-governed-semantic-layer&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>architecture</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Self-Serve Analytics: Why Deterministic Governance is the Missing Link</title>
      <dc:creator>Harshit Chouhan</dc:creator>
      <pubDate>Mon, 31 Aug 2026 15:12:47 +0000</pubDate>
      <link>https://dev.to/harshit_colrows/self-serve-analytics-why-deterministic-governance-is-the-missing-link-1067</link>
      <guid>https://dev.to/harshit_colrows/self-serve-analytics-why-deterministic-governance-is-the-missing-link-1067</guid>
      <description>&lt;p&gt;Ten years of self-serve BI, and the analytics team is still the bottleneck.&lt;/p&gt;

&lt;p&gt;We handed everyone a query tool and treated the semantics as somebody else's problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Self-serve relocated the queue, it didn't remove it
&lt;/h2&gt;

&lt;p&gt;The promise was fewer tickets. What actually happened is the ticket changed shape. It used to say &lt;em&gt;"please pull last quarter's revenue by region."&lt;/em&gt; Now it says &lt;em&gt;"which of these four revenue fields is the real one?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A business user doesn't need SQL. They need certainty that the number means what they think it means, and that they were allowed to pull it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the layer underneath has to provide
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;th&gt;Without it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One governed definition per concept, versioned&lt;/td&gt;
&lt;td&gt;Four dashboards, four numbers, one long meeting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access policy resolved per person at compile time&lt;/td&gt;
&lt;td&gt;Duplicate datasets per audience, drifting apart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A refusal when the question is ambiguous&lt;/td&gt;
&lt;td&gt;A plausible number nobody can defend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lineage on every answer&lt;/td&gt;
&lt;td&gt;"Where did this come from?" has no answer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The refusal row is counter-intuitive and it's the most important. A self-serve tool that always returns something is training your organisation to trust numbers it shouldn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changes when you get it right
&lt;/h2&gt;

&lt;p&gt;At Cipla, moving meaning into a governed layer produced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;8×&lt;/strong&gt; increase in the number of people actually using data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&amp;gt;90%&lt;/strong&gt; reduction in decision latency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;80%&lt;/strong&gt; drop in IT report requests&lt;/li&gt;
&lt;li&gt;Campaign diagnosis that used to take days, resolved effectively instantly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that came from a better dashboard tool. It came from removing the interpretation step between a question and a trustworthy answer.&lt;/p&gt;

&lt;p&gt;Give people a tool and you get more tickets. Give them governed meaning and you get self-serve.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the architecture, the rollout sequence, and the governance model that makes self-serve safe — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/self-serve-analytics-empowering-business-teams/" rel="noopener noreferrer"&gt;Self-Serve Analytics: Why Deterministic Governance is the Missing Link&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://colrows.com/blogs/self-serve-analytics-empowering-business-teams/" rel="noopener noreferrer"&gt;colrows.com/blogs/self-serve-analytics-empowering-business-teams&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>dataengineering</category>
      <category>architecture</category>
      <category>datascience</category>
    </item>
    <item>
      <title>The Semantic Control Plane: Deterministic Governance for AI</title>
      <dc:creator>Harshit Chouhan</dc:creator>
      <pubDate>Wed, 26 Aug 2026 14:10:24 +0000</pubDate>
      <link>https://dev.to/harshit_colrows/the-semantic-control-plane-deterministic-governance-for-ai-3g4e</link>
      <guid>https://dev.to/harshit_colrows/the-semantic-control-plane-deterministic-governance-for-ai-3g4e</guid>
      <description>&lt;p&gt;Most enterprise AI governance is broken by design.&lt;/p&gt;

&lt;p&gt;Runtime filters, output classifiers, LLM-as-judge checks — they all share one fatal flaw. By the time they fire, the sensitive data has already left the warehouse.&lt;/p&gt;

&lt;h2&gt;
  
  
  You're not preventing a breach. You're documenting one.
&lt;/h2&gt;

&lt;p&gt;Every runtime guardrail is a post-hoc annotation. The query ran. The rows moved. Something downstream then decided whether you were allowed to see them.&lt;/p&gt;

&lt;p&gt;That is an audit finding waiting to be written, and no amount of classifier accuracy fixes the ordering problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Moving governance to compile time
&lt;/h2&gt;

&lt;p&gt;The fix is architectural: attach policy to business concepts rather than to tables or endpoints, and evaluate it while the query is being built.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Runtime governance&lt;/th&gt;
&lt;th&gt;Compile-time governance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Policy attached to&lt;/td&gt;
&lt;td&gt;Tables, endpoints, outputs&lt;/td&gt;
&lt;td&gt;Entities, metrics, relationships&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fires&lt;/td&gt;
&lt;td&gt;After execution&lt;/td&gt;
&lt;td&gt;Before SQL is emitted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unauthorised request&lt;/td&gt;
&lt;td&gt;Returns filtered result&lt;/td&gt;
&lt;td&gt;Fails to compile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data movement&lt;/td&gt;
&lt;td&gt;Already happened&lt;/td&gt;
&lt;td&gt;Never happens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit artefact&lt;/td&gt;
&lt;td&gt;A log line&lt;/td&gt;
&lt;td&gt;The exact SQL plus the predicates applied&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Attach a policy to &lt;code&gt;NetRevenue&lt;/code&gt; and &lt;code&gt;ChurnRisk&lt;/code&gt; and it travels with the concept — into every query, every tool, every agent, without being re-implemented per surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a control plane has to do
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Resolve intent against a typed, versioned semantic graph&lt;/li&gt;
&lt;li&gt;Prove a join path exists — no path, no query&lt;/li&gt;
&lt;li&gt;Inject RBAC, ABAC and row/column predicates per persona&lt;/li&gt;
&lt;li&gt;Emit dialect-perfect SQL for the target engine&lt;/li&gt;
&lt;li&gt;Record a point-in-time reproducible audit trail&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 3 is the one people skip, and it's the one that makes the difference between an AI system you can ship into a regulated workflow and one that stays in pilot forever.&lt;/p&gt;

&lt;p&gt;The agent never sees a table it wasn't entitled to — not because it behaved, but because the query was never compiled.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the control plane architecture in detail, how policies compose across scopes, and what the audit output looks like — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/semantic-control-plane/" rel="noopener noreferrer"&gt;The Semantic Control Plane: Deterministic Governance for AI&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://colrows.com/blogs/semantic-control-plane/" rel="noopener noreferrer"&gt;colrows.com/blogs/semantic-control-plane&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>dataengineering</category>
      <category>architecture</category>
      <category>datascience</category>
    </item>
    <item>
      <title>The Best Text-to-SQL Tools in 2026, Scored on Accuracy, Governance, and Reproducibility</title>
      <dc:creator>Harshit Chouhan</dc:creator>
      <pubDate>Mon, 24 Aug 2026 16:04:15 +0000</pubDate>
      <link>https://dev.to/harshit_colrows/the-best-text-to-sql-tools-in-2026-scored-on-accuracy-governance-and-reproducibility-5c2o</link>
      <guid>https://dev.to/harshit_colrows/the-best-text-to-sql-tools-in-2026-scored-on-accuracy-governance-and-reproducibility-5c2o</guid>
      <description>&lt;p&gt;Most text-to-SQL comparisons score features. Features are not the problem.&lt;/p&gt;

&lt;p&gt;Score them on the only thing that matters — does the number come back right, and can you prove it?&lt;/p&gt;

&lt;h2&gt;
  
  
  The scoring criteria that separate the field
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Why it decides the outcome&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Multi-table join accuracy&lt;/td&gt;
&lt;td&gt;Single-table lookups tell you nothing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Behaviour under ambiguity&lt;/td&gt;
&lt;td&gt;Ask, refuse, or silently guess?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authorisation timing&lt;/td&gt;
&lt;td&gt;Before execution, or filtered after?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Determinism&lt;/td&gt;
&lt;td&gt;Same question twice, same answer?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reproducibility&lt;/td&gt;
&lt;td&gt;Can you rebuild a 6-month-old answer for an auditor?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Almost every tool in the category scores well on page one of a demo. The separation happens on the last three rows, and those are architectural — you cannot bolt determinism onto a probabilistic pipeline later.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test that ends most evaluations
&lt;/h2&gt;

&lt;p&gt;Ask the tool something that has no valid answer on your schema.&lt;/p&gt;

&lt;p&gt;A tool that can't say &lt;em&gt;"I don't know"&lt;/em&gt; will eventually tell your CFO something untrue with total confidence. That is worse than a tool that fails loudly, because nobody knows which answer was the bad one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run this evaluation on your own schema
&lt;/h2&gt;

&lt;p&gt;Benchmark demos use clean schemas with sensible names. Yours has three tables called something like &lt;code&gt;customer&lt;/code&gt; and only one of them is current.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A metric requiring a join across three tables, one with a near-duplicate&lt;/li&gt;
&lt;li&gt;A time comparison where the fiscal calendar ≠ calendar year&lt;/li&gt;
&lt;li&gt;A question two people are entitled to different answers to&lt;/li&gt;
&lt;li&gt;The same question, asked an hour apart&lt;/li&gt;
&lt;li&gt;Something unanswerable&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Score every vendor on the same five. It takes an afternoon and the differences stop being marketing.&lt;/p&gt;

&lt;p&gt;For reference: on real enterprise schemas, raw schema access scored &lt;strong&gt;14.5%&lt;/strong&gt; in our benchmark; compiled, governed context scored &lt;strong&gt;98.2%&lt;/strong&gt; with the same model.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the scored comparison across the current field, with methodology and the cases where each tool loses — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/best-text-to-sql-tools/" rel="noopener noreferrer"&gt;The Best Text-to-SQL Tools in 2026, Scored on Accuracy, Governance, and Reproducibility&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://colrows.com/blogs/best-text-to-sql-tools/" rel="noopener noreferrer"&gt;colrows.com/blogs/best-text-to-sql-tools&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>sql</category>
      <category>llm</category>
      <category>database</category>
    </item>
    <item>
      <title>dbt Semantic Layer Alternatives for Multi-Warehouse Estates (2026)</title>
      <dc:creator>Harshit Chouhan</dc:creator>
      <pubDate>Wed, 19 Aug 2026 13:23:37 +0000</pubDate>
      <link>https://dev.to/harshit_colrows/dbt-semantic-layer-alternatives-for-multi-warehouse-estates-2026-6mc</link>
      <guid>https://dev.to/harshit_colrows/dbt-semantic-layer-alternatives-for-multi-warehouse-estates-2026-6mc</guid>
      <description>&lt;p&gt;Most "dbt alternatives" lists are written by whoever wants to sell you the alternative.&lt;/p&gt;

&lt;p&gt;Here's the version that starts by telling you when to keep dbt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep dbt if
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Your consumers are dashboards and analysts, not agents&lt;/li&gt;
&lt;li&gt;Your metric set is reasonably stable&lt;/li&gt;
&lt;li&gt;Your team already treats models as reviewed code&lt;/li&gt;
&lt;li&gt;Someone owns the semantic YAML as part of their job&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a real, common configuration and dbt serves it well. Switching would be churn for its own sake.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start looking when
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Signal&lt;/th&gt;
&lt;th&gt;Why dbt strains&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Agents become the main consumer&lt;/td&gt;
&lt;td&gt;Coverage is limited to pre-defined metrics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Questions routinely fall outside the metric set&lt;/td&gt;
&lt;td&gt;Each one becomes a pull request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Governance must be enforced &lt;em&gt;in&lt;/em&gt; the query&lt;/td&gt;
&lt;td&gt;dbt governs upstream, in the warehouse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-warehouse estate&lt;/td&gt;
&lt;td&gt;Cross-platform joins fall back to hand-written SQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Definitions drift and nobody notices&lt;/td&gt;
&lt;td&gt;No drift detection; staleness is silent&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The multi-warehouse row is the most common trigger. Almost nobody's estate is on one platform — there's a warehouse, a lakehouse someone piloted, an operational Postgres, and a SaaS system that never got migrated.&lt;/p&gt;

&lt;h2&gt;
  
  
  The axis that matters
&lt;/h2&gt;

&lt;p&gt;The useful question isn't feature parity. It's whether your semantic layer is a &lt;strong&gt;definition store&lt;/strong&gt; or an &lt;strong&gt;execution layer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A definition store answers "what is net revenue?" An execution layer answers "for this person, right now, across this estate, prove the join and return governed SQL."&lt;/p&gt;

&lt;p&gt;Those are different products. Your next two years of AI roadmap decide which one you actually need — and the honest answer for many teams is: keep dbt for analytics engineering discipline, and put an execution layer above it for agent traffic. They are not mutually exclusive.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to ask any alternative
&lt;/h2&gt;

&lt;p&gt;Who maintains the model in year two — a person, or the system? If the answer is a person, you've bought dbt with different syntax.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the full alternatives landscape, migration paths, and how to run a multi-warehouse evaluation — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/dbt-semantic-layer-alternatives/" rel="noopener noreferrer"&gt;dbt Semantic Layer Alternatives for Multi-Warehouse Estates (2026)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://colrows.com/blogs/dbt-semantic-layer-alternatives/" rel="noopener noreferrer"&gt;colrows.com/blogs/dbt-semantic-layer-alternatives&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>database</category>
      <category>ai</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Looker Pricing in 2026: What Google Publishes, What You Actually Pay</title>
      <dc:creator>Harshit Chouhan</dc:creator>
      <pubDate>Wed, 12 Aug 2026 15:39:38 +0000</pubDate>
      <link>https://dev.to/harshit_colrows/looker-pricing-in-2026-what-google-publishes-what-you-actually-pay-ha3</link>
      <guid>https://dev.to/harshit_colrows/looker-pricing-in-2026-what-google-publishes-what-you-actually-pay-ha3</guid>
      <description>&lt;p&gt;The Looker quote you receive is not the Looker bill you pay.&lt;/p&gt;

&lt;p&gt;The licence covers the platform. LookML is where the budget quietly goes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's on the quote vs what lands
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Line item&lt;/th&gt;
&lt;th&gt;On the quote?&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Platform / instance fee&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;The number people compare&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-user tiers&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Viewer vs Explorer vs Developer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LookML maintenance&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;An engineer's time, permanently&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warehouse compute&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Billed by BigQuery/Snowflake, not Google&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Re-modelling on schema change&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Arrives as sprint work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Migration if you ever leave&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Definitions are in LookML, not portable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The per-user tiers deserve attention: a "viewer" who filters a dashboard can reclassify as an explorer. Adoption success shows up as a licensing surprise.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real cost driver
&lt;/h2&gt;

&lt;p&gt;LookML was the right instinct — put metric definitions in reviewed code instead of scattering them across dashboards. Consistency improved and stayed improved.&lt;/p&gt;

&lt;p&gt;The cost is that &lt;strong&gt;coverage equals authoring effort&lt;/strong&gt;. Every new concept is a pull request. Every schema change is maintenance debt. Every question outside the model is a ticket, and the ticket is the actual user experience.&lt;/p&gt;

&lt;p&gt;That is fine when the consumer is a human analyst who can wait two days. It stops working when the consumer is an AI agent asking things nobody pre-modelled, at machine rates.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to build an honest comparison
&lt;/h2&gt;

&lt;p&gt;Price three things, not one:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Licence and platform fee&lt;/li&gt;
&lt;li&gt;The engineer who keeps the model current — the salary line nobody puts in the TCO&lt;/li&gt;
&lt;li&gt;The latency between a business question and a trustworthy answer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The third is the one with real money in it. Cipla cut decision latency by over 90% and IT report requests by 80% — neither number appears on any BI invoice.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — current published figures, how the tiers actually reclassify users, and a like-for-like TCO model — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/looker-pricing/" rel="noopener noreferrer"&gt;Looker Pricing in 2026: What Google Publishes, What You Actually Pay&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://colrows.com/blogs/looker-pricing/" rel="noopener noreferrer"&gt;colrows.com/blogs/looker-pricing&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>database</category>
      <category>ai</category>
      <category>datascience</category>
    </item>
    <item>
      <title>dbt Semantic Layer vs Cube vs AtScale: Choosing an Enterprise Semantic Layer</title>
      <dc:creator>Harshit Chouhan</dc:creator>
      <pubDate>Mon, 10 Aug 2026 15:55:42 +0000</pubDate>
      <link>https://dev.to/harshit_colrows/dbt-semantic-layer-vs-cube-vs-atscale-choosing-an-enterprise-semantic-layer-452d</link>
      <guid>https://dev.to/harshit_colrows/dbt-semantic-layer-vs-cube-vs-atscale-choosing-an-enterprise-semantic-layer-452d</guid>
      <description>&lt;p&gt;Three semantic layers, three architectures, three very different bills.&lt;/p&gt;

&lt;p&gt;All three will define what a metric means. None of them proves an AI agent is allowed to run it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick orientation
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;dbt Semantic Layer&lt;/th&gt;
&lt;th&gt;Cube&lt;/th&gt;
&lt;th&gt;AtScale&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core idea&lt;/td&gt;
&lt;td&gt;Metrics as version-controlled code&lt;/td&gt;
&lt;td&gt;Headless API in front of metrics&lt;/td&gt;
&lt;td&gt;OLAP-style aggregate acceleration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strongest when&lt;/td&gt;
&lt;td&gt;You want engineering discipline&lt;/td&gt;
&lt;td&gt;Many apps consume the same numbers&lt;/td&gt;
&lt;td&gt;Heavy, stable aggregate workloads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modelling&lt;/td&gt;
&lt;td&gt;Hand-authored YAML&lt;/td&gt;
&lt;td&gt;Hand-authored data model&lt;/td&gt;
&lt;td&gt;Hand-authored cubes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost driver&lt;/td&gt;
&lt;td&gt;Plan tier + query volume&lt;/td&gt;
&lt;td&gt;Pre-aggregation builds + compute&lt;/td&gt;
&lt;td&gt;Quote-based licence + compute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Governance&lt;/td&gt;
&lt;td&gt;Upstream, in the warehouse&lt;/td&gt;
&lt;td&gt;In front of the API&lt;/td&gt;
&lt;td&gt;On the cube&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each is competent at what it was built for. If your consumers are dashboards and analysts, any of the three will serve you.&lt;/p&gt;

&lt;h2&gt;
  
  
  The question none of them answers
&lt;/h2&gt;

&lt;p&gt;An agent doesn't arrive with a metric name. It arrives with an intent in English and has to work out which entities, which grain, which joins, and whether it's entitled to any of it.&lt;/p&gt;

&lt;p&gt;That exposes two gaps every one of these shares:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Undefined intent has no answer.&lt;/strong&gt; Coverage is whatever someone remembered to model. Business questions don't respect that boundary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorisation is checked around the query, not inside it.&lt;/strong&gt; A filter applied after execution means the data already moved.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What to actually evaluate on
&lt;/h2&gt;

&lt;p&gt;Ignore feature matrices and score these five:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Answer a question nobody modelled, on your schema&lt;/li&gt;
&lt;li&gt;Show why one join path was chosen over two others&lt;/li&gt;
&lt;li&gt;Same question, two users with different entitlements — show both SQL statements&lt;/li&gt;
&lt;li&gt;Ask something ambiguous. Refusal or guess?&lt;/li&gt;
&lt;li&gt;Reproduce a number from six months ago with the definitions then in force&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most evaluations stop at 1. Numbers 3 and 5 are the ones that decide whether the thing ships in a regulated business.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — architecture-by-architecture comparison, cost profiles, and the migration implications of each — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/dbt-semantic-layer-vs-cube-vs-atscale/" rel="noopener noreferrer"&gt;dbt Semantic Layer vs Cube vs AtScale: Choosing an Enterprise Semantic Layer&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://colrows.com/blogs/dbt-semantic-layer-vs-cube-vs-atscale/" rel="noopener noreferrer"&gt;colrows.com/blogs/dbt-semantic-layer-vs-cube-vs-atscale&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>database</category>
      <category>ai</category>
      <category>datascience</category>
    </item>
  </channel>
</rss>
