<?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: Yogendra Sharma</title>
    <description>The latest articles on DEV Community by Yogendra Sharma (@yogendra_colrows).</description>
    <link>https://dev.to/yogendra_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%2F3981553%2F1484002c-3a6b-4a54-806c-b538d687c2a9.png</url>
      <title>DEV Community: Yogendra Sharma</title>
      <link>https://dev.to/yogendra_colrows</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yogendra_colrows"/>
    <language>en</language>
    <item>
      <title>Stop Semantic Decay: Why AI Needs an Autonomous Compiler</title>
      <dc:creator>Yogendra Sharma</dc:creator>
      <pubDate>Tue, 01 Sep 2026 15:39:35 +0000</pubDate>
      <link>https://dev.to/yogendra_colrows/stop-semantic-decay-why-ai-needs-an-autonomous-compiler-3c4m</link>
      <guid>https://dev.to/yogendra_colrows/stop-semantic-decay-why-ai-needs-an-autonomous-compiler-3c4m</guid>
      <description>&lt;p&gt;Most data systems don't break. They slowly forget.&lt;/p&gt;

&lt;p&gt;A definition shifts. A metric gets reused in a new context. An assumption outlives the reason for it. Nothing crashes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this isn't a data quality problem
&lt;/h2&gt;

&lt;p&gt;Data quality tooling checks whether values are within expected bounds. Drift is different — the values are fine. The &lt;em&gt;meaning&lt;/em&gt; moved.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Data quality check&lt;/th&gt;
&lt;th&gt;Reality&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; now excludes intercompany&lt;/td&gt;
&lt;td&gt;Passes&lt;/td&gt;
&lt;td&gt;Every trend line has a discontinuity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Churn window changed 30→60 days&lt;/td&gt;
&lt;td&gt;Passes&lt;/td&gt;
&lt;td&gt;Two teams' numbers stop agreeing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Table repurposed after migration&lt;/td&gt;
&lt;td&gt;Passes&lt;/td&gt;
&lt;td&gt;Old dashboards read it as if unchanged&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New segment definition&lt;/td&gt;
&lt;td&gt;Passes&lt;/td&gt;
&lt;td&gt;Historical comparisons are meaningless&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every one of those passes every test you have. Dashboards still load. Confidence quietly erodes until someone finally says "I don't trust this number" in a meeting, and nobody can trace when it stopped being true.&lt;/p&gt;

&lt;h2&gt;
  
  
  Drift is technical debt with no ticket
&lt;/h2&gt;

&lt;p&gt;That's what makes it insidious. Code debt is visible — you can see the TODO, the failing test, the module nobody will touch. Semantic debt has no artefact. It accumulates in the gap between what a definition says and how it's actually used.&lt;/p&gt;

&lt;h2&gt;
  
  
  What catches it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;behaviour layer&lt;/strong&gt; — statistical profiles of how concepts are actually queried&lt;/li&gt;
&lt;li&gt;Comparison of declared definition against observed usage&lt;/li&gt;
&lt;li&gt;Alerting on divergence, not on value ranges&lt;/li&gt;
&lt;li&gt;Versioning, so the moment of change is recoverable&lt;/li&gt;
&lt;li&gt;Autonomous rebuild, so the fix isn't a quarterly review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The mechanism matters: you detect drift by noticing that &lt;em&gt;usage&lt;/em&gt; stopped matching &lt;em&gt;declaration&lt;/em&gt;. That signal exists in your query logs already. Almost nobody reads it.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — how drift accumulates, the detection mechanism, and why autonomous maintenance is the only sustainable answer — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/knowledge-drift-and-semantic-decay/" rel="noopener noreferrer"&gt;Stop Semantic Decay: Why AI Needs an Autonomous Compiler&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/knowledge-drift-and-semantic-decay/" rel="noopener noreferrer"&gt;colrows.com/blogs/knowledge-drift-and-semantic-decay&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>Multi-Tenant Semantic Isolation: Enforcing Tenant Boundaries at Compile Time</title>
      <dc:creator>Yogendra Sharma</dc:creator>
      <pubDate>Thu, 27 Aug 2026 15:02:02 +0000</pubDate>
      <link>https://dev.to/yogendra_colrows/multi-tenant-semantic-isolation-enforcing-tenant-boundaries-at-compile-time-1432</link>
      <guid>https://dev.to/yogendra_colrows/multi-tenant-semantic-isolation-enforcing-tenant-boundaries-at-compile-time-1432</guid>
      <description>&lt;p&gt;We've been building multi-tenant AI systems and hit a wall most platforms quietly ignore.&lt;/p&gt;

