<?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: Nilesh Kumar</title>
    <description>The latest articles on DEV Community by Nilesh Kumar (@nilesh_kumar).</description>
    <link>https://dev.to/nilesh_kumar</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%2F3983017%2F0e0d496b-6827-47b2-960b-7ed1136fc20e.png</url>
      <title>DEV Community: Nilesh Kumar</title>
      <link>https://dev.to/nilesh_kumar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nilesh_kumar"/>
    <language>en</language>
    <item>
      <title>LookML vs dbt Semantic Layer vs a Compiled Semantic Layer</title>
      <dc:creator>Nilesh Kumar</dc:creator>
      <pubDate>Wed, 23 Sep 2026 14:42:39 +0000</pubDate>
      <link>https://dev.to/nilesh_kumar/lookml-vs-dbt-semantic-layer-vs-a-compiled-semantic-layer-4l47</link>
      <guid>https://dev.to/nilesh_kumar/lookml-vs-dbt-semantic-layer-vs-a-compiled-semantic-layer-4l47</guid>
      <description>&lt;p&gt;LookML and dbt made the same bet: definitions belong in code that humans write and review.&lt;/p&gt;

&lt;p&gt;The next question is whether a human should be writing them at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Both were right about the problem
&lt;/h2&gt;

&lt;p&gt;Scattering metric definitions across dashboards was genuinely bad. Version control, review, reuse — real engineering discipline applied to meaning. That was a step forward and it stuck.&lt;/p&gt;

&lt;h2&gt;
  
  
  The shared constraint
&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;LookML&lt;/th&gt;
&lt;th&gt;dbt Semantic Layer&lt;/th&gt;
&lt;th&gt;Compiled layer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Authored by&lt;/td&gt;
&lt;td&gt;Engineers, by hand&lt;/td&gt;
&lt;td&gt;Engineers, by hand&lt;/td&gt;
&lt;td&gt;Generated from your sources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coverage equals&lt;/td&gt;
&lt;td&gt;Authoring effort&lt;/td&gt;
&lt;td&gt;Authoring effort&lt;/td&gt;
&lt;td&gt;Estate size&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New concept&lt;/td&gt;
&lt;td&gt;A pull request&lt;/td&gt;
&lt;td&gt;A pull request&lt;/td&gt;
&lt;td&gt;Resolved on demand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema change&lt;/td&gt;
&lt;td&gt;Maintenance debt&lt;/td&gt;
&lt;td&gt;Maintenance debt&lt;/td&gt;
&lt;td&gt;Drift detected automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Governance&lt;/td&gt;
&lt;td&gt;Dashboards and folders&lt;/td&gt;
&lt;td&gt;Upstream in the warehouse&lt;/td&gt;
&lt;td&gt;Compiled into every query&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Undefined question&lt;/td&gt;
&lt;td&gt;Ticket&lt;/td&gt;
&lt;td&gt;Ticket&lt;/td&gt;
&lt;td&gt;Resolved or explicitly refused&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The first two rows are the whole comparison. Everything else follows from them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters more now than it did in 2019
&lt;/h2&gt;

&lt;p&gt;When the consumer was a human analyst filing a ticket, "coverage equals authoring effort" was an acceptable trade — the request rate was bounded by how fast people could type.&lt;/p&gt;

&lt;p&gt;Agents don't have that bound. They ask at machine rates, about things nobody anticipated, and a modelling backlog becomes the system's effective capacity.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest framing
&lt;/h2&gt;

&lt;p&gt;This isn't LookML vs dbt. Those two differ mainly in syntax and ecosystem, and either can be the right choice for analytics engineering discipline.&lt;/p&gt;

