<?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 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>
    <item>
      <title>The Text-to-SQL Accuracy Cliff: Why Deterministic Compilers Beat LLM Guessing</title>
      <dc:creator>Harshit Chouhan</dc:creator>
      <pubDate>Wed, 05 Aug 2026 14:18:33 +0000</pubDate>
      <link>https://dev.to/harshit_colrows/the-text-to-sql-accuracy-cliff-why-deterministic-compilers-beat-llm-guessing-2860</link>
      <guid>https://dev.to/harshit_colrows/the-text-to-sql-accuracy-cliff-why-deterministic-compilers-beat-llm-guessing-2860</guid>
      <description>&lt;p&gt;Every text-to-SQL demo is flawless. Every production rollout is a coin flip.&lt;/p&gt;

&lt;p&gt;The model didn't get worse between the demo and your warehouse. Your schema crossed a threshold it cannot reason past.&lt;/p&gt;

&lt;h2&gt;
  
  
  Accuracy doesn't decay. It collapses.
&lt;/h2&gt;

&lt;p&gt;The intuition most teams carry is that accuracy degrades gradually as queries get harder. It doesn't. It holds, holds, holds — then falls off a cliff the moment a question needs a join the model has to guess at.&lt;/p&gt;

&lt;p&gt;On our own enterprise benchmark, raw schema access scored &lt;strong&gt;14.5%&lt;/strong&gt;. The same model, given compiled and governed context, scored &lt;strong&gt;98.2%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Same model. Same questions. The only variable was the context it ran on.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three gaps that create the cliff
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gap&lt;/th&gt;
&lt;th&gt;What the model sees&lt;/th&gt;
&lt;th&gt;What it needs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Naming&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cust_t&lt;/code&gt;, &lt;code&gt;cust_type&lt;/code&gt;, &lt;code&gt;customer_seg&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;One typed entity with synonyms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joins&lt;/td&gt;
&lt;td&gt;200 tables, 3 plausible paths&lt;/td&gt;
&lt;td&gt;A proven path, or a hard failure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rules&lt;/td&gt;
&lt;td&gt;No sign of the fiscal calendar&lt;/td&gt;
&lt;td&gt;Grain and filters attached to the metric&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Any one of these produces syntactically perfect SQL that returns the wrong number. That is the dangerous failure — a query that errors gets fixed, a query that returns 8% instead of 12% gets pasted into a board deck.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "temperature: 0" is not determinism
&lt;/h2&gt;

&lt;p&gt;Setting temperature to zero makes sampling greedy, not correct. Greedy decoding over an ambiguous schema reliably picks the &lt;em&gt;same wrong join&lt;/em&gt; every time. You have traded variance for consistent error, which is worse — now it looks trustworthy.&lt;/p&gt;

&lt;p&gt;Determinism has to come from architecture, not decoding parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The LLM parses language into a typed intent&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;semantic graph&lt;/strong&gt; — not the model — resolves entities, metrics and grain&lt;/li&gt;
&lt;li&gt;The planner proves a join path exists, or compilation fails&lt;/li&gt;
&lt;li&gt;Policy predicates are injected before SQL is emitted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ambiguity produces a refusal instead of a guess. That is the whole difference.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — what the famous benchmark numbers actually measure, what failure looks like in real SQL, what a wrong number costs, and how every serious vendor has converged on the same answer — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/text-to-sql-accuracy-cliff/" rel="noopener noreferrer"&gt;The Text-to-SQL Accuracy Cliff: Why Deterministic Compilers Beat LLM Guessing&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/text-to-sql-accuracy-cliff/" rel="noopener noreferrer"&gt;colrows.com/blogs/text-to-sql-accuracy-cliff&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>RAG vs. Semantic Layer: Why AI Needs Deterministic Governance</title>
      <dc:creator>Harshit Chouhan</dc:creator>
      <pubDate>Mon, 03 Aug 2026 18:09:55 +0000</pubDate>
      <link>https://dev.to/harshit_colrows/rag-vs-semantic-layer-why-ai-needs-deterministic-governance-1i2k</link>
      <guid>https://dev.to/harshit_colrows/rag-vs-semantic-layer-why-ai-needs-deterministic-governance-1i2k</guid>
      <description>&lt;p&gt;Half the market is arguing about whether RAG or a semantic layer is the right foundation for enterprise AI.&lt;/p&gt;

&lt;p&gt;They are not competing. They answer different questions, and most teams need both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two shapes of question
&lt;/h2&gt;

&lt;p&gt;Every question an agent receives breaks into one of two forms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"What did we say about X?"&lt;/strong&gt; — lives in contracts, policies, tickets, docs. Unstructured. RAG was built for this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"What is true about X?"&lt;/strong&gt; — lives in your warehouse and governed metrics. Structured. A semantic layer was built for this.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Treating them as rivals is how teams end up with a system that can quote the pricing policy but cannot tell you this quarter's realised price.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where each one breaks
&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;RAG&lt;/th&gt;
&lt;th&gt;Semantic layer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Good at&lt;/td&gt;
&lt;td&gt;Retrieving relevant prose&lt;/td&gt;
&lt;td&gt;Resolving definitions and joins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fails on&lt;/td&gt;
&lt;td&gt;Aggregation, math, current state&lt;/td&gt;
&lt;td&gt;Anything not modelled as data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permissions&lt;/td&gt;
&lt;td&gt;Flattened at ingest, rebuilt at query time&lt;/td&gt;
&lt;td&gt;Compiled per person, per query&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Answer stability&lt;/td&gt;
&lt;td&gt;Varies with retrieval ranking&lt;/td&gt;
&lt;td&gt;Identical by construction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit story&lt;/td&gt;
&lt;td&gt;Cites a chunk&lt;/td&gt;
&lt;td&gt;Reproduces the exact SQL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The permissions row is the one that ends pilots. A retrieval index that ingested everything has, by construction, assembled your most sensitive object — and reconstructing entitlement at query time is guesswork.&lt;/p&gt;

&lt;h2&gt;
  
  
  The layer that actually decides
&lt;/h2&gt;

&lt;p&gt;Neither a document chunk nor a metric definition is worth much until something compiles it into a governed query and runs it.&lt;/p&gt;

&lt;p&gt;That is the piece most architectures are missing: &lt;strong&gt;intent → context resolution → constrained planning → governed execution&lt;/strong&gt;. RAG can feed the first step. It cannot perform the last three.&lt;/p&gt;

&lt;p&gt;Point an agent at raw tables and the best models score in the low teens on real enterprise data. Give the same model compiled, governed context and it clears the high nineties. The retrieval quality was never the bottleneck.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the precise division of labour, why hybrid architectures win, and how compile-time governance closes the gap RAG cannot — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/rag-vs-semantic-layer/" rel="noopener noreferrer"&gt;RAG vs. Semantic Layer: Why AI Needs Deterministic Governance&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/rag-vs-semantic-layer/" rel="noopener noreferrer"&gt;colrows.com/blogs/rag-vs-semantic-layer&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>