&lt;p&gt;Data can be isolated. Meaning cannot — not by the usual mechanisms.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem in one sentence
&lt;/h2&gt;

&lt;p&gt;Two tenants define &lt;code&gt;revenue&lt;/code&gt; differently. Both are correct. Your semantic layer has to be right twice, simultaneously, without either tenant's definition leaking into the other's answers.&lt;/p&gt;

&lt;p&gt;Row-level security doesn't help here. It isolates &lt;em&gt;rows&lt;/em&gt;. This is a collision in the definition layer, above the data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where naive designs break
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Failure&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One shared graph, tenant filter&lt;/td&gt;
&lt;td&gt;Tenant A's definition resolves for Tenant B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One graph per tenant&lt;/td&gt;
&lt;td&gt;Maintenance cost multiplies by tenant count&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Namespace prefixes&lt;/td&gt;
&lt;td&gt;Shared concepts get duplicated and drift&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Isolation at the API layer&lt;/td&gt;
&lt;td&gt;Resolution already happened underneath&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Multi-scope resolution
&lt;/h2&gt;

&lt;p&gt;The workable answer is to make scope a first-class dimension of the graph itself: &lt;strong&gt;global → datastore → persona → user&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A concept resolves by walking that chain and taking the most specific definition available. &lt;code&gt;Revenue&lt;/code&gt; might be defined globally, overridden for a datastore, refined for a persona. Tenant boundaries become a scope level rather than a deployment decision.&lt;/p&gt;

&lt;p&gt;Two properties fall out of that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Compile-time enforcement&lt;/strong&gt; — an unauthorised cross-tenant resolution fails to compile rather than returning filtered rows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared maintenance&lt;/strong&gt; — a global improvement propagates to every tenant that hasn't overridden it, so you're not maintaining N graphs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this matters beyond SaaS
&lt;/h2&gt;

&lt;p&gt;Any organisation with distinct legal entities, regional definitions, or acquired subsidiaries has the same problem internally. "One version of the truth" is usually wrong — you need one version &lt;em&gt;per scope&lt;/em&gt;, resolved deterministically, with the boundaries provable.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the scope resolution model, the compile-time isolation guarantees, and the tenancy architecture — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/multi-tenant-semantic-isolation/" rel="noopener noreferrer"&gt;Multi-Tenant Semantic Isolation: Enforcing Tenant Boundaries at Compile Time&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/multi-tenant-semantic-isolation/" rel="noopener noreferrer"&gt;colrows.com/blogs/multi-tenant-semantic-isolation&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>architecture</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>The Enterprise Memory Graph: Why AI-Native Companies Need a Memory They Can Trust</title>
      <dc:creator>Yogendra Sharma</dc:creator>
      <pubDate>Thu, 20 Aug 2026 17:12:52 +0000</pubDate>
      <link>https://dev.to/yogendra_colrows/the-enterprise-memory-graph-why-ai-native-companies-need-a-memory-they-can-trust-4ghe</link>
      <guid>https://dev.to/yogendra_colrows/the-enterprise-memory-graph-why-ai-native-companies-need-a-memory-they-can-trust-4ghe</guid>
      <description>&lt;p&gt;Every AI vendor is selling memory this year.&lt;/p&gt;

&lt;p&gt;Almost none of it can tell you what "active customer" meant last quarter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two different problems wearing the same word
&lt;/h2&gt;

&lt;p&gt;Conversational memory stores what was &lt;em&gt;said&lt;/em&gt;. Enterprise memory has to store what was &lt;em&gt;true&lt;/em&gt; — and when it stopped being true.&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;Conversational memory&lt;/th&gt;
&lt;th&gt;Enterprise memory graph&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Unit&lt;/td&gt;
&lt;td&gt;Message, summary, embedding&lt;/td&gt;
&lt;td&gt;Typed entity, metric, relationship&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Question answered&lt;/td&gt;
&lt;td&gt;"What did we discuss?"&lt;/td&gt;
&lt;td&gt;"What was true, when, for whom?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consistency&lt;/td&gt;
&lt;td&gt;Best-effort&lt;/td&gt;
&lt;td&gt;Versioned and reproducible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Governance&lt;/td&gt;
&lt;td&gt;Usually none&lt;/td&gt;
&lt;td&gt;Policy attached to the concept&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure mode&lt;/td&gt;
&lt;td&gt;Forgets&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Silently disagrees with itself&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That last row is the dangerous one. A system that forgets is annoying. A system that quietly returns numbers computed under two different definitions is a trust problem you find out about in a board meeting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The failure nobody instruments
&lt;/h2&gt;