&lt;p&gt;The real axis is whether your semantic coverage scales with your &lt;strong&gt;data&lt;/strong&gt; or with your &lt;strong&gt;headcount&lt;/strong&gt;. That's the question that decides the next five years, and neither hand-authored option answers it well.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the three-way comparison, migration considerations, and where each fits in a modern stack — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/lookml-vs-dbt-semantic-layer/" rel="noopener noreferrer"&gt;LookML vs dbt Semantic Layer vs a Compiled 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/lookml-vs-dbt-semantic-layer/" rel="noopener noreferrer"&gt;colrows.com/blogs/lookml-vs-dbt-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>
    <item>
      <title>What Is a Semantic Compiler? Deterministic SQL for AI</title>
      <dc:creator>Nilesh Kumar</dc:creator>
      <pubDate>Wed, 16 Sep 2026 15:16:16 +0000</pubDate>
      <link>https://dev.to/nilesh_kumar/what-is-a-semantic-compiler-deterministic-sql-for-ai-lon</link>
      <guid>https://dev.to/nilesh_kumar/what-is-a-semantic-compiler-deterministic-sql-for-ai-lon</guid>
      <description>&lt;p&gt;"Semantic layer" describes where something sits. "Semantic compiler" describes what it does.&lt;/p&gt;

&lt;p&gt;The second one is falsifiable, which is why we use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Map it onto a compiler you already know
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Compiler concept&lt;/th&gt;
&lt;th&gt;Semantic compiler equivalent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Source language&lt;/td&gt;
&lt;td&gt;A business question&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Symbol table&lt;/td&gt;
&lt;td&gt;The versioned semantic graph — entities, metrics, relationships, policies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type checking&lt;/td&gt;
&lt;td&gt;Does this metric exist at this grain, for this scope?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Link step&lt;/td&gt;
&lt;td&gt;Proving a join path. No path, no binary.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Static analysis&lt;/td&gt;
&lt;td&gt;Policy predicates injected before emission&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code generation&lt;/td&gt;
&lt;td&gt;Dialect-perfect SQL for the target engine&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Once you see the mapping, the design constraints follow automatically — and so does the property that matters.&lt;/p&gt;

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

&lt;p&gt;Nobody asks a C compiler to &lt;em&gt;try&lt;/em&gt; producing correct assembly. It either compiles or it fails with an error you can act on. That guarantee is the entire value proposition, and every compiler engineer takes it for granted.&lt;/p&gt;

&lt;p&gt;Apply the same standard here: the system either produces correct, governed SQL or it fails loudly. It never produces plausible SQL.&lt;/p&gt;

&lt;p&gt;That single difference is the whole argument for compiling rather than generating. A generator's failure mode is a confident wrong answer. A compiler's failure mode is an error message.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this isn't just naming
&lt;/h2&gt;

&lt;p&gt;It changes what you can build on top. Deterministic output means you can cache it, audit it, reproduce it point-in-time, and reason about it in a regulated workflow. Probabilistic output means every downstream guarantee is statistical.&lt;/p&gt;

&lt;p&gt;The LLM still does what it's good at — turning language into structured intent. It just stops being the component that decides what your business means.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the compiler architecture in detail, the type system, and how join proof works — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/what-is-a-semantic-compiler/" rel="noopener noreferrer"&gt;What Is a Semantic Compiler? Deterministic SQL 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/what-is-a-semantic-compiler/" rel="noopener noreferrer"&gt;colrows.com/blogs/what-is-a-semantic-compiler&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>Databricks Genie Alternatives: Beyond Curated Spaces Inside Unity Catalog</title>
      <dc:creator>Nilesh Kumar</dc:creator>
      <pubDate>Fri, 11 Sep 2026 15:55:30 +0000</pubDate>
      <link>https://dev.to/nilesh_kumar/databricks-genie-alternatives-beyond-curated-spaces-inside-unity-catalog-4a91</link>
      <guid>https://dev.to/nilesh_kumar/databricks-genie-alternatives-beyond-curated-spaces-inside-unity-catalog-4a91</guid>
      <description>&lt;p&gt;Genie is only as good as the Space somebody curated for it.&lt;/p&gt;

&lt;p&gt;Which means the product you're really evaluating is your own team's capacity to keep curating.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Genie performs
&lt;/h2&gt;