&lt;p&gt;A definition changes in April. Nothing breaks. Dashboards still load, queries still return. But every answer produced after that date quietly disagrees with every answer before it, and no one can say which was right.&lt;/p&gt;

&lt;p&gt;There's no exception, no alert, no failed test. Just an accumulating divergence.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes it a memory rather than a cache
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Typed&lt;/strong&gt; entities and relationships, so structure is explicit rather than inferred&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Versioned&lt;/strong&gt;, so a historical answer can be rebuilt exactly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Point-in-time reproducible&lt;/strong&gt; — the property that turns memory into evidence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drift-detecting&lt;/strong&gt;, so a stale definition is surfaced rather than discovered&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Governed&lt;/strong&gt;, so entitlement travels with meaning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you can't reconstruct what a metric meant on a specific date, you don't have memory. You have a cache with good marketing.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the graph architecture, versioning model, and how point-in-time reproduction works — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/enterprise-memory-graph/" rel="noopener noreferrer"&gt;The Enterprise Memory Graph: Why AI-Native Companies Need a Memory They Can Trust&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/enterprise-memory-graph/" rel="noopener noreferrer"&gt;colrows.com/blogs/enterprise-memory-graph&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 Decline of Metadata Tools: Why You Need a Semantic Compiler</title>
      <dc:creator>Yogendra Sharma</dc:creator>
      <pubDate>Tue, 18 Aug 2026 15:02:01 +0000</pubDate>
      <link>https://dev.to/yogendra_colrows/the-decline-of-metadata-tools-why-you-need-a-semantic-compiler-13jl</link>
      <guid>https://dev.to/yogendra_colrows/the-decline-of-metadata-tools-why-you-need-a-semantic-compiler-13jl</guid>
      <description>&lt;p&gt;The metadata catalog category consolidated in 2025 and almost nobody wrote the post-mortem.&lt;/p&gt;

&lt;p&gt;It wasn't a product failure. The ROI case never closed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The original promise, and why it was reasonable
&lt;/h2&gt;

&lt;p&gt;Document the estate, and analysts stop wasting weeks finding data. Lineage for impact analysis, ownership for accountability, classification for compliance. Alation, Collibra and Atlan are genuinely good at all of that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the payback didn't arrive
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Consequence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Value tracks description freshness&lt;/td&gt;
&lt;td&gt;Freshness requires manual work with no owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coverage decays quietly&lt;/td&gt;
&lt;td&gt;Nobody notices until trust is gone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Describes, doesn't enforce&lt;/td&gt;
&lt;td&gt;A documented rule isn't a control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human-shaped output&lt;/td&gt;
&lt;td&gt;Fine for someone who can ask a colleague&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A catalog's usefulness is a function of how current it is. Keeping it current is unglamorous, unassigned work — so coverage decays, trust follows, and the renewal conversation gets difficult.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually broke the model
&lt;/h2&gt;

&lt;p&gt;Not a competitor. LLMs made "query the data" everyone's job overnight.&lt;/p&gt;

&lt;p&gt;A description adequate for a human who could ask a colleague for clarification is nowhere near adequate for an agent that won't. Ask a catalog what &lt;code&gt;net revenue&lt;/code&gt; is and you get prose someone typed in 2023. Ask whether this agent may query it and it has no opinion at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the spend is going
&lt;/h2&gt;

&lt;p&gt;To layers that &lt;strong&gt;enforce&lt;/strong&gt; rather than describe: definitions typed and executable, relationships proven rather than annotated, policy that runs rather than policy that's documented, and drift detected automatically because nobody updates a wiki.&lt;/p&gt;

&lt;p&gt;The catalog told you what you have. The semantic layer decides what happens next.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the consolidation history, why the ROI never closed, and what replaces the category — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/decline-of-metadata-tools/" rel="noopener noreferrer"&gt;The Decline of Metadata Tools: Why You Need a Semantic Compiler&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/decline-of-metadata-tools/" rel="noopener noreferrer"&gt;colrows.com/blogs/decline-of-metadata-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>Data Products Are Dead: The Era of Semantic Products</title>
      <dc:creator>Yogendra Sharma</dc:creator>
      <pubDate>Thu, 13 Aug 2026 17:58:14 +0000</pubDate>
      <link>https://dev.to/yogendra_colrows/data-products-are-dead-the-era-of-semantic-products-2ll2</link>
      <guid>https://dev.to/yogendra_colrows/data-products-are-dead-the-era-of-semantic-products-2ll2</guid>
      <description>&lt;p&gt;Data products solved ownership. They solved pipelines. They never solved meaning.&lt;/p&gt;