&lt;p&gt;A well-built Space with good example queries genuinely works. For a bounded analytical domain with an owner, it's a reasonable choice and it's already in your Databricks bill.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four questions that decide it
&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;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who curates Spaces, and what happens when they leave?&lt;/td&gt;
&lt;td&gt;Curation is the product&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What does it do outside the curated examples?&lt;/td&gt;
&lt;td&gt;Refuse, or improvise a join?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What covers data outside Databricks?&lt;/td&gt;
&lt;td&gt;Scope stops at the lakehouse boundary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is Unity Catalog governance enforced &lt;em&gt;in&lt;/em&gt; the generated query?&lt;/td&gt;
&lt;td&gt;Or around it?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Question two is the important one. A system that improvises when it runs out of precedent will produce a confident answer built on a guessed relationship, and nothing in the output signals that it did.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two categories of alternative
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Warehouse-native assistants&lt;/strong&gt; — same architecture, same curation dependency, different vendor. Switching gets you a different logo and the same ceiling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Semantic execution layers&lt;/strong&gt; — resolve intent against a graph that maintains itself, so coverage isn't a manual artefact. Join paths proven rather than inferred. Policy compiled into the SQL. Coverage spans the estate rather than one platform.&lt;/p&gt;

&lt;p&gt;The distinction that matters: does the system's knowledge of your business grow because someone curated it, or because the system read your sources and maintains itself with drift detection?&lt;/p&gt;

&lt;p&gt;If it's the former, you haven't bought a product — you've bought a commitment.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the scored comparison, the curation cost model, and how Unity Catalog governance composes — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/databricks-genie-alternatives/" rel="noopener noreferrer"&gt;Databricks Genie Alternatives: Beyond Curated Spaces Inside Unity Catalog&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/databricks-genie-alternatives/" rel="noopener noreferrer"&gt;colrows.com/blogs/databricks-genie-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>APIs vs MCP vs A2A: What Enterprise AI Teams Need to Know</title>
      <dc:creator>Nilesh Kumar</dc:creator>
      <pubDate>Wed, 09 Sep 2026 16:46:10 +0000</pubDate>
      <link>https://dev.to/nilesh_kumar/apis-vs-mcp-vs-a2a-what-enterprise-ai-teams-need-to-know-58lb</link>
      <guid>https://dev.to/nilesh_kumar/apis-vs-mcp-vs-a2a-what-enterprise-ai-teams-need-to-know-58lb</guid>
      <description>&lt;p&gt;APIs, MCP and A2A get discussed as competing standards. They're not. They solve different layers of the same problem.&lt;/p&gt;

&lt;p&gt;Here's the clean separation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three layers, three jobs
&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;Connects&lt;/th&gt;
&lt;th&gt;Consumer&lt;/th&gt;
&lt;th&gt;Solves&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;APIs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Applications to services&lt;/td&gt;
&lt;td&gt;Code you wrote&lt;/td&gt;
&lt;td&gt;Deterministic, contract-based access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agents to tools and data&lt;/td&gt;
&lt;td&gt;An LLM-driven agent&lt;/td&gt;
&lt;td&gt;Discovery and invocation without bespoke glue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A2A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agents to other agents&lt;/td&gt;
&lt;td&gt;Another agent&lt;/td&gt;
&lt;td&gt;Delegation and multi-agent coordination&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;An API assumes the caller already knows what it wants and how to ask. MCP assumes the caller must &lt;em&gt;discover&lt;/em&gt; what's available and figure out how to use it. A2A assumes the caller wants to hand off a goal rather than make a call.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why you end up with all three
&lt;/h2&gt;

&lt;p&gt;They compose. A production agent stack typically has A2A between agents, MCP from agents to capabilities, and plain APIs underneath MCP servers doing the actual work.&lt;/p&gt;

&lt;p&gt;Choosing between them is usually a sign the question was framed wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  The layer none of them provides
&lt;/h2&gt;