&lt;p&gt;In a world where humans, dashboards, copilots and agents all query at once, a static data product collapses.&lt;/p&gt;

&lt;h2&gt;
  
  
  What data products got right
&lt;/h2&gt;

&lt;p&gt;Clear ownership, defined contracts, discoverability, SLAs. Those were real advances over an undifferentiated lake, and the operating model they introduced was correct.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where they stop
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Assumption&lt;/th&gt;
&lt;th&gt;Why it breaks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Consumers are known in advance&lt;/td&gt;
&lt;td&gt;Agents ask unanticipated questions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A contract is a schema&lt;/td&gt;
&lt;td&gt;A schema says nothing about what a field &lt;em&gt;means&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Definitions live in documentation&lt;/td&gt;
&lt;td&gt;Documentation decays silently&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One product per domain&lt;/td&gt;
&lt;td&gt;Real questions cross domains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Governance is upstream&lt;/td&gt;
&lt;td&gt;Agents reach the data through new doors&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The second row is the crux. A data contract will guarantee the &lt;code&gt;revenue&lt;/code&gt; column exists, is a decimal, and arrives by 06:00. It guarantees nothing about whether it includes intercompany, at what recognition point, in which currency.&lt;/p&gt;

&lt;h2&gt;
  
  
  What replaces them
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;semantic product&lt;/strong&gt;: the same ownership discipline, but the unit is a governed &lt;em&gt;concept&lt;/em&gt; rather than a dataset.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Typed and versioned, so &lt;code&gt;active customer&lt;/code&gt; has one definition with a history&lt;/li&gt;
&lt;li&gt;Relationships proven, not documented — join paths are part of the product&lt;/li&gt;
&lt;li&gt;Policy attached to the concept, travelling into every query&lt;/li&gt;
&lt;li&gt;Self-maintaining, with drift detection instead of a quarterly review&lt;/li&gt;
&lt;li&gt;Consumable by humans and agents through the same compiled path&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Data products made data available. Semantic products make it &lt;em&gt;usable by machines that can't ask a colleague for clarification&lt;/em&gt; — which is now most of your query volume.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the semantic product model, how it composes with mesh thinking, and the migration path — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/data-products-are-dead-long-live-semantic-products/" rel="noopener noreferrer"&gt;Data Products Are Dead: The Era of Semantic Products&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/data-products-are-dead-long-live-semantic-products/" rel="noopener noreferrer"&gt;colrows.com/blogs/data-products-are-dead-long-live-semantic-products&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>Multi-Hop Query Understanding: The Deterministic Compiler Approach</title>
      <dc:creator>Yogendra Sharma</dc:creator>
      <pubDate>Thu, 06 Aug 2026 13:43:21 +0000</pubDate>
      <link>https://dev.to/yogendra_colrows/multi-hop-query-understanding-the-deterministic-compiler-approach-5gpo</link>
      <guid>https://dev.to/yogendra_colrows/multi-hop-query-understanding-the-deterministic-compiler-approach-5gpo</guid>
      <description>&lt;p&gt;The hardest business questions aren't about metrics. They're about relationships.&lt;/p&gt;

&lt;p&gt;If your BI tool can't explain &lt;em&gt;why&lt;/em&gt; something happened, it isn't intelligence — it's reporting.&lt;/p&gt;

&lt;h2&gt;
  
  
  What multi-hop actually means
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;"Why did EMEA churn spike after the March pricing change?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's not one lookup. It's a traversal: pricing change → affected accounts → support ticket volume → response latency → churn events, each hop joined on a different key, several crossing system boundaries.&lt;/p&gt;

&lt;p&gt;Single-hop tools answer &lt;em&gt;what&lt;/em&gt;. Multi-hop is required for &lt;em&gt;why&lt;/em&gt;, and almost every analytics stack is single-hop underneath.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why LLMs alone don't close it
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hop count&lt;/th&gt;
&lt;th&gt;What the model must get right&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;One table, one filter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;One join — usually inferable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3+&lt;/td&gt;
&lt;td&gt;Join order, cardinality, grain, and which of several paths is correct&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Errors compound. A 90% chance of a correct hop is a 73% chance of a correct three-hop answer, and the output looks identical either way. There's no error bar on a confident paragraph.&lt;/p&gt;