&lt;p&gt;All three move requests. None of them governs meaning.&lt;/p&gt;

&lt;p&gt;Whichever combination you land on, something still has to answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which entity does &lt;code&gt;customer&lt;/code&gt; refer to, at what grain?&lt;/li&gt;
&lt;li&gt;Does a valid join path exist between these two concepts?&lt;/li&gt;
&lt;li&gt;Is this caller entitled to these specific rows?&lt;/li&gt;
&lt;li&gt;Can this answer be reproduced six months from now?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those aren't transport concerns and no protocol will grow into them. They belong to a semantic execution layer sitting behind whichever protocol carries the request.&lt;/p&gt;

&lt;p&gt;The protocols move the request. Something else has to govern the truth.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the full architectural comparison, when to reach for each, and how they compose in production — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/apis-vs-mcp-vs-a2a/" rel="noopener noreferrer"&gt;APIs vs MCP vs A2A: What Enterprise AI Teams Need to Know&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/apis-vs-mcp-vs-a2a/" rel="noopener noreferrer"&gt;colrows.com/blogs/apis-vs-mcp-vs-a2a&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>Enterprise MCP Adoption: Why the Model Context Protocol Became Infrastructure</title>
      <dc:creator>Nilesh Kumar</dc:creator>
      <pubDate>Wed, 02 Sep 2026 16:24:46 +0000</pubDate>
      <link>https://dev.to/nilesh_kumar/enterprise-mcp-adoption-why-the-model-context-protocol-became-infrastructure-52c7</link>
      <guid>https://dev.to/nilesh_kumar/enterprise-mcp-adoption-why-the-model-context-protocol-became-infrastructure-52c7</guid>
      <description>&lt;p&gt;Twelve months ago MCP was a spec people argued about on GitHub.&lt;/p&gt;

&lt;p&gt;It is now the default way agents reach enterprise systems — 10,000+ public servers and roughly 97M SDK downloads a month.&lt;/p&gt;

&lt;h2&gt;
  
  
  The wiring question is settled
&lt;/h2&gt;

&lt;p&gt;That adoption curve ends the debate about whether to standardise agent-to-tool connectivity. You should, and the standard exists.&lt;/p&gt;

&lt;p&gt;What it doesn't settle is the meaning question. MCP defines how a request travels. It says nothing about whether two agents on the same wire agree what &lt;code&gt;revenue&lt;/code&gt; means, or whether either was entitled to ask.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enterprise adoption splits in two
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Track&lt;/th&gt;
&lt;th&gt;Status at most organisations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Connectivity&lt;/td&gt;
&lt;td&gt;Largely solved, increasingly commodity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comprehension and control&lt;/td&gt;
&lt;td&gt;Barely started&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Teams that treat MCP as the finish line build a very efficient path to inconsistent answers. Teams that treat it as transport — with a governed semantic layer behind it — get agents that actually ship.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it became infrastructure so fast
&lt;/h2&gt;

&lt;p&gt;Because the alternative was N×M integrations. Three agent frameworks, four data sources, twelve brittle connectors, and someone renames a column and three agents break at once.&lt;/p&gt;

&lt;p&gt;MCP collapses that to one server per source. That's a real engineering win and it explains the curve.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part to plan for now
&lt;/h2&gt;

&lt;p&gt;The protocol is commoditising, which means it will stop being a differentiator within a year. What sits behind your MCP server — schema or semantics — is the decision that persists.&lt;/p&gt;

&lt;p&gt;Expose the schema and every connecting agent infers meaning independently. Expose the semantics and they all compile through the same versioned graph, with the same proven joins and the same policy.&lt;/p&gt;

&lt;p&gt;Same protocol. Same effort to connect. Completely different answers.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the adoption data, what changed in the ecosystem, and how to plan the layer behind the server — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/mcp-enterprise-adoption/" rel="noopener noreferrer"&gt;Enterprise MCP Adoption: Why the Model Context Protocol Became Infrastructure&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-enterprise-adoption/" rel="noopener noreferrer"&gt;colrows.com/blogs/mcp-enterprise-adoption&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>Vanna AI Alternatives: When RAG-Trained Text-to-SQL Needs Governance</title>
      <dc:creator>Nilesh Kumar</dc:creator>
      <pubDate>Wed, 26 Aug 2026 14:09:20 +0000</pubDate>
      <link>https://dev.to/nilesh_kumar/vanna-ai-alternatives-when-rag-trained-text-to-sql-needs-governance-24ck</link>
      <guid>https://dev.to/nilesh_kumar/vanna-ai-alternatives-when-rag-trained-text-to-sql-needs-governance-24ck</guid>
      <description>&lt;p&gt;Vanna proved you can get surprisingly far by retrieving similar queries and letting the model pattern-match.&lt;/p&gt;

&lt;p&gt;Then someone asks a question that resembles nothing in the training set.&lt;/p&gt;

&lt;h2&gt;
  
  
  How RAG-based text-to-SQL works, and where that ends
&lt;/h2&gt;

&lt;p&gt;Find queries like yours, adapt them. When the question is close to something seen before, it's fast and often right. That's a legitimate architecture and it explains the traction.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;th&gt;Why it's structural&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Corpus coverage&lt;/td&gt;
&lt;td&gt;Accuracy tracks how well history covers the question space&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Novel joins&lt;/td&gt;
&lt;td&gt;No precedent to retrieve, so the model improvises&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No entitlement concept&lt;/td&gt;
&lt;td&gt;Similarity doesn't know who's asking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Silent corpus decay&lt;/td&gt;
&lt;td&gt;Schema evolves; old queries stay in the index&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The entitlement row is the one that blocks enterprise deployment. Retrieval has no notion of authorisation — you can filter the result, but the query already ran with whatever credentials the service holds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The alternative isn't a bigger corpus
&lt;/h2&gt;

&lt;p&gt;More examples raise the floor and don't move the ceiling. The ceiling is that pattern-matching has no model of &lt;em&gt;meaning&lt;/em&gt;, so it cannot distinguish "no precedent exists" from "improvise something plausible."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resolve-then-prove&lt;/strong&gt; instead of retrieve-then-guess:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Parse language into a typed intent&lt;/li&gt;
&lt;li&gt;Resolve entities and metrics against a versioned semantic graph&lt;/li&gt;
&lt;li&gt;Prove a join path exists — fail compilation if it doesn't&lt;/li&gt;
&lt;li&gt;Inject policy predicates for the caller&lt;/li&gt;
&lt;li&gt;Emit dialect-perfect SQL&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 3 is what a retrieval corpus fundamentally cannot provide.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Vanna is still the right call
&lt;/h2&gt;

&lt;p&gt;Open source, fast to pilot, full visibility, no procurement. For a proof of concept on a bounded schema it's a reasonable starting point — just budget for the fact that production governance is yours to build.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the scored alternatives comparison, and the architectural difference between retrieval and resolution — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/vanna-ai-alternatives/" rel="noopener noreferrer"&gt;Vanna AI Alternatives: When RAG-Trained Text-to-SQL Needs 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/vanna-ai-alternatives/" rel="noopener noreferrer"&gt;colrows.com/blogs/vanna-ai-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>Why Power BI Copilot Delivers Wrong Answers (and What It Costs You)</title>
      <dc:creator>Nilesh Kumar</dc:creator>
      <pubDate>Wed, 19 Aug 2026 13:24:44 +0000</pubDate>
      <link>https://dev.to/nilesh_kumar/why-power-bi-copilot-delivers-wrong-answers-and-what-it-costs-you-3gk1</link>
      <guid>https://dev.to/nilesh_kumar/why-power-bi-copilot-delivers-wrong-answers-and-what-it-costs-you-3gk1</guid>
      <description>&lt;p&gt;Power BI Copilot rarely says "I don't know."&lt;/p&gt;

&lt;p&gt;It says a number. The number looks right. That's the expensive part.&lt;/p&gt;