&lt;h2&gt;
  
  
  The compiler approach
&lt;/h2&gt;

&lt;p&gt;Treat the question as something to be &lt;strong&gt;compiled&lt;/strong&gt;, not generated:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Parse intent into a typed representation&lt;/li&gt;
&lt;li&gt;Resolve each concept against the versioned &lt;strong&gt;semantic graph&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enumerate candidate paths, then &lt;strong&gt;prove&lt;/strong&gt; one — cardinality-aware, or fail&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 where multi-hop is won or lost. A generator picks a plausible path. A compiler proves the path exists and is unique for the requested grain, and refuses when it isn't.&lt;/p&gt;

&lt;p&gt;That refusal is the feature. An honest "this question is ambiguous — did you mean recognised or booked revenue?" is worth more than a confident wrong causal story.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the traversal architecture, cardinality handling, and worked multi-hop examples — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/multi-hop-query-understanding-the-new-frontier-of-bi/" rel="noopener noreferrer"&gt;Multi-Hop Query Understanding: The Deterministic Compiler Approach&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/multi-hop-query-understanding-the-new-frontier-of-bi/" rel="noopener noreferrer"&gt;colrows.com/blogs/multi-hop-query-understanding-the-new-frontier-of-bi&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>Fine-Grained Data Access Control: Precision &amp; Security</title>
      <dc:creator>Yogendra Sharma</dc:creator>
      <pubDate>Tue, 04 Aug 2026 14:59:57 +0000</pubDate>
      <link>https://dev.to/yogendra_colrows/fine-grained-data-access-control-precision-security-595g</link>
      <guid>https://dev.to/yogendra_colrows/fine-grained-data-access-control-precision-security-595g</guid>
      <description>&lt;p&gt;Most enterprises secure the dashboard and leave the query wide open.&lt;/p&gt;

&lt;p&gt;By the time your access filter fires, the data has already left the warehouse.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why tool-level controls don't travel
&lt;/h2&gt;

&lt;p&gt;Row and column rules bolted onto a BI tool protect exactly one surface. The moment an AI agent reaches the same warehouse through a different door — an MCP server, a notebook, a REST call — those rules don't come with it.&lt;/p&gt;

&lt;p&gt;So teams do what's available: duplicate datasets per audience, maintain parallel views, and accept that the copies drift.&lt;/p&gt;

&lt;h2&gt;
  
  
  Attach policy to meaning, not storage
&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;Tool-level ACLs&lt;/th&gt;
&lt;th&gt;Compile-time predicates&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Attached to&lt;/td&gt;
&lt;td&gt;Reports, folders, views&lt;/td&gt;
&lt;td&gt;Entities, metrics, relationships&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Travels to new consumers&lt;/td&gt;
&lt;td&gt;No — re-implement per tool&lt;/td&gt;
&lt;td&gt;Yes — it's part of the concept&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unauthorised request&lt;/td&gt;
&lt;td&gt;Filtered result&lt;/td&gt;
&lt;td&gt;Fails to compile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rows read&lt;/td&gt;
&lt;td&gt;Then hidden&lt;/td&gt;
&lt;td&gt;Never read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit artefact&lt;/td&gt;
&lt;td&gt;Access log&lt;/td&gt;
&lt;td&gt;The SQL, with predicates inline&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The third row is the security boundary. "Filtered afterwards" means the query ran with full privileges and something downstream decided what you were allowed to see.&lt;/p&gt;

&lt;h2&gt;
  
  
  What precision looks like in practice
&lt;/h2&gt;

&lt;p&gt;RBAC gets you role membership. ABAC adds attributes — region, cost centre, clearance, purpose of use. Row and column predicates then narrow the actual result at compile time, per person, per question.&lt;/p&gt;

&lt;p&gt;One governed query path serves every persona and returns a different, correct slice to each. No shadow copies to reconcile, and no separate governance implementation per tool.&lt;/p&gt;

&lt;p&gt;That's the difference between preventing a breach and documenting one.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full breakdown&lt;/strong&gt; — the policy model, how RBAC and ABAC compose, and the predicate injection mechanics — is here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://colrows.com/blogs/fine-grained-data-access-control-precision-security/" rel="noopener noreferrer"&gt;Fine-Grained Data Access Control: Precision &amp;amp; Security&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/fine-grained-data-access-control-precision-security/" rel="noopener noreferrer"&gt;colrows.com/blogs/fine-grained-data-access-control-precision-security&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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