&lt;h2&gt;
  
  
  The failure isn't syntax
&lt;/h2&gt;

&lt;p&gt;The generated DAX or SQL usually runs fine. The failure is semantic — the right query shape over the wrong interpretation.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Failure&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ambiguous column&lt;/td&gt;
&lt;td&gt;Two tables have &lt;code&gt;revenue&lt;/code&gt;; it picks one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Misread relationship&lt;/td&gt;
&lt;td&gt;Exists in the model, means something else&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lost filter context&lt;/td&gt;
&lt;td&gt;Visual-level filters don't survive into the generated logic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No provenance&lt;/td&gt;
&lt;td&gt;Nobody can tell afterwards which definition produced the number&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;An answer you can't reproduce isn't an answer. It's a suggestion with a decimal point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why prompting doesn't fix it
&lt;/h2&gt;

&lt;p&gt;Copilot inherits the Power BI semantic model, which means it inherits everything that model leaves ambiguous. If two measures could plausibly answer the question, no amount of prompt engineering tells it which one your CFO means — because that information was never in the model.&lt;/p&gt;

&lt;p&gt;You cannot prompt your way past a missing definition. You can only supply the definition.&lt;/p&gt;

&lt;h2&gt;
  
  
  What closes the gap
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Entities and metrics resolved against a &lt;strong&gt;typed, versioned&lt;/strong&gt; graph before any query exists&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;proven join path&lt;/strong&gt; — no valid path, no query, rather than a plausible guess&lt;/li&gt;
&lt;li&gt;Policy compiled into the query per person, so different entitlements produce different SQL&lt;/li&gt;
&lt;li&gt;An audit trail that reproduces the answer exactly, months later&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On real enterprise schemas that difference is not marginal. Raw schema access scored &lt;strong&gt;14.5%&lt;/strong&gt; in our benchmark; the same model with compiled, governed context scored &lt;strong&gt;98.2%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The model was never the variable.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the specific failure modes with examples, what a wrong number costs, and the architectural fix — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/power-bi-copilot-wrong-answers/" rel="noopener noreferrer"&gt;Why Power BI Copilot Delivers Wrong Answers (and What It Costs You)&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/power-bi-copilot-wrong-answers/" rel="noopener noreferrer"&gt;colrows.com/blogs/power-bi-copilot-wrong-answers&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>Snowflake vs. Databricks: Why You Need an Autonomous Semantic Layer</title>
      <dc:creator>Nilesh Kumar</dc:creator>
      <pubDate>Wed, 12 Aug 2026 15:40:52 +0000</pubDate>
      <link>https://dev.to/nilesh_kumar/snowflake-vs-databricks-why-you-need-an-autonomous-semantic-layer-4of</link>
      <guid>https://dev.to/nilesh_kumar/snowflake-vs-databricks-why-you-need-an-autonomous-semantic-layer-4of</guid>
      <description>&lt;p&gt;Your warehouse vendor now sells the semantic layer too. Convenient.&lt;/p&gt;

&lt;p&gt;Right up until half the business turns out to live in the other warehouse.&lt;/p&gt;

&lt;h2&gt;
  
  
  Both shipped something real
&lt;/h2&gt;

&lt;p&gt;Snowflake Semantic Views and Databricks Metric Views are genuine improvements. Definitions live next to the data, governed by the platform's own model, queryable by that platform's AI features.&lt;/p&gt;

&lt;p&gt;If your entire estate is on one platform, either will take you a long way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Almost nobody's estate is on one platform
&lt;/h2&gt;

&lt;p&gt;There's a warehouse, a lakehouse someone piloted, an operational Postgres, and a SaaS system that never got migrated. A warehouse-native semantic layer can only see its own warehouse.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Consequence&lt;/th&gt;
&lt;th&gt;What it looks like&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cross-platform joins&lt;/td&gt;
&lt;td&gt;Fall back to hand-written SQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duplicate definitions&lt;/td&gt;
&lt;td&gt;Same metric defined twice, drifting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-platform governance&lt;/td&gt;
&lt;td&gt;Coverage is per-platform, so gaps are structural&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Partial answers&lt;/td&gt;
&lt;td&gt;Agent returns a confident number computed over two thirds of the data&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That last one is the dangerous failure. Nothing errors. The number is just wrong in a way nobody can see.&lt;/p&gt;

&lt;h2&gt;
  
  
  The walled garden problem
&lt;/h2&gt;

&lt;p&gt;There is also an incentive question worth naming: a warehouse vendor's semantic layer is, among other things, a reason to move more data into that warehouse. That's not sinister — it's product strategy — but it means "should meaning live inside the warehouse?" is being answered by parties who benefit from one answer.&lt;/p&gt;

&lt;p&gt;Meaning has to sit &lt;strong&gt;above&lt;/strong&gt; the warehouse, not inside one of them: one versioned graph across the estate, join paths proven regardless of which engine holds the tables, compile-time policy applied uniformly, and dialect-perfect SQL emitted per target.&lt;/p&gt;

&lt;p&gt;Adopt the native features. Just don't mistake them for the layer that spans your business.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — what each platform's feature does and where it stops, plus the cross-estate architecture — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/snowflake-databricks-semantic-layer/" rel="noopener noreferrer"&gt;Snowflake vs. Databricks: Why You Need an Autonomous 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/snowflake-databricks-semantic-layer/" rel="noopener noreferrer"&gt;colrows.com/blogs/snowflake-databricks-semantic-layer&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>Semantic Layer vs. Knowledge Graph: Choosing Your AI Data Foundation</title>
      <dc:creator>Nilesh Kumar</dc:creator>
      <pubDate>Fri, 07 Aug 2026 17:18:30 +0000</pubDate>
      <link>https://dev.to/nilesh_kumar/semantic-layer-vs-knowledge-graph-choosing-your-ai-data-foundation-5717</link>
      <guid>https://dev.to/nilesh_kumar/semantic-layer-vs-knowledge-graph-choosing-your-ai-data-foundation-5717</guid>
      <description>&lt;p&gt;Knowledge graph people and semantic layer people keep arguing past each other.&lt;/p&gt;

&lt;p&gt;One models how things relate. The other proves what a number means. You probably need both.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest division of labour
&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;Knowledge graph&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;Models&lt;/td&gt;
&lt;td&gt;Entities and relationships&lt;/td&gt;
&lt;td&gt;Metrics, grain, filters, policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strong at&lt;/td&gt;
&lt;td&gt;Traversal, inference, causality&lt;/td&gt;
&lt;td&gt;Aggregation, definition, governance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weak at&lt;/td&gt;
&lt;td&gt;Math and consistent aggregates&lt;/td&gt;
&lt;td&gt;Anything not modelled as a metric&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical failure&lt;/td&gt;
&lt;td&gt;Ontology drifts, nobody notices&lt;/td&gt;
&lt;td&gt;Question falls outside the metric set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Answers&lt;/td&gt;
&lt;td&gt;"How is X connected to Y?"&lt;/td&gt;
&lt;td&gt;"What is X, exactly, for this person?"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ask an agent &lt;em&gt;"why did EMEA churn spike after the pricing change"&lt;/em&gt; and you need both: the causal path through the graph, and a metric definition precise enough that the number is defensible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the argument actually goes wrong
&lt;/h2&gt;

&lt;p&gt;Treating them as competing purchases. They operate on different layers of the same problem — one is topology, the other is semantics plus policy.&lt;/p&gt;

&lt;p&gt;The real question is neither. It's &lt;strong&gt;which layer executes&lt;/strong&gt;. A graph and a definition are both inert until something compiles them into governed SQL and runs it against your warehouse.&lt;/p&gt;

&lt;h2&gt;
  
  
  The execution gap
&lt;/h2&gt;

&lt;p&gt;That's the piece most architectures are missing. You can have an immaculate ontology and a complete metric catalogue and still have no answer to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does a valid join path exist for this specific question?&lt;/li&gt;
&lt;li&gt;Is this caller entitled to these rows?&lt;/li&gt;
&lt;li&gt;Can I reproduce this answer in six months?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Intent → context resolution → constrained planning → governed execution.&lt;/strong&gt; The graph feeds step two. The semantic layer feeds steps two and four. Neither performs step three.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the division of labour in detail, a worked customer-risk example, and how the two compose — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/semantic-layer-vs-knowledge-graph/" rel="noopener noreferrer"&gt;Semantic Layer vs. Knowledge Graph: Choosing Your AI Data Foundation&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-vs-knowledge-graph/" rel="noopener noreferrer"&gt;colrows.com/blogs/semantic-layer-vs-knowledge-graph&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>Governing AI Agents: Why Compile-Time Security is Mandatory</title>
      <dc:creator>Nilesh Kumar</dc:creator>
      <pubDate>Wed, 05 Aug 2026 14:28:24 +0000</pubDate>
      <link>https://dev.to/nilesh_kumar/governing-ai-agents-why-compile-time-security-is-mandatory-13a7</link>
      <guid>https://dev.to/nilesh_kumar/governing-ai-agents-why-compile-time-security-is-mandatory-13a7</guid>
      <description>&lt;p&gt;The moment you hand an agent warehouse credentials, your governance model is already obsolete.&lt;/p&gt;

&lt;p&gt;Prompts aren't policy. Output filters aren't controls. Logs aren't proof.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every runtime guardrail shares one flaw
&lt;/h2&gt;

&lt;p&gt;It fires after the query ran. The rows moved. You are not preventing exposure — you're annotating it.&lt;/p&gt;

&lt;p&gt;That ordering problem is not solvable by making the classifier better. It's solvable by moving the decision earlier.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually governs an agent
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;th&gt;What it prevents&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Intent parsing&lt;/td&gt;
&lt;td&gt;Language → typed intent&lt;/td&gt;
&lt;td&gt;Prompt injection reaching SQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context resolution&lt;/td&gt;
&lt;td&gt;Entities and metrics resolved against a versioned graph&lt;/td&gt;
&lt;td&gt;Guessed column semantics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Join proof&lt;/td&gt;
&lt;td&gt;Path proven, or compilation fails&lt;/td&gt;
&lt;td&gt;Invented relationships&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Policy injection&lt;/td&gt;
&lt;td&gt;RBAC + ABAC + row/column predicates&lt;/td&gt;
&lt;td&gt;Unauthorised rows ever being read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit emission&lt;/td&gt;
&lt;td&gt;Question → SQL → predicates → result&lt;/td&gt;
&lt;td&gt;An unanswerable post-incident review&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;h2&gt;
  
  
  The test to run on any vendor
&lt;/h2&gt;

&lt;p&gt;Ask what happens when a user requests something they're not entitled to.&lt;/p&gt;

&lt;p&gt;If the answer involves filtering the result set, the data already left the warehouse and you're being sold a logging feature as a security control.&lt;/p&gt;

&lt;p&gt;If the answer is "compilation fails," you're looking at governance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why compile-time is the only defensible position
&lt;/h2&gt;

&lt;p&gt;Regulators don't accept "the model said so" as a control, and they never have. A number that informed a decision has to be reconstructable months later with the definitions that were in force at the time.&lt;/p&gt;

&lt;p&gt;That means policy has to be part of query construction, not a wrapper around it — and the audit artefact has to be the SQL itself, not a description of intent.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the governance architecture step by step, policy composition across scopes, and the audit format — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/how-to-govern-ai-agents-that-query-enterprise-data/" rel="noopener noreferrer"&gt;Governing AI Agents: Why Compile-Time Security is Mandatory&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/how-to-govern-ai-agents-that-query-enterprise-data/" rel="noopener noreferrer"&gt;colrows.com/blogs/how-to-govern-ai-agents-that-query-enterprise-data&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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