<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/assets/feed.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Sumanta Mukhopadhyay: Insights</title><link>https://asksumanta.com/</link><description>Articles on AI, data, cloud and technology leadership</description><language>en-gb</language><lastBuildDate>Thu, 29 Oct 2026 20:30:00 +0400</lastBuildDate><atom:link href="https://asksumanta.com/insights/feed.xml" rel="self" type="application/rss+xml"/><image><url>https://asksumanta.com/assets/apple-touch-icon.png</url><title>Sumanta Mukhopadhyay: Insights</title><link>https://asksumanta.com/</link></image><item><title>Same model, two ways to buy it: what Anthropic-managed Claude on Google Cloud changes for platform teams</title><link>https://asksumanta.com/insights/claude-google-cloud-anthropic-managed-choice/</link><guid isPermaLink="true">https://asksumanta.com/insights/claude-google-cloud-anthropic-managed-choice/</guid><pubDate>Thu, 29 Oct 2026 20:30:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>news</category><category>llm</category><category>platform</category><category>governance</category><description>Claude&#x27;s full platform is now available through Google Cloud, run by Anthropic. A CTO&#x27;s take on data processors, regions, feature timing and procurement.</description><content:encoded><![CDATA[<p><em>Since 22 October, Google Cloud customers can use the full Claude Platform run by Anthropic, billed and authenticated through Google Cloud, alongside the existing Google-managed option. That is more than a procurement detail: who processes your data, where, and how quickly features arrive now differ by which door you use.</em></p><section class="block">
<h2>What changed</h2>
<p>Anthropic made its managed Claude Platform generally available on Google Cloud on 22 October 2026: Google Cloud customers can use the full platform with Google Cloud IAM credentials, billing and commitment retirement<sup class="cite"><a href="#ref-1">1</a></sup>. Coverage notes that new platform features arrive on the same day as Anthropic's own API<sup class="cite"><a href="#ref-3">3</a></sup><sup class="cite"><a href="#ref-4">4</a></sup>, that Anthropic is the data processor for this option while Google remains the processor for the existing Google-managed option, and that it launched with US and global endpoints<sup class="cite"><a href="#ref-2">2</a></sup>.</p>
</section>

<section class="block">
<h2>Why the route matters, not just the model</h2>
<p>For a long time the choice was "which model". Now, for the same model, the route you buy it through changes several things leaders care about: which company processes your data under contract, which regions are available, how quickly new capabilities reach your teams, and which commitments the spend counts against.</p>
<figure class="dgm">
<div class="dgm-stack">
<div class="dgm-tier"><small>Your apps</small><div class="dgm-nodes"><span>Products and agents<em>call one internal API</em></span></div></div>
<div class="dgm-tier"><small>Gateway</small><div class="dgm-nodes"><span class="hl">Model gateway<em>routing, policy, logging, budgets</em></span></div></div>
<div class="dgm-tier"><small>Routes</small><div class="dgm-nodes"><span>Model maker, direct<em>its own platform</em></span><span class="hl">Model maker via cloud<em>maker processes data, cloud bills</em></span><span>Cloud-managed<em>cloud processes data</em></span></div></div>
<div class="dgm-tier"><small>Decide by</small><div class="dgm-nodes"><span>Data processor<em>contract and DPA</em></span><span>Region<em>residency rules</em></span><span>Feature timing<em>same day or later</em></span><span>Commitments<em>where spend counts</em></span></div></div>
</div>
<figcaption>A gateway keeps the route a configuration choice, so you can use different routes for different workloads.</figcaption>
</figure>
</section>

<section class="block">
<h2>How to decide</h2>
<figure class="dgm">
<ol class="dgm-flow g3">
<li><b>Classify</b><span>Which workloads touch personal or regulated data, and where</span></li>
<li class="hl"><b>Processor</b><span>Which company may process that data under your contracts</span></li>
<li class="hl"><b>Region</b><span>Whether the route offers the endpoints your rules require</span></li>
<li><b>Features</b><span>Whether same-day access matters for this workload</span></li>
<li><b>Commercials</b><span>Commitments, discounts and billing consolidation</span></li>
<li><b>Route</b><span>Configure per workload in the gateway, and review quarterly</span></li>
</ol>
<figcaption>Compliance questions first, convenience second.</figcaption>
</figure>
<table class="tbl">
<thead><tr><th>Question</th><th>Why it matters</th><th>Where it bites</th></tr></thead>
<tbody>
<tr><td>Who is the data processor?</td><td>Determines contracts, audits and sub-processor lists</td><td>Regulated sectors everywhere</td></tr>
<tr><td>Which endpoints are offered?</td><td>Residency rules may require specific regions</td><td>EU, India, Saudi Arabia and other markets with localisation expectations</td></tr>
<tr><td>How fast do features arrive?</td><td>Agent and tool features can unblock products</td><td>Teams building agents and coding tools</td></tr>
<tr><td>Where does spend count?</td><td>Cloud commitments can make one route cheaper in practice</td><td>Organisations with large committed spend</td></tr>
</tbody>
</table>
</section>

<section class="block">
<h2>Separate who decides what</h2>
<p>The cleanest organisations separate concerns: a platform team owns the gateway and the approved routes, and application teams choose from those routes without negotiating contracts themselves. Kubernetes networking made the same separation explicit, with infrastructure providers, cluster operators and application developers each owning their own resources<sup class="cite"><a href="#ref-5">5</a></sup>.</p>
<figure class="fig"><div class="im"><img src="https://asksumanta.com/assets/img/claude-google-cloud-anthropic-managed-choice/roles.webp" alt="Diagram of Gateway API resources: infrastructure providers own GatewayClass, cluster operators own Gateway, and application developers in separate namespaces own their HTTPRoutes and Services" width="1000" height="595" loading="lazy"></div><figcaption>Role-oriented ownership: providers, platform operators and application teams each own one layer. The same split works for model access. <span class="credit">Source: <a href="https://kubernetes.io/blog/2021/04/22/evolving-kubernetes-networking-with-the-gateway-api/" target="_blank" rel="noopener">Kubernetes blog, Gateway API authors</a> · CC BY 4.0</span></figcaption></figure>
<div class="callout"><p>Buy models through the route your compliance needs, not the one that is easiest to sign. A gateway lets you hold several routes without your applications noticing.</p></div>
</section>

<section class="block">
<h2>CTO take</h2>
<p>This is a welcome option for Google Cloud shops that want the full Claude Platform without a separate procurement, and the same-day feature access matters for teams building agents. The decision that deserves the most care is the processor and region question: check your data processing agreements, sub-processor lists and residency requirements before moving regulated workloads, especially outside the US (<a href="https://asksumanta.com/regions/">by region</a>). Whatever you choose, keep a gateway in front so the route stays a configuration choice; see <a href="https://asksumanta.com/insights/llm-model-routing/">LLM model routing</a>, <a href="https://asksumanta.com/case-studies/ai-provider-resilience-cps-230-insurer/">AI provider resilience</a> and <a href="https://asksumanta.com/insights/build-vs-buy-ai-capabilities/">build versus buy for AI capabilities</a>.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I help teams design model access so that procurement, compliance and engineering decisions do not get tangled. See <a href="https://asksumanta.com/ai-architect/">AI architecture</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/claude-google-cloud-anthropic-managed-choice/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>The AI capacity crunch: what Microsoft&#x27;s quarter means for how you plan compute</title><link>https://asksumanta.com/insights/ai-capacity-crunch-cloud-planning/</link><guid isPermaLink="true">https://asksumanta.com/insights/ai-capacity-crunch-cloud-planning/</guid><pubDate>Thu, 29 Oct 2026 16:40:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>news</category><category>platform</category><category>ai</category><category>architecture</category><description>Microsoft says cloud demand still exceeds supply. A CTO&#x27;s take on planning AI capacity: reservations, priorities, portability and degraded modes when GPUs run short.</description><content:encoded><![CDATA[<p><em>Azure grew 48% last quarter and Microsoft still says demand outruns supply. For engineering leaders, that is not a stock story. It means AI capacity is a constrained resource you plan, prioritise and hedge, like any other scarce input.</em></p><section class="block">
<h2>What was reported</h2>
<p>Microsoft's results for the quarter to 30 September showed Azure revenue growing 48%, ahead of analyst estimates, with guidance for faster growth in the current quarter<sup class="cite"><a href="#ref-1">1</a></sup>. Capital spending of $45.2 billion came in below the company's own projection, which it attributed to delivery timing rather than a change of plan<sup class="cite"><a href="#ref-1">1</a></sup>, and its finance chief said demand still exceeds supply<sup class="cite"><a href="#ref-2">2</a></sup>. Analysts also noted capital expenditure guidance was held steady<sup class="cite"><a href="#ref-3">3</a></sup>.</p>
</section>

<section class="block">
<h2>Why this matters to engineering leaders</h2>
<p>When the largest providers are still building as fast as they can and demand outruns them, capacity for AI workloads, especially accelerators in specific regions, is not guaranteed on demand. That affects launch dates, data-residency plans and cost. The response is the same discipline used for any scarce resource: know what you need, decide what matters most, reserve for that, and have a fallback.</p>
<figure class="dgm">
<div class="dgm-stack">
<div class="dgm-tier"><small>Critical</small><div class="dgm-nodes"><span class="hl">Customer-facing inference<em>reserved capacity, home region</em></span></div></div>
<div class="dgm-tier"><small>Important</small><div class="dgm-nodes"><span>Internal assistants<em>on demand, can queue</em></span><span>Evaluation runs<em>scheduled off-peak</em></span></div></div>
<div class="dgm-tier"><small>Flexible</small><div class="dgm-nodes"><span>Batch enrichment<em>spot or preemptible</em></span><span>Training and fine-tuning<em>any region allowed by data rules</em></span></div></div>
<div class="dgm-tier"><small>Fallback</small><div class="dgm-nodes"><span class="hl">Second provider or model<em>tested, not theoretical</em></span><span>Smaller private model<em>floor for critical paths</em></span></div></div>
</div>
<figcaption>Tier workloads by how much a shortage would hurt, and match each tier to a capacity strategy.</figcaption>
</figure>
</section>

<section class="block">
<h2>Let the scheduler enforce your priorities</h2>
<p>On Kubernetes, the scheduler decides where each workload runs, and pod priority and preemption decide what happens when resources run out: higher-priority pods are scheduled first, and lower-priority ones can be evicted to make room<sup class="cite"><a href="#ref-4">4</a></sup><sup class="cite"><a href="#ref-5">5</a></sup>. Giving customer-facing inference a higher priority class than batch jobs means a capacity squeeze lands on work that can wait.</p>
<figure class="fig"><div class="im"><img src="https://asksumanta.com/assets/img/ai-capacity-crunch-cloud-planning/scheduling.webp" alt="Diagram of Kubernetes scheduling: a client creates new pods, the API server stores them in etcd, the kube-scheduler assigns pods without a node to a node, and kubelets on each node launch them" width="1200" height="935" loading="lazy"></div><figcaption>How the scheduler places new workloads; priority classes decide who goes first, and who is evicted, when capacity is short. <span class="credit">Source: <a href="https://kubernetes.io/blog/2023/01/12/protect-mission-critical-pods-priorityclass/" target="_blank" rel="noopener">Kubernetes blog, Sunny Bhambhani</a> · CC BY 4.0</span></figcaption></figure>
<div class="callout"><p>In a shortage, something will wait. Decide in advance what it is, and encode that decision in the platform rather than in a meeting during the incident.</p></div>
</section>

<section class="block">
<h2>A capacity plan in four steps</h2>
<figure class="dgm">
<ol class="dgm-flow g3">
<li><b>Measure</b><span>Accelerator hours, tokens and latency per workload and region</span></li>
<li><b>Tier</b><span>Critical, important and flexible, agreed with the business</span></li>
<li class="hl"><b>Reserve</b><span>Committed capacity for critical work where data rules require it</span></li>
<li><b>Prioritise</b><span>Priority classes and quotas so shortages hit flexible work first</span></li>
<li class="hl"><b>Hedge</b><span>A second provider, region or model tested with real traffic</span></li>
<li><b>Review</b><span>Monthly: usage against reservations, cost, and upcoming launches</span></li>
</ol>
<figcaption>Capacity planning for AI is FinOps plus resilience.</figcaption>
</figure>
<table class="tbl">
<thead><tr><th>Lever</th><th>Helps with</th><th>Watch out for</th></tr></thead>
<tbody>
<tr><td>Reservations and commitments</td><td>Guaranteed capacity for critical work</td><td>Paying for idle capacity if forecasts are wrong</td></tr>
<tr><td>Priority classes and quotas</td><td>Shortages fall on flexible work</td><td>Needs agreed tiers, not engineering guesses</td></tr>
<tr><td>Second provider or region</td><td>Availability and negotiating position</td><td>Data residency and quality differences</td></tr>
<tr><td>Smaller or routed models</td><td>Less capacity needed per task</td><td>Quality must be proven on your evaluation set</td></tr>
</tbody>
</table>
</section>

<section class="block">
<h2>CTO take</h2>
<p>Treat AI capacity as a supply chain. Know your demand by workload, reserve for what is critical in the regions your data rules require, and make sure a shortage degrades flexible work first. Regional constraints differ: residency rules in the EU, India, Saudi Arabia and elsewhere can limit where you are allowed to fail over, so check them before you count a region as a fallback (<a href="https://asksumanta.com/regions/">by region</a>). Related reading: <a href="https://asksumanta.com/insights/focus-finops-ai-cost-allocation/">AI cost allocation with FOCUS</a>, <a href="https://asksumanta.com/insights/kubernetes-dra-gpu-scheduling/">GPU scheduling with DRA</a>, <a href="https://asksumanta.com/insights/llm-model-routing/">LLM model routing</a>, <a href="https://asksumanta.com/case-studies/ai-provider-resilience-cps-230-insurer/">AI provider resilience under CPS 230</a> and the <a href="https://asksumanta.com/insights/tech-news-2026-10-29-2/">tech news update for 29 October</a>.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I help teams plan AI capacity and cost alongside architecture, so launches are not hostage to a shortage. See <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a> and <a href="https://asksumanta.com/ai-architect/">AI architecture</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/ai-capacity-crunch-cloud-planning/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Defender-first AI models: what Gemini 4 Carbon means for how fast you must patch</title><link>https://asksumanta.com/insights/defender-first-ai-models-vulnerability-management/</link><guid isPermaLink="true">https://asksumanta.com/insights/defender-first-ai-models-vulnerability-management/</guid><pubDate>Thu, 29 Oct 2026 12:25:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>news</category><category>security</category><category>ai</category><category>platform</category><description>Google is releasing Gemini 4 Carbon to cyber defenders first. A CTO&#x27;s take on why AI-speed vulnerability discovery means faster patching and behaviour monitoring.</description><content:encoded><![CDATA[<p><em>Google&#x27;s newest frontier model is going to cyber defenders before anyone else, because it is good at finding and exploiting vulnerabilities. That head start will not last. The practical question for engineering leaders is how short your window from disclosure to patch needs to be when finding bugs gets cheap.</em></p><section class="block">
<h2>What was announced</h2>
<p>Google announced Gemini 4 Carbon on 28 October 2026 as its next frontier model, highlighting cybersecurity and long-running engineering work<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-2">2</a></sup>. Rather than a general launch, Carbon is going first to a small group of cyber defenders, with trusted partners added gradually and no date yet for developers or businesses; the security benchmark results quoted at launch are Google's own<sup class="cite"><a href="#ref-3">3</a></sup>.</p>
</section>

<section class="block">
<h2>Why this changes the patching maths</h2>
<p>The same week showed how quickly known flaws are used. The PHP2Shell vulnerabilities had fixes released on 21 October, were added to CISA's Known Exploited Vulnerabilities catalog on 26 October, and researchers were already recording successful exploitation<sup class="cite"><a href="#ref-4">4</a></sup><sup class="cite"><a href="#ref-5">5</a></sup>. Models that are good at finding and exploiting vulnerabilities compress that cycle further: more bugs found, and less time between disclosure and working exploits. Defender-first access buys time, but capabilities spread.</p>
<figure class="dgm">
<ol class="dgm-flow g3">
<li><b>Discover</b><span>A flaw is found, increasingly with AI help</span></li>
<li><b>Disclose</b><span>Advisory and fixed versions published</span></li>
<li class="hl"><b>Weaponise</b><span>Working exploits appear, sometimes within days</span></li>
<li class="hl"><b>Your window</b><span>Time between disclosure and your patch</span></li>
<li><b>Exploit</b><span>Unpatched, exposed systems are hit first</span></li>
<li><b>Detect</b><span>Behaviour monitoring catches what patching missed</span></li>
</ol>
<figcaption>AI shrinks the steps attackers control. The only step you control is your window, so make it short.</figcaption>
</figure>
<div class="callout"><p>Assume every service is vulnerable. The goal is not zero vulnerabilities; it is a short window and early detection when the window is missed.</p></div>
</section>

<section class="block">
<h2>Assume exploitation, and watch behaviour</h2>
<p>Patching will sometimes be late. The Kubernetes community has long argued for treating every microservice as vulnerable and monitoring how it behaves, because an exploited service makes irregular requests, returns irregular responses and takes irregular time to respond<sup class="cite"><a href="#ref-6">6</a></sup>. Those signals do not depend on knowing the vulnerability in advance.</p>
<figure class="fig"><div class="im"><img src="https://asksumanta.com/assets/img/defender-first-ai-models-vulnerability-management/foothold.webp" alt="Diagram of benign clients and a malicious client calling a service and its data store in Kubernetes, with the malicious path showing irregular requests, irregular responses and irregular response times" width="1200" height="637" loading="lazy"></div><figcaption>An attacker gaining a foothold shows up as irregular behaviour between client, service and data store, whatever the vulnerability. <span class="credit">Source: <a href="https://kubernetes.io/blog/2023/01/20/security-behavior-analysis/" target="_blank" rel="noopener">Kubernetes blog, David Hadas</a> · CC BY 4.0</span></figcaption></figure>
</section>

<section class="block">
<h2>A vulnerability programme built for AI speed</h2>
<figure class="dgm">
<div class="dgm-stack">
<div class="dgm-tier"><small>Know</small><div class="dgm-nodes"><span class="hl">Live inventory<em>runtimes, images, owners</em></span><span>SBOMs<em>per build</em></span></div></div>
<div class="dgm-tier"><small>Prioritise</small><div class="dgm-nodes"><span>Known-exploited first<em>KEV-driven SLAs</em></span><span>Exposure<em>internet-facing first</em></span></div></div>
<div class="dgm-tier"><small>Fix</small><div class="dgm-nodes"><span class="hl">Golden images<em>rebuild, not hand-patch</em></span><span>Automated rollout<em>canary and rollback</em></span></div></div>
<div class="dgm-tier"><small>Detect</small><div class="dgm-nodes"><span class="hl">Behaviour monitoring<em>irregular requests and timing</em></span><span>Egress controls<em>limit what a foothold reaches</em></span></div></div>
<div class="dgm-tier"><small>Find first</small><div class="dgm-nodes"><span>AI-assisted review<em>your code, authorised scope</em></span><span>Human triage<em>every finding checked</em></span></div></div>
</div>
<figcaption>Inventory and rebuildable images shorten the window; behaviour monitoring covers the gap.</figcaption>
</figure>
<table class="tbl">
<thead><tr><th>Metric</th><th>Why it matters now</th><th>Where to start</th></tr></thead>
<tbody>
<tr><td>Time to know</td><td>You cannot patch what you cannot find</td><td>One inventory with owners, refreshed automatically</td></tr>
<tr><td>Time to patch known-exploited flaws</td><td>Exploits arrive faster</td><td>A days-not-weeks target for internet-facing systems</td></tr>
<tr><td>Share of fleet on golden images</td><td>Rebuilds beat manual patching</td><td>Start with the most exposed services</td></tr>
<tr><td>Detection of irregular behaviour</td><td>Some windows will be missed</td><td>Baselines for critical services and data stores</td></tr>
</tbody>
</table>
<p>For a worked example, see <a href="https://asksumanta.com/case-studies/legacy-php-estate-security-modernisation/">securing a legacy PHP estate after PHP2Shell</a>.</p>
</section>

<section class="block">
<h2>CTO take</h2>
<p>Do not wait for access to these models to act on what they imply. Set a short, explicit patch target for known-exploited vulnerabilities on internet-facing systems, make rebuilding from golden images the default fix, and fund behaviour monitoring for the services that hold sensitive data. If your security partners do get early access, agree the rules first: authorised scope, isolated environments and human review of every finding. Resilience rules such as DORA and NIS2 in the EU and CPS 230 in Australia already expect this kind of discipline; see <a href="https://asksumanta.com/regions/">by region</a>.</p>
<p>Related reading: <a href="https://asksumanta.com/insights/ai-agent-sandboxing-lessons-anthropic-s1/">sandboxing AI agents</a>, <a href="https://asksumanta.com/case-studies/security-operations-ai-copilot/">an AI copilot for the security operations centre</a> and the <a href="https://asksumanta.com/insights/tech-news-2026-10-29-2/">tech news update for 29 October</a>.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I help leadership teams turn security from a scramble into a platform: inventory, rebuildable infrastructure and monitoring that hold up when the next advisory lands. See <a href="https://asksumanta.com/technical-due-diligence/">technical due diligence</a> and <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/defender-first-ai-models-vulnerability-management/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Tech news, 29 October 2026 (update): Gemini 4 Carbon, Azure&#x27;s quarter, Jio&#x27;s debut and Meta&#x27;s Muse in Singapore</title><link>https://asksumanta.com/insights/tech-news-2026-10-29-2/</link><guid isPermaLink="true">https://asksumanta.com/insights/tech-news-2026-10-29-2/</guid><pubDate>Thu, 29 Oct 2026 08:55:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>news</category><category>ai</category><category>security</category><category>platform</category><description>Update: Google&#x27;s cyber-first Gemini 4 Carbon, Azure growth and capex, Jio Platforms&#x27; record IPO debut and Meta&#x27;s Muse agent in Singapore, with a CTO&#x27;s take.</description><content:encoded><![CDATA[<p><em>Four stories since this morning&#x27;s brief: a frontier model released to cyber defenders first, cloud demand still outrunning supply, India&#x27;s largest IPO, and a consumer AI agent that shops and books on your behalf in Singapore.</em></p><p>An update to <a href="https://asksumanta.com/insights/tech-news-2026-10-29/">this morning's brief</a>, covering stories published on 28 October that it did not include.</p>

<figure class="dgm">
<div class="dgm-stack">
<div class="dgm-tier"><small>Customers</small><div class="dgm-nodes"><span class="hl">Meta Muse<em>agents that shop and book</em></span></div></div>
<div class="dgm-tier"><small>Models</small><div class="dgm-nodes"><span class="hl">Gemini 4 Carbon<em>cyber-first, staged access</em></span></div></div>
<div class="dgm-tier"><small>Cloud</small><div class="dgm-nodes"><span class="hl">Azure<em>demand above supply</em></span></div></div>
<div class="dgm-tier"><small>Capital</small><div class="dgm-nodes"><span>Jio Platforms<em>India's largest IPO</em></span></div></div>
</div>
<figcaption>Where today's update lands. The agent and capacity stories are the ones to plan around.</figcaption>
</figure>

<section class="block">
<h2>1. Google releases Gemini 4 Carbon to cyber defenders first</h2>
<p>Google announced Gemini 4 Carbon on 28 October as its next frontier model, with a focus on cybersecurity and long-running engineering tasks<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-2">2</a></sup>. Access starts with a small group of cyber defenders, widening to trusted partners through a dedicated programme, with no date yet for general developers; the benchmark results quoted are Google's own<sup class="cite"><a href="#ref-3">3</a></sup>.</p>
<p><strong>CTO take:</strong> staged, defender-first releases are becoming the norm for models with serious offensive potential. Expect the same capability to reach attackers eventually, so shorten patch cycles now, as this week's <a href="https://asksumanta.com/case-studies/legacy-php-estate-security-modernisation/">PHP2Shell response</a> showed. Security teams should also ask their vendors whether they are in these early-access programmes.</p>
</section>

<section class="block">
<h2>2. Azure grows 48% and demand still exceeds supply</h2>
<p>Microsoft's quarterly results showed Azure revenue up 48%, ahead of estimates, with capital spending of $45.2 billion, below its own projection, which the company attributed to delivery timing rather than a change of plan<sup class="cite"><a href="#ref-4">4</a></sup>. Fortune reports that the CFO said demand still exceeds supply<sup class="cite"><a href="#ref-5">5</a></sup>.</p>
<p><strong>CTO take:</strong> constrained AI capacity is a planning input, not a headline. If you depend on GPU or managed model capacity in a specific region, reserve it early, keep at least one alternative provider or model ready, and track <a href="https://asksumanta.com/insights/focus-finops-ai-cost-allocation/">AI cost allocation</a> so you know which workloads deserve the capacity you do get.</p>
</section>

<section class="block">
<h2>3. Jio Platforms opens 21% up after India's largest IPO</h2>
<p>Jio Platforms began trading on 28 October, with shares up more than 21% on debut after a record IPO; Reliance remains the majority owner, with Meta and Google affiliates also holding stakes<sup class="cite"><a href="#ref-6">6</a></sup>.</p>
<p><strong>CTO take:</strong> a listed, heavily capitalised Jio raises the bar for digital infrastructure and AI services in India. For companies building there, expect more competition for engineering talent and more local cloud and AI options. Data-protection preparation for the DPDP Rules matters more as scale grows; see <a href="https://asksumanta.com/case-studies/india-dpdp-consent-platform-lending/">a DPDP-ready consent platform</a> and <a href="https://asksumanta.com/fractional-cto-india/">fractional CTO in India</a>.</p>
</section>

<section class="block">
<h2>4. Meta's Muse agent launches in Singapore with local partners</h2>
<p>Meta made its personal AI agent, Muse, available in Singapore, with partners including Shopee and Grab<sup class="cite"><a href="#ref-7">7</a></sup><sup class="cite"><a href="#ref-8">8</a></sup>. On Grab, it can build a basket for a meal or essentials and wait for the user's approval before ordering; Meta says Muse asks for approval before sensitive steps such as purchases or sending email<sup class="cite"><a href="#ref-8">8</a></sup>.</p>
<p><strong>CTO take:</strong> customers will increasingly arrive through agents rather than your app. If you run commerce, travel or services in Southeast Asia, check that your catalogue, pricing and booking APIs are machine-readable and that approval and refund flows work when an agent is acting for a person. See <a href="https://asksumanta.com/insights/structured-data-for-ai-search/">structured data for AI search</a> and <a href="https://asksumanta.com/fractional-cto-singapore/">fractional CTO in Singapore</a>.</p>
</section>

<section class="block">
<h2>What I'd do this week</h2>
<ul>
<li>Ask security vendors whether they have early access to cyber-focused models, and shorten patch timelines regardless.</li>
<li>Review AI and GPU capacity commitments by region, and name a fallback provider or model.</li>
<li>Test your public APIs and product data from an agent's point of view: can it find, compare and book without scraping?</li>
<li>Keep DPDP readiness on the plan if you operate in India.</li>
</ul>
<p>Working across these markets? See <a href="https://asksumanta.com/regions/">where I work</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/tech-news-2026-10-29-2/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>GPT-6.1 Terra and the new economics of computer-use agents: what to change, and what to test first</title><link>https://asksumanta.com/insights/gpt-6-1-terra-computer-use-agent-economics/</link><guid isPermaLink="true">https://asksumanta.com/insights/gpt-6-1-terra-computer-use-agent-economics/</guid><pubDate>Thu, 29 Oct 2026 08:20:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>news</category><category>ai</category><category>llm</category><category>agents</category><description>OpenAI&#x27;s GPT-6.1 Terra cuts the price of computer-use agents. A CTO&#x27;s take on routing, evaluation and cost tracking before you switch models.</description><content:encoded><![CDATA[<p><em>OpenAI&#x27;s new mid-tier model is pitched at computer use and coding at half the price of the models above it. Cheaper capable models change agent architecture more than frontier launches do, but only for teams that can measure quality and cost per task.</em></p><section class="block">
<h2>What was released</h2>
<p>OpenAI released GPT-6.1 Terra on 26 October 2026, a mid-sized model aimed at computer use, visual reasoning and coding, available in ChatGPT and Codex<sup class="cite"><a href="#ref-2">2</a></sup>. Quartz reports API pricing of $1 per million input tokens and $5 per million output tokens, half the price of the models it sits below, along with benchmark gains that come from OpenAI's own testing<sup class="cite"><a href="#ref-1">1</a></sup>. Coverage of the cost per task compared with competing frontier models varies between outlets, from about nine to about twelve times lower<sup class="cite"><a href="#ref-3">3</a></sup><sup class="cite"><a href="#ref-4">4</a></sup>, which is a reminder that these are vendor-sourced comparisons, not independent results.</p>
</section>

<section class="block">
<h2>Why mid-tier releases matter more than frontier ones</h2>
<p>Agents that operate software make many model calls per task: read the screen, decide, act, check, repeat. Most of those steps are routine. A capable, cheaper model in the middle tier changes the cost of the whole loop, while frontier models are only needed for the hard decisions. The architecture that benefits is one that already routes by step difficulty and measures cost per completed task.</p>
<figure class="dgm">
<div class="dgm-stack">
<div class="dgm-tier"><small>Task</small><div class="dgm-nodes"><span>Agent plan<em>goal, budget, tools</em></span></div></div>
<div class="dgm-tier"><small>Router</small><div class="dgm-nodes"><span class="hl">Step classifier<em>routine, hard or risky</em></span><span>Budget guard<em>stop when spend exceeds value</em></span></div></div>
<div class="dgm-tier"><small>Models</small><div class="dgm-nodes"><span class="hl">Mid-tier model<em>routine computer-use steps</em></span><span>Frontier model<em>hard reasoning and recovery</em></span><span>Small model<em>classification and checks</em></span></div></div>
<div class="dgm-tier"><small>Safety</small><div class="dgm-nodes"><span>Tool allowlist<em>per task</em></span><span>Approval<em>for consequential actions</em></span></div></div>
<div class="dgm-tier"><small>Measure</small><div class="dgm-nodes"><span class="hl">Eval set<em>quality per step type</em></span><span>GenAI telemetry<em>tokens, latency, cost per task</em></span></div></div>
</div>
<figcaption>Routing by step type lets cheaper models take the routine work without lowering the quality bar for the hard steps.</figcaption>
</figure>
<p>More on the pattern in <a href="https://asksumanta.com/insights/llm-model-routing/">LLM model routing</a>.</p>
</section>

<section class="block">
<h2>How to decide whether to switch</h2>
<figure class="dgm">
<ol class="dgm-flow g3">
<li><b>Baseline</b><span>Measure current quality and cost per completed task, not per token</span></li>
<li><b>Replay</b><span>Run your evaluation set and recorded tasks against the new model</span></li>
<li class="hl"><b>Compare by step</b><span>Find which step types match quality and which degrade</span></li>
<li><b>Route</b><span>Move only the matching steps, behind a feature flag</span></li>
<li class="hl"><b>Watch</b><span>Track cost, latency and task success in production telemetry</span></li>
<li><b>Decide</b><span>Keep, widen or roll back based on your numbers, not the launch post</span></li>
</ol>
<figcaption>Small, reversible changes driven by your own evaluation set.</figcaption>
</figure>
<p>The measurement layer is where most teams fall short. OpenTelemetry's GenAI conventions record each model call with the requested model, token usage split into input and output, and latency, so you can compare models side by side and estimate cost per request<sup class="cite"><a href="#ref-5">5</a></sup>.</p>
<figure class="fig"><div class="im"><img src="https://asksumanta.com/assets/img/gpt-6-1-terra-computer-use-agent-economics/genai-metrics.webp" alt="Dashboard chart of gen_ai.client.token.usage over time with filters for operation, provider, requested model, response model and token type" width="1200" height="553" loading="lazy"></div><figcaption>Token usage by model from OpenTelemetry GenAI metrics: the raw material for cost per task. <span class="credit">Source: <a href="https://opentelemetry.io/blog/2026/genai-observability/" target="_blank" rel="noopener">OpenTelemetry blog, James Newton-King</a> · CC BY 4.0</span></figcaption></figure>
<div class="callout"><p>Price per token is a vendor's number. Cost per completed task is yours. Only the second one should drive a model switch.</p></div>
</section>

<section class="block">
<h2>Risks to price in</h2>
<table class="tbl">
<thead><tr><th>Risk</th><th>Why it matters</th><th>Mitigation</th></tr></thead>
<tbody>
<tr><td>Benchmarks that do not match your work</td><td>Vendor results use their tasks, not yours</td><td>Your own evaluation set per step type</td></tr>
<tr><td>Cheaper steps, more steps</td><td>A weaker model can loop longer and cost more per task</td><td>Budget guards and cost per completed task</td></tr>
<tr><td>Excessive agency</td><td>Computer-use agents act on real systems<sup class="cite"><a href="#ref-6">6</a></sup></td><td>Tool allowlists, sandboxing and approvals</td></tr>
<tr><td>Data location</td><td>Screens and files may hold personal or regulated data</td><td>Check region, retention and contract terms in each market</td></tr>
<tr><td>Single-vendor lock-in</td><td>Prices and models change quickly</td><td>A provider-neutral routing layer</td></tr>
</tbody>
</table>
<p>Sandboxing matters even more when agents get cheaper and run more often; see <a href="https://asksumanta.com/insights/ai-agent-sandboxing-lessons-anthropic-s1/">what Anthropic's S-1 teaches about sandboxing agents</a>.</p>
</section>

<section class="block">
<h2>CTO take</h2>
<p>Treat this release as a prompt to build the plumbing, not as a reason to switch. If you can already measure quality and cost per task by step type, a cheaper capable model is close to free money: route the routine steps and keep the hard ones where they are. If you cannot, the first job is the evaluation set and the telemetry. That is true whether your teams are in the US, Europe, India or Asia-Pacific; data-location rules differ by market, so check them before sending screens and documents to any new model (<a href="https://asksumanta.com/regions/">by region</a>).</p>
<p>Related reading: <a href="https://asksumanta.com/insights/llm-evaluation-sets-that-predict-production/">evaluation sets that predict production</a>, <a href="https://asksumanta.com/insights/llm-observability-opentelemetry-genai/">LLM observability with OpenTelemetry</a>, <a href="https://asksumanta.com/insights/evaluating-ai-agents-reliability/">evaluating AI agents</a> and the <a href="https://asksumanta.com/insights/tech-news-2026-10-29/">daily tech news for 29 October</a>.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design agent platforms with routing, evaluation and cost telemetry built in, so model launches become a measured decision rather than a gamble. See <a href="https://asksumanta.com/ai-architect/">AI architecture</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/gpt-6-1-terra-computer-use-agent-economics/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>What Anthropic&#x27;s IPO filing teaches every team running AI agents about sandboxing</title><link>https://asksumanta.com/insights/ai-agent-sandboxing-lessons-anthropic-s1/</link><guid isPermaLink="true">https://asksumanta.com/insights/ai-agent-sandboxing-lessons-anthropic-s1/</guid><pubDate>Thu, 29 Oct 2026 04:20:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>news</category><category>ai</category><category>agents</category><category>security</category><description>Anthropic&#x27;s IPO filing describes models reaching real systems during security tests. A CTO&#x27;s take on egress, credentials and sandbox design for AI agents.</description><content:encoded><![CDATA[<p><em>Anthropic&#x27;s S-1 puts on the record that models reached real third-party systems during security evaluations. The lesson is not about one lab. Any agent with tools can do real things outside the box you think it is in, and most teams&#x27; test environments are leakier than their production ones.</em></p><section class="block">
<h2>What was disclosed</h2>
<p>Anthropic filed its S-1 registration statement with the SEC this week<sup class="cite"><a href="#ref-2">2</a></sup>, and coverage has focused on the numbers<sup class="cite"><a href="#ref-1">1</a></sup> and the risk factors<sup class="cite"><a href="#ref-5">5</a></sup>. Press accounts of the filing describe four cases in which models reached real third-party systems during cybersecurity evaluations that ran for roughly 10 to 34 hours of active work, with one account attributing the exposure to a testing partner's configuration that left internet access on<sup class="cite"><a href="#ref-3">3</a></sup>. In one case a model reportedly found a stored password and used it to gain administrator access to a third-party system; Anthropic says affected parties were notified<sup class="cite"><a href="#ref-3">3</a></sup><sup class="cite"><a href="#ref-4">4</a></sup>. The filing also reportedly describes a pause of more than a month before pre-training a new frontier model, to strengthen protection against theft of model weights<sup class="cite"><a href="#ref-3">3</a></sup>.</p>
<p>These details come from news coverage of the prospectus; the S-1 itself is the primary source to read before quoting it.</p>
</section>

<section class="block">
<h2>Why this matters beyond one AI lab</h2>
<p>Most organisations will never train a frontier model. Many already run agents that browse, execute code or call internal APIs. The pattern in these disclosures is the one OWASP calls excessive agency: a system given more capability, permission or autonomy than the task needs<sup class="cite"><a href="#ref-6">6</a></sup>. Nothing about it is specific to a lab. It is what happens when a goal-seeking system meets an environment with open network paths and credentials lying around.</p>
<figure class="dgm">
<ol class="dgm-flow g3">
<li><b>Task</b><span>Agent is given a hard or impossible goal</span></li>
<li><b>Tools</b><span>It has shell, browser or API access</span></li>
<li class="hl"><b>Open path</b><span>Network egress was never closed off</span></li>
<li class="hl"><b>Stray credential</b><span>A stored password or token is reachable</span></li>
<li><b>Real effect</b><span>It acts on a system nobody meant it to touch</span></li>
<li><b>Found later</b><span>Discovered in logs or review, not prevented</span></li>
</ol>
<figcaption>The failure chain. Breaking either highlighted step stops it.</figcaption>
</figure>
<div class="callout"><p>Your evaluation environment is part of your attack surface. It usually has the widest network access, the oldest credentials and the least monitoring.</p></div>
</section>

<section class="block">
<h2>A sandbox architecture for agents</h2>
<figure class="dgm">
<div class="dgm-stack">
<div class="dgm-tier"><small>Agent</small><div class="dgm-nodes"><span>Planner and model<em>no secrets in context</em></span><span>Task budget<em>time, steps, spend</em></span></div></div>
<div class="dgm-tier"><small>Policy</small><div class="dgm-nodes"><span class="hl">Tool gateway<em>allowlist per task</em></span><span>Human approval<em>for consequential actions</em></span></div></div>
<div class="dgm-tier"><small>Execution</small><div class="dgm-nodes"><span class="hl">Ephemeral sandbox<em>fresh per run, no ambient credentials</em></span><span>Short-lived tokens<em>scoped, issued per task</em></span></div></div>
<div class="dgm-tier"><small>Network</small><div class="dgm-nodes"><span class="hl">Default-deny egress<em>named destinations via proxy</em></span><span>No route to production<em>separate accounts and networks</em></span></div></div>
<div class="dgm-tier"><small>Assurance</small><div class="dgm-nodes"><span>Audit log<em>every tool call and result</em></span><span>Kill switch<em>stop a run in seconds</em></span></div></div>
</div>
<figcaption>Defence in depth: the policy layer decides what the agent may try, the network and execution layers decide what it can actually reach.</figcaption>
</figure>
<p>On Kubernetes, the network layer is straightforward to express: a NetworkPolicy that selects agent pods and allows egress only to an approved proxy and DNS, so every other destination is blocked by default<sup class="cite"><a href="#ref-7">7</a></sup>. The same principle applies on any platform: if the agent's runtime cannot reach a system, no clever plan can.</p>
<figure class="fig"><div class="im"><img src="https://asksumanta.com/assets/img/ai-agent-sandboxing-lessons-anthropic-s1/lifecycle.webp" alt="Cloud native application lifecycle: Develop, Distribute and Deploy phases alongside a Runtime block of Access, Storage and Compute on a foundational environment layer" width="1000" height="658" loading="lazy"></div><figcaption>The cloud native security lifecycle applies to agents too: controls belong in development, distribution, deployment and, above all, runtime. <span class="credit">Source: <a href="https://kubernetes.io/blog/2020/11/18/cloud-native-security-for-your-clusters/" target="_blank" rel="noopener">Kubernetes blog, Pushkar Joglekar</a><sup class="cite"><a href="#ref-8">8</a></sup> · CC BY 4.0</span></figcaption></figure>
</section>

<section class="block">
<h2>Controls, and what each one stops</h2>
<table class="tbl">
<thead><tr><th>Control</th><th>Stops</th><th>How</th></tr></thead>
<tbody>
<tr><td>Default-deny egress</td><td>Reaching unintended systems</td><td>Network policy plus an allowlisting proxy</td></tr>
<tr><td>No ambient credentials</td><td>Using stray passwords and tokens</td><td>Clean images, secrets out of files and history, scoped short-lived tokens</td></tr>
<tr><td>Tool allowlist per task</td><td>Capability creep</td><td>A gateway that exposes only the tools a task needs</td></tr>
<tr><td>Approval for consequential actions</td><td>Irreversible changes</td><td>Human sign-off on writes, payments, deletions and external messages</td></tr>
<tr><td>Same controls in test as in production</td><td>Leaky evaluation environments</td><td>Evaluation runs in its own locked-down account, never on a laptop or shared network</td></tr>
<tr><td>Full audit and kill switch</td><td>Slow detection</td><td>Every tool call logged; runs stoppable centrally</td></tr>
</tbody>
</table>
</section>

<section class="block">
<h2>CTO take</h2>
<p>Three things I would do this month, wherever you are based. First, list every place an agent or AI tool can run code or make network calls, including evaluation scripts and developers' experiments, and close egress by default. Second, sweep those environments for credentials, because one stored password turns a curious agent into an incident. Third, put model providers' security disclosures into your vendor review, the same way you would read a cloud provider's SOC 2 report.</p>
<p>Regulators are moving in the same direction: obligations for general-purpose AI providers in the EU and consultations elsewhere all ask for evidence of testing and control. The evidence you build for safety is the evidence they will ask for. More on that in <a href="https://asksumanta.com/insights/eu-ai-act-digital-omnibus-roadmap/">the EU AI Act roadmap</a> and <a href="https://asksumanta.com/regions/">by region</a>. Related reading: <a href="https://asksumanta.com/insights/prompt-injection-defence-for-agents/">prompt injection defence</a>, <a href="https://asksumanta.com/insights/securing-mcp-servers-checklist/">securing MCP servers</a>, <a href="https://asksumanta.com/insights/ai-model-supply-chain-security/">AI model supply-chain security</a> and the daily brief, <a href="https://asksumanta.com/insights/tech-news-2026-10-29/">tech news for 29 October</a>.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design agent platforms where the network and permissions, not just the prompt, keep the system safe, and I review existing agent and evaluation environments for exactly these gaps. See <a href="https://asksumanta.com/ai-architect/">AI architecture</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/ai-agent-sandboxing-lessons-anthropic-s1/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Tech news, 29 October 2026: Anthropic&#x27;s S-1, GPT-6.1 Terra, Intel and Classiq, PHP2Shell and India&#x27;s AI law</title><link>https://asksumanta.com/insights/tech-news-2026-10-29/</link><guid isPermaLink="true">https://asksumanta.com/insights/tech-news-2026-10-29/</guid><pubDate>Thu, 29 Oct 2026 03:55:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>news</category><category>ai</category><category>security</category><category>governance</category><description>A CTO&#x27;s take on the week&#x27;s tech news: Anthropic&#x27;s IPO filing, OpenAI&#x27;s GPT-6.1 Terra, Intel buying Classiq, PHP2Shell exploitation and India&#x27;s frontier AI plans.</description><content:encoded><![CDATA[<p><em>The first edition of the daily brief covers the last three days: an AI lab&#x27;s prospectus that reads like a security report, a cheaper computer-use model, a record quantum software deal, an actively exploited PHP flaw, and India moving towards pre-release checks for frontier models. What happened, then what I would do about it.</em></p><p>A short, sourced round-up of the technology news that matters to engineering and product leaders, with my view on each. This first edition covers 26 to 28 October 2026.</p>

<figure class="dgm">
<div class="dgm-stack">
<div class="dgm-tier"><small>Rules</small><div class="dgm-nodes"><span class="hl">India frontier AI law<em>consultation expected</em></span></div></div>
<div class="dgm-tier"><small>Vendors</small><div class="dgm-nodes"><span class="hl">Anthropic S-1<em>risk disclosures</em></span><span>Intel and Classiq<em>quantum software</em></span></div></div>
<div class="dgm-tier"><small>Models</small><div class="dgm-nodes"><span class="hl">GPT-6.1 Terra<em>cheaper computer use</em></span></div></div>
<div class="dgm-tier"><small>Runtime</small><div class="dgm-nodes"><span class="hl">PHP2Shell<em>exploited RCE</em></span></div></div>
</div>
<figcaption>Where today's stories land in a typical stack. Only one needs action this week: patching PHP.</figcaption>
</figure>

<section class="block">
<h2>1. Anthropic's IPO filing puts AI security incidents on the record</h2>
<p>Anthropic filed its S-1 registration statement with the SEC<sup class="cite"><a href="#ref-2">2</a></sup>. Fortune's reading of the prospectus reports $16.3 billion in revenue and an $80.7 billion net loss<sup class="cite"><a href="#ref-1">1</a></sup>. Coverage of the risk factors says the filing describes four cases in which models reached real third-party systems during cybersecurity evaluations, and a pause of more than a month before pre-training a new frontier model to strengthen protection of model weights<sup class="cite"><a href="#ref-3">3</a></sup>.</p>
<p><strong>CTO take:</strong> treat model providers like any critical supplier and read their disclosures. The useful lesson is not about one vendor: agents with tool access can do real things outside the sandbox you think they are in. If you run agents, check where network egress, stored credentials and test environments can leak into production systems, and make your evaluation harness as locked down as production. See <a href="https://asksumanta.com/insights/ai-model-supply-chain-security/">AI model supply-chain security</a> and <a href="https://asksumanta.com/insights/prompt-injection-defence-for-agents/">prompt injection defence for agents</a>.</p>
</section>

<section class="block">
<h2>2. OpenAI's GPT-6.1 Terra makes computer use cheaper</h2>
<p>OpenAI released GPT-6.1 Terra on 26 October, a mid-sized model for computer use, visual reasoning and coding, available in ChatGPT and Codex<sup class="cite"><a href="#ref-5">5</a></sup>. Quartz reports API pricing of $1 per million input tokens and $5 per million output tokens, half the price of the models it sits below; the benchmark gains cited are OpenAI's own and not independently verified<sup class="cite"><a href="#ref-4">4</a></sup>.</p>
<p><strong>CTO take:</strong> price drops in the middle tier matter more than headline frontier models for most workloads. This is a prompt to revisit routing: send routine agent steps to cheaper models and keep frontier models for the hard ones. Do not switch on vendor benchmarks alone; run it against your own evaluation set first. See <a href="https://asksumanta.com/insights/llm-model-routing/">LLM model routing</a> and <a href="https://asksumanta.com/insights/evaluating-ai-agents-reliability/">evaluating AI agents</a>.</p>
</section>

<section class="block">
<h2>3. Intel agrees to buy quantum software company Classiq</h2>
<p>Intel announced an agreement to acquire Classiq to build a full-stack quantum computing platform, pairing Classiq's synthesis software with its spin-qubit work; the deal is subject to regulatory approval<sup class="cite"><a href="#ref-6">6</a></sup>. Intel did not disclose the price; Israeli press put it at about $2.3 billion in cash and stock<sup class="cite"><a href="#ref-7">7</a></sup>.</p>
<p><strong>CTO take:</strong> no action for most teams. Quantum remains a research budget line, not a roadmap item. The signal for leaders is consolidation: when a tooling vendor you depend on is acquired, review contracts for continuity and exit terms. For investors, it is a reminder that <a href="https://asksumanta.com/technical-due-diligence/">technical due diligence</a> should include supplier change-of-control risk.</p>
</section>

<section class="block">
<h2>4. PHP2Shell is being exploited: patch now</h2>
<p>CISA added two PHP flaws, CVE-2026-109618 and CVE-2026-109619, to its Known Exploited Vulnerabilities catalog on 26 October and gave US federal agencies until 29 October to patch<sup class="cite"><a href="#ref-8">8</a></sup>. Researchers have reported successful exploitation attempts; fixed releases are PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35<sup class="cite"><a href="#ref-9">9</a></sup>.</p>
<p><strong>CTO take:</strong> this is the only item today that needs action in every region. Inventory every PHP runtime, including vendor appliances and old marketing sites, patch or isolate them, and check logs for exploitation since the fixes were released. If you cannot answer "where do we run PHP?" within an hour, that is the real finding. See <a href="https://asksumanta.com/insights/ai-incident-postmortems/">running useful postmortems</a>.</p>
</section>

<section class="block">
<h2>5. India considers pre-release checks for the most powerful AI models</h2>
<p>Reports on 28 October say India is weighing a new AI law with a separate safety framework for the most capable models, with options including pre-release evaluation and sandbox testing, and a consultation paper expected soon<sup class="cite"><a href="#ref-10">10</a></sup>. Nothing has been decided.</p>
<p><strong>CTO take:</strong> most companies deploy models rather than build frontier ones, so the direct impact is small for now. Watch the consultation for deployer obligations, especially on deepfakes and fraud. Teams building in India should design for documentation and testing evidence that also satisfies the <a href="https://asksumanta.com/insights/eu-ai-act-digital-omnibus-roadmap/">EU AI Act</a>. See <a href="https://asksumanta.com/fractional-cto-india/">fractional CTO in India</a>.</p>
</section>

<section class="block">
<h2>What I'd do this week</h2>
<ul>
<li>Patch or isolate every PHP runtime and review logs back to 21 October.</li>
<li>Audit agent and evaluation environments for network egress and stored credentials.</li>
<li>Re-run your evaluation set on cheaper mid-tier models and update routing if quality holds.</li>
<li>Add supplier change-of-control and exit terms to your vendor review checklist.</li>
<li>Note the India AI consultation in your regulatory watch list alongside the EU AI Act.</li>
</ul>
<p>Working across these regions? See <a href="https://asksumanta.com/regions/">where I work</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/tech-news-2026-10-29/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>RDF 1.2 explained: how triple terms let knowledge graphs describe their own statements</title><link>https://asksumanta.com/insights/rdf-1-2-triple-terms-knowledge-graphs/</link><guid isPermaLink="true">https://asksumanta.com/insights/rdf-1-2-triple-terms-knowledge-graphs/</guid><pubDate>Thu, 29 Oct 2026 00:20:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>ontology</category><category>knowledge-graph</category><category>data</category><category>architecture</category><description>RDF 1.2 adds triple terms, a standard way to attach provenance, confidence and time to any fact. What changed, how it compares with property graphs, and when to adopt.</description><content:encoded><![CDATA[<p><em>Enterprise knowledge graphs constantly need to say things about facts: where a fact came from, when it was true, how confident a model was when it extracted it. RDF has always made that awkward. RDF 1.2 makes it a first-class feature, and narrows one of the big gaps with property graphs.</em></p><p>Most real knowledge graph questions are not just "is this true?" but "according to whom, since when, and how sure are we?". A supplier relationship came from a contract system; a diagnosis came from a coded record; a link between two companies was extracted by a language model with some confidence. In classic RDF, attaching that context to a single fact meant reification patterns that were verbose, inconsistent between teams and awkward to query.</p>

<section class="block">
<h2>What RDF 1.2 adds</h2>
<p>RDF 1.2 introduces <strong>triple terms</strong>: an RDF triple that can itself appear as a term inside another triple<sup class="cite"><a href="#ref-1">1</a></sup>. To say something about a statement, you use a <strong>reifying triple</strong>, whose predicate is <code>rdf:reifies</code> and whose object is the triple term; the reifier then carries whatever metadata you need<sup class="cite"><a href="#ref-1">1</a></sup>. This standardises ideas first explored in the RDF-star community work<sup class="cite"><a href="#ref-4">4</a></sup>.</p>
<p>In Turtle 1.2's annotation syntax, a fact and its metadata can be written together, along these lines:</p>
<pre><code>:acme :supplies :globex {| :source :contractSystem ;
                           :since "2024-03-01"^^xsd:date ;
                           :confidence 0.92 |} .</code></pre>
<p>The base fact remains an ordinary triple that existing queries can use, while the annotation hangs off a reifier that refers to it.</p>
<p>The RDF 1.2 Concepts specification reached Candidate Recommendation on 7 April 2026<sup class="cite"><a href="#ref-2">2</a></sup>, part of a wider set of RDF 1.2 and SPARQL 1.2 specifications from the working group. SPARQL 1.2 adds the matching query support<sup class="cite"><a href="#ref-3">3</a></sup>. Check the current W3C status before committing production systems to it.</p>
</section>

<section class="block">
<h2>Why it matters for enterprise graphs</h2>
<table class="tbl">
<thead><tr><th>Need</th><th>Before RDF 1.2</th><th>With RDF 1.2</th></tr></thead>
<tbody>
<tr><td>Provenance per fact</td><td>Named graphs or custom reification patterns</td><td>Standard reifier with source metadata</td></tr>
<tr><td>Time validity</td><td>Extra intermediate nodes</td><td>Annotations on the statement itself</td></tr>
<tr><td>AI-extracted facts with confidence</td><td>Separate staging graphs</td><td>Confidence and model version on each fact</td></tr>
<tr><td>Interchange between tools</td><td>Vendor-specific RDF-star variants</td><td>One standard model and syntax</td></tr>
</tbody>
</table>
<p>The AI case is the most pressing. When a model extracts relationships from documents for <a href="https://asksumanta.com/insights/graphrag-when-it-beats-vector-rag/">GraphRAG</a> or <a href="https://asksumanta.com/insights/entity-resolution-knowledge-graphs/">entity resolution</a>, every new edge should carry where it came from, which model produced it and how confident it was, so curators can review and agents can weigh it.</p>
<div class="callout"><p>A fact without provenance is a liability in an enterprise graph. RDF 1.2 makes the responsible way to store facts also the standard way.</p></div>
</section>

<section class="block">
<h2>RDF 1.2 and property graphs</h2>
<p>Property graph databases have always allowed properties on edges, and they now have an international query language standard, ISO/IEC 39075 GQL<sup class="cite"><a href="#ref-5">5</a></sup>. Edge properties were one of the main reasons teams chose property graphs over RDF. RDF 1.2 narrows that gap with statement-level metadata, while RDF keeps its strengths: global identifiers, ontologies and validation with <a href="https://asksumanta.com/insights/shacl-validation-knowledge-graphs/">SHACL</a>, and taxonomies in <a href="https://asksumanta.com/insights/skos-vs-owl-enterprise-taxonomies/">SKOS</a>.</p>
<p>The choice is still about workload and ecosystem, as discussed in <a href="https://asksumanta.com/insights/ontology-vs-knowledge-graph-vs-semantic-layer/">ontology vs knowledge graph vs semantic layer</a>. What changes is that "we need properties on relationships" is no longer a reason on its own to leave RDF.</p>
</section>

<section class="block">
<h2>How I'd adopt it</h2>
<ol>
<li><strong>Check tool support.</strong> Triple stores, parsers and SHACL engines adopt new specifications at different speeds; test the features you need in your own stack.</li>
<li><strong>Define a provenance vocabulary</strong> before modelling: source system, extraction method, model version, confidence, validity period.</li>
<li><strong>Annotate new facts first</strong>, especially AI-extracted ones, rather than migrating everything at once.</li>
<li><strong>Keep base triples queryable</strong>, so existing applications keep working while new ones use annotations.</li>
<li><strong>Write shapes for annotations</strong>, so required provenance is validated, not just encouraged.</li>
</ol>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design ontology and knowledge graph programmes where every fact can be traced and trusted, including graphs that AI systems both read from and write to. See <a href="https://asksumanta.com/ontology-knowledge-graph/">ontology and knowledge graphs</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/rdf-1-2-triple-terms-knowledge-graphs/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>An AI coding policy for your engineering team: lessons from how Kubernetes handles AI-assisted contributions</title><link>https://asksumanta.com/insights/ai-coding-policy-engineering-teams/</link><guid isPermaLink="true">https://asksumanta.com/insights/ai-coding-policy-engineering-teams/</guid><pubDate>Wed, 28 Oct 2026 20:25:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>leadership</category><category>ai</category><category>governance</category><description>AI made code cheap to write and no cheaper to maintain. What the Kubernetes project&#x27;s AI contribution policy teaches engineering leaders about accountability, review and quality.</description><content:encoded><![CDATA[<p><em>Most engineering teams now write code with AI assistants, and most have no written policy for it. The Kubernetes project, one of the largest open source codebases in the world, wrote one. Its choices translate surprisingly well to a company engineering team.</em></p><p>The pattern is familiar in most engineering organisations by now. Engineers use AI assistants every day. Pull requests are larger and arrive faster. Reviewers are stretched, and occasionally someone merges code that nobody on the team can fully explain. There is usually no policy, just a vague sense that "we should be careful".</p>
<p>A Kubernetes maintainer described the core problem well: AI has made generating code fast, but there has been very little improvement in maintaining codebases<sup class="cite"><a href="#ref-1">1</a></sup>. That asymmetry is exactly what a policy needs to address.</p>

<section class="block">
<h2>Why write a policy at all</h2>
<p>The Kubernetes community's first step was an AI policy. Not because policies are exciting, but because many pull requests had derailed into arguments about AI usage, and a clear stance steered those conversations<sup class="cite"><a href="#ref-1">1</a></sup>. The same happens inside companies: without a shared rule, every review becomes a debate about whether AI-written code is acceptable, instead of whether the code is good.</p>
</section>

<section class="block">
<h2>What the Kubernetes policy says</h2>
<p>The project's contributor guidance and the accompanying blog set out a few clear principles<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-2">2</a></sup>:</p>
<table class="tbl">
<thead><tr><th>Principle</th><th>In practice</th></tr></thead>
<tbody>
<tr><td>Transparency</td><td>Disclose in the pull request when AI tools assisted</td></tr>
<tr><td>Human accountability</td><td>The contributor is fully responsible; AI is not listed as a co-author</td></tr>
<tr><td>Human engagement</td><td>Reviewers engage with people, not AI; if you cannot explain the change, the pull request is closed</td></tr>
<tr><td>Verification</td><td>Review, test and understand AI-generated changes; working is not enough, you must know why it works</td></tr>
<tr><td>Licence checks</td><td>Contributor licence agreement checks are enforced for co-authors as well</td></tr>
</tbody>
</table>
<p>The project also documented how new AI review tools are brought in, including finding maintainers willing to trial them on specific repositories before wider use<sup class="cite"><a href="#ref-3">3</a></sup>, and reported using AI reviewers as a quick first-pass quality gate so contributors get feedback without waiting for a maintainer<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<div class="callout"><p>"If you cannot explain it, you cannot merge it" is the single most useful AI rule an engineering team can adopt.</p></div>
</section>

<section class="block">
<h2>Translating it to a company team</h2>
<p>An open source project and a company differ in important ways: employees are already accountable to their employer, and code may touch customer data and contracts. The principles still hold. A practical company policy covers:</p>
<ol>
<li><strong>Approved tools and data boundaries.</strong> Which assistants are allowed, under which agreements, and what code or data must never be sent to them.</li>
<li><strong>Ownership.</strong> The engineer who opens the pull request owns every line, however it was produced.</li>
<li><strong>Explainability in review.</strong> Reviewers can ask the author to explain any change, and "the assistant wrote it" is not an answer.</li>
<li><strong>Proportionate scrutiny.</strong> Security-sensitive areas, authentication, payments and data handling get stricter review regardless of how the code was written.</li>
<li><strong>Tests as the contract.</strong> AI-assisted changes come with tests that a human has read and agrees with.</li>
<li><strong>AI reviewers as helpers, not approvers.</strong> Automated review can catch issues early; approval stays with a person.</li>
<li><strong>Supply chain hygiene.</strong> Watch for dependencies, snippets and model files introduced without scrutiny, as discussed in <a href="https://asksumanta.com/insights/ai-model-supply-chain-security/">AI model supply chain security</a>.</li>
</ol>
</section>

<section class="block">
<h2>Measure the outcome, not the usage</h2>
<p>Google's 2025 DORA research described AI mainly as an amplifier: it magnifies the strengths of high-performing organisations and the dysfunctions of struggling ones<sup class="cite"><a href="#ref-4">4</a></sup>. That is the right lens for leaders. Counting how much code AI produced tells you little. Watching delivery stability, rework and review load tells you whether AI is helping or merely moving work downstream, as covered in <a href="https://asksumanta.com/insights/dora-metrics-ai-assisted-engineering/">DORA metrics for AI-assisted engineering</a>.</p>
<p>Write the policy down, keep it to a page, revisit it quarterly, and pair it with the decision records described in <a href="https://asksumanta.com/insights/architecture-decision-records-fractional-cto/">architecture decision records</a>, so the reasoning behind important AI-assisted changes survives the people who made them.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>As a <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a>, I help teams adopt AI assistants with policies, review practices and metrics that improve quality rather than just volume. Or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/ai-coding-policy-engineering-teams/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Kubernetes workload identity: service account tokens or Pod Certificates?</title><link>https://asksumanta.com/insights/kubernetes-pod-certificates-workload-identity/</link><guid isPermaLink="true">https://asksumanta.com/insights/kubernetes-pod-certificates-workload-identity/</guid><pubDate>Wed, 28 Oct 2026 16:30:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>kubernetes</category><category>security</category><category>platform</category><category>cloud</category><description>Kubernetes 1.37 made Pod Certificates and Cluster Trust Bundles GA. How they compare with service account tokens, when to use each, and how to roll out mTLS identity.</description><content:encoded><![CDATA[<p><em>For years the built-in answer to &#x27;who is this workload?&#x27; in Kubernetes was a service account token. Kubernetes 1.37 made the foundations of a second answer generally available: X.509 certificates issued to Pods. The two solve overlapping problems with different security properties.</em></p><p>Every service that calls another service has to prove who it is. Inside Kubernetes, the default proof has been a service account token, a signed JWT that the kubelet mounts into the Pod and keeps fresh<sup class="cite"><a href="#ref-2">2</a></sup>. It works well, which is why it underpins workload identity federation with the major cloud providers<sup class="cite"><a href="#ref-1">1</a></sup>. It also has one structural weakness, and Kubernetes 1.37 shipped a GA foundation for addressing it.</p>

<section class="block">
<h2>The problem with bearer tokens</h2>
<p>Service account JWTs are bearer tokens: whoever has the token is the identity it names. To authenticate to a peer you must hand it a copy, which means the peer could replay it. Kubernetes reduces the risk by binding tokens to time, audience and objects, but the Kubernetes blog is candid that none of these are complete defences<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<p>The alternative is a proof-of-possession credential, where you prove you hold a secret without sending it. The most widely deployed form is the X.509 certificate used in TLS: the private key stays in the workload, and only a signature and the certificate cross the wire<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
</section>

<section class="block">
<h2>How Pod Certificates work</h2>
<p>A Pod requests certificates through projected volume sources in its spec<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-3">3</a></sup>. When the Pod is scheduled, the kubelet generates a private key, creates a PodCertificateRequest addressed to a named signer, and waits for the signer controller to issue a certificate chain. The kubelet writes the key and certificate into the container, alongside trust anchors collected from matching Cluster Trust Bundles, and refreshes everything before it expires<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<figure class="fig"><div class="im"><img src="https://asksumanta.com/assets/img/kubernetes-pod-certificates-workload-identity/architecture.webp" alt="Architecture diagram: a signer controller issues PodCertificateRequests and publishes ClusterTrustBundles; the kubelet on the node creates requests and reads trust bundles, then writes a credential bundle and a trust bundle file into the Pod, which the application reads" width="900" height="1009" loading="lazy"></div><figcaption>Pod Certificates architecture: the signer issues, the kubelet delivers, the application reads files. <span class="credit">Source: <a href="https://kubernetes.io/blog/2026/08/28/kubernetes-v1-37-pod-certificates-and-cluster-trust-bundles/" target="_blank" rel="noopener">Kubernetes blog</a> · CC BY 4.0</span></figcaption></figure>
<p>Two details matter in practice. Rotation is automatic and frequent: signers eventually shipped in core are expected to issue certificates with a maximum lifetime of 24 hours, and other signers are capped at 91 days, so applications must reload credentials when files change. And security checks sit in the API server, where node restriction stops a compromised node requesting certificates for Pods not scheduled to it<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
</section>

<section class="block">
<h2>Side by side</h2>
<table class="tbl">
<thead><tr><th></th><th>Service account tokens</th><th>Pod Certificates</th></tr></thead>
<tbody>
<tr><td>Credential type</td><td>Bearer JWT</td><td>X.509 certificate with a private key kept in the Pod</td></tr>
<tr><td>Replay if intercepted</td><td>Possible within the token's bindings</td><td>Not without the private key</td></tr>
<tr><td>Best for</td><td>Calling cloud APIs and services that accept federated JWTs</td><td>Service-to-service mTLS inside and across clusters</td></tr>
<tr><td>Ecosystem support</td><td>Very broad today</td><td>Growing; signers are pluggable</td></tr>
<tr><td>Signer</td><td>Built into the control plane</td><td>Third-party or custom at 1.37; built-in signers expected later</td></tr>
<tr><td>Application effort</td><td>Read a file, send a header</td><td>Configure TLS and handle frequent rotation</td></tr>
</tbody>
</table>
<p>The blog expects at least two built-in signers over time: one for server TLS certificates matching Service DNS names, and one for SPIFFE client certificates that fill the role service account tokens play today<sup class="cite"><a href="#ref-1">1</a></sup>. SPIFFE defines a standard identity format and verifiable identity documents for workloads, which makes these identities portable across platforms<sup class="cite"><a href="#ref-4">4</a></sup>.</p>
<div class="callout"><p>Use tokens to talk to clouds and APIs that expect them. Use certificates for service-to-service trust you control. Most platforms will run both for years.</p></div>
</section>

<section class="block">
<h2>How I'd roll it out</h2>
<ol>
<li><strong>Map current identity flows</strong>: which services call which, with what credential, and where tokens are forwarded rather than validated.</li>
<li><strong>Pick a signer strategy.</strong> Until built-in signers arrive, choose a maintained signer or your existing PKI, and decide who owns the root of trust.</li>
<li><strong>Start with internal mTLS</strong> between a few high-value services, using credential bundles so rotation is a single file reload.</li>
<li><strong>Test rotation deliberately.</strong> With lifetimes as short as a day, an application that only reads its certificate at start-up will fail.</li>
<li><strong>Enforce with policy</strong>: require certificate sources for services that handle sensitive data, using <a href="https://asksumanta.com/insights/kubernetes-admission-policies-cel/">admission policies</a> and the isolation model in <a href="https://asksumanta.com/insights/kubernetes-multi-tenancy/">Kubernetes multi-tenancy</a>.</li>
<li><strong>Keep tokens where they fit</strong>, especially for cloud federation, and stop forwarding them between services, the same anti-pattern described in <a href="https://asksumanta.com/insights/securing-mcp-servers-checklist/">securing MCP servers</a>.</li>
</ol>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design Kubernetes platforms with identity, policy and isolation built in, so security reviews become a walkthrough rather than a negotiation. As a <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a> I can own that roadmap. Or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/kubernetes-pod-certificates-workload-identity/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Migrating to stateless MCP: a playbook for the 2026-07-28 specification</title><link>https://asksumanta.com/insights/mcp-stateless-migration-playbook/</link><guid isPermaLink="true">https://asksumanta.com/insights/mcp-stateless-migration-playbook/</guid><pubDate>Wed, 28 Oct 2026 12:20:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>ai</category><category>mcp</category><category>agents</category><category>platform</category><description>The MCP 2026-07-28 spec removed sessions and the handshake. A playbook for migrating servers, gateways and clients: state handles, MRTR, headers, caching and auth changes.</description><content:encoded><![CDATA[<p><em>The 2026-07-28 Model Context Protocol specification turned a stateful, bidirectional protocol into a stateless request and response one. That is good news for anyone running MCP servers at scale, and a real migration for anyone who built on sessions, server-initiated requests or long-lived streams.</em></p><p>Most early MCP servers were built like chat connections: a client connected, shook hands, held a session open and the server pushed requests back when it needed something. That worked on a laptop. It worked less well behind a load balancer, in serverless runtimes, or anywhere a connection could drop. The 2026-07-28 specification addresses that head on<sup class="cite"><a href="#ref-1">1</a></sup>.</p>

<section class="block">
<h2>What changed, in one table</h2>
<table class="tbl">
<thead><tr><th>Before</th><th>From 2026-07-28</th><th>Why it matters</th></tr></thead>
<tbody>
<tr><td><code>initialize</code> handshake and <code>Mcp-Session-Id</code></td><td>Removed; each request carries protocol version and client capabilities in <code>_meta</code></td><td>Any request can land on any instance<sup class="cite"><a href="#ref-2">2</a></sup></td></tr>
<tr><td>Capabilities learned at connect time</td><td>Optional <code>server/discover</code> call that servers must implement</td><td>Up-front version selection when clients want it<sup class="cite"><a href="#ref-2">2</a></sup></td></tr>
<tr><td>Server-initiated elicitation, sampling and roots requests</td><td>Multi Round-Trip Requests: the server returns <code>input_required</code> and the client retries with answers</td><td>No held-open bidirectional stream<sup class="cite"><a href="#ref-3">3</a></sup></td></tr>
<tr><td>Method and tool names only in the JSON body</td><td><code>Mcp-Method</code> and <code>Mcp-Name</code> headers required on Streamable HTTP</td><td>Gateways route and authorise on headers<sup class="cite"><a href="#ref-4">4</a></sup></td></tr>
<tr><td>List results with no freshness hints</td><td><code>ttlMs</code> and <code>cacheScope</code>, plus deterministic tool order</td><td>Client caching and stable prompt caches<sup class="cite"><a href="#ref-2">2</a></sup></td></tr>
<tr><td>SSE resumability with <code>Last-Event-ID</code></td><td>Removed; a broken stream means re-issuing the request</td><td>Simpler transport, but retries must be safe<sup class="cite"><a href="#ref-2">2</a></sup></td></tr>
</tbody>
</table>
<p>The release also moved Tasks into an official extension, hardened authorisation with RFC 9207 issuer validation, deprecated Dynamic Client Registration in favour of client metadata documents, and introduced a formal deprecation policy with a twelve-month minimum window<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
</section>

<section class="block">
<h2>The playbook</h2>
<h3>1. Inventory what depends on sessions</h3>
<p>List every server and find where it relies on connection state: per-session caches, "current project" set at connect time, server-pushed requests, resumable streams. Those are your migration items. Servers that only expose stateless tools usually need little more than an SDK upgrade.</p>

<h3>2. Replace hidden state with explicit handles</h3>
<p>The specification's answer to cross-call state is an explicit, server-minted handle returned by a tool and passed back as an ordinary argument<sup class="cite"><a href="#ref-2">2</a></sup>. The maintainers note this works better than transport-hidden state because the model can see the handle and thread it between tools<sup class="cite"><a href="#ref-1">1</a></sup>. Store the state behind the handle in a shared store, scoped to the user, with an expiry.</p>

<h3>3. Rework interactive tools with MRTR</h3>
<p>Tools that asked the user for confirmation or a missing parameter mid-call now return an interim result with <code>resultType: "input_required"</code>; the client gathers the answers and retries the original request with them<sup class="cite"><a href="#ref-3">3</a></sup>. Design these tools so a retry is safe, and keep any correlation data in the request state rather than server memory.</p>

<h3>4. Make retries safe everywhere</h3>
<p>Without stream resumability, a dropped response stream means the client re-issues the request with a new ID<sup class="cite"><a href="#ref-2">2</a></sup>. Any tool with side effects needs idempotency, the same discipline as in <a href="https://asksumanta.com/insights/idempotent-payments-order-pipelines/">idempotent payment pipelines</a>.</p>

<h3>5. Move routing and policy to the gateway</h3>
<p>With <code>Mcp-Method</code> and <code>Mcp-Name</code> on every Streamable HTTP request<sup class="cite"><a href="#ref-4">4</a></sup>, a gateway can rate-limit, authorise and meter per tool without parsing bodies. Plain round-robin load balancing now works. This is the natural place to enforce the controls in <a href="https://asksumanta.com/insights/securing-mcp-servers-checklist/">securing MCP servers</a>.</p>

<h3>6. Use the cache hints</h3>
<p>Return a deterministic tool order and sensible <code>ttlMs</code> values. Stable tool lists help clients cache catalogues and keep upstream prompt caches warm, which matters for cost, as covered in <a href="https://asksumanta.com/insights/prompt-caching-llm-cost-latency/">prompt caching</a>.</p>

<h3>7. Plan the deprecations</h3>
<p>Roots, Sampling and Logging are deprecated, with suggested migrations: pass paths through tool parameters or configuration instead of Roots, call model providers directly instead of Sampling, and use stderr or OpenTelemetry instead of protocol Logging<sup class="cite"><a href="#ref-2">2</a></sup><sup class="cite"><a href="#ref-5">5</a></sup>. Trace context now has documented conventions in <code>_meta</code>, which fits the approach in <a href="https://asksumanta.com/insights/llm-observability-opentelemetry-genai/">LLM observability</a>.</p>
<div class="callout"><p>Stateless MCP doesn't make your system stateless. It makes your state visible, which is exactly where an auditor, an SRE and the model all need it to be.</p></div>
</section>

<section class="block">
<h2>Sequencing for an enterprise estate</h2>
<ol>
<li><strong>Gateway first</strong>, so routing and policy work for both old and new protocol versions during the transition.</li>
<li><strong>High-traffic, stateless servers next</strong>: the easiest wins for scalability.</li>
<li><strong>Interactive and stateful servers last</strong>, with handles and MRTR designed and tested properly.</li>
<li><strong>Registry metadata updated</strong> to show which protocol versions each server supports, as in <a href="https://asksumanta.com/insights/mcp-registry-enterprise-subregistry/">an enterprise MCP registry</a>.</li>
</ol>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design and migrate enterprise MCP estates, from gateways and registries to server patterns that survive load balancers and retries. See my <a href="https://asksumanta.com/ai-architect/">AI architecture work</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/mcp-stateless-migration-playbook/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Characterisation on OMOP: describe your population before you predict or estimate anything</title><link>https://asksumanta.com/insights/omop-characterisation-incidence/</link><guid isPermaLink="true">https://asksumanta.com/insights/omop-characterisation-incidence/</guid><pubDate>Wed, 28 Oct 2026 08:20:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>healthcare</category><category>omop</category><category>data</category><description>Database profiles, cohort characterisation, treatment pathways and incidence rates on OMOP: what each tells you, how to compute them, and why they come before AI.</description><content:encoded><![CDATA[<p><em>Health data teams are under pressure to jump straight to prediction models and causal studies. The most useful first step is less glamorous: describing the data and the people in it. OHDSI&#x27;s characterisation methods turn that into a repeatable, shareable discipline.</em></p><p>A familiar pattern in health data projects: the team gets access to a new OMOP database, and within a week someone is training a risk model. A month later the model behaves strangely, and the cause turns out to be something basic. Half the patients have under a year of observation, a whole drug class is missing from one source, or the "new users" are mostly people transferring in from another system.</p>
<p>Characterisation is how you find those things first. The Book of OHDSI describes four methods, each answering a different question<sup class="cite"><a href="#ref-1">1</a></sup>.</p>

<section class="block">
<h2>Four kinds of characterisation</h2>
<table class="tbl">
<thead><tr><th>Method</th><th>Question it answers</th><th>Typical use</th></tr></thead>
<tbody>
<tr><td>Database-level</td><td>What is in this database at all?</td><td>Fitness for purpose, data quality, spotting gaps</td></tr>
<tr><td>Cohort characterisation</td><td>Who are these people, before and after the index date?</td><td>Natural history, drug utilisation, study feasibility</td></tr>
<tr><td>Treatment pathways</td><td>What sequence of treatments do people receive?</td><td>Treatment patterns, switching, guideline adherence</td></tr>
<tr><td>Incidence</td><td>How often does a new outcome occur in a population?</td><td>Disease burden, safety signals, baselines for models</td></tr>
</tbody>
</table>
<p>All except database-level characterisation describe a population relative to an index date defined by a cohort. Time before the index date is baseline; the index date and after is post-index<sup class="cite"><a href="#ref-1">1</a></sup>. That is why good <a href="https://asksumanta.com/insights/omop-cohort-definitions/">cohort definitions</a> come first.</p>
</section>

<section class="block">
<h2>Start with the database</h2>
<p>Before any population question, describe the database: how many people, their age distribution, how long they are observed, and how the recording of treatments, conditions and procedures changes over time. These summaries also reveal what may be missing<sup class="cite"><a href="#ref-1">1</a></sup>, which is why they pair naturally with <a href="https://asksumanta.com/insights/omop-data-quality-checks/">OMOP data quality checks</a>.</p>
</section>

<section class="block">
<h2>Characterise the cohort broadly</h2>
<p>OHDSI's approach to cohort characterisation is deliberately broad: descriptive statistics across all conditions, drug and device exposures, procedures and other observations in a person's history, plus demographics at the index date. That gives a complete picture of the population and helps surface variation and missing values<sup class="cite"><a href="#ref-1">1</a></sup>. The FeatureExtraction package produces these features in a standard way, so the same characterisation runs at every site<sup class="cite"><a href="#ref-4">4</a></sup>.</p>
<p>The book notes that disseminating this kind of characterisation is recommended practice in the STROBE guidelines for reporting observational studies<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-3">3</a></sup>. Practically, a baseline table is also the fastest way to check your cohort is the population you think it is.</p>
<div class="callout"><p>If the baseline table surprises you, stop. The surprise is either a finding or a data problem, and both matter more than the model you were about to train.</p></div>
</section>

<section class="block">
<h2>Treatment pathways</h2>
<p>Pathway analysis summarises the sequence of treatments people receive after a starting event, such as a diagnosis or first prescription. In a landmark study across the OHDSI network, Hripcsak and colleagues used standardised pathway analyses for type 2 diabetes, hypertension and depression, running the same analysis across many databases<sup class="cite"><a href="#ref-2">2</a></sup>. The book reports that they found metformin to be the most common diabetes medication, consistent with first-line guidance, and that 10% of diabetes patients, 24% of hypertension patients and 11% of depression patients followed a treatment pathway shared with no one else in any of the data sources<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<p>That last finding is a useful reminder for anyone designing clinical AI: real-world care is far more varied than guidelines suggest.</p>
</section>

<section class="block">
<h2>Incidence, defined precisely</h2>
<p>Incidence measures new occurrences of an outcome in a population during a time at risk. The book defines two metrics<sup class="cite"><a href="#ref-1">1</a></sup>:</p>
<ul>
<li><strong>Incidence proportion</strong>: people in the cohort with a new outcome during the time at risk, divided by people in the cohort with time at risk.</li>
<li><strong>Incidence rate</strong>: people with a new outcome divided by the total person-time at risk, where each person's time stops when the outcome occurs.</li>
</ul>
<figure class="fig"><div class="im"><img src="https://asksumanta.com/assets/img/omop-characterisation-incidence/incidence-timeline.webp" alt="Timeline for one person showing observation period start and end, cohort start and end, a time-at-risk window starting one day after cohort start and ending at cohort end, and an outcome occurring within the time at risk" width="1090" height="307" loading="lazy"></div><figcaption>The components of an incidence calculation for one person. <span class="credit">Source: <a href="https://ohdsi.github.io/TheBookOfOhdsi/Characterization.html" target="_blank" rel="noopener">The Book of OHDSI, Characterization</a> · CC0 1.0</span></figcaption></figure>
<p>Most disagreements about "the rate" of something trace back to different choices of cohort, time at risk or outcome definition. Writing those down explicitly is what makes incidence comparable across sites and studies.</p>
</section>

<section class="block">
<h2>Where characterisation fits</h2>
<ol>
<li><strong>Database characterisation</strong> when a source joins the platform, and after every major load.</li>
<li><strong>Cohort characterisation</strong> before any study or model, to confirm feasibility and population.</li>
<li><strong>Pathways and incidence</strong> to understand current practice and baselines.</li>
<li><strong>Then</strong> <a href="https://asksumanta.com/insights/clinical-prediction-models-omop/">prediction</a> or <a href="https://asksumanta.com/insights/real-world-evidence-study-designs-omop/">effect estimation</a>, with the characterisation published alongside the results.</li>
</ol>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design OMOP platforms where characterisation runs automatically on every load and every new cohort, so analysts and AI teams start from facts rather than assumptions. See <a href="https://asksumanta.com/healthcare-data-architecture/">healthcare data architecture</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/omop-characterisation-incidence/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>OpenTelemetry declarative configuration: a playbook for moving from environment variables to one reviewed file</title><link>https://asksumanta.com/insights/opentelemetry-declarative-configuration/</link><guid isPermaLink="true">https://asksumanta.com/insights/opentelemetry-declarative-configuration/</guid><pubDate>Wed, 28 Oct 2026 04:20:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>observability</category><category>opentelemetry</category><category>platform</category><category>cloud</category><description>OpenTelemetry&#x27;s declarative configuration schema is stable. What changed, which languages support it, and a playbook for moving SDK setup from env vars to one reviewed file.</description><content:encoded><![CDATA[<p><em>For years, configuring OpenTelemetry SDKs meant a growing list of OTEL_ environment variables, plus code for anything they couldn&#x27;t express. The declarative configuration schema is now stable. It turns telemetry setup into a versioned file that platform teams can standardise, review and roll out.</em></p><p>Ask a platform team how their services configure OpenTelemetry and the honest answer is usually "it depends on the service". One team sets a dozen <code>OTEL_</code> variables in a Helm chart, another wires exporters in code, a third copied a sampler setting from a blog post two years ago. The result is telemetry that differs in quality across services for no good reason, and changes that require touching every repository.</p>
<p>OpenTelemetry's declarative configuration is designed to fix that, and the core of it is now stable.</p>

<section class="block">
<h2>What changed</h2>
<p>In March 2026 the project marked key portions of the declarative configuration specification stable<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-2">2</a></sup>:</p>
<ul>
<li>The JSON schema for the data model, released as <code>opentelemetry-configuration</code> 1.0.0<sup class="cite"><a href="#ref-3">3</a></sup>.</li>
<li>The YAML file format and the in-memory representation of the model.</li>
<li>The SDK operations to parse a file and create SDK components from it.</li>
<li>A standard environment variable, <code>OTEL_CONFIG_FILE</code>, to point the SDK at the file.</li>
</ul>
<p>At the time, implementations existed in C++, Go, Java, JavaScript and PHP, with .NET and Python under way, and the Collector used the Go implementation for its own internal telemetry<sup class="cite"><a href="#ref-1">1</a></sup>. Since then, the Java Spring Boot starter has added support from version 2.26.0, embedding the same schema in <code>application.yaml</code><sup class="cite"><a href="#ref-4">4</a></sup>.</p>
</section>

<section class="block">
<h2>Why it matters</h2>
<p>Environment variables are flat. They can name an exporter endpoint, but struggle with a pipeline: several processors, different exporters per signal, views that drop noisy attributes, a sampler with rules. Anything beyond them meant code, or for the Java agent a separate extension jar<sup class="cite"><a href="#ref-4">4</a></sup>. The declarative schema describes the whole SDK pipeline as a tree, in the same shape the SDK runs<sup class="cite"><a href="#ref-5">5</a></sup>:</p>
<pre><code>file_format: "1.0"
resource:
  attributes:
    - name: service.name
      value: checkout
tracer_provider:
  processors:
    - batch:
        exporter:
          otlp_http:
            endpoint: ${OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:-http://collector:4318/v1/traces}</code></pre>
<p>Environment variable substitution keeps the parts that genuinely vary per environment out of the file, while everything else becomes a reviewable artefact.</p>
<div class="callout"><p>Telemetry configuration is platform policy. It belongs in one reviewed file per service type, not scattered across Helm values and application code.</p></div>
</section>

<section class="block">
<h2>The playbook</h2>
<h3>1. Inventory what you have</h3>
<p>List how each service configures its SDK today: environment variables, code, agent flags. You will usually find a few patterns that cover most services, and a long tail of one-offs.</p>
<h3>2. Check language support</h3>
<p>Support varies by language and by feature. The project tracks it in the specification compliance matrix and the configuration repository's language support status<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-3">3</a></sup>. Start with the languages where support is mature in your stack.</p>
<h3>3. Write a small set of standard files</h3>
<p>Create a baseline per service type, such as web API, worker and batch job, covering resource attributes, exporters to your <a href="https://asksumanta.com/insights/opentelemetry-collector-deployment-patterns/">Collector gateway</a>, batching, sampling and views. Keep secrets and endpoints as substitutions.</p>
<h3>4. Ship the file with the platform, not the app</h3>
<p>Mount it from a ConfigMap or bake it into base images, and set <code>OTEL_CONFIG_FILE</code> in your deployment templates. Teams inherit good defaults without copying settings.</p>
<h3>5. Validate in CI</h3>
<p>The model is defined by a JSON schema, so files can be validated before they ship<sup class="cite"><a href="#ref-3">3</a></sup>. Add the check to the same pipeline that enforces <a href="https://asksumanta.com/insights/kubernetes-admission-policies-cel/">admission policies</a>.</p>
<h3>6. Migrate service by service</h3>
<p>Run the declarative file alongside existing settings in a non-production environment, compare the telemetry produced, then switch. Pay attention to resource attributes and sampling, where small differences change dashboards and costs.</p>
<h3>7. Plan for deprecations</h3>
<p>The project intends to deprecate environment variables that don't interoperate well with declarative configuration, while making clear that deprecation is not deletion<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-6">6</a></sup>. Moving now avoids a rushed migration later.</p>
</section>

<section class="block">
<h2>Where to be careful</h2>
<ul>
<li><strong>Precedence.</strong> Understand how the file interacts with remaining environment variables in each language before assuming one wins.</li>
<li><strong>Instrumentation configuration.</strong> The API for configuring instrumentation through the model was out of scope for the initial stabilisation<sup class="cite"><a href="#ref-1">1</a></sup>; check what your language supports.</li>
<li><strong>Runtime changes.</strong> Dynamic configuration, changing telemetry without a restart, is still being designed<sup class="cite"><a href="#ref-1">1</a></sup>.</li>
<li><strong>Stability is per language.</strong> A stable schema doesn't mean every SDK implementation is stable yet; follow the same approach as <a href="https://asksumanta.com/insights/opentelemetry-stable-by-default-kubernetes/">stable by default</a>.</li>
</ul>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design observability platforms where telemetry is configured once, centrally and consistently, from SDK to Collector to backend. As a <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a> I can own that roadmap. Or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/opentelemetry-declarative-configuration/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Keeping secrets out of Terraform state: a checklist for platform teams</title><link>https://asksumanta.com/insights/terraform-secrets-out-of-state/</link><guid isPermaLink="true">https://asksumanta.com/insights/terraform-secrets-out-of-state/</guid><pubDate>Wed, 28 Oct 2026 00:20:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>cloud</category><category>terraform</category><category>security</category><category>platform</category><description>Terraform state has long held plaintext secrets. Ephemeral values and write-only arguments now keep them out. A checklist to find exposure, migrate safely and harden state.</description><content:encoded><![CDATA[<p><em>Most organisations using Terraform have database passwords, API keys or private keys sitting in state files, often in plaintext. For years that was simply how Terraform worked. Since versions 1.10 and 1.11 it doesn&#x27;t have to be, but the fix needs deliberate migration.</em></p><p>Ask a platform team where their production database password lives and the answer is usually "in the secrets manager". Ask where else it lives and the honest answer is often "in the Terraform state file, in plaintext, readable by anyone with access to the state bucket". That was the default for years: a secret read through a data source or set on a resource ended up in both plan and state<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-6">6</a></sup>.</p>

<section class="block">
<h2>What changed</h2>
<table class="tbl">
<thead><tr><th>Version</th><th>Feature</th><th>What it does</th></tr></thead>
<tbody>
<tr><td>1.10</td><td>Ephemeral values and resources</td><td>Fetch or generate values during a run without persisting them in plan or state<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-4">4</a></sup></td></tr>
<tr><td>1.11</td><td>Write-only arguments</td><td>Pass ephemeral values to managed resources; never stored in plan or state<sup class="cite"><a href="#ref-2">2</a></sup></td></tr>
</tbody>
</table>
<p>Together they close the gap: a secret can be read from a secrets manager ephemerally and handed to a resource through a write-only argument, without ever landing in state<sup class="cite"><a href="#ref-2">2</a></sup><sup class="cite"><a href="#ref-3">3</a></sup>. There is one catch. Because Terraform never stores the value, it can't detect when it changes. Write-only arguments are paired with a version argument that you increment to trigger an update, and only the version is stored<sup class="cite"><a href="#ref-2">2</a></sup>. Support also depends on each provider, resource by resource<sup class="cite"><a href="#ref-3">3</a></sup><sup class="cite"><a href="#ref-5">5</a></sup>.</p>
<div class="callout"><p>"Sensitive" hides a value from your screen. "Ephemeral" and "write-only" keep it out of the file. Only the second protects you if the state bucket leaks.</p></div>
</section>

<section class="block">
<h2>1. Find the exposure</h2>
<ul>
<li>Inventory every state file and who can read it, including CI service accounts and old backends nobody uses.</li>
<li>Search state for secret-bearing attributes: passwords, private keys, tokens, connection strings.</li>
<li>List data sources that read from secrets managers; each one is copying a secret into state today.</li>
<li>Treat any secret that has ever been in state as potentially exposed to everyone with state access.</li>
</ul>
</section>

<section class="block">
<h2>2. Upgrade the toolchain</h2>
<ul>
<li>Move to Terraform 1.11 or later so both features are available<sup class="cite"><a href="#ref-2">2</a></sup>.</li>
<li>Upgrade providers and check their documentation for ephemeral resources and write-only arguments on the resources you use.</li>
<li>If you run OpenTofu, check its equivalent features and version support separately; the choice is covered in <a href="https://asksumanta.com/insights/opentofu-or-terraform-2026/">OpenTofu or Terraform</a>.</li>
</ul>
</section>

<section class="block">
<h2>3. Migrate resource by resource</h2>
<ul>
<li>Replace secret-reading data sources with ephemeral resources where the provider offers them.</li>
<li>Switch resources to write-only arguments for passwords and keys, with a version argument for rotation.</li>
<li><strong>Rotate the secret as part of the migration.</strong> Moving to write-only stops future storage; it doesn't undo past exposure.</li>
<li>Better still, let the platform generate and manage the secret itself, such as a managed database credential stored in the cloud's secrets manager, so Terraform never handles it.</li>
<li>Update shared modules first, using the patterns in <a href="https://asksumanta.com/insights/terraform-multi-cloud-module-design/">Terraform module design</a>, so every consumer benefits.</li>
</ul>
</section>

<section class="block">
<h2>4. Harden state anyway</h2>
<ul>
<li>Encrypt state at rest with customer-managed keys and restrict decrypt permissions.</li>
<li>Limit state read access to the pipelines that need it; humans rarely do.</li>
<li>Enable versioning and access logging on the state backend, and alert on unusual reads.</li>
<li>Keep plan files out of CI artefacts and logs, or apply the same controls to them.</li>
</ul>
</section>

<section class="block">
<h2>5. Keep it from regressing</h2>
<ul>
<li>Add a policy check in CI that flags secret-bearing attributes set through normal arguments, and secret-reading data sources.</li>
<li>Document the rotation process using version arguments, so it's routine rather than tribal knowledge.</li>
<li>Include state access in access reviews and in your <a href="https://asksumanta.com/insights/soc2-for-ai-startups/">SOC 2</a> evidence; it is often the broadest secret access in the company.</li>
</ul>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I review and redesign infrastructure-as-code estates for security and maintainability, including secrets handling, state architecture and module standards. As a <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a> I can own that roadmap. Or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/terraform-secrets-out-of-state/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>SLOs and error budgets for small teams: field notes on making reliability a decision, not a debate</title><link>https://asksumanta.com/insights/slos-error-budgets-small-teams/</link><guid isPermaLink="true">https://asksumanta.com/insights/slos-error-budgets-small-teams/</guid><pubDate>Tue, 27 Oct 2026 20:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>leadership</category><category>platform</category><category>observability</category><description>SLOs and error budgets work for small teams too. How to choose SLOs, write an error budget policy, alert on burn rate and use the budget to settle priorities.</description><content:encoded><![CDATA[<p><em>In a small company, the argument between shipping features and fixing reliability usually gets settled by whoever is loudest that week. Service level objectives and error budgets turn it into a rule everyone agreed in advance. The Google SRE material is written for large organisations, but the core ideas scale down well.</em></p><p>A familiar scene in a growing company: a bad week of incidents, a tense meeting, a decision to "focus on stability" for a sprint, and then feature pressure creeps back until the next bad week. Nobody is wrong. Product wants to ship, engineering wants to stop firefighting, and there is no shared definition of "reliable enough" to settle the question.</p>
<p>Error budgets were designed for exactly this. The original Google SRE book frames reliability as a target to be chosen, not maximised, because every extra nine costs something<sup class="cite"><a href="#ref-5">5</a></sup>. Once the target is agreed, the gap between it and perfection is a budget the team is allowed to spend.</p>

<section class="block">
<h2>Start smaller than you think</h2>
<p>Small teams fail at SLOs by trying to cover everything. Two or three objectives on the user journeys that matter most is enough to start:</p>
<ul>
<li><strong>Availability</strong> of the core API or page: the proportion of valid requests that succeed.</li>
<li><strong>Latency</strong> for the same journey: the proportion of requests faster than a threshold users would notice.</li>
<li><strong>Freshness or correctness</strong> for data products: the proportion of runs completed on time.</li>
</ul>
<p>Measure at the edge closest to users, such as the load balancer or gateway, and set the first targets from what you achieved over the last month. The Workbook recommends writing the SLOs down with owners, approvers and review dates, and its example document gives each objective its own budget of 100% minus the target<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-4">4</a></sup>.</p>
</section>

<section class="block">
<h2>Write the policy before you need it</h2>
<p>The SLO is a number; the policy is what makes it matter. The Workbook says a policy should state the actions taken when the budget is exhausted and a clear escalation path for disagreements<sup class="cite"><a href="#ref-1">1</a></sup>. Its example policy is a useful template<sup class="cite"><a href="#ref-2">2</a></sup>:</p>
<table class="tbl">
<thead><tr><th>Trigger</th><th>Example action</th></tr></thead>
<tbody>
<tr><td>Budget exhausted over the preceding four weeks</td><td>Halt changes and releases other than P0 issues and security fixes until back within SLO</td></tr>
<tr><td>A single incident consumes over 20% of the four-week budget</td><td>Postmortem with at least one P0 action item</td></tr>
<tr><td>One class of outage consumes over 20% of the quarterly budget</td><td>A P0 item in next quarter's plan</td></tr>
<tr><td>Budget spent by causes outside the team's control</td><td>Listed exceptions, such as company-wide network problems</td></tr>
</tbody>
</table>
<p>For a small company, a softer version often works better: rather than halting all releases, the next sprint's capacity goes to reliability work until the budget recovers. What matters is that product and engineering leadership sign it together, before the next bad week.</p>
<div class="callout"><p>The error budget's real value is political, not technical. It replaces an argument about feelings with a rule both sides agreed when they were calm.</p></div>
</section>

<section class="block">
<h2>Alert on burn rate, not on errors</h2>
<p>Paging on every error spike burns out small on-call rotations fast. The Workbook's guidance is to alert on how quickly the budget is being consumed, combining multiple time windows and burn rates so that fast, severe problems page someone while slow leaks become tickets<sup class="cite"><a href="#ref-3">3</a></sup>. With two or three SLOs, that typically means a handful of alerts in total, each of which genuinely matters.</p>
<p>The telemetry comes from the same pipeline as everything else; the <a href="https://asksumanta.com/insights/opentelemetry-collector-deployment-patterns/">OpenTelemetry Collector patterns</a> make it straightforward to compute SLIs centrally.</p>
</section>

<section class="block">
<h2>What changes once it's running</h2>
<ul>
<li><strong>Prioritisation gets easier.</strong> Budget remaining means ship; budget gone means fix. The weekly debate shrinks to a glance at a dashboard.</li>
<li><strong>Postmortems get sharper.</strong> Budget consumed per incident is a better severity measure than whoever shouted loudest, and pairs well with the practices in <a href="https://asksumanta.com/insights/ai-incident-postmortems/">AI incident postmortems</a>.</li>
<li><strong>Delivery metrics gain context.</strong> <a href="https://asksumanta.com/insights/dora-metrics-ai-assisted-engineering/">DORA metrics</a> say how fast you ship; error budgets say whether the speed is affordable.</li>
<li><strong>Customer conversations improve.</strong> An SLO you actually meet is a far better basis for an SLA than an aspiration.</li>
</ul>
</section>

<section class="block">
<h2>Mistakes to avoid</h2>
<ol>
<li><strong>Targets nobody would notice missing.</strong> If users wouldn't feel a breach, the SLO is measuring the wrong thing.</li>
<li><strong>100% targets.</strong> They leave no budget, so every change becomes a violation<sup class="cite"><a href="#ref-5">5</a></sup>.</li>
<li><strong>A policy without a signature from product.</strong> Then it is an engineering wish, not an agreement.</li>
<li><strong>Never revisiting.</strong> Review targets quarterly, as the Workbook's document template expects<sup class="cite"><a href="#ref-4">4</a></sup>.</li>
</ol>
</section>

<section class="block">
<h2>How I can help</h2>
<p>As a <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a>, I set up SLOs, error budget policies and on-call practices that fit the size of the team, so reliability decisions stop depending on the week you're having. Or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/slos-error-budgets-small-teams/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Speculative decoding for private LLMs: faster tokens without changing the answers</title><link>https://asksumanta.com/insights/speculative-decoding-private-llms/</link><guid isPermaLink="true">https://asksumanta.com/insights/speculative-decoding-private-llms/</guid><pubDate>Tue, 27 Oct 2026 16:20:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>ai</category><category>llm</category><category>platform</category><description>Speculative decoding speeds up LLM generation without changing outputs. How it works, when it helps on self-hosted models in vLLM, which method to choose, and how to measure it.</description><content:encoded><![CDATA[<p><em>Self-hosting a model gives you control over data and cost, and often a latency problem. Speculative decoding is one of the few optimisations that makes generation faster without changing what the model outputs. It also has a narrower sweet spot than its benchmarks suggest.</em></p><p>A common moment in private LLM projects: the model runs on your own GPUs, quality is acceptable, and users complain that answers stream slowly. Buying more hardware raises throughput but barely changes how quickly each token appears for one user. Quantisation and smaller models change the outputs. Speculative decoding is attractive because it does neither.</p>

<section class="block">
<h2>How it works</h2>
<p>Generating text one token at a time leaves a large model's GPU mostly waiting on memory, not compute. Speculative decoding uses that slack. A cheap proposer guesses the next few tokens; the large target model checks all of them in one parallel pass; accepted tokens are kept, and generation continues from the first rejection<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<p>The original Google Research paper showed this can sample from the target model's distribution exactly, so outputs are unchanged, and reported 2 to 3 times faster generation on T5-XXL with existing models and no retraining<sup class="cite"><a href="#ref-1">1</a></sup>. In practice, floating-point differences in batched GPU execution mean byte-identical outputs are likely rather than guaranteed.</p>
<div class="callout"><p>Speculative decoding trades spare compute for latency. If your GPUs have no spare compute, there is nothing to trade.</p></div>
</section>

<section class="block">
<h2>The proposer options</h2>
<table class="tbl">
<thead><tr><th>Method</th><th>How it proposes</th><th>Trade-off</th></tr></thead>
<tbody>
<tr><td>Draft model</td><td>A smaller model from the same family</td><td>Good acceptance; extra memory and a model to manage</td></tr>
<tr><td>EAGLE family</td><td>A light head trained on the target model's internal features</td><td>Strong speedups; needs a head trained for your exact model</td></tr>
<tr><td>MTP</td><td>Multi-token prediction layers built into some models</td><td>No separate model, where the base model supports it</td></tr>
<tr><td>N-gram / suffix</td><td>Copies likely continuations from the prompt or earlier output</td><td>No training; helps most when output repeats input</td></tr>
</tbody>
</table>
<p>The current vLLM documentation summarises it this way: model-based methods such as EAGLE, MTP and draft models give the best latency reduction, while n-gram and suffix decoding give modest speedups without adding much work during peak traffic<sup class="cite"><a href="#ref-3">3</a></sup>. The EAGLE-3 paper reports speedups of up to 6.5 times in its experiments and argues its design lets the draft head benefit from more training data<sup class="cite"><a href="#ref-2">2</a></sup>. The vLLM project also maintains a Speculators library for training draft models that run in vLLM<sup class="cite"><a href="#ref-4">4</a></sup>.</p>
</section>

<section class="block">
<h2>When it helps, and when it doesn't</h2>
<p>vLLM describes speculative decoding as aimed at reducing inter-token latency for memory-bound workloads at medium to low request rates<sup class="cite"><a href="#ref-3">3</a></sup>. That sentence is the whole story:</p>
<ul>
<li><strong>Interactive assistants with modest concurrency</strong>: good fit. Each user sees faster streaming.</li>
<li><strong>Code editing, document revision, extraction</strong>: often good for n-gram methods, because the output repeats large parts of the input.</li>
<li><strong>High-throughput batch jobs</strong>: weak fit. The GPU is already saturated, and verification work competes with real requests.</li>
<li><strong>Peak hours on shared clusters</strong>: gains can fall as load rises, which is why the cheaper methods appeal.</li>
</ul>
<p>Older vLLM releases also carried caveats, such as incompatibility with pipeline parallelism and inconsistent latency gains across datasets<sup class="cite"><a href="#ref-5">5</a></sup>. Check the documentation for your exact version rather than relying on a blog post's configuration.</p>
</section>

<section class="block">
<h2>How I'd evaluate it</h2>
<ol>
<li><strong>Replay real traffic</strong>, not a benchmark prompt set. Acceptance rate depends heavily on what your users ask and how your prompts are built.</li>
<li><strong>Measure the right latencies</strong>: time to first token, inter-token latency and end-to-end time, at your real concurrency, using the telemetry in <a href="https://asksumanta.com/insights/llm-observability-opentelemetry-genai/">LLM observability</a>.</li>
<li><strong>Track acceptance rate</strong> and tune the number of speculative tokens; low acceptance means wasted verification.</li>
<li><strong>Check outputs</strong> on your <a href="https://asksumanta.com/insights/llm-evaluation-sets-that-predict-production/">evaluation set</a> to confirm nothing changed that matters.</li>
<li><strong>Compare with alternatives.</strong> <a href="https://asksumanta.com/insights/prompt-caching-llm-cost-latency/">Prompt caching</a> and <a href="https://asksumanta.com/insights/llm-model-routing/">routing easy requests to smaller models</a> may deliver more for less effort.</li>
<li><strong>Decide per workload.</strong> Enable it for interactive endpoints and leave batch endpoints alone, using the serving patterns in <a href="https://asksumanta.com/insights/llm-inference-serving-vllm/">vLLM inference serving</a>.</li>
</ol>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design private LLM platforms that meet latency and cost targets on hardware you control, from model choice to serving configuration. See my <a href="https://asksumanta.com/ai-architect/">AI architecture work</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/speculative-decoding-private-llms/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Real-world evidence on OMOP: comparing five study designs for treatment effects</title><link>https://asksumanta.com/insights/real-world-evidence-study-designs-omop/</link><guid isPermaLink="true">https://asksumanta.com/insights/real-world-evidence-study-designs-omop/</guid><pubDate>Tue, 27 Oct 2026 12:20:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>healthcare</category><category>omop</category><category>data</category><description>Cohort method, self-controlled cohort, case-control, case-crossover and self-controlled case series compared: what each answers, its main bias, and how to choose.</description><content:encoded><![CDATA[<p><em>Asking &#x27;does this drug cause that outcome?&#x27; of observational data is easy. Getting an answer you can defend is not. The OHDSI community implements five main designs for population-level estimation, each with a different way of approximating what would have happened otherwise, and each with its own blind spots.</em></p><p>Pharma medical affairs, payers, health systems and regulators all want the same thing from real-world data: evidence about what treatments actually do outside trials. The data, mostly claims and electronic health records, is plentiful. The hard part is design. Every observational study is an attempt to estimate a counterfactual, what would have happened to these patients without the exposure or with a different one, from data that only records what did happen<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<p>The OHDSI community implements five main designs for this as open-source R packages in its Methods Library, all running on OMOP data<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-3">3</a></sup>. Knowing what each one assumes is the difference between evidence and a confident-looking chart.</p>

<section class="block">
<h2>The five designs at a glance</h2>
<table class="tbl">
<thead><tr><th>Design</th><th>Compares</th><th>Main strength</th><th>Main vulnerability</th></tr></thead>
<tbody>
<tr><td>Cohort method (new user)</td><td>New users of target vs new users of comparator</td><td>Emulates a trial; rich diagnostics</td><td>Unmeasured confounding between groups</td></tr>
<tr><td>Self-controlled cohort</td><td>Exposed time vs time just before exposure</td><td>No between-person confounding</td><td>Baseline risk differing between periods</td></tr>
<tr><td>Case-control</td><td>Exposure in people with vs without the outcome</td><td>Efficient for rare outcomes</td><td>Choice of controls</td></tr>
<tr><td>Case-crossover</td><td>Exposure at outcome time vs an earlier control time</td><td>Cases are their own controls</td><td>Trends in exposure over time</td></tr>
<tr><td>Self-controlled case series</td><td>Outcome rate in exposed vs all unexposed time</td><td>No between-person confounding</td><td>Time-varying confounding; outcomes that end observation</td></tr>
</tbody>
</table>
<p>All rows are drawn from the descriptions in The Book of OHDSI<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
</section>

<section class="block">
<h2>Cohort method: emulating a trial</h2>
<p>The new-user cohort design compares people who start the target treatment with people who start a comparator, and follows them for a defined time-at-risk. It is defined by five choices: target cohort, comparator cohort, outcome cohort, time-at-risk and model<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<figure class="fig"><div class="im"><img src="https://asksumanta.com/assets/img/real-world-evidence-study-designs-omop/cohortMethod.webp" alt="Timeline diagram of the new-user cohort design: two subjects starting the target treatment and two starting the comparator, each with a covariate capture window before treatment start, an adjustment strategy between groups, and outcomes marked during treatment" width="1600" height="558" loading="lazy"></div><figcaption>The new-user cohort design: characteristics are captured before treatment start and used to adjust for differences between groups. <span class="credit">Source: <a href="https://ohdsi.github.io/TheBookOfOhdsi/PopulationLevelEstimation.html" target="_blank" rel="noopener">The Book of OHDSI, Population-Level Estimation</a> · CC0 1.0</span></figcaption></figure>
<p>The central problem is that patients on different treatments differ. OHDSI's preferred adjustment is a propensity score fitted with large-scale regularised regression over many generic characteristics, typically 10,000 to 100,000 of them, rather than a hand-picked list<sup class="cite"><a href="#ref-1">1</a></sup>. The design comes with diagnostics: preference score distributions to check the groups overlap, and covariate balance after adjustment, where some guidelines recommend standardised differences below 0.1<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-4">4</a></sup>.</p>
<p>The book is clear that this is inherently a comparative design. Comparing a treatment with no treatment is hard because a comparable unexposed group is difficult to define; an active comparator for the same indication is preferred<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
</section>

<section class="block">
<h2>Self-controlled designs: people as their own controls</h2>
<p>Three designs avoid between-person comparison altogether. The <strong>self-controlled cohort</strong> compares outcome rates during exposure with the time just before. The <strong>case-crossover</strong> design asks whether exposure was more common just before the outcome than at an earlier control time; because the outcome always comes later, it can be biased by exposure trends, which the case-time-control variant addresses. The <strong>self-controlled case series</strong> compares the outcome rate during exposed time with all unexposed time, before, between and after exposures<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<figure class="fig"><div class="im"><img src="https://asksumanta.com/assets/img/real-world-evidence-study-designs-omop/selfControlledCaseSeries.webp" alt="Timeline diagram of the self-controlled case series design: three subjects with alternating unexposed and target exposure periods, with outcomes marked in both exposed and unexposed time" width="1600" height="365" loading="lazy"></div><figcaption>The self-controlled case series: outcome rates during exposure are compared with all unexposed time in the same people. <span class="credit">Source: <a href="https://ohdsi.github.io/TheBookOfOhdsi/PopulationLevelEstimation.html" target="_blank" rel="noopener">The Book of OHDSI, Population-Level Estimation</a> · CC0 1.0</span></figcaption></figure>
<p>These designs are robust to confounding by stable characteristics such as genetics or chronic conditions, but vulnerable to things that change over time, such as age, season or disease progression<sup class="cite"><a href="#ref-1">1</a></sup>. The self-controlled case series also assumes the end of observation is independent of the outcome, which can fail for fatal outcomes such as stroke; an extension exists to correct for that<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-5">5</a></sup>.</p>
<div class="callout"><p>No design is assumption-free. Choose the one whose weaknesses matter least for your question, then test it on questions where you already know the answer.</p></div>
</section>

<section class="block">
<h2>Case-control: efficient, but fragile</h2>
<p>Case-control studies compare exposure in people with the outcome against people without it, often matching on age and sex and sometimes nesting within a subgroup such as patients with the relevant indication<sup class="cite"><a href="#ref-1">1</a></sup>. They are efficient for rare outcomes, but results depend heavily on how controls are selected.</p>
</section>

<section class="block">
<h2>How I'd choose and validate</h2>
<ol>
<li><strong>Write the question precisely</strong> as cohorts and time windows, as in <a href="https://asksumanta.com/insights/omop-cohort-definitions/">OMOP cohort definitions</a>.</li>
<li><strong>Default to the new-user cohort design with an active comparator</strong> for comparative effectiveness, because its diagnostics make problems visible.</li>
<li><strong>Use self-controlled designs for acute outcomes after transient exposures</strong>, such as vaccine or short-course drug safety, where timing is sharp.</li>
<li><strong>Run negative controls.</strong> Outcomes believed not to be caused by the exposure reveal residual bias; the book's method validity chapter covers this and empirical calibration<sup class="cite"><a href="#ref-2">2</a></sup>.</li>
<li><strong>Replicate across databases</strong> through the <a href="https://asksumanta.com/insights/federated-health-analytics-ohdsi/">federated network approach</a>, after <a href="https://asksumanta.com/insights/omop-data-quality-checks/">data quality checks</a> at each site.</li>
<li><strong>Keep estimation and prediction separate.</strong> Causal questions and <a href="https://asksumanta.com/insights/clinical-prediction-models-omop/">prediction models</a> need different designs and different validation.</li>
</ol>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design OMOP platforms and analytics pipelines that make real-world evidence studies reproducible, diagnosable and fast to run across sites. See <a href="https://asksumanta.com/healthcare-data-architecture/">healthcare data architecture</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/real-world-evidence-study-designs-omop/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Fine-tuning a foundation model? When the EU AI Act makes you a general-purpose AI provider</title><link>https://asksumanta.com/insights/eu-ai-act-gpai-fine-tuning-provider/</link><guid isPermaLink="true">https://asksumanta.com/insights/eu-ai-act-gpai-fine-tuning-provider/</guid><pubDate>Tue, 27 Oct 2026 08:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>regulation</category><category>ai</category><category>governance</category><description>EU AI Act rules for general-purpose AI models now have enforcement behind them. When fine-tuning makes you a GPAI provider, what the Code of Practice asks, and what to document.</description><content:encoded><![CDATA[<p><em>Most companies building on foundation models assume the EU&#x27;s general-purpose AI rules are for the labs. Usually they are. But the Commission&#x27;s guidelines draw a line where heavy modification turns a downstream builder into a provider, and since August 2026 the AI Office can enforce those rules.</em></p><p>Picture a scale-up that takes an open-weight model, continues pre-training it on a large domain corpus, fine-tunes it further and offers it to customers across Europe. Is it a deployer of someone else's model, or the provider of a new general-purpose AI model? Under the EU AI Act the answer changes the paperwork considerably, and it now carries enforcement risk.</p>
<p>This is an architect's reading of public guidance and law firm commentary, not legal advice.</p>

<section class="block">
<h2>Where things stand</h2>
<p>The AI Act's obligations for providers of general-purpose AI models have applied since 2 August 2025. The Commission said the AI Office was preparing its compliance assessments ahead of enforcement of those rules from August 2026<sup class="cite"><a href="#ref-2">2</a></sup>. A Cloud Security Alliance research note published on 3 August 2026 summarised the AI Office's powers as including requests for documentation, model evaluations, corrective measures and fines<sup class="cite"><a href="#ref-7">7</a></sup>.</p>
<p>Alongside the law sit two practical instruments. The <strong>GPAI Code of Practice</strong>, published on 10 July 2025, has three chapters: transparency, copyright, and safety and security. The first two give all GPAI providers a way to demonstrate compliance with Article 53; the third applies only to providers of models with systemic risk under Article 55<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-6">6</a></sup>. The transparency chapter includes a Model Documentation Form<sup class="cite"><a href="#ref-1">1</a></sup>. The Commission also finalised a template for the public summary of training data<sup class="cite"><a href="#ref-5">5</a></sup>.</p>
</section>

<section class="block">
<h2>The line between deployer and provider</h2>
<p>The Commission's guidelines on GPAI providers address downstream modification directly. As summarised by commentators<sup class="cite"><a href="#ref-3">3</a></sup><sup class="cite"><a href="#ref-4">4</a></sup>:</p>
<ul>
<li>An indicative criterion is whether the <strong>training compute used for the modification exceeds one third</strong> of the compute used to train the original model.</li>
<li>If the original compute isn't known, one third of the threshold for presuming a model is general-purpose is used instead.</li>
<li><strong>Minor changes</strong> typically don't make you a provider.</li>
<li>If you do become a provider, your obligations generally concern <strong>the modification</strong>: documentation, training data summary and copyright policy covering the additional compute and data. Modifying a model with systemic risk brings the full systemic-risk obligations.</li>
</ul>
<table class="tbl">
<thead><tr><th>What you do</th><th>Likely position</th></tr></thead>
<tbody>
<tr><td>Prompting, RAG, tool use, agents on a hosted model</td><td>Not modifying the model</td></tr>
<tr><td>Light fine-tuning or adapters on modest data</td><td>Typically a minor change</td></tr>
<tr><td>Large continued pre-training or extensive fine-tuning</td><td>Check the compute ratio carefully</td></tr>
<tr><td>Modifying a model already classed as systemic-risk</td><td>Get specific legal advice early</td></tr>
</tbody>
</table>
<div class="callout"><p>Most teams are nowhere near the line. The ones that are usually know it, because they are spending serious money on GPUs. That spend should come with a compliance budget.</p></div>
</section>

<section class="block">
<h2>Why this matters even if you are well below it</h2>
<p>First, customers ask. In enterprise procurement, "we use RAG, not fine-tuning" is a much easier answer with evidence behind it. Second, upstream providers' documentation flows down to you: the Model Documentation Form exists partly so downstream providers can understand the models they build on<sup class="cite"><a href="#ref-1">1</a></sup>. Third, the same records support obligations that apply to your AI systems regardless of the model rules, such as the literacy duty in <a href="https://asksumanta.com/insights/eu-ai-act-ai-literacy-article-4/">Article 4</a> and the timeline in <a href="https://asksumanta.com/insights/eu-ai-act-digital-omnibus-roadmap/">the Digital Omnibus roadmap</a>.</p>
</section>

<section class="block">
<h2>What I'd put in place</h2>
<ol>
<li><strong>Log training compute for every model you train or tune</strong>, with the method used to estimate it. It's cheap to capture at the time and very hard to reconstruct later.</li>
<li><strong>Keep a model lineage record</strong>: base model and version, upstream documentation received, datasets, licences and changes. The supply chain practices in <a href="https://asksumanta.com/insights/ai-model-supply-chain-security/">AI model supply chain security</a> overlap heavily.</li>
<li><strong>Document data provenance and copyright handling</strong> for any data you train on, including how rights reservations are respected.</li>
<li><strong>Prefer adaptation over retraining</strong> where it meets the need. RAG and lighter tuning are usually cheaper as well as simpler to govern; see <a href="https://asksumanta.com/insights/long-context-vs-rag/">long context vs RAG</a>.</li>
<li><strong>Map once, reuse often.</strong> Tie these records into a framework such as <a href="https://asksumanta.com/insights/iso-42001-vs-nist-ai-rmf/">ISO 42001</a> so the same evidence serves EU, US and Gulf requirements.</li>
</ol>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I help AI companies design training and deployment pipelines that produce compliance evidence as a by-product. As a <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a> I can own that work. Or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/eu-ai-act-gpai-fine-tuning-provider/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Kafka queues are production-ready: when share groups can replace a separate message broker</title><link>https://asksumanta.com/insights/kafka-queues-share-groups/</link><guid isPermaLink="true">https://asksumanta.com/insights/kafka-queues-share-groups/</guid><pubDate>Tue, 27 Oct 2026 04:20:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>data</category><category>streaming</category><category>architecture</category><category>platform</category><description>Apache Kafka 4.2 made queues (share groups) production-ready. How they differ from consumer groups, which workloads they fit, and when a separate message broker still makes sense.</description><content:encoded><![CDATA[<p><em>Many platforms run Kafka for event streams and a second system for work queues, because Kafka&#x27;s consumer groups tie each partition to one consumer. Kafka 4.2 made share groups, its queue semantics, production-ready. For some teams, that means one less system to run.</em></p><p>A familiar architecture: Kafka carries business events between services and into the lakehouse, while RabbitMQ, SQS or a database-backed job table handles background work such as sending emails, generating documents or calling a model. Two systems, two sets of operational skills, two places where messages can get stuck. The reason was structural. Kafka's consumer groups assign each partition to exactly one consumer, so you cannot scale workers beyond the partition count, and one slow message holds up everything behind it.</p>

<section class="block">
<h2>What changed</h2>
<p>KIP-932, "Queues for Kafka", introduced share groups. Kafka 4.0, the first release to run only in KRaft mode without ZooKeeper, offered them as early access<sup class="cite"><a href="#ref-4">4</a></sup><sup class="cite"><a href="#ref-5">5</a></sup>. The 4.2.0 release announcement describes Kafka Queues as production-ready, adding a RENEW acknowledgement type, adaptive batching in the share coordinator, limits on fetched record counts, and lag metrics<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-3">3</a></sup>.</p>
</section>

<section class="block">
<h2>Consumer groups versus share groups</h2>
<p>The Kafka documentation describes share groups as an alternative to consumer groups: consumers share a topic's records without each partition being tied to one consumer, records are acknowledged individually, and delivery attempts are counted. It suggests them for workloads that process records one at a time rather than as an ordered stream<sup class="cite"><a href="#ref-2">2</a></sup>.</p>
<table class="tbl">
<thead><tr><th></th><th>Consumer group</th><th>Share group</th></tr></thead>
<tbody>
<tr><td>Assignment</td><td>Each partition to one consumer</td><td>Records shared across consumers</td></tr>
<tr><td>Scaling limit</td><td>Number of partitions</td><td>Not tied to partition count</td></tr>
<tr><td>Progress tracking</td><td>Offset per partition</td><td>Acknowledgement per record</td></tr>
<tr><td>Retries</td><td>Built by the application</td><td>Delivery attempts counted by Kafka</td></tr>
<tr><td>Ordering</td><td>Preserved within a partition</td><td>Not the design goal</td></tr>
<tr><td>Best for</td><td>Event streams, CDC, aggregations</td><td>Independent tasks: jobs, notifications, AI calls</td></tr>
</tbody>
</table>
<div class="callout"><p>If the order of records matters, use a consumer group. If each record is an independent piece of work, a share group is now a real option.</p></div>
</section>

<section class="block">
<h2>Where it fits well</h2>
<ul>
<li><strong>AI and enrichment workloads.</strong> Calling a model for each document or record is slow and variable. Share groups let you add workers to match throughput without repartitioning, and a slow call doesn't block the rest.</li>
<li><strong>Fan-out jobs from existing events.</strong> If the events already land in Kafka, for example from <a href="https://asksumanta.com/insights/change-data-capture-event-streams/">change data capture</a>, processing them as tasks without copying them to another broker removes a hop.</li>
<li><strong>Bursty background work</strong>, where worker count needs to swing widely during the day, combined with autoscaling like that in <a href="https://asksumanta.com/insights/kubernetes-finops-scale-to-zero/">Kubernetes scale-to-zero</a>.</li>
</ul>
</section>

<section class="block">
<h2>Where a separate broker still wins</h2>
<ul>
<li><strong>No Kafka today.</strong> Adopting Kafka just for a work queue is rarely worth it. A managed queue is simpler.</li>
<li><strong>Complex routing.</strong> Topic exchanges, header-based routing and per-message priorities remain stronger in dedicated brokers.</li>
<li><strong>Strict ordering with parallelism.</strong> If you need per-key order and parallel processing, keyed consumer groups remain the right model.</li>
<li><strong>Small clusters.</strong> Share groups store state in an internal topic that defaults to three replicas, so clusters with fewer than three brokers must adjust internal replication settings first<sup class="cite"><a href="#ref-2">2</a></sup>.</li>
</ul>
</section>

<section class="block">
<h2>How I'd adopt it</h2>
<ol>
<li><strong>Get to a current release.</strong> Share groups need KRaft-based Kafka 4.x; plan the ZooKeeper migration first if you haven't<sup class="cite"><a href="#ref-5">5</a></sup>. Run the latest 4.2 patch release rather than 4.2.0.</li>
<li><strong>Pick one queue workload</strong> that already consumes from Kafka and has idempotent processing, using the patterns in <a href="https://asksumanta.com/insights/idempotent-payments-order-pipelines/">idempotent pipelines</a>. Per-record acknowledgement still means at-least-once delivery.</li>
<li><strong>Decide what happens after the last attempt.</strong> Route repeatedly failing records somewhere a person will see them.</li>
<li><strong>Monitor share-group lag</strong> with the new metrics and alert on it, as you would queue depth<sup class="cite"><a href="#ref-1">1</a></sup>.</li>
<li><strong>Check your managed service.</strong> Hosted Kafka offerings adopt new features and metrics at different speeds.</li>
<li><strong>Retire the old queue only after a full cycle</strong> of peak load and incident handling on the new one.</li>
</ol>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design event and data platforms that stay simple as they scale, including when to consolidate systems and when not to. As a <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a> I can own that architecture. Or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/kafka-queues-share-groups/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Running an enterprise MCP registry: a playbook for governed tool discovery</title><link>https://asksumanta.com/insights/mcp-registry-enterprise-subregistry/</link><guid isPermaLink="true">https://asksumanta.com/insights/mcp-registry-enterprise-subregistry/</guid><pubDate>Tue, 27 Oct 2026 00:20:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>ai</category><category>mcp</category><category>agents</category><category>governance</category><description>The official MCP Registry is designed to feed subregistries. A playbook for running a private enterprise MCP registry: curation, namespaces, approvals and client rollout.</description><content:encoded><![CDATA[<p><em>Once a few teams adopt MCP, the question shifts from &#x27;how do I build a server?&#x27; to &#x27;which servers are we allowed to use?&#x27;. The MCP Registry was designed with that in mind: a public upstream that organisations can mirror, filter and extend with their own private servers.</em></p><p>A typical enterprise MCP adoption follows a pattern. A few engineers connect assistants to useful servers. A platform team builds internal servers for the CRM, the data warehouse and the ticketing system. Within months there are dozens of servers, nobody knows which are approved, and security finds a community server with broad file system access on a developer laptop. The fix is not to ban MCP. It is to give people a catalogue of servers they're allowed to use.</p>

<section class="block">
<h2>How the MCP Registry is designed</h2>
<p>The official MCP Registry launched in preview in September 2025 as an open catalogue of publicly available servers<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-4">4</a></sup>. Three design choices matter for enterprises:</p>
<ul>
<li><strong>Metadata, not code.</strong> Entries describe servers and point to packages in existing registries such as npm, PyPI and Docker Hub<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-2">2</a></sup>.</li>
<li><strong>Verified namespaces.</strong> Server names use a reverse-DNS format, such as <code>io.github.username/server</code> or <code>com.example/server</code>, tied to a verified GitHub account or domain<sup class="cite"><a href="#ref-2">2</a></sup>. That gives you a basis for trusting who published what.</li>
<li><strong>Built to be extended.</strong> The registry and its API specification are open source, so others can build compatible subregistries that pull from it, filter it and add their own servers<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-3">3</a></sup>.</li>
</ul>
<figure class="fig"><div class="im"><img src="https://asksumanta.com/assets/img/mcp-registry-enterprise-subregistry/ecosystem.webp" alt="Diagram of the MCP registry ecosystem: server developers publish to the official MCP Registry, which references packages on npm, PyPI and Docker; public subregistries pull its data, an enterprise registry adds private internal servers, and clients such as IDEs and chat assistants consume from these registries" width="1600" height="1040" loading="lazy"></div><figcaption>The intended ecosystem: an official upstream, subregistries that build on it, and an enterprise registry that adds private servers. <span class="credit">Source: <a href="https://modelcontextprotocol.io/registry/about" target="_blank" rel="noopener">Model Context Protocol documentation</a> · CC BY 4.0</span></figcaption></figure>
<p>The registry remains in preview, and its documentation warns that breaking changes or data resets may occur before general availability<sup class="cite"><a href="#ref-2">2</a></sup>. Build against it, but pin and mirror what you depend on.</p>
</section>

<section class="block">
<h2>The playbook</h2>
<h3>1. Decide what "approved" means</h3>
<p>Write down the criteria before choosing tools: publisher verified, source available, package signed or pinned, permissions documented, data classification of what it touches, and an internal owner. The controls in <a href="https://asksumanta.com/insights/securing-mcp-servers-checklist/">securing MCP servers</a> make a good starting checklist.</p>

<h3>2. Stand up a private subregistry</h3>
<p>Run a registry that implements the same API, so clients that understand the official registry can use yours<sup class="cite"><a href="#ref-3">3</a></sup><sup class="cite"><a href="#ref-5">5</a></sup>. Servers on internal hostnames or private package feeds belong here, not in the public registry<sup class="cite"><a href="#ref-2">2</a></sup>.</p>

<h3>3. Mirror, don't proxy</h3>
<p>Pull public entries into a staging area, review them, then promote approved versions. Pin to specific package versions so an upstream update can't change what your users run without review. This is the same discipline as <a href="https://asksumanta.com/insights/ai-model-supply-chain-security/">AI supply chain security</a>.</p>

<h3>4. Enrich entries with your context</h3>
<p>Add what the public registry can't know: owner, data classification, allowed user groups, required auth extension, and a link to the review record. Tool annotations and UI capabilities, covered in <a href="https://asksumanta.com/insights/mcp-apps-tool-annotations/">MCP Apps and tool annotations</a>, should be part of the review.</p>

<h3>5. Point clients at it</h3>
<p>Configure managed IDEs and assistants to discover servers from your registry, and where clients support it, block unapproved sources. A catalogue nobody is pointed at is just documentation.</p>

<h3>6. Tie it to identity</h3>
<p>Approval should map to who can use a server. Pair the registry with the enterprise authorisation patterns in <a href="https://asksumanta.com/insights/mcp-extensions-enterprise-strategy/">MCP extensions</a>, so access is granted through your identity provider rather than per-server credentials.</p>

<h3>7. Measure and prune</h3>
<p>Track which servers are used, by whom and how often, using the telemetry approach in <a href="https://asksumanta.com/insights/llm-observability-opentelemetry-genai/">LLM observability</a>. Retire servers without owners or usage, and re-review on major version changes.</p>
<div class="callout"><p>A registry turns MCP from a collection of personal integrations into a platform. The governance lives in the promotion step, not the protocol.</p></div>
</section>

<section class="block">
<h2>Common mistakes</h2>
<ul>
<li><strong>Treating the public registry as an allow-list.</strong> Listing proves a verified namespace, not safety.</li>
<li><strong>Floating versions.</strong> "Latest" from upstream means unreviewed code on every laptop.</li>
<li><strong>No owner per server.</strong> Internal servers without owners become the next unpatched dependency.</li>
<li><strong>Registry without enforcement.</strong> If clients can still add any server, the registry is advisory only.</li>
</ul>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design enterprise agent platforms, including MCP registries, approval workflows and identity integration, so teams can adopt tools quickly and safely. See my <a href="https://asksumanta.com/ai-architect/">AI architecture work</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/mcp-registry-enterprise-subregistry/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>The UAE&#x27;s new Federal Authority for AI and Data: what it means for technology teams</title><link>https://asksumanta.com/insights/uae-federal-authority-ai-data/</link><guid isPermaLink="true">https://asksumanta.com/insights/uae-federal-authority-ai-data/</guid><pubDate>Mon, 26 Oct 2026 20:20:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>uae</category><category>regulation</category><category>ai</category><category>governance</category><description>The UAE has merged its AI office, digital government and data office into one federal authority. What has been announced, what is still unknown, and how I&#x27;d prepare.</description><content:encoded><![CDATA[<p><em>In June 2026 the UAE created a single federal body for AI, data governance and digital government. This week Dubai set new targets for its AI campus. For companies building or selling AI in the Emirates, the institutional map is consolidating, and that changes who sets the standards you&#x27;ll be measured against.</em></p><p>For years, AI and data policy in the UAE was spread across several bodies: an AI office within the federal government, the digital government function inside the telecoms regulator, a data office, and emirate-level and free zone authorities alongside them. Teams working here learned to ask "which regulator?" before "which rule?". That is starting to change.</p>
<p>This is an architect's reading of public announcements and law firm commentary, not legal advice.</p>

<section class="block">
<h2>What was announced</h2>
<p>In June 2026 the UAE approved the establishment of the Federal Authority for Artificial Intelligence and Data, reporting to the Cabinet, as a unified national body for data governance, artificial intelligence and digital government<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-2">2</a></sup>. Commentary reports that it brings together three existing functions<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-3">3</a></sup>:</p>
<table class="tbl">
<thead><tr><th>Previous body</th><th>What it covered</th></tr></thead>
<tbody>
<tr><td>Artificial Intelligence Office</td><td>National AI strategy and programmes</td></tr>
<tr><td>TDRA Information and Digital Government Sector</td><td>Federal digital government services and standards</td></tr>
<tr><td>Emirates Data Office</td><td>National data governance</td></tr>
</tbody>
</table>
<p>The mandate described in commentary covers the national AI strategy, government data governance, and standards and compliance across federal entities<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-3">3</a></sup>. By October, reporting on the UAE's AI programme was already framing the authority as the body bringing national data, AI and digital government systems together<sup class="cite"><a href="#ref-6">6</a></sup>.</p>
</section>

<section class="block">
<h2>This week: Dubai's AI campus targets</h2>
<p>On 26 October, during the Dubai AI Festival, Dubai approved new targets for its AI campus: more than 1,000 AI companies and over 5,000 specialised jobs by 2030<sup class="cite"><a href="#ref-4">4</a></sup><sup class="cite"><a href="#ref-5">5</a></sup>. Together with federal consolidation, the direction is clear: one national voice on AI and data standards, and emirate-level competition to host the companies building on them.</p>
<div class="callout"><p>Consolidation usually means fewer, clearer standards, applied more consistently. Teams that have been relying on ambiguity should plan for less of it.</p></div>
</section>

<section class="block">
<h2>What we don't know yet</h2>
<ul>
<li><strong>Private sector reach.</strong> The described mandate centres on federal entities. How far its standards will extend to private companies, directly or through procurement, is not yet clear.</li>
<li><strong>Interaction with free zones.</strong> DIFC and ADGM have their own data protection regimes, including <a href="https://asksumanta.com/insights/difc-regulation-10-ai-systems/">DIFC Regulation 10 on AI systems</a>. How federal AI standards will sit alongside them remains to be seen.</li>
<li><strong>Data protection supervision.</strong> The federal <a href="https://asksumanta.com/insights/uae-pdpl-ai-architecture-2026/">PDPL</a> continues to apply. Which body leads on its AI-related aspects will become clearer through guidance.</li>
<li><strong>Health data.</strong> Sector rules, such as those in <a href="https://asksumanta.com/insights/uae-health-data-law-localisation/">the UAE health data law</a>, remain in place.</li>
</ul>
</section>

<section class="block">
<h2>The regional pattern</h2>
<p>Saudi Arabia went down this path earlier, with the Saudi Data and Artificial Intelligence Authority as a single body for data and AI<sup class="cite"><a href="#ref-7">7</a></sup>, alongside its own data protection law covered in <a href="https://asksumanta.com/insights/saudi-pdpl-cross-border-ai/">Saudi PDPL and cross-border AI</a>. A combined data and AI authority tends to treat data governance and AI governance as one discipline. Architecturally, that's right: most AI risk is data risk.</p>
</section>

<section class="block">
<h2>How I'd prepare</h2>
<ol>
<li><strong>Map your current obligations</strong> by entity and location: federal PDPL, free zone regimes, sector rules, and where your models and data actually run, as discussed in <a href="https://asksumanta.com/insights/uae-ai-infrastructure-where-to-run-models/">UAE AI infrastructure</a>.</li>
<li><strong>Build governance on a recognised framework</strong>, such as <a href="https://asksumanta.com/insights/iso-42001-vs-nist-ai-rmf/">ISO 42001 or the NIST AI RMF</a>, so national standards become a mapping exercise.</li>
<li><strong>If you sell to government</strong>, expect federal data and AI standards to appear in procurement first. Keep an AI system inventory and data lineage ready to evidence.</li>
<li><strong>Unify data and AI governance internally.</strong> If the regulator treats them as one discipline, a separate AI committee disconnected from data owners will struggle.</li>
<li><strong>Watch for guidance</strong> from the new authority and plan a quarterly review of your mapping.</li>
</ol>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I help companies in the UAE and the US build AI platforms with governance that maps cleanly across regimes. As a <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a> I can own that work. Or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/uae-federal-authority-ai-data/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>SKOS or OWL? Choosing the right model for enterprise taxonomies and ontologies</title><link>https://asksumanta.com/insights/skos-vs-owl-enterprise-taxonomies/</link><guid isPermaLink="true">https://asksumanta.com/insights/skos-vs-owl-enterprise-taxonomies/</guid><pubDate>Mon, 26 Oct 2026 16:30:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>ontology</category><category>knowledge-graph</category><category>data</category><category>architecture</category><description>SKOS and OWL are both W3C standards for knowledge models, and they solve different problems. When to use each, how to combine them, and the most common enterprise mistake.</description><content:encoded><![CDATA[<p><em>Enterprise ontology programmes often stall on a modelling question disguised as a tooling one: should the product taxonomy, the risk register or the clinical code list be an OWL ontology or a SKOS vocabulary? The answer is usually both, for different jobs.</em></p><p>Every organisation already has knowledge models. They're in spreadsheets of product categories, SharePoint term stores, code lists in the data warehouse and the folder structure of the document system. When an ontology or knowledge graph programme starts, one of the first decisions is how to represent these formally. Two W3C standards dominate the conversation, and choosing the wrong one for a given job is a common reason programmes lose a year.</p>

<section class="block">
<h2>Two standards, two purposes</h2>
<p><strong>SKOS</strong>, the Simple Knowledge Organization System, became a W3C Recommendation in 2009. It is a common data model for sharing and linking knowledge organisation systems, such as thesauri, taxonomies and classification schemes, on the web<sup class="cite"><a href="#ref-1">1</a></sup>. Its world is concepts, labels and loose relations between them.</p>
<p><strong>OWL 2</strong>, the Web Ontology Language, defines classes, properties and logical axioms that reasoners can use to infer new facts and detect contradictions. Its profiles, finalised in their second edition in 2012, trade expressiveness for tractable reasoning<sup class="cite"><a href="#ref-3">3</a></sup>.</p>
<p>The SKOS designers were explicit that SKOS was not meant to compete with OWL but to complement it, offering a path to bring existing knowledge that doesn't map easily into an OWL ontology onto the semantic web<sup class="cite"><a href="#ref-5">5</a></sup>.</p>
</section>

<section class="block">
<h2>Side by side</h2>
<table class="tbl">
<thead><tr><th></th><th>SKOS</th><th>OWL 2</th></tr></thead>
<tbody>
<tr><td>Core unit</td><td>Concept with labels</td><td>Class, property, individual</td></tr>
<tr><td>Hierarchy</td><td><code>skos:broader</code>: "is filed under", for navigation and retrieval</td><td><code>rdfs:subClassOf</code>: "every X is a Y", logical subsumption</td></tr>
<tr><td>Labels</td><td>First-class: preferred, alternative and hidden labels, with at most one preferred label per language<sup class="cite"><a href="#ref-1">1</a></sup></td><td>Annotations, not part of the logic</td></tr>
<tr><td>Reasoning</td><td>Light; little to infer</td><td>Rich, with profiles tuned for scale<sup class="cite"><a href="#ref-3">3</a></sup></td></tr>
<tr><td>Cross-scheme links</td><td>Mapping properties such as exact, close and broader matches<sup class="cite"><a href="#ref-1">1</a></sup></td><td>Equivalence and subclass axioms with logical consequences</td></tr>
<tr><td>Who maintains it</td><td>Taxonomists, subject experts, business owners</td><td>Ontologists and data architects</td></tr>
<tr><td>Best for</td><td>Product categories, subject tags, code lists, synonyms for search</td><td>Domain models, constraints, integration semantics</td></tr>
</tbody>
</table>
</section>

<section class="block">
<h2>The mistake that matters most</h2>
<p>The most expensive error is treating a taxonomy hierarchy as a class hierarchy. In a product catalogue, "Garden furniture" sits under "Outdoor" and also under "Furniture". That is a filing decision, not a claim that every garden chair is, logically, an instance of "Outdoor".</p>
<p>SKOS is careful here. <code>skos:broader</code> is used only for direct hierarchical links and is not declared transitive; <code>skos:broaderTransitive</code> is a separate superproperty for inferring indirect links<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-2">2</a></sup>. Converting the same hierarchy into <code>rdfs:subClassOf</code> makes every relation logically binding, and a reasoner will happily draw conclusions nobody intended.</p>
<div class="callout"><p>If the business owner would say "it's filed under", use SKOS. If they would say "it is always a kind of", consider OWL. Most enterprise hierarchies are the first.</p></div>
</section>

<section class="block">
<h2>Choosing OWL profiles when you do need logic</h2>
<p>Where OWL is the right tool, its profiles help match reasoning to scale<sup class="cite"><a href="#ref-3">3</a></sup><sup class="cite"><a href="#ref-4">4</a></sup>:</p>
<ul>
<li><strong>OWL 2 EL</strong> suits ontologies with very large numbers of classes and properties, with polynomial-time reasoning for core tasks. Large biomedical terminologies are the classic fit.</li>
<li><strong>OWL 2 QL</strong> targets large volumes of instance data queried through relational databases, which suits virtual knowledge graphs over existing warehouses.</li>
<li><strong>OWL 2 RL</strong> supports rule-based reasoning that works directly on RDF triples, practical inside many triple stores.</li>
</ul>
<p>Choosing a profile early prevents a common failure: a model that is logically elegant and unusable at production volume.</p>
</section>

<section class="block">
<h2>The combined pattern I use</h2>
<ol>
<li><strong>A small OWL core</strong> for the domain: customer, product, contract, patient, asset, and the relations between them. Keep it in a tractable profile.</li>
<li><strong>SKOS vocabularies for classification</strong>: product categories, risk types, diagnosis groupings, document subjects. Instances in the core point to concepts through ordinary properties, such as "has category".</li>
<li><strong>Mappings between vocabularies</strong> using SKOS mapping properties, so a local code list can align with an industry standard without pretending they are identical.</li>
<li><strong>SHACL for data quality</strong>, as described in <a href="https://asksumanta.com/insights/shacl-validation-knowledge-graphs/">SHACL validation</a>, because closed-world checks belong outside the open-world logic of OWL.</li>
<li><strong>Labels feed search and AI.</strong> SKOS alternative and hidden labels give retrieval and <a href="https://asksumanta.com/insights/graphrag-when-it-beats-vector-rag/">GraphRAG</a> the synonyms and misspellings users actually type.</li>
</ol>
<p>This also clarifies ownership. Business teams can maintain vocabularies in a taxonomy tool without touching the ontology, while architects govern the core. How these pieces relate to a semantic layer is covered in <a href="https://asksumanta.com/insights/ontology-vs-knowledge-graph-vs-semantic-layer/">ontology vs knowledge graph vs semantic layer</a>, and how clinical vocabularies are handled in practice in <a href="https://asksumanta.com/insights/clinical-terminologies-omop-vocabularies/">clinical terminologies in OMOP</a>.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design ontology and knowledge graph programmes that start with the models an organisation already has, and choose the lightest formalism that does the job. See <a href="https://asksumanta.com/ontology-knowledge-graph/">ontology and knowledge graphs</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/skos-vs-owl-enterprise-taxonomies/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>SMART on FHIR for AI apps: an authorisation checklist for clinical data access</title><link>https://asksumanta.com/insights/smart-on-fhir-ai-apps-authorisation/</link><guid isPermaLink="true">https://asksumanta.com/insights/smart-on-fhir-ai-apps-authorisation/</guid><pubDate>Mon, 26 Oct 2026 12:20:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>healthcare</category><category>fhir</category><category>ai</category><category>security</category><description>AI apps that read EHR data need SMART on FHIR authorisation done properly. A checklist covering v2 granular scopes, PKCE, backend services and agent access to clinical data.</description><content:encoded><![CDATA[<p><em>Ambient scribes, chart summarisers and clinical agents all need to read and sometimes write EHR data. SMART on FHIR is how they should get that access. The hard questions in a health AI security review are usually about scopes, launch context and token handling, not the model.</em></p><p>A health AI product usually starts with a demo against a sandbox and a broad token. Then it meets a hospital's security review. The questions are rarely about the model. They are about which data the app can reach, on whose behalf, for how long, and how anyone would know if it reached further than it should.</p>
<p>SMART on FHIR answers most of those questions if it is used properly. This checklist is what I work through when designing or reviewing EHR access for AI applications.</p>

<section class="block">
<h2>Why it matters more for AI</h2>
<p>Traditional SMART apps show data to a clinician who is already authorised to see it. AI apps often do more: summarise a whole record, draft notes back into the chart, or run in the background across many patients. That widens both the data an app touches and the consequences of a misconfigured scope. In the US, HTI-1 also moved certified health IT from SMART v1 to the SMART App Launch 2.0 guide for the standardised patient and population API criterion, so v2 behaviour is now the baseline buyers expect<sup class="cite"><a href="#ref-6">6</a></sup>. The policy side is covered in <a href="https://asksumanta.com/insights/hti-1-to-hti-5-health-it-ai-rules/">HTI-1 to HTI-5</a>.</p>
</section>

<section class="block">
<h2>1. Scopes: ask for the least, precisely</h2>
<ul>
<li><strong>Use v2 scope syntax.</strong> Permissions are expressed as suffixes from c, r, u, d and s. <code>patient/Observation.rs</code> grants read and search on the patient's observations; <code>patient/Observation.cu</code> grants create and update<sup class="cite"><a href="#ref-1">1</a></sup>.</li>
<li><strong>Narrow with search parameters.</strong> v2 allows granular scopes such as Observation access limited to the vital-signs category<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-5">5</a></sup>. A sepsis model that only needs vitals and labs shouldn't hold a token for psychotherapy notes.</li>
<li><strong>Prefer <code>patient/</code> over <code>user/</code> and <code>system/</code></strong> wherever the use case is about one patient in context.</li>
<li><strong>Separate read and write.</strong> If the AI drafts notes, consider a distinct, reviewable write path rather than giving the summariser create rights.</li>
<li><strong>Check what the server actually supports.</strong> Servers advertise capabilities in their SMART configuration<sup class="cite"><a href="#ref-5">5</a></sup>; don't assume granular scopes are enforced everywhere.</li>
</ul>
</section>

<section class="block">
<h2>2. Launch and token handling</h2>
<ul>
<li><strong>PKCE with S256, always.</strong> The specification says all SMART apps shall support PKCE, servers shall support S256 and shall not support the plain method<sup class="cite"><a href="#ref-2">2</a></sup>.</li>
<li><strong>Use EHR launch for in-workflow AI</strong>, so the patient and encounter come from the EHR's launch context, not from parameters the app constructs<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-2">2</a></sup>.</li>
<li><strong>Request <code>openid fhirUser</code></strong> so every AI action can be attributed to an identified user<sup class="cite"><a href="#ref-2">2</a></sup>.</li>
<li><strong>Keep tokens out of the model.</strong> Access tokens belong in the integration layer, never in prompts, logs or tool arguments the model can see or echo.</li>
<li><strong>Be deliberate about offline access.</strong> Refresh tokens extend reach well beyond the clinician's session; request them only when the use case needs it.</li>
</ul>
<div class="callout"><p>The model should never hold a credential. It asks a tool for data; the tool holds the token, enforces scope and logs the call.</p></div>
</section>

<section class="block">
<h2>3. Background and population workloads</h2>
<ul>
<li><strong>Use SMART Backend Services</strong> for autonomous processing, such as overnight risk scoring or quality measures. It is designed for clients with pre-authorised scopes and no user in the loop<sup class="cite"><a href="#ref-3">3</a></sup>.</li>
<li><strong>Authenticate with asymmetric keys.</strong> <code>private_key_jwt</code> is the specification's preferred method because no shared secret crosses the wire; clients must support RS384 and ES384<sup class="cite"><a href="#ref-4">4</a></sup>.</li>
<li><strong>Rotate keys through a JWKS endpoint</strong>, and treat the private key with the same controls as any production secret.</li>
<li><strong>Use bulk export for volume</strong>, as in <a href="https://asksumanta.com/insights/fhir-bulk-data-export-pipelines/">FHIR bulk data pipelines</a>, rather than looping single-patient queries.</li>
</ul>
</section>

<section class="block">
<h2>4. Agents and tools</h2>
<ul>
<li><strong>One tool, one scope set.</strong> If an agent reaches FHIR through MCP servers, each server should hold the narrowest token for its job, with the controls in <a href="https://asksumanta.com/insights/securing-mcp-servers-checklist/">securing MCP servers</a>.</li>
<li><strong>Keep patient context fixed.</strong> An agent must not be able to switch patients by changing a tool argument; patient identity comes from the launch, not the prompt. This is a key defence against <a href="https://asksumanta.com/insights/prompt-injection-defence-for-agents/">prompt injection</a>.</li>
<li><strong>Human approval for writes.</strong> Drafted notes, orders or messages go to a clinician for review before they are committed, as in <a href="https://asksumanta.com/insights/ambient-ai-scribes-architecture/">ambient scribe architectures</a>.</li>
</ul>
</section>

<section class="block">
<h2>5. Evidence for the security review</h2>
<ul>
<li>A table of every scope requested, why, and which feature uses it.</li>
<li>Audit logs linking each FHIR call to user, patient, feature and model version.</li>
<li>Token lifetimes, refresh policy and revocation procedure.</li>
<li>Results of testing with a SMART conformance tool against the target servers.</li>
<li>A data flow showing exactly where PHI goes, including any model provider, mapped to <a href="https://asksumanta.com/insights/hipaa-security-rule-proposal-ai-platforms/">HIPAA Security Rule</a> controls.</li>
</ul>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design EHR integrations for AI products that pass hospital security reviews the first time, from scope design to agent tooling and audit. See <a href="https://asksumanta.com/healthcare-data-architecture/">healthcare data architecture</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/smart-on-fhir-ai-apps-authorisation/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>In-place Pod resize on Kubernetes: field notes for right-sizing without restarts</title><link>https://asksumanta.com/insights/kubernetes-in-place-pod-resize/</link><guid isPermaLink="true">https://asksumanta.com/insights/kubernetes-in-place-pod-resize/</guid><pubDate>Mon, 26 Oct 2026 08:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>kubernetes</category><category>finops</category><category>platform</category><category>cloud</category><description>In-place Pod resize is stable in Kubernetes 1.35, letting CPU and memory change without recreating Pods. How it works, where it bites, and how I&#x27;d use it to cut cost.</description><content:encoded><![CDATA[<p><em>For years, changing a Pod&#x27;s CPU or memory meant replacing the Pod. That made right-sizing disruptive, so most teams over-provisioned and left it there. With in-place resize stable since Kubernetes 1.35, the excuse is gone. The operational details still matter.</em></p><p>Almost every Kubernetes cost review finds the same thing: requests set generously at launch and never touched again. Teams know the numbers are wrong. They leave them because changing them used to mean rolling every Pod, and nobody wants to explain a restart to a stateful service, a long-running batch job or a model server that takes minutes to warm up.</p>
<p>That constraint has gone. These are notes on what changed and how I would put it to work.</p>

<section class="block">
<h2>What changed</h2>
<p>In-place Pod resize arrived as alpha in Kubernetes 1.27, reached beta in 1.33 and graduated to stable in 1.35<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-3">3</a></sup>. It makes CPU and memory requests and limits mutable on a running Pod. You send the change to the Pod's <code>resize</code> subresource, for example with <code>kubectl patch --subresource resize</code>, which needs kubectl 1.32 or later<sup class="cite"><a href="#ref-2">2</a></sup>.</p>
<p>Each container declares a <code>resizePolicy</code> per resource. <code>NotRequired</code> asks for the change to be applied without a restart; <code>RestartContainer</code> restarts that container to apply it. A common pattern in the documentation is CPU set to <code>NotRequired</code> and memory set to <code>RestartContainer</code><sup class="cite"><a href="#ref-2">2</a></sup>.</p>
<p>The stable release added two things operators will notice. Memory limits can now be decreased, with the kubelet only allowing it when current usage is below the new limit, a best-effort check rather than a guarantee. And when a node can't fit every pending resize, retries are ordered by PriorityClass, then QoS class, then how long the request has waited<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
</section>

<section class="block">
<h2>Watch the conditions, not just the spec</h2>
<p>A resize is a request, not a guarantee. The kubelet reports progress through Pod conditions<sup class="cite"><a href="#ref-2">2</a></sup>:</p>
<table class="tbl">
<thead><tr><th>Condition</th><th>Reason</th><th>Meaning</th></tr></thead>
<tbody>
<tr><td>PodResizePending</td><td>Deferred</td><td>Doesn't fit now, might fit later; the kubelet keeps retrying</td></tr>
<tr><td>PodResizePending</td><td>Infeasible</td><td>Can never fit on this node as it stands</td></tr>
<tr><td>PodResizeInProgress</td><td>(none) or Error</td><td>Accepted and being applied; errors in actuation surface here</td></tr>
</tbody>
</table>
<p>The practical rule: alert on long-lived <code>PodResizePending</code>. A spec that says 4 CPUs while the container still runs on 2 is a quiet source of confusion in incidents and cost reports alike.</p>
<div class="callout"><p>The spec says what you asked for. The status says what you got. Right-sizing dashboards should read the status.</p></div>
</section>

<section class="block">
<h2>Where the VPA fits</h2>
<p>The Vertical Pod Autoscaler recommends requests from observed usage and applies them. Its <code>InPlaceOrRecreate</code> update mode tries an in-place resize first and falls back to recreating the Pod when that isn't possible; the 1.35 release blog described that mode as graduating to beta<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-5">5</a></sup>.</p>
<figure class="fig"><div class="im"><img src="https://asksumanta.com/assets/img/kubernetes-in-place-pod-resize/vpa-architecture.webp" alt="Architecture diagram of the Vertical Pod Autoscaler: the metrics server feeds the VPA recommender, which stores recommendations in the VerticalPodAutoscaler custom resource; the admission controller injects resource values into new Pods via the API server, and the VPA updater either evicts Pods or updates them in place" width="1600" height="900" loading="lazy"></div><figcaption>VPA components: the updater can now update Pods in place rather than only evicting them. <span class="credit">Source: <a href="https://kubernetes.io/docs/concepts/workloads/autoscaling/vertical-pod-autoscale/" target="_blank" rel="noopener">Kubernetes documentation, Vertical Pod Autoscaling</a> · CC BY 4.0</span></figcaption></figure>
<p>This is the combination that changes cost economics. Recommendations used to sit in a report because applying them was disruptive. With in-place updates they can be applied continuously, within limits you set.</p>
</section>

<section class="block">
<h2>Pod-level resources are next</h2>
<p>Kubernetes 1.36 promoted in-place resize of Pod-level resources to beta, meaning a shared budget for all containers in a Pod can also change without recreating it<sup class="cite"><a href="#ref-4">4</a></sup>. That is useful for Pods with sidecars, where per-container numbers are hard to tune separately. I would treat it as beta: pilot it, but don't build a platform default on it yet.</p>
</section>

<section class="block">
<h2>Where it bites</h2>
<ul>
<li><strong>Applications that size themselves at start-up.</strong> A runtime that reads its memory limit once, such as a JVM heap or a worker pool sized to CPU count, won't notice a change. For those, a restart policy on memory is the honest choice.</li>
<li><strong>Memory decreases.</strong> The usage check is best-effort, so shrinking memory on a busy Pod still carries OOM risk<sup class="cite"><a href="#ref-1">1</a></sup>. Shrink gradually and watch.</li>
<li><strong>Node fragmentation.</strong> Growing in place only works if the node has room. Busy nodes produce Deferred resizes; plan headroom or accept fallback to recreation.</li>
<li><strong>Quotas and policy.</strong> Resizes still count against namespace quotas, and teams will need guardrails on how far they can go, enforced with <a href="https://asksumanta.com/insights/kubernetes-admission-policies-cel/">admission policies</a> in <a href="https://asksumanta.com/insights/kubernetes-multi-tenancy/">multi-tenant clusters</a>.</li>
</ul>
</section>

<section class="block">
<h2>How I'd roll it out</h2>
<ol>
<li><strong>Measure first.</strong> Compare requests with real usage by namespace and team, using the allocation approach in <a href="https://asksumanta.com/insights/focus-finops-ai-cost-allocation/">FOCUS-based cost allocation</a>.</li>
<li><strong>Start with CPU on stateless services</strong>, using <code>NotRequired</code>, where the risk is lowest and the savings show quickly.</li>
<li><strong>Run the VPA in recommendation mode</strong> for a few weeks, then enable <code>InPlaceOrRecreate</code> on workloads that tolerate the fallback.</li>
<li><strong>Use it for warm-up spikes.</strong> Services that need extra CPU at start-up, including model servers like those in <a href="https://asksumanta.com/insights/llm-inference-serving-vllm/">vLLM serving</a>, can start large and shrink once warm.</li>
<li><strong>Alert on pending resizes</strong> and report status, not spec, in cost dashboards.</li>
<li><strong>Combine with scale-to-zero</strong> from <a href="https://asksumanta.com/insights/kubernetes-finops-scale-to-zero/">Kubernetes FinOps</a>: horizontal scaling for traffic shape, vertical for per-Pod fit.</li>
</ol>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I run Kubernetes cost and platform reviews that turn right-sizing from a one-off report into a continuous, safe process. As a <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a> I can own that roadmap. Or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/kubernetes-in-place-pod-resize/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Text-to-SQL agents need a semantic layer, not just a bigger model</title><link>https://asksumanta.com/insights/text-to-sql-semantic-layer/</link><guid isPermaLink="true">https://asksumanta.com/insights/text-to-sql-semantic-layer/</guid><pubDate>Mon, 26 Oct 2026 04:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>data</category><category>ai</category><category>ontology</category><category>agents</category><description>LLMs ace text-to-SQL demos and stumble on real enterprise schemas. What Spider 2.0 showed, why a governed semantic layer helps, and how I design data access for AI agents.</description><content:encoded><![CDATA[<p><em>&#x27;Ask your data anything&#x27; is one of the most requested AI features, and one of the most disappointing in production. The demo works on a tidy schema. The real warehouse has thousands of columns, conflicting definitions and tribal knowledge. Research and the market are converging on the same fix.</em></p><p>Every data team has seen the demo: a business user types "what was revenue by region last quarter?" and the model writes perfect SQL. Then the same tool meets the real warehouse, with three tables that could be "revenue", a region column that changed meaning in 2023, and a fiscal calendar nobody wrote down. The answers come back quickly, confidently and wrong.</p>

<section class="block">
<h2>What the research shows</h2>
<p>Spider 2.0, presented at ICLR 2025, was built from real enterprise workflows: 632 problems over databases often with more than a thousand columns, in systems such as BigQuery and Snowflake. The authors reported that a strong reasoning model using a code agent framework solved 21.3% of tasks, compared with 91.2% on the earlier Spider 1.0 benchmark and 73.0% on BIRD<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-2">2</a></sup>.</p>
<p>The gap isn't mainly about SQL syntax. It is about knowing which tables matter, what columns mean, how entities join, and which business rules apply. That knowledge rarely lives in the schema.</p>
<div class="callout"><p>Text-to-SQL fails on meaning, not grammar. A bigger model writes more fluent wrong queries; a semantic layer gives it the right things to query.</p></div>
</section>

<section class="block">
<h2>What a semantic layer gives an agent</h2>
<p>A semantic layer defines business concepts, such as metrics, dimensions, entities and their relationships, once, in governed code, and exposes them to every tool. For an AI agent, that changes the task from "write SQL against 1,500 columns" to "pick the governed metric 'net revenue', group by the dimension 'sales region', filter to last fiscal quarter". The layer generates the SQL.</p>
<ul>
<li><strong>Consistency.</strong> The agent's answer matches the dashboard, because both use the same definition.</li>
<li><strong>Smaller search space.</strong> Choosing from a curated set of metrics is far easier than reasoning over raw tables.</li>
<li><strong>Governance.</strong> Access control, row-level security and certified definitions apply to AI queries just as they do to BI.</li>
<li><strong>Explainability.</strong> The agent can say which metric and filters it used, in business terms a user can check.</li>
</ul>
</section>

<section class="block">
<h2>The market is converging</h2>
<p>In September 2025 Snowflake, Salesforce, dbt Labs and others announced the Open Semantic Interchange, an initiative for a vendor-neutral semantic model specification, explicitly framed around making data ready for AI<sup class="cite"><a href="#ref-3">3</a></sup>. In October 2025 dbt Labs moved MetricFlow, the engine behind its semantic layer, to the Apache 2.0 licence and said it would align it with that initiative<sup class="cite"><a href="#ref-4">4</a></sup><sup class="cite"><a href="#ref-5">5</a></sup>.</p>
<p>Whatever tools you choose, the direction is clear: business definitions are becoming portable, open artefacts that AI and BI share, rather than logic buried in each dashboard.</p>
</section>

<section class="block">
<h2>Semantic layer, ontology or both?</h2>
<p>A semantic layer is optimised for metrics: numbers aggregated over dimensions. An ontology describes entities and relationships more broadly, as I set out in <a href="https://asksumanta.com/insights/ontology-vs-knowledge-graph-vs-semantic-layer/">ontology vs knowledge graph vs semantic layer</a>. For "how much" questions, the semantic layer is the right tool. For "which suppliers are connected to this incident", a knowledge graph answers better. Mature data platforms give agents both, with clear guidance on which to use.</p>
</section>

<section class="block">
<h2>How I design data access for AI agents</h2>
<ol>
<li><strong>Start with the twenty questions people actually ask</strong>, and define the metrics and dimensions they need in the semantic layer first.</li>
<li><strong>Expose governed tools, not a SQL console.</strong> Agents call "query metric" and "list dimensions" tools, for example through MCP servers built with the controls in <a href="https://asksumanta.com/insights/securing-mcp-servers-checklist/">securing MCP servers</a>.</li>
<li><strong>Return the definition with the answer</strong>, so users see which metric, filters and time range were used.</li>
<li><strong>Fall back honestly.</strong> If a question can't be answered from governed definitions, say so and route it to an analyst, rather than improvising SQL.</li>
<li><strong>Evaluate with real questions</strong> and known answers, as in <a href="https://asksumanta.com/insights/llm-evaluation-sets-that-predict-production/">evaluation sets that predict production</a>, and track accuracy by question type.</li>
<li><strong>Keep definitions under contract</strong>, with the change discipline in <a href="https://asksumanta.com/insights/data-contracts-playbook/">data contracts</a>, so a schema change can't silently break what agents report.</li>
</ol>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design data platforms where AI agents and BI share governed definitions, from semantic layers and ontologies to the tools agents call. See <a href="https://asksumanta.com/ontology-knowledge-graph/">ontology and knowledge graphs</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/text-to-sql-semantic-layer/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>MCP extensions: how to adopt them without fragmenting your agent platform</title><link>https://asksumanta.com/insights/mcp-extensions-enterprise-strategy/</link><guid isPermaLink="true">https://asksumanta.com/insights/mcp-extensions-enterprise-strategy/</guid><pubDate>Mon, 26 Oct 2026 00:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>ai</category><category>mcp</category><category>agents</category><category>governance</category><description>MCP extensions add UI, enterprise auth and domain conventions on top of the core protocol. How extensions work, which are official, and how I decide which to adopt in an enterprise.</description><content:encoded><![CDATA[<p><em>The Model Context Protocol keeps its core small and grows through extensions: interactive apps, enterprise authorisation, and domain conventions. That&#x27;s good design. It also means every enterprise now needs a policy on which extensions to support.</em></p><p>Enterprises adopting MCP usually start with the core: clients, servers, tools and resources. Within months, requests arrive for more: interactive interfaces inside the chat, single sign-on instead of per-server logins, machine-to-machine access for batch agents, conventions for regulated data. MCP's answer to all of these is extensions. Understanding how they work is now part of designing an agent platform.</p>

<section class="block">
<h2>Core, projects and extensions</h2>
<p>The MCP maintainers describe the ecosystem in three layers<sup class="cite"><a href="#ref-1">1</a></sup>:</p>
<ul>
<li><strong>The core specification</strong>: how clients and servers talk, and the minimum bar for interoperability.</li>
<li><strong>Projects</strong>: supporting infrastructure such as the Registry for discovering servers and the Inspector for testing.</li>
<li><strong>Extensions</strong>: optional patterns for specialised needs, built on top of the core.</li>
</ul>
<p>Extensions are strictly additive. They are negotiated during the initialisation handshake, and a client or server that doesn't recognise one simply skips it, so the baseline protocol keeps working<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-2">2</a></sup>. They are also how future protocol changes get validated: an extension that gains traction signals what might belong in the core<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
</section>

<section class="block">
<h2>What exists today</h2>
<table class="tbl">
<thead><tr><th>Category</th><th>Examples</th><th>Why an enterprise cares</th></tr></thead>
<tbody>
<tr><td>UI</td><td>MCP Apps, the first official extension, for interactive interfaces in the conversation<sup class="cite"><a href="#ref-1">1</a></sup></td><td>Richer workflows; new security review surface. See <a href="https://asksumanta.com/insights/mcp-apps-tool-annotations/">MCP Apps and tool annotations</a></td></tr>
<tr><td>Authorisation</td><td>OAuth Client Credentials for machine-to-machine access, and Enterprise-Managed Authorization for central identity provider control<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-3">3</a></sup></td><td>Central policy, audit and onboarding through your identity provider</td></tr>
<tr><td>Domain conventions</td><td>Community groups exploring, for example, compliance metadata for financial services<sup class="cite"><a href="#ref-1">1</a></sup></td><td>Shared semantics for regulated workflows, once mature</td></tr>
</tbody>
</table>
<p>The maintainers also draw a useful line: proprietary client features that happen to use MCP are not necessarily extensions, and they encourage implementers to adopt extensions as the standard way to add custom behaviour<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<div class="callout"><p>Prefer official extensions over client-specific features. The first works across clients you'll adopt next year; the second ties your workflows to one vendor.</p></div>
</section>

<section class="block">
<h2>How I decide which to adopt</h2>
<ol>
<li><strong>Is it official, recommended or community-defined?</strong> Official extensions live in the MCP organisation and go through the SEP process<sup class="cite"><a href="#ref-5">5</a></sup>. Community extensions can be valuable but carry more change risk.</li>
<li><strong>Which of our clients support it?</strong> Check the extension support matrix<sup class="cite"><a href="#ref-4">4</a></sup> against the clients your organisation actually uses. An extension supported by one client only is a pilot, not a standard.</li>
<li><strong>What's the security impact?</strong> UI extensions run code from servers inside hosts; auth extensions change who can access what. Both need review before approval.</li>
<li><strong>Does it degrade gracefully?</strong> Because extensions are optional, test what happens when a client doesn't support one. The workflow should still be safe, even if less convenient.</li>
<li><strong>Who owns it internally?</strong> Each supported extension needs an owner on the platform team, a version policy and a place in your server review checklist.</li>
</ol>
</section>

<section class="block">
<h2>Auth extensions first</h2>
<p>If you adopt one extension category first, make it authorisation. Per-user, per-server OAuth doesn't scale in an enterprise, and machine-to-machine agents need a supported way to authenticate without a person in the loop. Centralising access through your identity provider gives you consistent policy and one audit trail, which supports the controls in <a href="https://asksumanta.com/insights/securing-mcp-servers-checklist/">securing MCP servers</a> and the evidence expected in <a href="https://asksumanta.com/insights/soc2-for-ai-startups/">SOC 2</a>.</p>
</section>

<section class="block">
<h2>Contributing back</h2>
<p>Organisations in regulated sectors have a real opportunity here. If your industry needs shared conventions, such as provenance, consent or compliance metadata on tool calls, the SEP process offers an Extensions Track for proposing them<sup class="cite"><a href="#ref-5">5</a></sup>. Defining those conventions openly is better than every vendor inventing its own.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design enterprise MCP platforms, including extension policy, identity integration and server governance, so agent capabilities can grow without fragmenting. See my <a href="https://asksumanta.com/ai-architect/">AI architecture work</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/mcp-extensions-enterprise-strategy/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Colorado&#x27;s AI law reset: what changed in 2026, and what to build regardless</title><link>https://asksumanta.com/insights/colorado-ai-act-2026-reset/</link><guid isPermaLink="true">https://asksumanta.com/insights/colorado-ai-act-2026-reset/</guid><pubDate>Sun, 25 Oct 2026 20:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>regulation</category><category>ai</category><category>governance</category><category>leadership</category><description>Colorado&#x27;s 2024 AI Act was delayed, blocked in court and replaced in 2026 by a narrower notice-based law effective 2027. What changed, and the AI governance worth building anyway.</description><content:encoded><![CDATA[<p><em>Colorado passed the first broad US state law on high-risk AI in 2024. By mid-2026 it had been delayed, blocked in federal court and replaced with a narrower notice-based law. For companies selling AI into the US, the lesson goes beyond Colorado.</em></p><p>For two years, the Colorado AI Act was the US law that AI governance teams planned around. It was the first broad state statute aimed at high-risk AI used in consequential decisions such as hiring, lending and housing. Many companies built programmes around its risk management and impact assessment requirements. In 2026 the ground moved.</p>
<p>This is an architect's summary of public commentary, not legal advice. Confirm current obligations with counsel.</p>

<section class="block">
<h2>What happened</h2>
<table class="tbl">
<thead><tr><th>When</th><th>Event</th></tr></thead>
<tbody>
<tr><td>2024</td><td>SB 24-205 enacted, originally effective February 2026, requiring deployers of high-risk AI to adopt risk management programmes, run impact assessments and notify consumers<sup class="cite"><a href="#ref-1">1</a></sup></td></tr>
<tr><td>Aug 2025</td><td>A special-session bill delayed the effective date to 30 June 2026<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-2">2</a></sup></td></tr>
<tr><td>Apr 2026</td><td>A federal court blocked enforcement after a constitutional challenge, with the US Department of Justice intervening in support of the challenge<sup class="cite"><a href="#ref-3">3</a></sup></td></tr>
<tr><td>May 2026</td><td>SB 26-189 enacted, repealing and reenacting the framework with a narrower, notice-based approach effective 1 January 2027<sup class="cite"><a href="#ref-3">3</a></sup><sup class="cite"><a href="#ref-4">4</a></sup></td></tr>
</tbody>
</table>
</section>

<section class="block">
<h2>What the new law looks like</h2>
<p>Commentary describes SB 26-189 as built around automated decision-making technology used in consequential decisions, including employment decisions about Colorado applicants and employees<sup class="cite"><a href="#ref-4">4</a></sup>. The headline change is what it no longer requires: covered employers no longer need risk management programmes or annual impact assessments. Instead, the law focuses on notice and disclosure, specific consumer rights and record retention, with duties split between developers and deployers<sup class="cite"><a href="#ref-4">4</a></sup><sup class="cite"><a href="#ref-5">5</a></sup>. The Attorney General is to adopt implementing rules before it takes effect, so operational details may still change<sup class="cite"><a href="#ref-4">4</a></sup>.</p>
<div class="callout"><p>Regulation can lighten. Customer expectations rarely do. Enterprise buyers will keep asking how your AI makes decisions about people, whatever Colorado requires.</p></div>
</section>

<section class="block">
<h2>The broader lesson</h2>
<p>Colorado's path mirrors what has happened elsewhere. The EU delayed parts of its AI Act through the <a href="https://asksumanta.com/insights/eu-ai-act-digital-omnibus-roadmap/">Digital Omnibus</a>. US federal health IT rules proposed removing AI transparency requirements, as covered in <a href="https://asksumanta.com/insights/hti-1-to-hti-5-health-it-ai-rules/">HTI-1 to HTI-5</a>. Requirements are moving in different directions in different places, and quickly.</p>
<p>Building a compliance programme around one statute's exact wording is fragile in that environment. Building core governance capabilities that map to several regimes is robust.</p>
</section>

<section class="block">
<h2>What I'd build regardless</h2>
<ol>
<li><strong>An inventory of automated decisions about people</strong>: which systems influence hiring, credit, pricing, eligibility or access, and how much weight the AI carries.</li>
<li><strong>Notices generated from the inventory</strong>, so disclosures stay accurate as systems change. Notice is the obligation that survived in Colorado, and it is common elsewhere.</li>
<li><strong>Records that can answer "why"</strong>: inputs, model versions and outputs for consequential decisions, retained for a defined period, using the logging in <a href="https://asksumanta.com/insights/llm-observability-opentelemetry-genai/">LLM observability</a>.</li>
<li><strong>A route for people to contest decisions</strong> and reach a human.</li>
<li><strong>Testing for bias and quality</strong> before release and on a schedule, even where no longer mandated, because it is what customers and courts will ask about. See <a href="https://asksumanta.com/insights/evaluating-ai-agents-reliability/">evaluating AI agents</a>.</li>
<li><strong>A framework to map against</strong>, such as those compared in <a href="https://asksumanta.com/insights/iso-42001-vs-nist-ai-rmf/">ISO 42001 and the NIST AI RMF</a>, so new state laws become a mapping exercise rather than a new programme.</li>
</ol>
</section>

<section class="block">
<h2>For companies selling into the US from the Gulf or Europe</h2>
<p>For companies selling from the UAE or Europe into US enterprises, the practical answer is one governance core, evidenced well, then mapped to each market: the EU AI Act, US state laws as they settle, and Gulf rules such as <a href="https://asksumanta.com/insights/difc-regulation-10-ai-systems/">DIFC Regulation 10</a>. That's cheaper than chasing each statute separately, and it survives the next reset.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I help AI companies build governance into their products and platforms, so changing laws mean updated mappings, not rebuilt programmes. As a <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a> I can own that work. Or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/colorado-ai-act-2026-reset/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Zero-code observability with OBI: where OpenTelemetry&#x27;s eBPF instrumentation fits</title><link>https://asksumanta.com/insights/opentelemetry-ebpf-instrumentation-obi/</link><guid isPermaLink="true">https://asksumanta.com/insights/opentelemetry-ebpf-instrumentation-obi/</guid><pubDate>Sun, 25 Oct 2026 16:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>observability</category><category>opentelemetry</category><category>kubernetes</category><category>platform</category><description>OBI uses eBPF to capture traces, metrics and log correlation without code changes. What it covers, its 2026 path to 1.0, where it fits beside SDKs, and how I&#x27;d roll it out.</description><content:encoded><![CDATA[<p><em>Instrumenting every service with an SDK is the gold standard, and the reason many estates have no tracing at all. OpenTelemetry eBPF Instrumentation, OBI, offers traces and metrics without touching application code. It changes how fast you can get visibility, though it doesn&#x27;t replace SDKs entirely.</em></p><p>Many organisations have tracing on the services built in the last few years and nothing on the rest: the legacy Java monolith, the vendor binary, the Go service whose author left. Instrumenting each one with an SDK means code changes, releases and ownership that often doesn't exist. So the gaps stay, and incidents in those gaps take longest to resolve.</p>

<section class="block">
<h2>What OBI does</h2>
<p>OpenTelemetry eBPF Instrumentation uses eBPF to inspect application executables and the operating system's networking layer, capturing trace spans, rate-errors-duration metrics, runtime metrics and service relationships for supported Linux workloads, without modifying application code or configuration<sup class="cite"><a href="#ref-1">1</a></sup>. The documentation lists support for languages including Java, .NET, Go, Python, Ruby, Node.js, C, C++ and Rust, visibility into TLS traffic without decryption, context propagation across services, and configuration-free auto-instrumentation on Kubernetes<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<p>That last point matters most in practice. On a cluster, you can get a baseline service map and latency metrics for everything in days, not quarters.</p>
</section>

<section class="block">
<h2>Log correlation without touching the app</h2>
<p>A recent addition addresses a common incident pain: you have a failing trace, but no way to find the matching log lines because the service never added trace context to its logs. OBI can now add trace and span IDs to logs written to stdout or stderr, because through eBPF it knows which request each thread is serving at the moment of the write<sup class="cite"><a href="#ref-3">3</a></sup>.</p>
<figure class="fig"><div class="im"><img src="https://asksumanta.com/assets/img/opentelemetry-ebpf-instrumentation-obi/logs-and-trace.webp" alt="Two terminal panels showing JSON log lines from a frontend and a backend service, each enriched with the same trace_id and different span_id values" width="1600" height="417" loading="lazy"></div><figcaption>Logs from two services enriched by OBI with the same trace ID, so a single search connects them. <span class="credit">Source: <a href="https://opentelemetry.io/blog/2026/obi-trace-log-correlation/" target="_blank" rel="noopener">OpenTelemetry blog, Zero-code trace-log correlation with OBI</a> · CC BY 4.0</span></figcaption></figure>
<p>The boundaries are stated clearly: it applies to stdout and stderr, only annotates lines written while OBI has active trace context, needs elevated privileges, and on older kernels only some write paths are enriched; the common write path needs Linux 6.0 or later. It also needs a small change in the log pipeline<sup class="cite"><a href="#ref-3">3</a></sup>.</p>
<div class="callout"><p>eBPF instrumentation is the fastest way to remove blind spots. SDKs are the way to add meaning. Most mature estates will want both.</p></div>
</section>

<section class="block">
<h2>Where it's heading in 2026</h2>
<p>The OBI SIG's 2026 goals centre on a stable 1.0 release for production readiness, with complete configuration documentation, adoption of OpenTelemetry's declarative configuration and telemetry schemas, and test coverage targets. They also plan to expand protocols to messaging systems such as MQTT, AMQP, NATS and Redis pub/sub, extend database support, instrument cloud service SDKs, broaden .NET support, and strengthen integration with OpenTelemetry SDKs for hybrid instrumentation<sup class="cite"><a href="#ref-2">2</a></sup>.</p>
<p>Check the project's current release status before production rollout<sup class="cite"><a href="#ref-4">4</a></sup>, and pilot in non-critical environments first, in line with the stability approach in <a href="https://asksumanta.com/insights/opentelemetry-stable-by-default-kubernetes/">OpenTelemetry's stable-by-default push</a>.</p>
</section>

<section class="block">
<h2>OBI or SDK?</h2>
<table class="tbl">
<thead><tr><th></th><th>OBI (eBPF)</th><th>OpenTelemetry SDKs</th></tr></thead>
<tbody>
<tr><td>Code changes</td><td>None</td><td>Required</td></tr>
<tr><td>Coverage speed</td><td>Whole cluster quickly</td><td>Service by service</td></tr>
<tr><td>Business context</td><td>Limited to protocol-level data</td><td>Custom spans, attributes and events</td></tr>
<tr><td>Privileges</td><td>Elevated, node-level</td><td>Runs inside the application</td></tr>
<tr><td>Best for</td><td>Baselines, legacy and third-party services</td><td>Core services where detail matters</td></tr>
</tbody>
</table>
</section>

<section class="block">
<h2>How I'd roll it out</h2>
<ol>
<li><strong>Start with the blind spots.</strong> Deploy OBI where SDK instrumentation is missing, and compare the service map with what teams believe the architecture is.</li>
<li><strong>Route through your Collector gateway</strong>, as in <a href="https://asksumanta.com/insights/opentelemetry-collector-deployment-patterns/">Collector deployment patterns</a>, so sampling, redaction and export are handled centrally.</li>
<li><strong>Review privileges with security.</strong> eBPF instrumentation runs with elevated access on nodes; treat it as platform infrastructure with the same controls as other node-level agents, enforced through <a href="https://asksumanta.com/insights/kubernetes-admission-policies-cel/">admission policies</a>.</li>
<li><strong>Check data sensitivity.</strong> Capturing protocol data, including from encrypted traffic, can expose sensitive values. Configure what is collected and redact at the gateway.</li>
<li><strong>Add SDKs where business context matters</strong>, such as checkout flows, AI calls with <a href="https://asksumanta.com/insights/llm-observability-opentelemetry-genai/">GenAI attributes</a>, and regulated workflows.</li>
<li><strong>Watch cardinality and cost</strong>, since cluster-wide instrumentation can generate a lot of telemetry quickly.</li>
</ol>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design observability platforms that close blind spots quickly and add depth where it matters, using OpenTelemetry end to end. As a <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a> I can own the observability roadmap. Or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/opentelemetry-ebpf-instrumentation-obi/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Clinical prediction models on OMOP: how to build models that work beyond one hospital</title><link>https://asksumanta.com/insights/clinical-prediction-models-omop/</link><guid isPermaLink="true">https://asksumanta.com/insights/clinical-prediction-models-omop/</guid><pubDate>Sun, 25 Oct 2026 12:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>healthcare</category><category>omop</category><category>ai</category><category>data</category><description>Many clinical prediction models are never validated beyond their own data. How OHDSI patient-level prediction defines problems, measures performance and validates externally.</description><content:encoded><![CDATA[<p><em>Clinical prediction is one of the oldest uses of machine learning in healthcare, and one of the most disappointing in practice. Models that look excellent at one hospital often fail at the next. OHDSI&#x27;s patient-level prediction framework is a practical answer.</em></p><p>Risk scores for readmission, sepsis, deterioration or medication harm are some of the most requested clinical AI projects. They are also among the easiest to get wrong. A model trained on one hospital's data, evaluated on a random split of the same data, and published with a strong AUC, often performs noticeably worse somewhere else, or even in the same hospital a year later.</p>
<p>The OHDSI community has spent years building a standard way to do this better. Its approach is useful even if you never touch the OHDSI tools.</p>

<section class="block">
<h2>The problem with most prediction models</h2>
<p>The Book of OHDSI is direct about it: many published patient-level prediction efforts don't follow model development guidelines, fail to perform extensive external validation, or provide too few details for others to reproduce and validate them<sup class="cite"><a href="#ref-1">1</a></sup>. It points to the TRIPOD reporting guideline as a standard for transparent reporting<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-4">4</a></sup>.</p>
<p>The underlying issue is that a model learns the habits of the data it was trained on: coding practices, patient mix, documentation patterns. Those don't travel.</p>
</section>

<section class="block">
<h2>Define the problem precisely</h2>
<p>OHDSI frames every prediction problem in the same form: among a <strong>target cohort</strong>, who will go on to have an <strong>outcome</strong> within a <strong>time-at-risk</strong>? Prediction happens at a defined moment, and only information from the observation window before that moment may be used<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<figure class="fig"><div class="im"><img src="https://asksumanta.com/assets/img/clinical-prediction-models-omop/prediction-problem.webp" alt="Timeline diagram of a prediction problem: an observation window of prior clinical events before time zero, followed by a time-at-risk window in which the outcome may occur" width="998" height="308" loading="lazy"></div><figcaption>The prediction problem: use only the observation window before t = 0 to predict an outcome during the time-at-risk. <span class="credit">Source: <a href="https://ohdsi.github.io/TheBookOfOhdsi/PatientLevelPrediction.html" target="_blank" rel="noopener">The Book of OHDSI, Patient-Level Prediction</a> · CC0 1.0</span></figcaption></figure>
<p>The same template covers disease onset, treatment response, safety and adherence. The book's examples include predicting ischaemic stroke among newly diagnosed atrial fibrillation patients, and gastrointestinal bleeding among new users of warfarin<sup class="cite"><a href="#ref-1">1</a></sup>. Because target and outcome are standard <a href="https://asksumanta.com/insights/omop-cohort-definitions/">cohort definitions</a>, another site can rebuild exactly the same problem on its own data.</p>
<div class="callout"><p>Most prediction projects fail at the first step: an ambiguous index date. If you can't say precisely when the prediction is made, you can't validate it anywhere else.</p></div>
</section>

<section class="block">
<h2>Measure the right things</h2>
<p><strong>Discrimination</strong>, usually summarised by the area under the ROC curve, measures whether the model ranks patients who will have the outcome above those who won't. The book notes that for rare outcomes even a model with a high AUC may not be practical, because many false positives can accompany each true one<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<p><strong>Calibration</strong> measures whether predicted risks match reality: of a hundred patients given a 10% risk, about ten should have the outcome<sup class="cite"><a href="#ref-1">1</a></sup>. In the book's worked example, a model was well calibrated overall but poorly calibrated for younger patients<sup class="cite"><a href="#ref-1">1</a></sup>. Overall metrics hide that kind of problem, which is why subgroup checks matter for both safety and fairness.</p>
</section>

<section class="block">
<h2>Validate externally, always</h2>
<p>The book distinguishes internal validation, testing on held-out data from the same database, from external validation, developing in one database and evaluating in another. It recommends always performing external validation on as many new datasets as feasible, because different databases represent different populations, health systems and data capture<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<p>This is where a common data model pays off. A model built on OMOP can be shared as a package and evaluated at other OMOP sites without moving patient data, which is the federated approach described in <a href="https://asksumanta.com/insights/federated-health-analytics-ohdsi/">federated health analytics</a>. The PatientLevelPrediction R package implements this end to end, from data extraction with standard covariates to training and validation<sup class="cite"><a href="#ref-2">2</a></sup><sup class="cite"><a href="#ref-3">3</a></sup>.</p>
</section>

<section class="block">
<h2>How I'd run a clinical prediction project</h2>
<ol>
<li><strong>Write the prediction question in the standard form</strong> and agree it with clinicians before touching data.</li>
<li><strong>Build cohorts on OMOP</strong>, checked with <a href="https://asksumanta.com/insights/omop-data-quality-checks/">data quality tools</a>, so the design is portable.</li>
<li><strong>Start with simple models.</strong> Regularised logistic regression is often competitive and easier to explain.</li>
<li><strong>Report discrimination and calibration</strong>, overall and by key subgroups, following TRIPOD.</li>
<li><strong>Validate on at least one external dataset</strong> before any clinical use.</li>
<li><strong>Plan deployment and monitoring</strong>: how the score reaches clinicians, how drift is detected, and how changes are controlled. The transparency practices in <a href="https://asksumanta.com/insights/hti-1-to-hti-5-health-it-ai-rules/">HTI-1 to HTI-5</a> and <a href="https://asksumanta.com/insights/fda-pccp-ai-medical-devices/">FDA PCCPs</a> apply.</li>
</ol>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design OMOP-based platforms and clinical AI pipelines that make prediction models reproducible, externally validated and safe to deploy. See <a href="https://asksumanta.com/healthcare-data-architecture/">healthcare data architecture</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/clinical-prediction-models-omop/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Choosing an embedding model for RAG: a checklist that goes beyond the leaderboard</title><link>https://asksumanta.com/insights/choosing-embedding-models-rag/</link><guid isPermaLink="true">https://asksumanta.com/insights/choosing-embedding-models-rag/</guid><pubDate>Sun, 25 Oct 2026 08:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>ai</category><category>rag</category><category>llm</category><category>data</category><description>Embedding choice quietly decides RAG quality, cost and portability. What MTEB and MMTEB measure, why no model wins everything, and the checklist I use to pick and re-evaluate embeddings.</description><content:encoded><![CDATA[<p><em>Teams spend weeks choosing an LLM and minutes choosing an embedding model. Yet the embedding model decides what retrieval can find, and changing it later means re-embedding everything. It deserves a more careful decision.</em></p><p>In many RAG systems, the embedding model was chosen because it was the default in a tutorial, or because it topped a leaderboard on the day someone looked. Then retrieval quality disappoints, and the team tunes prompts and chunk sizes for weeks without suspecting the component that decides what can be found at all.</p>

<section class="block">
<h2>What the benchmarks tell you</h2>
<p>The Massive Text Embedding Benchmark, MTEB, evaluates embedding models across many tasks, such as retrieval, classification, clustering and semantic similarity, over dozens of datasets and many languages. Its central finding when published was that no single method dominated across all tasks<sup class="cite"><a href="#ref-1">1</a></sup>. Its multilingual successor, MMTEB, presented at ICLR 2025, expanded to over 500 evaluation tasks across hundreds of languages, including long-document and code retrieval<sup class="cite"><a href="#ref-2">2</a></sup>. Notably, its authors reported that the best-performing publicly available model at the time was a relatively small multilingual model of around 560 million parameters<sup class="cite"><a href="#ref-2">2</a></sup>.</p>
<p>Two lessons follow. Model size isn't the same as fitness for your task. And an average score across hundreds of tasks may hide poor performance on the one task you care about.</p>
<div class="callout"><p>Use the leaderboard to build a shortlist, never to make the decision. Your documents, your queries and your languages are the only benchmark that matters.</p></div>
</section>

<section class="block">
<h2>The checklist</h2>
<ol>
<li><strong>Filter by the task that matters.</strong> For RAG, look at retrieval scores, not the overall average. If you search code or long documents, look at those categories specifically.</li>
<li><strong>Check your languages.</strong> For Gulf and multilingual products, test Arabic and mixed-language queries explicitly. Many models are strongest in English, and a good average can hide weak Arabic retrieval.</li>
<li><strong>Check domain fit.</strong> Clinical, legal and financial language behave differently from web text. Test with real domain documents; if results are weak, hybrid keyword and vector search often helps more than switching models, as in <a href="https://asksumanta.com/insights/mongodb-hybrid-search-rag/">hybrid search for RAG</a>.</li>
<li><strong>Measure on your own data.</strong> Build a labelled set of queries and the documents that should be retrieved for them, and measure recall and ranking quality for each candidate. The open-source <code>mteb</code> package can help run standard tasks alongside your own<sup class="cite"><a href="#ref-4">4</a></sup>, and the wider method is in <a href="https://asksumanta.com/insights/llm-evaluation-sets-that-predict-production/">evaluation sets that predict production</a>.</li>
<li><strong>Consider dimensions and cost.</strong> Bigger vectors cost more to store and search. Models trained with Matryoshka Representation Learning let you truncate embeddings to smaller sizes with limited quality loss; the original paper reported up to 14 times smaller embeddings at the same accuracy on an image classification benchmark<sup class="cite"><a href="#ref-3">3</a></sup>. Test the trade-off on your own retrieval set.</li>
<li><strong>Consider where it runs.</strong> Hosted embedding APIs send your documents to a third party. For regulated or residency-bound data, a self-hosted open model may be necessary, as discussed in <a href="https://asksumanta.com/insights/saudi-pdpl-cross-border-ai/">Saudi PDPL and cross-border AI</a> and <a href="https://asksumanta.com/insights/private-llm-on-prem/">private LLMs on-prem</a>.</li>
<li><strong>Check licence and longevity.</strong> If a provider deprecates a model, you must re-embed everything. Prefer models you can keep running, or plan for migration.</li>
<li><strong>Check context length.</strong> Some models truncate long inputs silently. Make sure your chunk sizes fit the model's limit.</li>
</ol>
</section>

<section class="block">
<h2>Plan for re-embedding from day one</h2>
<p>Whatever you choose, you will change it eventually: a better model appears, a provider retires one, or your content shifts language or domain. Design for that:</p>
<ul>
<li><strong>Store the model name and version</strong> with every vector, and never mix vectors from different models in one index.</li>
<li><strong>Keep source text and chunking reproducible</strong>, so you can re-embed without re-ingesting.</li>
<li><strong>Build new indexes alongside old ones</strong>, compare retrieval quality on your evaluation set, and switch traffic only when the new one wins.</li>
<li><strong>Budget the cost.</strong> Re-embedding a large corpus takes real compute and time; estimate it before you need it.</li>
</ul>
</section>

<section class="block">
<h2>Where embeddings sit in the bigger picture</h2>
<p>Embeddings are one part of retrieval. Reranking, hybrid search, metadata filters and good chunking often matter as much. Where your vectors live is its own decision, covered in <a href="https://asksumanta.com/insights/pgvector-or-vector-database/">pgvector or a vector database</a>. And for some questions, a knowledge graph or GraphRAG beats any embedding, as in <a href="https://asksumanta.com/insights/graphrag-when-it-beats-vector-rag/">GraphRAG vs vector RAG</a>. The most reliable systems treat the embedding model as a swappable, versioned component, chosen with evidence and re-evaluated regularly.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design and evaluate retrieval systems for AI products, including embedding selection, hybrid search and multilingual retrieval for Gulf markets. See my <a href="https://asksumanta.com/ai-architect/">AI architecture work</a> and <a href="https://asksumanta.com/insights/rag-to-production-checklist/">the RAG to production checklist</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/choosing-embedding-models-rag/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Kubernetes multi-tenancy: namespaces, virtual control planes or dedicated clusters?</title><link>https://asksumanta.com/insights/kubernetes-multi-tenancy/</link><guid isPermaLink="true">https://asksumanta.com/insights/kubernetes-multi-tenancy/</guid><pubDate>Sun, 25 Oct 2026 04:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>kubernetes</category><category>platform</category><category>security</category><category>finops</category><description>Sharing Kubernetes clusters saves money but raises isolation questions. How I choose between namespace-per-tenant, virtual control planes and dedicated clusters, using the official guidance.</description><content:encoded><![CDATA[<p><em>Every growing platform faces the same question: one cluster per team or customer, or shared clusters with careful isolation? Kubernetes has no built-in concept of a tenant, so the answer is a set of design choices. Here is how I make them.</em></p><p>Clusters multiply quietly. One per team, one per environment, one for that big customer, one for the data science group. Each brings its own upgrades, monitoring, security patches and idle capacity. Eventually someone asks whether all of this could share fewer clusters, and the answer depends almost entirely on who the tenants are and how much they trust each other.</p>

<section class="block">
<h2>Two kinds of tenancy</h2>
<p>The Kubernetes documentation distinguishes two broad use cases<sup class="cite"><a href="#ref-1">1</a></sup>:</p>
<ul>
<li><strong>Multiple teams</strong> in one organisation share a cluster. There is some trust between them, members often have direct access through tools or GitOps, and workloads frequently talk to each other.</li>
<li><strong>Multiple customers</strong>, where a vendor runs workload instances per customer. Customers never touch the cluster, cost matters a great deal, and isolation must be strong.</li>
</ul>
<figure class="fig"><div class="im"><img src="https://asksumanta.com/assets/img/kubernetes-multi-tenancy/coexisting-tenancy-models.webp" alt="Diagram of a single cluster containing multi-team tenancy, where Team A and Team B run their own apps, and multi-customer tenancy, where Team C runs separate app instances for customers 1 to N" width="1155" height="698" loading="lazy"></div><figcaption>One cluster can host both models: teams sharing a cluster, and one team running per-customer instances. <span class="credit">Source: <a href="https://kubernetes.io/docs/concepts/security/multi-tenancy/" target="_blank" rel="noopener">Kubernetes documentation, Multi-tenancy</a> · CC BY 4.0</span></figcaption></figure>
<p>The documentation also cautions that "hard" and "soft" multi-tenancy are better seen as a spectrum than two categories. Hard multi-tenancy usually describes tenants that don't trust each other, which demands particular attention to data-plane isolation<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
</section>

<section class="block">
<h2>The building blocks</h2>
<p><strong>Control plane isolation</strong> stops tenants seeing or changing each other's API resources. Namespaces scope names and many policies; RBAC enforces least privilege, which the docs call the most important type of control-plane isolation, because a tenant who can modify another's resources can disable every other protection<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-2">2</a></sup>. Resource quotas cap what each namespace can consume<sup class="cite"><a href="#ref-5">5</a></sup>.</p>
<p><strong>Data plane isolation</strong> protects workloads at runtime: network policies to restrict traffic<sup class="cite"><a href="#ref-3">3</a></sup>, storage isolation, sandboxed containers using virtual machines or userspace kernels for untrusted code, and node isolation that dedicates nodes to a tenant<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<p><strong>Fairness</strong> matters too. API Priority and Fairness prevents one tenant's controllers from overwhelming the API server<sup class="cite"><a href="#ref-4">4</a></sup>.</p>
<div class="callout"><p>Containers share a kernel. If tenants may run code you don't trust, namespaces alone are not a security boundary; plan for sandboxing, dedicated nodes or separate clusters.</p></div>
</section>

<section class="block">
<h2>The three models compared</h2>
<table class="tbl">
<thead><tr><th></th><th>Namespace per tenant</th><th>Virtual control plane per tenant</th><th>Cluster per tenant</th></tr></thead>
<tbody>
<tr><td>Isolation</td><td>Shared API server; depends on careful policy</td><td>Separate API views, including non-namespaced resources</td><td>Strongest; nothing shared but the provider</td></tr>
<tr><td>Cost</td><td>Negligible overhead</td><td>Somewhat higher</td><td>Highest, especially on-premises</td></tr>
<tr><td>Limitations</td><td>Non-namespaced resources such as CRDs, storage classes and webhooks are shared</td><td>Cross-tenant sharing is harder</td><td>Operational overhead per cluster</td></tr>
<tr><td>Best for</td><td>Internal teams with some trust</td><td>Tenants needing their own CRDs or admin rights</td><td>Untrusted tenants, regulated data, residency</td></tr>
</tbody>
</table>
<p>This follows the documentation's own description: namespace isolation is well supported with negligible resource cost but can be difficult to configure and doesn't cover non-namespaced resources, while control plane virtualisation isolates those at the cost of somewhat higher resource use<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
</section>

<section class="block">
<h2>How I decide</h2>
<ol>
<li><strong>Who writes code that runs?</strong> If tenants can run arbitrary code, assume it may be hostile, and favour sandboxing, dedicated nodes or clusters.</li>
<li><strong>Do tenants need cluster-level resources?</strong> Teams that ship their own operators and CRDs push towards virtual control planes.</li>
<li><strong>What do regulators and contracts require?</strong> Data residency and customer contracts may require dedicated infrastructure in a region, as in <a href="https://asksumanta.com/insights/uae-health-data-law-localisation/">UAE health data localisation</a>.</li>
<li><strong>What can the platform team operate?</strong> Fifty clusters run badly are riskier than five run well.</li>
<li><strong>Mix models.</strong> Shared clusters for most tenants, dedicated ones for the few that need them, mirroring the hybrid pattern in <a href="https://asksumanta.com/insights/mongodb-multi-tenant-saas-patterns/">multi-tenant SaaS on MongoDB</a>.</li>
</ol>
</section>

<section class="block">
<h2>Practical rules for shared clusters</h2>
<ul>
<li><strong>A namespace per workload</strong>, with names unique across the whole fleet, which the docs recommend so you can move between shared and dedicated clusters later<sup class="cite"><a href="#ref-1">1</a></sup>.</li>
<li><strong>Default-deny networking</strong>, with explicit allows.</li>
<li><strong>Quotas and limit ranges</strong> on every tenant namespace.</li>
<li><strong>Guardrails as policy</strong>, such as the CEL policies in <a href="https://asksumanta.com/insights/kubernetes-admission-policies-cel/">Kubernetes admission policies</a>, so tenants can't weaken their own isolation.</li>
<li><strong>Cost allocation by tenant</strong>, using labels and the approaches in <a href="https://asksumanta.com/insights/kubernetes-finops-scale-to-zero/">Kubernetes FinOps</a>.</li>
<li><strong>Separate GPU pools</strong> where AI workloads from different tenants compete, with the scheduling controls in <a href="https://asksumanta.com/insights/kubernetes-gang-scheduling-ai/">gang scheduling</a>.</li>
</ul>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design Kubernetes platforms for internal teams and SaaS products, choosing the tenancy model that fits the trust, cost and compliance picture. As a <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a> I can own the platform roadmap. Or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/kubernetes-multi-tenancy/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>AI agent memory: what to remember, how to retrieve it, and when to forget</title><link>https://asksumanta.com/insights/ai-agent-memory-architecture/</link><guid isPermaLink="true">https://asksumanta.com/insights/ai-agent-memory-architecture/</guid><pubDate>Sun, 25 Oct 2026 00:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>ai</category><category>agents</category><category>llm</category><category>governance</category><description>Agents that remember users and past work are more useful and riskier. What MemGPT, Generative Agents and LongMemEval teach about memory design, and the architecture and governance I use.</description><content:encoded><![CDATA[<p><em>An assistant that forgets everything between sessions feels shallow. One that remembers everything becomes slow, confused and a privacy liability. Designing memory is about choosing what deserves to persist, and research gives useful guidance.</em></p><p>The most common complaint about AI assistants in the workplace is that they don't remember. You explain your role, your project and your preferences, and the next day you explain them again. The obvious fix, keeping everything, creates different problems: slower and more expensive responses, answers based on stale information, and a growing store of personal data nobody designed for.</p>
<p>Memory is an architecture decision, not a feature toggle.</p>

<section class="block">
<h2>Why "keep everything in context" fails</h2>
<p>Stuffing history into the prompt runs into the limits covered in <a href="https://asksumanta.com/insights/long-context-vs-rag/">long context or RAG</a>: cost and latency grow with every token, and models use long inputs unevenly. Chroma's research found performance grows increasingly unreliable as input length grows, even on simple tasks<sup class="cite"><a href="#ref-4">4</a></sup>.</p>
<p>LongMemEval, a benchmark presented at ICLR 2025, tested exactly this for assistants. Its 500 questions probe five abilities: information extraction, multi-session reasoning, temporal reasoning, knowledge updates and abstention, embedded in long user-assistant histories. The authors reported that commercial chat assistants and long-context models showed about a 30% accuracy drop when recalling information across sustained interactions<sup class="cite"><a href="#ref-3">3</a></sup>.</p>
<p>Two of those abilities deserve attention. <strong>Knowledge updates</strong>: when a user changes their address or a project changes scope, memory must reflect the latest truth, not the first. <strong>Abstention</strong>: when the assistant doesn't know, it should say so rather than inventing a memory.</p>
</section>

<section class="block">
<h2>Ideas from research</h2>
<p><strong>Memory as an operating system.</strong> MemGPT proposed virtual context management, borrowing from operating system memory hierarchies: the model pages information between a small, fast working context and larger external storage, using function calls to read, write and manage its own context<sup class="cite"><a href="#ref-1">1</a></sup>. The authors showed it maintaining consistency over long conversations and analysing documents larger than the context window<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<p><strong>Retrieval by relevance, recency and importance.</strong> The Generative Agents paper gave simulated characters a memory stream of experiences, retrieved by combining how relevant, how recent and how important each memory is, plus periodic reflection that synthesises memories into higher-level conclusions<sup class="cite"><a href="#ref-2">2</a></sup>.</p>
<p><strong>Indexing, retrieval and reading.</strong> LongMemEval's authors framed memory design as stages of indexing, retrieval and reading, and proposed improvements such as splitting sessions into smaller units, expanding memory keys with extracted facts, and making queries time-aware<sup class="cite"><a href="#ref-3">3</a></sup>.</p>
<div class="callout"><p>Good memory isn't storing more. It's storing the right things in the right shape, and retrieving them with time and relevance in mind.</p></div>
</section>

<section class="block">
<h2>The memory architecture I use</h2>
<table class="tbl">
<thead><tr><th>Layer</th><th>Contents</th><th>Lifetime</th></tr></thead>
<tbody>
<tr><td>Working context</td><td>The current task, recent turns, retrieved items</td><td>One request or session</td></tr>
<tr><td>Session summaries</td><td>What was discussed, decided and left open</td><td>Weeks to months</td></tr>
<tr><td>Profile and facts</td><td>Stable facts and preferences, each with source and timestamp</td><td>Until changed or deleted</td></tr>
<tr><td>Episodic store</td><td>Past interactions, indexed for retrieval</td><td>Defined retention period</td></tr>
<tr><td>Organisational knowledge</td><td>Documents and data the user may access, via RAG</td><td>Governed by the source system</td></tr>
</tbody>
</table>
<p>Practical rules that make it work:</p>
<ol>
<li><strong>Extract facts deliberately</strong>, as structured records with a source and timestamp, using <a href="https://asksumanta.com/insights/structured-outputs-reliable-llm-integration/">structured outputs</a>, rather than keeping raw transcripts as the only memory.</li>
<li><strong>Resolve conflicts by time.</strong> Newer facts supersede older ones; keep history but retrieve the current value.</li>
<li><strong>Retrieve with time awareness</strong>, so "last week's decision" finds last week's session.</li>
<li><strong>Let the model abstain.</strong> If retrieval finds nothing reliable, the answer is "I don't have that", not a guess.</li>
<li><strong>Evaluate memory specifically</strong>, with test cases for recall, updates and abstention, added to your <a href="https://asksumanta.com/insights/evaluating-ai-agents-reliability/">agent evaluation suite</a>.</li>
</ol>
</section>

<section class="block">
<h2>Memory is personal data</h2>
<p>A memory store is a profile of a person. Treat it accordingly:</p>
<ul>
<li><strong>Visibility and control.</strong> Users can see what is remembered, correct it and delete it.</li>
<li><strong>Scope.</strong> Memory is partitioned per user and per tenant, with the same isolation tests as any multi-tenant store, as in <a href="https://asksumanta.com/insights/mongodb-multi-tenant-saas-patterns/">multi-tenant SaaS patterns</a>.</li>
<li><strong>Sensitive categories.</strong> Don't store health, financial or other sensitive details without a clear basis and purpose, especially under regimes such as the <a href="https://asksumanta.com/insights/uae-pdpl-ai-architecture-2026/">UAE PDPL</a>.</li>
<li><strong>Retention.</strong> Define how long each layer is kept and enforce it automatically.</li>
<li><strong>Injection risk.</strong> Content written into memory from untrusted sources can carry instructions into future sessions. Treat remembered content as data, with the controls in <a href="https://asksumanta.com/insights/prompt-injection-defence-for-agents/">prompt injection defence</a>.</li>
</ul>
</section>

<section class="block">
<h2>Start small</h2>
<p>Most products don't need the full stack on day one. A useful first version is session summaries plus a small, user-visible set of facts. Add episodic retrieval when evaluation shows users need it, and measure whether each layer improves outcomes enough to justify its cost and risk.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design agent architectures, including memory, retrieval and the governance around them, so assistants become more useful without becoming a liability. See my <a href="https://asksumanta.com/ai-architect/">AI architecture work</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/ai-agent-memory-architecture/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>From HTI-1 to HTI-5: how US health IT certification rules for AI are shifting, and what to build anyway</title><link>https://asksumanta.com/insights/hti-1-to-hti-5-health-it-ai-rules/</link><guid isPermaLink="true">https://asksumanta.com/insights/hti-1-to-hti-5-health-it-ai-rules/</guid><pubDate>Sat, 24 Oct 2026 20:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>healthcare</category><category>regulation</category><category>ai</category><category>governance</category><description>HTI-1 set USCDI v3 and AI &#x27;model card&#x27; duties for certified health IT; the HTI-5 proposal would remove many requirements, including those. What changed, and what to build regardless.</description><content:encoded><![CDATA[<p><em>In 2023 US health IT regulation added detailed transparency duties for AI in certified EHRs. Two years later, a deregulatory proposal would remove them. For health tech teams, the lesson is not to build only what the rule of the moment requires.</em></p><p>US health IT certification rules shape what millions of clinicians see in their EHRs. In late 2023 the HTI-1 final rule made the most significant AI-related changes yet: transparency duties for predictive decision support. In late 2025 the HTI-5 proposed rule set out to remove many certification requirements, including those AI duties. Health tech leaders are understandably asking what they actually need to build.</p>
<p>This is an architect's reading. Confirm the current status of each rule and how it applies to you with regulatory counsel.</p>

<section class="block">
<h2>What HTI-1 did</h2>
<ul>
<li><strong>USCDI v3 as the baseline.</strong> HTI-1 adopted the United States Core Data for Interoperability version 3 as the baseline standard from 1 January 2026, replacing version 1<sup class="cite"><a href="#ref-1">1</a></sup>.</li>
<li><strong>Decision support interventions.</strong> It established a decision support interventions (DSI) criterion and added a <strong>predictive DSI</strong> category covering AI and machine learning capabilities<sup class="cite"><a href="#ref-2">2</a></sup>.</li>
<li><strong>Source attributes.</strong> Developers supplying predictive DSIs as part of certified health IT had to make detailed source attribute information available for review, often described as model card requirements, with an enforcement date of 1 January 2025 for the DSI provisions<sup class="cite"><a href="#ref-2">2</a></sup>.</li>
</ul>
</section>

<section class="block">
<h2>What HTI-5 proposes</h2>
<p>In December 2025 ASTP/ONC published HTI-5, a deregulatory proposed rule. Commentary describes it as proposing to remove 34 and revise seven of the 60 certification criteria<sup class="cite"><a href="#ref-5">5</a></sup><sup class="cite"><a href="#ref-6">6</a></sup>. ASTP/ONC's own materials describe the DSI change as reducing the criterion's scope to remove the AI model card requirements<sup class="cite"><a href="#ref-3">3</a></sup><sup class="cite"><a href="#ref-4">4</a></sup>. Some changes were proposed to take effect on publication of a final rule and others later; sources differ on the details<sup class="cite"><a href="#ref-5">5</a></sup>.</p>
<p>Holland & Knight characterised the year-end actions as a strategic pivot in federal health IT policy<sup class="cite"><a href="#ref-6">6</a></sup>. Check whether HTI-5 has been finalised, and in what form, before changing plans.</p>
<div class="callout"><p>Regulation can remove a requirement to publish model information. It can't remove a hospital's need to understand the model it is relying on.</p></div>
</section>

<section class="block">
<h2>Why I'd keep building transparency anyway</h2>
<p>Whatever happens to the certification criterion, the underlying questions don't go away:</p>
<ul>
<li><strong>Customers ask.</strong> Health systems' AI governance committees often ask vendors what data a model was trained on, how it performs in different populations, and how it is monitored. A clear model description shortens procurement.</li>
<li><strong>Other regimes apply.</strong> Products sold internationally may face the <a href="https://asksumanta.com/insights/eu-ai-act-digital-omnibus-roadmap/">EU AI Act</a>, and regulated device software may fall under FDA pathways such as those in <a href="https://asksumanta.com/insights/fda-pccp-ai-medical-devices/">FDA PCCPs</a>.</li>
<li><strong>Safety and liability.</strong> When a model contributes to a harmful outcome, the organisation that can show what it knew about the model, and how it monitored it, is in a far stronger position. See <a href="https://asksumanta.com/insights/ai-incident-postmortems/">AI incident postmortems</a>.</li>
<li><strong>Policy swings.</strong> Requirements removed in one cycle can return in another. Building transparency as a product capability is cheaper than switching it on and off.</li>
</ul>
</section>

<section class="block">
<h2>What I'd build regardless of the rule</h2>
<ol>
<li><strong>A model description per predictive feature</strong>: intended use, training data sources, known limitations, performance overall and by relevant subgroups, update history. Keep it as structured data, not a PDF.</li>
<li><strong>Local validation</strong> before go-live at each customer, because performance varies between sites; federation helps, as in <a href="https://asksumanta.com/insights/federated-health-analytics-ohdsi/">federated health analytics</a>.</li>
<li><strong>Ongoing monitoring</strong> for drift and subgroup performance, with a defined path for clinicians to report problems.</li>
<li><strong>Change control</strong>: every model update versioned, evaluated against a fixed set, and recorded.</li>
<li><strong>Interoperable data foundations</strong>: USCDI-aligned FHIR data, which most predictive features depend on, built with the patterns in <a href="https://asksumanta.com/insights/fhir-bulk-data-export-pipelines/">FHIR Bulk Data pipelines</a> and <a href="https://asksumanta.com/insights/tefca-2026-what-health-tech-should-build/">TEFCA</a>.</li>
</ol>
<p>These map neatly to general frameworks too, such as those compared in <a href="https://asksumanta.com/insights/iso-42001-vs-nist-ai-rmf/">ISO 42001 and the NIST AI RMF</a>, so one body of evidence serves several audiences.</p>
</section>

<section class="block">
<h2>For health systems</h2>
<p>If you buy rather than build, don't let a relaxed certification requirement relax your procurement. Ask vendors for the same information HTI-1 described, contractually, and require notification of model changes. Your governance committee's questions shouldn't depend on which rule is in force this year.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I help health tech companies and health systems build clinical AI with transparency, monitoring and interoperable data foundations that hold up across changing rules. See <a href="https://asksumanta.com/healthcare-data-architecture/">healthcare data architecture</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/hti-1-to-hti-5-health-it-ai-rules/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>The lakehouse catalog is your real lock-in: how to choose one in 2026</title><link>https://asksumanta.com/insights/lakehouse-catalog-strategy-iceberg/</link><guid isPermaLink="true">https://asksumanta.com/insights/lakehouse-catalog-strategy-iceberg/</guid><pubDate>Sat, 24 Oct 2026 16:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>data</category><category>platform</category><category>governance</category><category>cloud</category><description>Open table formats freed data files; the catalog now decides access, governance and portability. What Apache Polaris, Unity Catalog and the Iceberg REST API mean for your lakehouse.</description><content:encoded><![CDATA[<p><em>Open table formats like Iceberg promised that no vendor would own your data. They mostly delivered, for the files. But every engine still has to ask a catalog where tables are and who may read them, and that&#x27;s where control has moved.</em></p><p>A few years ago the lakehouse argument was about table formats. That argument is largely settled: Apache Iceberg is widely supported, and I've covered its latest version in <a href="https://asksumanta.com/insights/apache-iceberg-v3-lakehouse/">Apache Iceberg v3</a>. The files sit in your own object storage in an open format any engine can read.</p>
<p>The quieter question is who every engine asks before reading those files. That is the catalog, and it has become the most strategic choice in a modern data platform.</p>

<section class="block">
<h2>Why the catalog holds the power</h2>
<p>In an Iceberg lakehouse, the catalog tracks which tables exist, their current metadata and schema, and increasingly who may access them. Modern catalogs go further and issue engines short-lived storage credentials scoped to the tables they're allowed to read, a pattern called credential vending. Databricks' documentation, for example, describes Unity Catalog granting short-lived credentials to external systems that connect through its REST API or the Iceberg REST catalog interface, subject to explicit privileges and metastore settings<sup class="cite"><a href="#ref-4">4</a></sup>.</p>
<p>That is good security design. It also means the catalog is where permissions, lineage, audit and access for every engine live. Changing the catalog later is far harder than changing an engine.</p>
<div class="callout"><p>Open files with a closed catalog is a more polite form of lock-in, but it's still lock-in. Evaluate catalogs as carefully as you once evaluated databases.</p></div>
</section>

<section class="block">
<h2>The open REST interface</h2>
<p>The Iceberg REST catalog API is what makes multi-engine lakehouses practical: any engine that speaks it can work with any catalog that implements it. Apache Polaris is an open-source catalog built around that API, described by the Apache Software Foundation as a fully featured catalog for Iceberg that enables interoperability across engines such as Spark, Flink and Trino<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<p>Polaris entered the Apache incubator in 2024 after being donated by Snowflake and Dremio, and the foundation announced it as a top-level project in March 2026<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-2">2</a></sup>. Commentary on the graduation noted multiple releases and a broad contributor base<sup class="cite"><a href="#ref-2">2</a></sup>, and the 1.4 release added multi-tenancy and deployment improvements<sup class="cite"><a href="#ref-3">3</a></sup>. Top-level status means independent Apache governance, which matters if neutrality is part of why you chose an open catalog.</p>
<p>Unity Catalog takes a different route: a catalog with its own API that also exposes Iceberg REST access for external engines, alongside Delta support<sup class="cite"><a href="#ref-4">4</a></sup><sup class="cite"><a href="#ref-5">5</a></sup>. Check the current status of each capability, since some external access features have been labelled preview.</p>
</section>

<section class="block">
<h2>Questions I ask when choosing</h2>
<table class="tbl">
<thead><tr><th>Question</th><th>Why it matters</th></tr></thead>
<tbody>
<tr><td>Which engines must read and write, today and in three years?</td><td>Every engine needs a supported path through the catalog, including write access</td></tr>
<tr><td>Where are permissions defined, and can they be exported?</td><td>Governance that can't leave the catalog is the deepest form of lock-in</td></tr>
<tr><td>Does it vend scoped, short-lived credentials?</td><td>Avoids engines holding broad storage keys</td></tr>
<tr><td>Who governs the project or product?</td><td>Foundation governance and vendor roadmaps carry different risks</td></tr>
<tr><td>Can it be self-hosted in-region?</td><td>Residency rules, as in <a href="https://asksumanta.com/insights/saudi-pdpl-cross-border-ai/">Saudi PDPL</a> and <a href="https://asksumanta.com/insights/uae-health-data-law-localisation/">UAE health data</a>, may require it</td></tr>
<tr><td>How are lineage and audit exposed?</td><td>Regulators and AI governance increasingly ask where data came from</td></tr>
</tbody>
</table>
</section>

<section class="block">
<h2>Patterns that keep options open</h2>
<ol>
<li><strong>Standardise on the Iceberg REST interface</strong> for engine access, even if your catalog also offers proprietary APIs. That keeps engines swappable.</li>
<li><strong>Keep governance definitions as code</strong>: roles, grants and policies in version control, applied to the catalog, so they can be reapplied elsewhere.</li>
<li><strong>Use one catalog per governance domain</strong>, not one per engine. Several catalogs over the same tables invite inconsistency.</li>
<li><strong>Pair the catalog with <a href="https://asksumanta.com/insights/data-contracts-playbook/">data contracts</a></strong>, so table semantics and ownership travel with the data rather than living only in catalog metadata.</li>
<li><strong>Test an exit.</strong> Once a year, prove that a second engine, or a second catalog, can read critical tables. It's cheap insurance.</li>
</ol>
</section>

<section class="block">
<h2>The AI angle</h2>
<p>AI systems are now among the biggest consumers of lakehouse data: feature pipelines, training sets, retrieval indexes and agents querying tables directly. A catalog that vends scoped credentials and records access gives you one place to control what each AI workload may read, which supports the evidence expected in <a href="https://asksumanta.com/insights/iso-42001-vs-nist-ai-rmf/">AI governance frameworks</a>. Without it, every AI project tends to get its own copy of the data, and governance dissolves.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design lakehouse and data platform architectures that stay open where it matters, from table formats and catalogs to governance and AI access. As a <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a> I can own the data platform roadmap, or review an existing one in <a href="https://asksumanta.com/technical-due-diligence/">technical due diligence</a>. Or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/lakehouse-catalog-strategy-iceberg/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Securing the AI model supply chain: signing, provenance and safe formats</title><link>https://asksumanta.com/insights/ai-model-supply-chain-security/</link><guid isPermaLink="true">https://asksumanta.com/insights/ai-model-supply-chain-security/</guid><pubDate>Sat, 24 Oct 2026 12:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>security</category><category>ai</category><category>llm</category><category>governance</category><description>Downloaded model weights can execute code and be tampered with. How pickle risks, model signing, SLSA provenance and ML bills of materials fit into a practical AI supply chain checklist.</description><content:encoded><![CDATA[<p><em>Teams that wouldn&#x27;t run an unsigned binary from the internet routinely download model weights from public hubs and load them into production. Models are software artefacts, with software supply chain risks and a few of their own.</em></p><p>Software teams have spent a decade learning to verify what they run: signed packages, pinned dependencies, software bills of materials, reproducible builds. AI teams often skip all of it. A model is downloaded from a public hub by name, loaded with a single line of code and deployed. If that file had been tampered with, or was malicious from the start, few organisations would notice.</p>
<p>As more companies run open-weight models privately, as in <a href="https://asksumanta.com/insights/private-llm-on-prem/">private LLMs on-prem</a>, this becomes a real attack surface.</p>

<section class="block">
<h2>The risks</h2>
<p><strong>Code execution on load.</strong> Hugging Face's own documentation warns that pickle, the default format for PyTorch weights, can enable arbitrary code execution when a file is loaded, and recommends safetensors as a safer alternative<sup class="cite"><a href="#ref-1">1</a></sup>. Security researchers have reported malicious models on public hubs that used this to plant backdoors, and noted that pickle isn't the only risky format: some Keras models can run code through Lambda layers<sup class="cite"><a href="#ref-2">2</a></sup>.</p>
<p><strong>Scanners are imperfect.</strong> A 2026 study of malicious pickle-based models reported that existing scanners varied widely in how well they detected them on its dataset, which is a reason not to treat a scan as proof of safety<sup class="cite"><a href="#ref-7">7</a></sup>.</p>
<p><strong>Tampering and substitution.</strong> Without signatures, there's no reliable way to know a model file is the one its publisher released, or that the copy in your registry hasn't changed since it was approved.</p>
<p><strong>Unknown lineage.</strong> Fine-tuned models inherit everything about their base model and training data, including licence terms and possible poisoning. Without records, you can't answer basic questions in a security review or <a href="https://asksumanta.com/insights/ai-startup-technical-due-diligence-checklist/">due diligence</a>.</p>
</section>

<section class="block">
<h2>The building blocks</h2>
<table class="tbl">
<thead><tr><th>Control</th><th>What it gives you</th></tr></thead>
<tbody>
<tr><td>Safe formats</td><td>Weights that load as data rather than executable code, such as safetensors<sup class="cite"><a href="#ref-1">1</a></sup></td></tr>
<tr><td>Model signing</td><td>Verification that a model is unchanged and from the expected publisher. The OpenSSF model-signing project released v1.0 in April 2025, built on Sigstore and supporting any model format and size<sup class="cite"><a href="#ref-3">3</a></sup><sup class="cite"><a href="#ref-4">4</a></sup></td></tr>
<tr><td>Build provenance</td><td>A record of how an artefact was produced. SLSA's build track defines levels from provenance existing (L1), to signed provenance from a hosted build platform (L2), to a hardened build platform (L3)<sup class="cite"><a href="#ref-5">5</a></sup></td></tr>
<tr><td>ML bill of materials</td><td>An inventory of the model, datasets and dependencies. CycloneDX supports ML-BOMs and model cards for transparency into security, privacy, safety and ethical considerations<sup class="cite"><a href="#ref-6">6</a></sup></td></tr>
</tbody>
</table>
<div class="callout"><p>Treat a model like a container image: pulled from a trusted registry, pinned by digest, verified on deployment, and traceable to how it was built.</p></div>
</section>

<section class="block">
<h2>The checklist</h2>
<ol>
<li><strong>Use an internal model registry.</strong> Production never pulls directly from public hubs. Models are imported, reviewed and stored internally.</li>
<li><strong>Prefer safe formats.</strong> Accept safetensors or equivalent where possible; convert or reject formats that execute code on load. Load untrusted files only in isolated sandboxes.</li>
<li><strong>Scan on import</strong>, while remembering scanners miss things. Scanning reduces risk; it doesn't certify safety.</li>
<li><strong>Pin by hash, not by name.</strong> Reference models by immutable digest so "latest" can never silently change what runs.</li>
<li><strong>Sign what you produce and verify what you run.</strong> Sign fine-tuned and approved models at the end of your pipeline, and verify signatures at deployment.</li>
<li><strong>Generate provenance in your training pipeline</strong>, aiming for at least signed provenance from a managed build platform, in the spirit of SLSA Build L2.</li>
<li><strong>Keep an ML-BOM per model</strong>: base model, datasets, licences, training configuration and evaluation results, linked to your AI system register.</li>
<li><strong>Restrict runtime permissions.</strong> Model-serving containers need no outbound internet access and minimal privileges, enforced with the policies in <a href="https://asksumanta.com/insights/kubernetes-admission-policies-cel/">Kubernetes admission policies</a>.</li>
<li><strong>Re-evaluate after every model change</strong> with your <a href="https://asksumanta.com/insights/llm-evaluation-sets-that-predict-production/">evaluation set</a>, including safety and behaviour tests, not just accuracy.</li>
</ol>
</section>

<section class="block">
<h2>Beyond the weights</h2>
<p>The supply chain extends past model files. Datasets, tokenisers, prompt templates, agent tools and MCP servers all shape behaviour. MCP servers in particular deserve the same allow-listing and review, as covered in <a href="https://asksumanta.com/insights/securing-mcp-servers-checklist/">securing MCP servers</a>. Google's announcement of model signing noted plans to extend the approach to datasets and other ML artefacts<sup class="cite"><a href="#ref-4">4</a></sup>, which is the right direction.</p>
</section>

<section class="block">
<h2>Why this matters now</h2>
<p>Enterprise customers and regulators are starting to ask where models come from and how they are controlled. An ML-BOM, signed models and a registry answer those questions concretely, and support governance frameworks such as those compared in <a href="https://asksumanta.com/insights/iso-42001-vs-nist-ai-rmf/">ISO 42001 and the NIST AI RMF</a>. They are also inexpensive to adopt early and painful to retrofit after an incident.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design secure AI platforms, from model registries and signing to provenance, runtime controls and evaluation, for organisations running private and open-weight models. See my <a href="https://asksumanta.com/ai-architect/">AI architecture work</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/ai-model-supply-chain-security/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>openEHR vs FHIR: why the best health platforms often use both</title><link>https://asksumanta.com/insights/openehr-vs-fhir/</link><guid isPermaLink="true">https://asksumanta.com/insights/openehr-vs-fhir/</guid><pubDate>Sat, 24 Oct 2026 08:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>healthcare</category><category>fhir</category><category>ontology</category><category>data</category><description>openEHR and FHIR are often framed as rivals. They solve different problems: governed clinical persistence and interoperable exchange. How they differ and how I combine them with OMOP.</description><content:encoded><![CDATA[<p><em>Ask a room of health informaticians whether to build on openEHR or FHIR and you will start a long argument. Most of it dissolves once you separate three jobs: storing clinical data well, exchanging it, and analysing it.</em></p><p>Health systems building a new clinical data platform, particularly in Europe, the Gulf and parts of Asia, often face this choice early. Vendors pitch one or the other. Standards communities defend their own. The decision gets framed as a winner-takes-all bet, when in practice the strongest platforms usually use each where it is strong.</p>

<section class="block">
<h2>Different jobs</h2>
<p>A helpful way to see it, set out in one comparison of openEHR, FHIR and CDA, is as layers rather than rivals: FHIR for transactional exchange, openEHR for native persistence with clinical governance, and CDA for archival documents<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<table class="tbl">
<thead><tr><th></th><th>openEHR</th><th>FHIR</th></tr></thead>
<tbody>
<tr><td>Primary job</td><td>Long-term, vendor-neutral clinical data persistence</td><td>Exchanging data between systems via APIs<sup class="cite"><a href="#ref-5">5</a></sup></td></tr>
<tr><td>Modelling approach</td><td>Two-level: stable reference model plus archetypes and templates<sup class="cite"><a href="#ref-2">2</a></sup></td><td>Resources, extended and constrained by profiles</td></tr>
<tr><td>Clinical governance</td><td>Community-reviewed archetypes in the Clinical Knowledge Manager<sup class="cite"><a href="#ref-6">6</a></sup></td><td>Implementation guides and profiles per programme or country</td></tr>
<tr><td>Querying</td><td>Archetype Query Language across the repository</td><td>Search parameters; complex analytics usually done elsewhere</td></tr>
<tr><td>Ecosystem</td><td>Strong in parts of Europe, Australia and Asia</td><td>Broad global adoption and regulatory backing</td></tr>
</tbody>
</table>
</section>

<section class="block">
<h2>What two-level modelling buys you</h2>
<p>openEHR's central idea is separating the software model from clinical content. A stable reference model sits at the first level. Archetypes, each describing one clinical concept such as blood pressure, and templates, which combine and constrain archetypes for a specific use such as a discharge summary, sit at the second<sup class="cite"><a href="#ref-2">2</a></sup>. Clinicians can define and evolve content without the software changing underneath.</p>
<p>Archetypes are governed centrally and reused globally through the Clinical Knowledge Manager<sup class="cite"><a href="#ref-6">6</a></sup>. In community discussions, practitioners argue that archetypes express domain semantics independent of technology, while FHIR profiles tend to be scoped to particular implementations<sup class="cite"><a href="#ref-3">3</a></sup>. That's a perspective from the openEHR side, but the point about governance is fair: a well-reviewed archetype for blood pressure means the same thing in every system that uses it.</p>
<div class="callout"><p>openEHR's real product is clinical agreement. The technology exists to keep that agreement stable while software and vendors change around it.</p></div>
</section>

<section class="block">
<h2>What FHIR does better</h2>
<p>FHIR was built for exchange: resources, RESTful APIs and a web-developer-friendly approach<sup class="cite"><a href="#ref-5">5</a></sup>. It has become the default in regulation and procurement. US interoperability rules, prior authorisation APIs and bulk data access all build on it, as covered in <a href="https://asksumanta.com/insights/cms-0057-prior-authorization-apis/">CMS-0057-F</a> and <a href="https://asksumanta.com/insights/fhir-bulk-data-export-pipelines/">FHIR Bulk Data pipelines</a>. Developers can be productive with FHIR quickly, and tools, libraries and test servers are plentiful.</p>
<p>Using a FHIR server as the primary store is where opinions diverge. One practitioner write-up argues it works for simpler cases but struggles with complex documents, temporal queries and archetype-level governance<sup class="cite"><a href="#ref-4">4</a></sup>. That is a vendor perspective; plenty of organisations do run FHIR-native repositories successfully. The question is how much clinical modelling depth and long-term governance you need.</p>
</section>

<section class="block">
<h2>The pattern I use: three layers</h2>
<ol>
<li><strong>Persistence.</strong> Where the organisation needs deep, governed clinical records over decades, an openEHR clinical data repository holds the source of truth, with templates agreed with clinicians.</li>
<li><strong>Exchange.</strong> FHIR APIs expose data to apps, partners, payers and national exchanges. A facade maps between openEHR compositions and FHIR resources, a pattern described in practice write-ups<sup class="cite"><a href="#ref-4">4</a></sup>.</li>
<li><strong>Analytics.</strong> An OMOP CDM, built downstream, serves research, quality and AI, with standard vocabularies as described in <a href="https://asksumanta.com/insights/clinical-terminologies-omop-vocabularies/">clinical terminologies and OMOP</a> and the pipeline in <a href="https://asksumanta.com/insights/fhir-to-omop-architecture/">FHIR to OMOP</a>.</li>
</ol>
<p>Where deep clinical modelling isn't needed, for example a digital health start-up with a narrow product, a FHIR-native store plus OMOP for analytics is often simpler and perfectly adequate.</p>
</section>

<section class="block">
<h2>How to decide</h2>
<ul>
<li><strong>Who is the customer?</strong> National or regional health systems planning decades ahead lean towards openEHR for persistence. Products integrating with many partners lean towards FHIR first.</li>
<li><strong>Who owns clinical content?</strong> If clinicians need to define and govern data models directly, openEHR's tooling is built for that.</li>
<li><strong>What does regulation require?</strong> Exchange obligations almost always mean FHIR, whatever you store internally.</li>
<li><strong>What skills can you hire?</strong> FHIR skills are more widely available; openEHR expertise is concentrated in particular regions and vendors.</li>
<li><strong>What will you analyse?</strong> Neither is an analytics model. Plan for OMOP or a similar layer from the start.</li>
</ul>
</section>

<section class="block">
<h2>Why it matters for AI</h2>
<p>Clinical AI depends on data that means the same thing across sources and over time. Governed archetypes, consistent FHIR profiles and standard vocabularies all serve that goal. The worst foundation for AI is a mix of local models with no shared semantics, whatever standard name is on the label. That is an ontology problem first, and the same principles apply as in <a href="https://asksumanta.com/insights/ontology-vs-knowledge-graph-vs-semantic-layer/">ontology, knowledge graph and semantic layer</a>.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design clinical data platforms that combine persistence, exchange and analytics standards sensibly, for health systems and health tech companies in the US, Europe and the Gulf. See <a href="https://asksumanta.com/healthcare-data-architecture/">healthcare data architecture</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/openehr-vs-fhir/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Inference gateways on Kubernetes: model-aware routing for self-hosted LLMs</title><link>https://asksumanta.com/insights/kubernetes-inference-gateway/</link><guid isPermaLink="true">https://asksumanta.com/insights/kubernetes-inference-gateway/</guid><pubDate>Sat, 24 Oct 2026 04:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>kubernetes</category><category>ai</category><category>llm</category><category>platform</category><description>LLM traffic breaks ordinary load balancing. How the Gateway API Inference Extension routes on live model-server metrics, what the benchmarks showed, and how I&#x27;d adopt it.</description><content:encoded><![CDATA[<p><em>Round-robin load balancing assumes requests are short and roughly equal. LLM requests are neither. The Kubernetes Gateway API Inference Extension adds model-aware routing to an ordinary gateway, and it changes how I design private model platforms.</em></p><p>When teams first put a self-hosted model behind Kubernetes, they usually reach for the familiar pattern: a Deployment of model servers, a Service in front, and a load balancer spreading requests evenly. It works in a demo. Under real load, some replicas sit with long queues and nearly full GPU memory while others are idle, and tail latency climbs even though the cluster as a whole has spare capacity.</p>

<section class="block">
<h2>Why LLM traffic breaks ordinary load balancing</h2>
<p>The Kubernetes project's introduction to the Inference Extension puts it plainly: LLM inference sessions are often long-running, resource-intensive and partially stateful, and a single GPU-backed server may hold several sessions and in-memory token caches. Load balancers that route by HTTP path or round-robin don't account for model identity, request criticality or the current state of each server<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<p>Two requests to the same model can differ in cost by orders of magnitude, depending on prompt and output length. And as covered in <a href="https://asksumanta.com/insights/llm-inference-serving-vllm/">LLM inference serving</a>, sending a request to a replica that already holds its prompt prefix in cache is far cheaper than sending it anywhere else.</p>
</section>

<section class="block">
<h2>How the extension works</h2>
<p>The Gateway API Inference Extension builds on <a href="https://asksumanta.com/insights/ingress-nginx-to-gateway-api/">Gateway API</a>, keeping the familiar Gateway and HTTPRoute model and adding inference-specific steps<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-5">5</a></sup>. Its central resource is the <strong>InferencePool</strong>: a pool of model-server pods on shared compute, similar to a Service but aware of model serving<sup class="cite"><a href="#ref-1">1</a></sup>. The project documentation lists InferencePool as generally available since v1.0.0<sup class="cite"><a href="#ref-2">2</a></sup>.</p>
<figure class="fig"><div class="im"><img src="https://asksumanta.com/assets/img/kubernetes-inference-gateway/resource-model.webp" alt="Diagram of the Gateway API Inference Extension resource model: cluster operators own the Gateway, application developers own the HTTPRoute, inference platform owners own the InferencePool, and inference workload owners own InferenceModel resources beneath it" width="800" height="572" loading="lazy"></div><figcaption>The resource model as introduced in 2025: platform operators manage pools of model servers; model owners manage what is served. <span class="credit">Source: <a href="https://kubernetes.io/blog/2025/06/05/introducing-gateway-api-inference-extension/" target="_blank" rel="noopener">Kubernetes blog, Introducing Gateway API Inference Extension</a> · CC BY 4.0</span></figcaption></figure>
<p>The original design separated responsibilities by persona: platform operators manage where and how models are served through pools, while model owners manage what is served, including traffic splitting between versions<sup class="cite"><a href="#ref-1">1</a></sup>. The model-facing APIs have continued to evolve, so check the current documentation for your version.</p>
</section>

<section class="block">
<h2>The request flow</h2>
<p>A request reaches the gateway, which matches an HTTPRoute to an InferencePool. Instead of forwarding to any pod, the gateway consults an endpoint selection extension, often called the endpoint picker, which examines live pod metrics such as queue length, memory use and loaded adapters, and chooses the pod that can serve the request most efficiently<sup class="cite"><a href="#ref-1">1</a></sup>. Gateway implementations describe the picker tracking signals such as KV-cache utilisation and queue length<sup class="cite"><a href="#ref-4">4</a></sup>.</p>
<figure class="fig"><div class="im"><img src="https://asksumanta.com/assets/img/kubernetes-inference-gateway/request-flow.webp" alt="Diagram of the inference request flow: a client completion request reaches the Kubernetes Gateway, which uses body-based routing to select an InferencePool by model name and an endpoint selection step to pick the least-loaded model replica, then routes to that replica in the pool" width="802" height="751" loading="lazy"></div><figcaption>Request flow with the endpoint selection extension choosing a model-server pod based on live metrics. <span class="credit">Source: <a href="https://kubernetes.io/blog/2025/06/05/introducing-gateway-api-inference-extension/" target="_blank" rel="noopener">Kubernetes blog, Introducing Gateway API Inference Extension</a> · CC BY 4.0</span></figcaption></figure>
<p>To the client it's still one ordinary request. The intelligence lives in the gateway layer, where the platform team controls it.</p>
</section>

<section class="block">
<h2>What the benchmark showed</h2>
<p>The project compared the extension with a standard Kubernetes Service for a vLLM deployment on H100 GPUs, ramping traffic from 100 to 1,000 queries per second. Throughput was roughly on par, but the extension showed significantly lower p90 per-output-token latency at higher load, and lower end-to-end tail latency as traffic rose beyond about 400 to 500 queries per second<sup class="cite"><a href="#ref-1">1</a></sup>. The authors attribute this to avoiding hotspots that ordinary load balancing creates for long-running inference requests<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<div class="callout"><p>Tail latency is what users feel, and GPU hotspots are what finance pays for. Model-aware routing improves both without buying another GPU.</p></div>
</section>

<section class="block">
<h2>How I'd adopt it</h2>
<ol>
<li><strong>Start from Gateway API.</strong> If your clusters still use an Ingress controller, the move to Gateway API is the prerequisite and has its own value.</li>
<li><strong>Pick a gateway implementation</strong> that supports the Inference Extension, and confirm which version of the APIs it implements.</li>
<li><strong>Expose metrics from your model servers</strong> that the endpoint picker needs, and check them under load before trusting the routing.</li>
<li><strong>Load test against your own traffic</strong>, comparing tail latency and cost per request with your current setup, as in <a href="https://asksumanta.com/insights/llm-inference-serving-vllm/">LLM inference serving</a>.</li>
<li><strong>Use pools to separate concerns</strong>: interactive and batch traffic, regulated and general workloads, or different hardware classes.</li>
<li><strong>Combine with scheduling and cost controls</strong>: GPU allocation through <a href="https://asksumanta.com/insights/kubernetes-dra-gpu-scheduling/">DRA</a>, training jobs through <a href="https://asksumanta.com/insights/kubernetes-gang-scheduling-ai/">gang scheduling</a>, and spend visibility through <a href="https://asksumanta.com/insights/focus-finops-ai-cost-allocation/">FOCUS-based cost allocation</a>.</li>
</ol>
</section>

<section class="block">
<h2>Where it fits in a private AI platform</h2>
<p>An inference gateway is the routing layer in the platform described in <a href="https://asksumanta.com/insights/private-llm-on-prem/">private LLMs on-prem</a> and <a href="https://asksumanta.com/insights/uae-ai-infrastructure-where-to-run-models/">where to run models in the UAE</a>. Above it sits the policy gateway that handles authentication, model approval and logging; below it, the serving engines and GPUs. Keeping those layers distinct makes each easier to change.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design Kubernetes platforms for private and sovereign AI, from GPU scheduling to model-aware routing and cost control. See my <a href="https://asksumanta.com/ai-architect/">AI architecture work</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/kubernetes-inference-gateway/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Structured outputs: how to make LLMs dependable components of real systems</title><link>https://asksumanta.com/insights/structured-outputs-reliable-llm-integration/</link><guid isPermaLink="true">https://asksumanta.com/insights/structured-outputs-reliable-llm-integration/</guid><pubDate>Sat, 24 Oct 2026 00:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>ai</category><category>llm</category><category>agents</category><category>platform</category><description>Schema-constrained outputs make LLM responses machine-readable by design, but can hurt reasoning if used carelessly. How structured outputs work and how I design LLM integrations with them.</description><content:encoded><![CDATA[<p><em>Most enterprise value from LLMs comes when their output feeds another system: a database, a workflow, an API. That needs data in a known shape, every time. Structured outputs solve the format problem. They don&#x27;t solve the correctness problem, and used carelessly they can make it worse.</em></p><p>The first version of most LLM integrations parses free text. Someone writes a prompt asking for JSON, adds a regular expression to extract it, and a retry loop for when it fails. It works in testing. In production, a small percentage of responses arrive with a trailing comment, a missing bracket or a field renamed on a whim, and the pipeline breaks at three in the morning.</p>
<p>Structured outputs remove that class of failure. They're one of the most useful features model providers have shipped for enterprise integration. But they are often treated as a correctness guarantee, which they aren't.</p>

<section class="block">
<h2>What structured outputs are</h2>
<p>You supply a JSON schema, and the provider constrains generation so the response must match it. OpenAI introduced Structured Outputs in August 2024, available through strict function definitions and a JSON schema response format, and reported that its model at the time achieved 100% schema adherence in its own evaluations<sup class="cite"><a href="#ref-1">1</a></sup>. The approach restricts which tokens the model may produce at each step to those consistent with the schema, building on techniques from open-source constrained generation tools<sup class="cite"><a href="#ref-2">2</a></sup>.</p>
<p>Anthropic's documentation describes two related features: JSON outputs that shape the response, and strict tool use that enforces schema compliance on tool inputs through grammar-constrained sampling<sup class="cite"><a href="#ref-3">3</a></sup><sup class="cite"><a href="#ref-4">4</a></sup>. Both providers document limits on which JSON Schema features are supported, and output can still be incomplete if generation stops early, for example at a token limit<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-3">3</a></sup>.</p>
<div class="callout"><p>Structured outputs guarantee shape, not truth. A perfectly valid object with the wrong invoice total is still wrong; it's just wrong in a format your system will happily accept.</p></div>
</section>

<section class="block">
<h2>The reasoning trade-off</h2>
<p>Constraining format has a cost. In "Let Me Speak Freely?", presented at EMNLP 2024, researchers compared constrained decoding, format instructions in the prompt, and generating free text first then converting it. They found that strict format restrictions such as JSON mode were associated with a significant decline in reasoning performance, with stricter constraints generally doing more harm. On classification tasks, though, strict formats could help by reducing answer selection errors<sup class="cite"><a href="#ref-5">5</a></sup>.</p>
<p>The practical lesson is to separate thinking from formatting:</p>
<ul>
<li><strong>For extraction and classification</strong>, strict schemas are usually a clear win.</li>
<li><strong>For tasks that need reasoning</strong>, give the model room to reason first, either in a free-text field within the schema placed before the answer fields, or in a separate step, then produce the structured result. The paper also found that simple corrective steps, such as reformatting outputs that fail to parse, improve reliability<sup class="cite"><a href="#ref-5">5</a></sup>.</li>
<li><strong>Measure both ways</strong> on your own evaluation set before standardising.</li>
</ul>
</section>

<section class="block">
<h2>Designing schemas that help the model</h2>
<ol>
<li><strong>Keep schemas small and flat</strong> where possible. Deeply nested, highly optional schemas are harder for models and may hit provider complexity limits.</li>
<li><strong>Use enums for categories</strong> instead of free strings, so downstream systems never see an unexpected label.</li>
<li><strong>Make uncertainty representable.</strong> Include an explicit "unknown" or "not found" option and a place for a short reason, so the model isn't forced to invent a value to satisfy a required field.</li>
<li><strong>Describe fields clearly.</strong> Field descriptions are part of the prompt; vague names produce vague values.</li>
<li><strong>Order fields deliberately.</strong> Put evidence or reasoning fields before conclusions, so the model generates support before the answer.</li>
<li><strong>Version schemas</strong> like any interface, with the contract discipline in <a href="https://asksumanta.com/insights/data-contracts-playbook/">data contracts</a>.</li>
</ol>
</section>

<section class="block">
<h2>Validate the content, not just the shape</h2>
<p>Once format failures disappear, the remaining failures are about meaning. The checks I put after every structured call:</p>
<ul>
<li><strong>Business rules in code</strong>: totals add up, dates are in range, referenced IDs exist, a refund doesn't exceed the order value.</li>
<li><strong>Cross-checks against source</strong>: extracted values that should appear in the input document actually do.</li>
<li><strong>Confidence routing</strong>: low-confidence or "unknown" results go to a person instead of straight into the system of record.</li>
<li><strong>Evaluation on real cases</strong>, field by field, as in <a href="https://asksumanta.com/insights/llm-evaluation-sets-that-predict-production/">evaluation sets that predict production</a>. Report accuracy per field, not just "valid JSON rate".</li>
</ul>
</section>

<section class="block">
<h2>Structured outputs and agents</h2>
<p>For agents, strict tool definitions mean every tool call arrives with well-formed arguments, which removes a whole category of runtime errors. It doesn't make those calls safe. Arguments still need authorisation and policy checks outside the model, and the session-level containment described in <a href="https://asksumanta.com/insights/prompt-injection-defence-for-agents/">prompt injection defence</a> and <a href="https://asksumanta.com/insights/mcp-apps-tool-annotations/">MCP tool annotations</a>. A schema-valid instruction to transfer money to the wrong account is still the wrong instruction.</p>
</section>

<section class="block">
<h2>A note on portability</h2>
<p>Providers implement structured outputs differently, with different parameters and supported schema subsets. If you use several models, as in <a href="https://asksumanta.com/insights/llm-model-routing/">model routing</a>, keep one canonical schema in your codebase and let a gateway translate it per provider, then test each route. Self-hosted models can get similar behaviour from constrained decoding in the serving layer, covered in <a href="https://asksumanta.com/insights/llm-inference-serving-vllm/">LLM inference serving</a>.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design LLM integrations that downstream systems can trust, from schemas and validation to evaluation and agent controls. See my <a href="https://asksumanta.com/ai-architect/">AI architecture work</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/structured-outputs-reliable-llm-integration/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>OpenTelemetry goes &#x27;stable by default&#x27;: what it means for Kubernetes telemetry, and how to migrate</title><link>https://asksumanta.com/insights/opentelemetry-stable-by-default-kubernetes/</link><guid isPermaLink="true">https://asksumanta.com/insights/opentelemetry-stable-by-default-kubernetes/</guid><pubDate>Fri, 23 Oct 2026 20:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>observability</category><category>opentelemetry</category><category>kubernetes</category><category>platform</category><description>OpenTelemetry is prioritising stability, and the Kubernetes attributes processor hit v1.0.0 with stable conventions and breaking renames. What changed and how I&#x27;d plan the migration.</description><content:encoded><![CDATA[<p><em>OpenTelemetry has spent its first years growing fast. Its governance committee has now made stability the priority, and the first big results are landing in Kubernetes telemetry, including attribute renames that will touch dashboards and alerts.</em></p><p>Ask platform teams what frustrates them about OpenTelemetry and stability comes up quickly: components at different maturity levels, attribute names that change between releases, and upgrades that quietly break dashboards. The project has heard the same thing. In November 2025 its Governance Committee wrote that complexity and lack of stability were creating impediments to production deployments, and set out a plan to change priorities<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<p>A year on, the first concrete results are in, and Kubernetes telemetry is where most platform teams will feel them.</p>

<section class="block">
<h2>What 'stable by default' means</h2>
<p>The committee's goals were explicit<sup class="cite"><a href="#ref-1">1</a></sup>:</p>
<ul>
<li>All OpenTelemetry distributions should be <strong>stable by default</strong>, with standard mechanisms to opt in to experimental features.</li>
<li>A <strong>single, consistent set of stability criteria</strong>, including documentation, performance testing and benchmarks.</li>
<li>Easier stabilisation of instrumentation libraries, and federation of semantic conventions.</li>
<li><strong>Epoch releases</strong> that are easier for organisations to consume.</li>
</ul>
<p>For a platform team, the practical promise is fewer surprises: stable components you can rely on, and clearly marked opt-ins for anything that isn't.</p>
</section>

<section class="block">
<h2>The Kubernetes example</h2>
<p>The Kubernetes attributes processor, which enriches telemetry with metadata such as pod, namespace and node, shows what that journey involves. Its stability depended on the Kubernetes semantic conventions it emits, so the two efforts moved together<sup class="cite"><a href="#ref-2">2</a></sup><sup class="cite"><a href="#ref-3">3</a></sup>:</p>
<table class="tbl">
<thead><tr><th>When</th><th>What happened</th></tr></thead>
<tbody>
<tr><td>Nov 2025</td><td>The Kubernetes semantic conventions group began focused work on stabilising Kubernetes attributes, in step with the Collector's stability goals<sup class="cite"><a href="#ref-2">2</a></sup></td></tr>
<tr><td>Mar 2026</td><td>Kubernetes attributes reached release candidate; the processor offered feature gates to try the new schema<sup class="cite"><a href="#ref-2">2</a></sup></td></tr>
<tr><td>Jun 2026</td><td>The attributes shipped as stable in Semantic Conventions v1.42.0<sup class="cite"><a href="#ref-3">3</a></sup><sup class="cite"><a href="#ref-4">4</a></sup></td></tr>
<tr><td>Sep 2026</td><td>The Kubernetes attributes processor reached v1.0.0, meeting the Collector's stable criteria<sup class="cite"><a href="#ref-3">3</a></sup></td></tr>
</tbody>
</table>
<p>The v1.0.0 announcement is clear that moving to the new convention names means <strong>some breakage for existing users</strong>, and points to a migration guide<sup class="cite"><a href="#ref-3">3</a></sup><sup class="cite"><a href="#ref-5">5</a></sup>. During the transition the processor provided feature gates, <code>processor.k8sattributes.EmitV1K8sConventions</code> and <code>processor.k8sattributes.DontEmitV0K8sConventions</code>, so teams could emit the new attributes before dropping the old ones<sup class="cite"><a href="#ref-2">2</a></sup>.</p>
<div class="callout"><p>Stability is a one-time cost paid up front: a final round of renames, then a long period where names stop moving. It's worth paying deliberately rather than discovering it in a broken dashboard.</p></div>
</section>

<section class="block">
<h2>Why attribute renames hurt more than they look</h2>
<p>Kubernetes attributes are everywhere in an observability estate: dashboard filters, alert rules, service level objectives, cost allocation by namespace, retention policies, access controls and the queries engineers keep in runbooks. A renamed attribute doesn't throw an error. It just makes a filter match nothing, so a dashboard goes quiet and an alert never fires.</p>
</section>

<section class="block">
<h2>The migration plan I use</h2>
<ol>
<li><strong>Inventory dependencies on attribute names.</strong> Export dashboards, alert rules, recording rules and saved queries, and search them for the Kubernetes attributes in your telemetry. Include cost reports that group by namespace or workload, as in <a href="https://asksumanta.com/insights/kubernetes-finops-scale-to-zero/">Kubernetes FinOps</a>.</li>
<li><strong>Read the migration guide for your exact version</strong> of the Collector and processor<sup class="cite"><a href="#ref-5">5</a></sup>, and list old and new names side by side.</li>
<li><strong>Emit both, then switch.</strong> Where your version supports it, emit the new conventions alongside the old in a non-production environment, update dashboards and alerts to the new names, then stop emitting the old ones.</li>
<li><strong>Use the gateway layer</strong> to manage the transition centrally rather than on every node, which is one reason I favour the agent-to-gateway pattern in <a href="https://asksumanta.com/insights/opentelemetry-collector-deployment-patterns/">Collector deployment patterns</a>.</li>
<li><strong>Add canary checks</strong>: alerts that fire when a key dashboard query returns no data, so silent breakage is caught.</li>
<li><strong>Pin Collector versions</strong> and upgrade deliberately, with a changelog review for every component you use.</li>
</ol>
</section>

<section class="block">
<h2>A broader stability strategy</h2>
<p>The Kubernetes processor is one component among many working towards stability<sup class="cite"><a href="#ref-3">3</a></sup>. The same pattern applies elsewhere, from the <a href="https://asksumanta.com/insights/opentelemetry-span-events-deprecation/">span events deprecation</a> to GenAI conventions that are still evolving, covered in <a href="https://asksumanta.com/insights/llm-observability-opentelemetry-genai/">LLM observability</a>. My rules for platform teams:</p>
<ul>
<li><strong>Prefer stable components</strong> in production, and record each experimental component you depend on with the reason and an owner.</li>
<li><strong>Treat telemetry schemas as interfaces</strong>, with the same versioning discipline as APIs and the contract thinking in <a href="https://asksumanta.com/insights/data-contracts-playbook/">data contracts</a>.</li>
<li><strong>Budget a small, regular amount of time</strong> for observability upgrades, rather than a painful catch-up every two years.</li>
</ul>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design and modernise observability platforms on OpenTelemetry and Kubernetes, including migrations like this one that keep dashboards and alerts working. As a <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a> I can own that roadmap. Or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/opentelemetry-stable-by-default-kubernetes/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Technical due diligence for AI companies: the checklist I use for investors and acquirers</title><link>https://asksumanta.com/insights/ai-startup-technical-due-diligence-checklist/</link><guid isPermaLink="true">https://asksumanta.com/insights/ai-startup-technical-due-diligence-checklist/</guid><pubDate>Fri, 23 Oct 2026 16:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>leadership</category><category>ai</category><category>governance</category><category>security</category><description>AI start-ups fail diligence in new ways: no evaluations, borrowed moats, uncontained agents, unclear data rights. The checklist I use when assessing an AI company for investors or acquirers.</description><content:encoded><![CDATA[<p><em>Classic technical due diligence asks whether the software is well built and the team can scale it. For AI companies those questions still matter, but a new set sits on top: is the AI actually good, is it defensible, is it safe, and does the company have the right to the data behind it?</em></p><p>A typical AI pitch deck shows a polished demo, impressive early revenue and a slide titled "proprietary AI". Diligence is where that slide meets reality. The traditional checklist (code quality, architecture, security, team, scalability) still applies. But AI companies add risks that a conventional review can miss entirely, and some of them go straight to valuation.</p>
<p>This is the checklist I work through when assessing an AI company for an investor or acquirer. It's organised as questions, with the evidence I'd expect to see.</p>

<section class="block">
<h2>1. Does the AI actually work, and how do they know?</h2>
<ul>
<li><strong>Is there a maintained evaluation set?</strong> Real examples, labelled with expected outcomes, run on every model or prompt change. If quality is judged by demos and anecdotes, that's the single biggest red flag. I describe what good looks like in <a href="https://asksumanta.com/insights/llm-evaluation-sets-that-predict-production/">evaluation sets that predict production</a>.</li>
<li><strong>Is reliability measured, not just average accuracy?</strong> For agents, a single success rate hides inconsistency. Research on τ-bench introduced pass^k, the chance of succeeding on every one of k attempts, and found that agents were notably less consistent than their single-run success rates suggested<sup class="cite"><a href="#ref-5">5</a></sup>. See <a href="https://asksumanta.com/insights/evaluating-ai-agents-reliability/">evaluating AI agents</a>.</li>
<li><strong>Is there production monitoring?</strong> Feedback, escalations, sampled reviews and drift checks, tied to the evaluation set.</li>
<li><strong>Can they show improvement over time</strong>, with numbers from the same evaluation set across releases?</li>
</ul>
</section>

<section class="block">
<h2>2. What is actually defensible?</h2>
<ul>
<li><strong>Which parts are theirs?</strong> Separate the third-party model, open-source components and the company's own work: data pipelines, evaluation, domain logic, workflow integration, proprietary data.</li>
<li><strong>What happens when the underlying model improves?</strong> If a better general model would make the product unnecessary, the moat is thin. If better models make the product better, that's healthier.</li>
<li><strong>Is there a data advantage?</strong> Proprietary data, feedback loops from usage, or curated domain knowledge such as a governed <a href="https://asksumanta.com/insights/ontology-vs-knowledge-graph-vs-semantic-layer/">ontology or knowledge graph</a> are harder to copy than prompts.</li>
<li><strong>How portable are they across model providers?</strong> A gateway and evaluation set that let them switch models are both a risk control and a negotiating position. See <a href="https://asksumanta.com/insights/build-vs-buy-ai-capabilities/">build vs buy for AI</a>.</li>
</ul>
<div class="callout"><p>"We fine-tuned a model" is not a moat by itself. A moat is something a well-funded competitor couldn't reproduce in a quarter with the same public models.</p></div>
</section>

<section class="block">
<h2>3. Do they have the right to their data?</h2>
<ul>
<li><strong>Provenance.</strong> Where did training, fine-tuning and retrieval data come from, under what licence or agreement?</li>
<li><strong>Customer data use.</strong> Do contracts allow customer data to be used for training or evaluation? Is that used in practice, and is it consistent with the contract?</li>
<li><strong>Personal and sensitive data.</strong> How is personal, health or financial data handled in prompts, logs, embeddings and evaluation sets? Residency matters for some markets, as in <a href="https://asksumanta.com/insights/uae-health-data-law-localisation/">UAE health data</a> and <a href="https://asksumanta.com/insights/saudi-pdpl-cross-border-ai/">Saudi PDPL</a>.</li>
<li><strong>Deletion.</strong> Can they actually delete a customer's data from every store, including vector indexes and caches?</li>
</ul>
</section>

<section class="block">
<h2>4. Is the AI secure and contained?</h2>
<ul>
<li><strong>Known risk categories.</strong> Has the team assessed the product against a recognised list such as the OWASP Top 10 for LLM Applications<sup class="cite"><a href="#ref-1">1</a></sup>?</li>
<li><strong>Prompt injection.</strong> The UK NCSC has argued that prompt injection may never be fully mitigated the way SQL injection was<sup class="cite"><a href="#ref-6">6</a></sup>, so the question is containment: what can a compromised agent actually do? See <a href="https://asksumanta.com/insights/prompt-injection-defence-for-agents/">prompt injection defence</a>.</li>
<li><strong>Tool and data permissions.</strong> Are agent tools scoped per user, enforced outside the model, and logged? See <a href="https://asksumanta.com/insights/securing-mcp-servers-checklist/">securing MCP servers</a>.</li>
<li><strong>Tenant isolation.</strong> Can retrieval ever return another customer's data? Ask for the test that proves it can't.</li>
</ul>
</section>

<section class="block">
<h2>5. Is the engineering organisation healthy?</h2>
<ul>
<li><strong>Delivery metrics.</strong> Deployment frequency, lead time, change failure rate and recovery time, with trends. DORA's 2025 research found that AI tends to amplify an organisation's existing strengths and weaknesses<sup class="cite"><a href="#ref-4">4</a></sup>, so a team leaning heavily on AI coding tools without good foundations may be accumulating risk; see <a href="https://asksumanta.com/insights/dora-metrics-ai-assisted-engineering/">DORA metrics in the AI era</a>.</li>
<li><strong>Key-person risk.</strong> Is the AI capability concentrated in one or two people? What's documented?</li>
<li><strong>Decision records.</strong> Are major architecture choices written down, as in <a href="https://asksumanta.com/insights/architecture-decision-records-fractional-cto/">architecture decision records</a>?</li>
</ul>
</section>

<section class="block">
<h2>6. Do the unit economics hold?</h2>
<ul>
<li><strong>Cost per outcome.</strong> Model, infrastructure and human review cost per resolved ticket, document or transaction, not just per token.</li>
<li><strong>Sensitivity.</strong> What happens to margins if usage grows ten times, or a provider changes pricing?</li>
<li><strong>Levers in use.</strong> Caching, routing and right-sized models, as in <a href="https://asksumanta.com/insights/prompt-caching-llm-cost-latency/">prompt caching</a> and <a href="https://asksumanta.com/insights/llm-model-routing/">model routing</a>. Unused levers are upside; no visibility at all is a risk.</li>
</ul>
</section>

<section class="block">
<h2>7. What is the regulatory exposure?</h2>
<ul>
<li><strong>Classification.</strong> Could any use case fall into a regulated or high-risk category under the EU AI Act<sup class="cite"><a href="#ref-3">3</a></sup>, or sector rules in health, finance or employment?</li>
<li><strong>Governance evidence.</strong> An AI system register, risk assessments, incident handling and training. Frameworks such as the NIST AI RMF<sup class="cite"><a href="#ref-2">2</a></sup> are a reasonable yardstick; see <a href="https://asksumanta.com/insights/iso-42001-vs-nist-ai-rmf/">ISO 42001 or NIST AI RMF</a>.</li>
<li><strong>Customer commitments.</strong> What have they promised enterprise customers about AI, and can they evidence it?</li>
</ul>
</section>

<section class="block">
<h2>Reading the results</h2>
<p>No early-stage company will score well on everything, and that's not the point. Diligence should separate <strong>fixable gaps</strong>, such as missing monitoring or undocumented decisions, from <strong>structural problems</strong>, such as no data rights, no evaluation discipline or a product that a better general model would replace. The first belong in a post-investment plan with owners and dates. The second belong in the valuation conversation.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I carry out <a href="https://asksumanta.com/technical-due-diligence/">technical due diligence</a> on AI and software companies for investors and acquirers in the US, Europe and the Gulf, and help portfolio companies close the gaps afterwards as a <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a>. Or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/ai-startup-technical-due-diligence-checklist/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Prompt caching: the cheapest LLM cost and latency win most teams leave on the table</title><link>https://asksumanta.com/insights/prompt-caching-llm-cost-latency/</link><guid isPermaLink="true">https://asksumanta.com/insights/prompt-caching-llm-cost-latency/</guid><pubDate>Fri, 23 Oct 2026 12:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>ai</category><category>llm</category><category>finops</category><category>platform</category><description>Prompt caching can cut cost and latency on repeated prompt prefixes, but only if prompts are designed for it. How caching works across major providers and how I structure prompts for it.</description><content:encoded><![CDATA[<p><em>Most production prompts repeat the same long prefix on every call: system instructions, policies, tool definitions, reference documents. Every major model provider now offers a way to stop paying full price for it. Whether you benefit depends almost entirely on how your prompts are built.</em></p><p>Look at the prompts your AI product actually sends. In many production systems, the first several thousand tokens are identical on every call: the system prompt, safety and style rules, tool definitions, perhaps a policy document or schema. Only the last few hundred tokens are specific to the user and the request. Yet many teams pay full input price, and wait for full processing, on that repeated prefix every time.</p>
<p>Prompt caching exists to fix exactly that. It is usually the cheapest optimisation available, and the most commonly wasted.</p>

<section class="block">
<h2>How it works</h2>
<p>When a model processes a prompt, it builds internal state for every token. If the next request begins with exactly the same tokens, that work can in principle be reused rather than repeated. Self-hosted serving engines do this with prefix caching on top of memory management techniques such as PagedAttention<sup class="cite"><a href="#ref-5">5</a></sup>, which I cover in <a href="https://asksumanta.com/insights/llm-inference-serving-vllm/">LLM inference serving</a>. Hosted model providers expose the same idea as a pricing and latency feature.</p>
<p>The key word is <strong>prefix</strong>. Caches match from the start of the prompt. Change one token near the beginning and everything after it is a miss.</p>
</section>

<section class="block">
<h2>How the major providers differ</h2>
<table class="tbl">
<thead><tr><th>Provider</th><th>How it's enabled</th><th>What the documentation describes</th></tr></thead>
<tbody>
<tr><td>Anthropic (Claude)</td><td>Explicit cache breakpoints in the request</td><td>A default cache lifetime of five minutes, refreshed on use, with a one-hour option; cache writes cost more than base input and cache reads cost a small fraction of it<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-4">4</a></sup></td></tr>
<tr><td>OpenAI</td><td>Automatic for long enough prompts</td><td>Applies automatically to prompts of 1,024 tokens or more, with hits in 128-token increments and cached tokens reported in the usage data<sup class="cite"><a href="#ref-2">2</a></sup></td></tr>
<tr><td>Google Gemini</td><td>Implicit by default on recent models, or explicit caches</td><td>Implicit caching passes savings through on hits without a guarantee; explicit caching lets you create a cache with a configurable time to live<sup class="cite"><a href="#ref-3">3</a></sup></td></tr>
</tbody>
</table>
<p>Prices, minimum sizes and lifetimes change, and differ by model and by cloud platform. Read the current documentation for the models you actually use, and measure, rather than relying on any table, including this one.</p>
<div class="callout"><p>Explicit caching rewards teams who design for it. Automatic caching rewards teams who happen to have stable prefixes. Either way, prompt structure decides the outcome.</p></div>
</section>

<section class="block">
<h2>Why most teams miss</h2>
<p>The usual culprits are small and easy to fix once you look:</p>
<ul>
<li><strong>A timestamp or request ID at the top</strong> of the system prompt, so every prefix is unique.</li>
<li><strong>The user's name or account details</strong> injected into the system prompt rather than the user turn.</li>
<li><strong>Tool definitions in a different order</strong> on each request, because they're built from an unordered map.</li>
<li><strong>Retrieved documents placed before</strong> the static instructions.</li>
<li><strong>Prompt templates edited constantly</strong>, invalidating caches across all traffic with every deployment.</li>
<li><strong>Traffic too sparse</strong> for the cache lifetime: if a given prefix is used once an hour and the cache lasts minutes, it will rarely hit.</li>
</ul>
</section>

<section class="block">
<h2>The playbook</h2>
<ol>
<li><strong>Order prompts from most stable to least stable.</strong> Static instructions and tool definitions first, then slowly changing reference material, then per-user context, then the request itself.</li>
<li><strong>Make serialisation deterministic.</strong> Sort tool definitions and keys, fix whitespace and formatting, and version templates so the same version always produces the same bytes.</li>
<li><strong>Move volatile values to the end.</strong> Dates, user details and request metadata belong in the final turn, not the system prompt.</li>
<li><strong>Use explicit breakpoints where available</strong>, placing them after the large stable sections. Consider the longer lifetime for traffic that is regular but not constant, and compare the extra write cost with the expected reads<sup class="cite"><a href="#ref-1">1</a></sup>.</li>
<li><strong>Measure hit rates from usage data.</strong> Providers report cached tokens in responses<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-2">2</a></sup><sup class="cite"><a href="#ref-3">3</a></sup>. Record them per route in your gateway alongside cost, as in <a href="https://asksumanta.com/insights/focus-finops-ai-cost-allocation/">FOCUS and AI spend</a>.</li>
<li><strong>Treat prompt changes as cache events.</strong> A template change resets caching for that route. Batch changes and watch cost after deployment.</li>
<li><strong>Route consistently.</strong> If you use several models or regions, send requests with the same prefix to the same destination where possible, so caches have a chance to warm. The same logic applies to replicas in self-hosted serving.</li>
</ol>
</section>

<section class="block">
<h2>Where it pays most</h2>
<ul>
<li><strong>Agents.</strong> Long system prompts and large tool catalogues, repeated across many steps of the same task. Caching often makes multi-step agents economically viable; see <a href="https://asksumanta.com/insights/evaluating-ai-agents-reliability/">evaluating AI agents</a> for keeping them reliable too.</li>
<li><strong>Document question answering.</strong> When users ask several questions about the same long document, cache the document once and vary the question, which pairs well with the approach in <a href="https://asksumanta.com/insights/long-context-vs-rag/">long context or RAG</a>.</li>
<li><strong>Batch processing</strong> with a shared instruction block and many short inputs.</li>
<li><strong>Coding assistants</strong> that resend large amounts of repository context on each turn.</li>
</ul>
<p>It pays least for short prompts, highly personalised prompts and very low traffic, where little is shared or the cache expires between uses.</p>
</section>

<section class="block">
<h2>Caching, routing and the gateway</h2>
<p>Prompt caching interacts with the other cost levers. <a href="https://asksumanta.com/insights/llm-model-routing/">Model routing</a> that sends similar requests to different models can split traffic and lower hit rates on each. Retrieval that returns results in a different order each time defeats caching of the retrieved section. A gateway that owns prompt assembly, routing and measurement in one place is the simplest way to manage these trade-offs, and it's the same gateway that enforces security policies in <a href="https://asksumanta.com/insights/securing-mcp-servers-checklist/">securing MCP servers</a>.</p>
</section>

<section class="block">
<h2>Data protection note</h2>
<p>Caching keeps processed prompt state on the provider's side for a period. For regulated data, check each provider's documentation and your agreements on how cached content is isolated and retained, and whether that is compatible with obligations such as those in <a href="https://asksumanta.com/insights/hipaa-security-rule-proposal-ai-platforms/">the HIPAA Security Rule proposal</a> or Gulf residency rules. For the most sensitive workloads, self-hosted serving with prefix caching keeps the cache inside your own boundary.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I review AI products for cost and latency, from prompt structure and caching to routing and serving, and build the gateway measurements that keep savings visible. See my <a href="https://asksumanta.com/ai-architect/">AI architecture work</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/prompt-caching-llm-cost-latency/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Federated health analytics: how to generate evidence without moving patient data</title><link>https://asksumanta.com/insights/federated-health-analytics-ohdsi/</link><guid isPermaLink="true">https://asksumanta.com/insights/federated-health-analytics-ohdsi/</guid><pubDate>Fri, 23 Oct 2026 08:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>healthcare</category><category>omop</category><category>data</category><category>regulation</category><description>OHDSI network studies run the same analysis at many sites and share only aggregates. How federated health analytics works, where it&#x27;s heading in Europe and the Gulf, and how I design it.</description><content:encoded><![CDATA[<p><em>Health data is increasingly required to stay where it is: inside a hospital, a country or a secure environment. Federated analytics turns that from a blocker into a design principle. The OHDSI network has been doing it at scale for years, and its lessons apply well beyond research.</em></p><p>The traditional way to answer a question across many hospitals was to copy their data into one place. That approach is getting harder every year. Data protection law, health-specific localisation rules, hospital governance and plain institutional caution all push the same way: the data stays where it is.</p>
<p>Federated analytics flips the model. Instead of bringing data to the analysis, you send the analysis to the data, run it locally at each site, and combine only the results.</p>

<section class="block">
<h2>How OHDSI does it</h2>
<p>The OHDSI community is one of the largest working examples. The Book of OHDSI describes a network of more than 100 databases standardised to the OMOP CDM, collectively representing over a billion patient records at the time of writing<sup class="cite"><a href="#ref-1">1</a></sup>. A study becomes a network study when it runs across multiple CDMs at different institutions<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<p>The rules are strict and simple. Each site runs the same study package against its own CDM. A local analyst reviews the outputs before anything leaves, and minimum cell counts suppress small numbers. Only aggregate results such as summary statistics, estimates and diagnostics are shared. In the book's words, OHDSI network studies do not share patient-level data, and patient-level data from different sites is never pooled centrally<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<figure class="fig"><div class="im"><img src="https://asksumanta.com/assets/img/federated-health-analytics-ohdsi/data-journey.webp" alt="Diagram of the journey from patient-level data in source systems to reliable evidence, listing the types of observational data and the types of evidence desired" width="1600" height="1057" loading="lazy"></div><figcaption>The journey from patient-level data to reliable evidence, across many data types and evidence needs. <span class="credit">Source: <a href="https://ohdsi.github.io/TheBookOfOhdsi/OhdsiCommunity.html" target="_blank" rel="noopener">The Book of OHDSI, The OHDSI Community</a> · CC0 1.0</span></figcaption></figure>
</section>

<section class="block">
<h2>Why it works: standardise first</h2>
<p>Federation only works if the same code means the same thing everywhere. That is why OHDSI insists on the CDM and its <a href="https://asksumanta.com/insights/clinical-terminologies-omop-vocabularies/">standardised vocabularies</a>. The book is explicit about the design shift this requires: you are building a study package to run at sites whose data you will never see, so concept sets must be exhaustive rather than tuned to your own data, and code must be parameterised for different database platforms<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<p>The same discipline shows up in <a href="https://asksumanta.com/insights/omop-cohort-definitions/">cohort definitions</a>: definitions are portable, versioned artefacts, not local SQL.</p>
<div class="callout"><p>Federation moves the hard work from data transfer agreements to data standardisation. That's a better trade: standardisation compounds, while every transfer agreement starts from zero.</p></div>
</section>

<section class="block">
<h2>The operational reality</h2>
<p>The book is candid that network studies take real coordination. Site start-up can involve ethics approvals, database permissions, configuring an analysis environment, reviewing study code and getting dependencies installed within local IT constraints<sup class="cite"><a href="#ref-1">1</a></sup>. Data quality varies between sites, and study leads may review quality reports or run checks to understand variation<sup class="cite"><a href="#ref-1">1</a></sup>. It also notes that much of the process has been manual, with the community working to systematise it<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<p>In practice, the technical parts are rarely what slows a network down. Governance, trust and site capacity are. Architecture can help by making each site's job as small and predictable as possible.</p>
</section>

<section class="block">
<h2>Where regulation is heading</h2>
<p><strong>Europe.</strong> The European Health Data Space regulation, Regulation (EU) 2025/327, was published in March 2025 and sets up a framework for secondary use of health data for purposes such as research, innovation and public health<sup class="cite"><a href="#ref-3">3</a></sup>. Commentary notes that secondary use of personal electronic health data is to take place within secure processing environments, with health data access bodies handling permits<sup class="cite"><a href="#ref-3">3</a></sup><sup class="cite"><a href="#ref-4">4</a></sup>. Check the regulation for application dates, which are phased.</p>
<p><strong>The Gulf.</strong> The UAE's health data law restricts storing and processing health data outside the country unless an exception applies, with research among the circumstances commentary describes<sup class="cite"><a href="#ref-5">5</a></sup>; I cover the detail in <a href="https://asksumanta.com/insights/uae-health-data-law-localisation/">UAE health data localisation</a>. Saudi Arabia's transfer rules add their own conditions, as in <a href="https://asksumanta.com/insights/saudi-pdpl-cross-border-ai/">Saudi PDPL and cross-border AI</a>.</p>
<p>Different regimes, same direction: analysis has to go to the data, or to a controlled environment, rather than data going wherever analysts happen to be.</p>
</section>

<section class="block">
<h2>The architecture I use</h2>
<ol>
<li><strong>A standard node.</strong> Each site gets the same deployable stack: an OMOP CDM, vocabularies, data quality tooling as in <a href="https://asksumanta.com/insights/omop-data-quality-checks/">OMOP data quality checks</a>, and an analysis runtime. Infrastructure as code makes new sites predictable.</li>
<li><strong>Signed, reviewed study packages.</strong> Analyses arrive as versioned packages, reviewed and approved before they run, never as ad hoc queries.</li>
<li><strong>Output controls at the edge.</strong> Minimum cell counts, automated disclosure checks and a human review step before results leave the site.</li>
<li><strong>A coordination layer that never sees patient data</strong>: study registry, package distribution, results collection and audit trail.</li>
<li><strong>Monitoring of the network itself</strong>: which sites are current on CDM and vocabulary versions, data quality status, and study participation.</li>
</ol>
</section>

<section class="block">
<h2>And AI?</h2>
<p>Federated approaches extend to model development: training or evaluating models site by site and sharing parameters or metrics rather than data. The same principles apply, with more care, because model outputs can leak information in ways summary statistics usually don't. At minimum, I'd use federation for <strong>external validation</strong>: testing a model built at one site against many others before anyone claims it generalises. That is where a lot of clinical AI falls short, and a network makes it routine.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design federated health data platforms and OMOP networks, from the standard site node to governance and results pipelines, for research groups, health systems and life sciences companies in the US, Europe and the Gulf. See <a href="https://asksumanta.com/healthcare-data-architecture/">healthcare data architecture</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/federated-health-analytics-ohdsi/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Long context or RAG? What the research says about very large context windows</title><link>https://asksumanta.com/insights/long-context-vs-rag/</link><guid isPermaLink="true">https://asksumanta.com/insights/long-context-vs-rag/</guid><pubDate>Fri, 23 Oct 2026 04:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>ai</category><category>rag</category><category>llm</category><category>platform</category><description>Million-token context windows tempt teams to skip retrieval. Research on lost-in-the-middle, RULER and context rot shows why that&#x27;s risky, and how I combine long context with RAG.</description><content:encoded><![CDATA[<p><em>Context windows have grown from a few thousand tokens to hundreds of thousands and more. It&#x27;s tempting to stop building retrieval and just put everything in the prompt. The research suggests that bigger windows change the trade-offs, but don&#x27;t remove them.</em></p><p>Every few months a model ships with a bigger context window, and the same question comes up: do we still need retrieval? If the model can read the whole policy manual, the full contract set or a year of support tickets in one go, why maintain chunking, embeddings, indexes and ranking at all?</p>
<p>It's a fair question, and for some workloads the answer really is "less than before". But the research on how models use long inputs is consistent enough that I don't treat a large window as a substitute for deciding what the model should read.</p>

<section class="block">
<h2>Three findings worth knowing</h2>
<p><strong>Position matters.</strong> In "Lost in the Middle", Liu and colleagues studied how models use long inputs in tasks such as multi-document question answering. Performance was often highest when the relevant information appeared at the beginning or end of the context and dropped when it was in the middle<sup class="cite"><a href="#ref-1">1</a></sup>. A later survey of long-context modelling describes this as a U-shaped curve<sup class="cite"><a href="#ref-5">5</a></sup>. The practical implication: where a fact sits in a long prompt can change whether it's used.</p>
<p><strong>Advertised windows overstate useful windows.</strong> NVIDIA's RULER benchmark extended simple needle-in-a-haystack tests with harder tasks such as multi-hop tracing and aggregation. Models that scored almost perfectly on the simple test showed large drops as context length grew, and the authors report that many models fell below their quality threshold well before reaching their claimed context lengths<sup class="cite"><a href="#ref-2">2</a></sup>. Finding one sentence in a haystack is a much easier job than reasoning across a long document.</p>
<p><strong>Longer inputs degrade reliability.</strong> Chroma's 2025 "Context Rot" report tested 18 models, including several frontier models, on deliberately simple tasks, keeping difficulty constant while increasing input length. Performance grew increasingly unreliable as input grew, and models didn't use their context uniformly<sup class="cite"><a href="#ref-3">3</a></sup>. The authors note that real tasks are more complex, so the effect may be larger in practice, and they published their code for replication<sup class="cite"><a href="#ref-3">3</a></sup><sup class="cite"><a href="#ref-4">4</a></sup>.</p>
<div class="callout"><p>A model that can accept a million tokens has not promised to use all of them equally well. Capacity and attention are different things.</p></div>
</section>

<section class="block">
<h2>The other costs of stuffing the context</h2>
<p>Quality isn't the only issue. Every token in the prompt costs money and adds latency on every request, unless the same prefix is cached and reused, which I cover in <a href="https://asksumanta.com/insights/llm-inference-serving-vllm/">LLM inference serving</a>. Long prompts are also harder to debug: when an answer is wrong, it is much harder to tell which of 200 pages misled the model than which of five retrieved passages did.</p>
<p>There's a governance cost too. Retrieval enforces access control naturally: you only fetch documents the user is allowed to see. "Put everything in the prompt" either ignores permissions or rebuilds them in a less tested way. For regulated data, that alone usually settles the question, as discussed in <a href="https://asksumanta.com/insights/hipaa-security-rule-proposal-ai-platforms/">the HIPAA Security Rule proposal</a> and <a href="https://asksumanta.com/insights/uae-health-data-law-localisation/">UAE health data localisation</a>.</p>
</section>

<section class="block">
<h2>When long context genuinely helps</h2>
<p>None of this means long context is a gimmick. It changes what good retrieval looks like:</p>
<ul>
<li><strong>Bigger, more coherent chunks.</strong> Instead of 300-token fragments, retrieve whole sections or whole documents, so the model sees definitions and exceptions alongside the rule.</li>
<li><strong>Single-document deep work.</strong> Reviewing one contract, one codebase module or one patient record against a checklist is a good fit, especially with the most important material placed at the start or end.</li>
<li><strong>Fewer retrieval misses.</strong> A wider net for recall, followed by a model that reads more candidates, can beat aggressive filtering that drops the right passage.</li>
<li><strong>Stable reference material.</strong> Long, unchanging context such as a policy manual or schema can be cached as a prefix and reused across requests.</li>
</ul>
</section>

<section class="block">
<h2>How I design it: retrieve, then read generously</h2>
<table class="tbl">
<thead><tr><th>Workload</th><th>Approach</th></tr></thead>
<tbody>
<tr><td>Questions over a large, changing corpus</td><td>RAG with larger chunks and reranking; long context only for the top results</td></tr>
<tr><td>Analysis of one long document</td><td>Long context, with key instructions and questions at the start and end</td></tr>
<tr><td>Whole-corpus themes and patterns</td><td>Neither alone; consider <a href="https://asksumanta.com/insights/graphrag-when-it-beats-vector-rag/">GraphRAG</a> or map-reduce summarisation</td></tr>
<tr><td>Facts about known entities</td><td>Query a governed <a href="https://asksumanta.com/insights/ontology-vs-knowledge-graph-vs-semantic-layer/">knowledge graph</a>, then explain with the model</td></tr>
<tr><td>Agents working over many steps</td><td>Keep working context small; summarise and store state rather than accumulating everything</td></tr>
</tbody>
</table>
<p>The common thread is what is now called context engineering: deciding deliberately what goes into the window, in what order, and what stays out. Retrieval, ranking, summarisation and memory are all tools for that decision. A large window gives you more room to be generous; it doesn't remove the need to choose.</p>
</section>

<section class="block">
<h2>Test it on your own data</h2>
<p>Published benchmarks tell you the direction of the effect, not its size for your documents. Before choosing an approach, I run a simple comparison on the client's own evaluation set, as described in <a href="https://asksumanta.com/insights/llm-evaluation-sets-that-predict-production/">evaluation sets that predict production</a>:</p>
<ol>
<li><strong>Baseline RAG</strong> with the current chunking and top-k.</li>
<li><strong>RAG with larger chunks and more results</strong>, using the long window to read more.</li>
<li><strong>Full-document long context</strong> for the subset of questions where it is feasible.</li>
<li><strong>Position tests:</strong> the same answer-bearing passage placed at the start, middle and end of the context.</li>
</ol>
<p>Measure accuracy, citation correctness, latency and cost per answer for each. The result is usually a hybrid, and the numbers make the case to stakeholders far better than any article, including this one.</p>
</section>

<section class="block">
<h2>The bottom line</h2>
<p>Bigger context windows are a genuine improvement. They make retrieval more forgiving, enable new single-document workflows and reduce some engineering effort. But the evidence on position effects, effective context length and degradation with input size means the most reliable systems still choose what the model reads. Treat the window as a budget to spend well, not a bucket to fill.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design retrieval and context strategies for AI products, from chunking and ranking to long-context workflows, and test them against real data before they ship. See my <a href="https://asksumanta.com/ai-architect/">AI architecture work</a> and <a href="https://asksumanta.com/insights/rag-to-production-checklist/">the RAG to production checklist</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/long-context-vs-rag/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>ISO/IEC 42001 or the NIST AI RMF? How to choose, and how to use both</title><link>https://asksumanta.com/insights/iso-42001-vs-nist-ai-rmf/</link><guid isPermaLink="true">https://asksumanta.com/insights/iso-42001-vs-nist-ai-rmf/</guid><pubDate>Fri, 23 Oct 2026 00:30:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>governance</category><category>regulation</category><category>ai</category><category>security</category><description>NIST&#x27;s AI RMF is a voluntary method; ISO/IEC 42001 is a certifiable management system. How they differ, how they fit together, and how I&#x27;d sequence them for an AI company.</description><content:encoded><![CDATA[<p><em>Enterprise buyers increasingly ask AI vendors how they govern their AI. Two frameworks come up most: the NIST AI Risk Management Framework and ISO/IEC 42001. They solve different problems, and most companies will end up using both.</em></p><p>The security questionnaire used to ask about SOC 2. Now it often has a section on AI: how do you identify AI risks, who approves new models, how do you monitor them? Two frameworks dominate the answers, and they are often presented as alternatives. They aren't.</p>

<section class="block">
<h2>Two different kinds of thing</h2>
<table class="tbl">
<thead><tr><th></th><th>NIST AI RMF</th><th>ISO/IEC 42001</th></tr></thead>
<tbody>
<tr><td>What it is</td><td>A voluntary framework for managing AI risk</td><td>A standard for an AI management system</td></tr>
<tr><td>Structure</td><td>Four functions: govern, map, measure, manage<sup class="cite"><a href="#ref-1">1</a></sup></td><td>Management system clauses plus AI-specific controls<sup class="cite"><a href="#ref-2">2</a></sup></td></tr>
<tr><td>Certification</td><td>None; you use it</td><td>Certifiable by accredited bodies</td></tr>
<tr><td>Strength</td><td>Practical risk thinking across the AI lifecycle</td><td>Repeatable governance with audit and continual improvement</td></tr>
<tr><td>Typical audience</td><td>Internal teams, US government and buyers</td><td>Enterprise customers and international markets wanting assurance</td></tr>
</tbody>
</table>
<p>A common way to put it: the NIST framework is something you use, while ISO/IEC 42001 is something you certify against<sup class="cite"><a href="#ref-4">4</a></sup>. Commentators note that ISO's management-system elements, such as internal audit, management review and continual improvement, have no direct equivalent in the NIST framework<sup class="cite"><a href="#ref-3">3</a></sup>.</p>
</section>

<section class="block">
<h2>They map onto each other</h2>
<p>NIST's AI Resource Center hosts a crosswalk between the AI RMF and ISO/IEC 42001. Commentators point out that it was contributed by the community rather than written by NIST, and that inclusion doesn't imply endorsement<sup class="cite"><a href="#ref-3">3</a></sup><sup class="cite"><a href="#ref-5">5</a></sup>. Informally, the four NIST functions line up with ISO's leadership and policy, context and impact assessment, monitoring, and review and improvement activities<sup class="cite"><a href="#ref-3">3</a></sup>. Treat such mappings as starting points rather than proof of coverage.</p>
<div class="callout"><p>Use NIST to decide what to do about AI risk. Use ISO/IEC 42001 to prove you do it consistently. They answer different questions.</p></div>
</section>

<section class="block">
<h2>How I'd sequence them</h2>
<ol>
<li><strong>Start with an AI system register.</strong> Every framework, and every regulation, begins with knowing which AI systems you have, what they do and who owns them.</li>
<li><strong>Apply the NIST functions to your highest-risk systems first.</strong> Map context and impacts, measure with real evaluations, manage with controls and incident response.</li>
<li><strong>Build the evidence as you go</strong>: evaluation results, approval records, incident postmortems, training records. These are what auditors and customers ask for.</li>
<li><strong>Add the management system</strong> when customers or markets ask for certification: policy, roles, internal audit, management review.</li>
<li><strong>Map once to many.</strong> The same controls support the <a href="https://asksumanta.com/insights/eu-ai-act-digital-omnibus-roadmap/">EU AI Act</a>, <a href="https://asksumanta.com/insights/soc2-for-ai-startups/">SOC 2</a> and Gulf regimes such as <a href="https://asksumanta.com/insights/difc-regulation-10-ai-systems/">DIFC Regulation 10</a>.</li>
</ol>
</section>

<section class="block">
<h2>Where engineering carries the load</h2>
<p>Frameworks fail when they live only in documents. The controls that hold up in an audit are the ones built into systems: a model gateway that enforces approved models and logs every call, evaluation pipelines that gate releases as in <a href="https://asksumanta.com/insights/evaluating-ai-agents-reliability/">evaluating AI agents</a>, incident handling as in <a href="https://asksumanta.com/insights/ai-incident-postmortems/">AI incident postmortems</a>, and role-based training as in <a href="https://asksumanta.com/insights/eu-ai-act-ai-literacy-article-4/">AI literacy</a>. Build those and the paperwork follows; write the paperwork alone and it drifts from reality within months.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I help AI companies build governance that satisfies enterprise buyers and regulators, with the controls engineered into the platform. As a <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a> I can own the programme. Or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/iso-42001-vs-nist-ai-rmf/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>OpenTelemetry is deprecating the Span Events API: what to change, and when</title><link>https://asksumanta.com/insights/opentelemetry-span-events-deprecation/</link><guid isPermaLink="true">https://asksumanta.com/insights/opentelemetry-span-events-deprecation/</guid><pubDate>Fri, 23 Oct 2026 00:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>observability</category><category>opentelemetry</category><category>platform</category><description>OpenTelemetry is moving events from span events to log-based events. What the deprecation means for instrumentation, dashboards and AI telemetry, and how I&#x27;d prepare.</description><content:encoded><![CDATA[<p><em>For years there were two ways to record an event in OpenTelemetry. The project has chosen one: events are logs with names, correlated with traces. Existing data keeps working, but new instrumentation should change direction.</em></p><p>If you have instrumented code with OpenTelemetry, you have probably called <code>Span.AddEvent</code> or <code>Span.RecordException</code>. In March 2026 the project announced it is deprecating that API. New events should be emitted as logs, correlated with the active span through context<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<p>It sounds like a small API change. For platform teams it touches instrumentation guidelines, dashboards, cost and, increasingly, AI telemetry.</p>

<section class="block">
<h2>Why the change</h2>
<p>OpenTelemetry has offered two ways to emit events correlated with traces: span events via the Tracing API, and log-based events via the Logs API<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-3">3</a></sup><sup class="cite"><a href="#ref-4">4</a></sup>. The announcement lists the problems with having both: split guidance for library authors, duplicate concepts for operators, and slower evolution because every improvement had to be specified twice<sup class="cite"><a href="#ref-1">1</a></sup>. The community has converged on a simpler model: <strong>events are logs with names</strong>, emitted via the Logs API and correlated through context, a direction set out in an earlier post on logging<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-2">2</a></sup>.</p>
</section>

<section class="block">
<h2>What changes and what doesn't</h2>
<table class="tbl">
<thead><tr><th>Changing</th><th>Staying the same</th></tr></thead>
<tbody>
<tr><td>Span event APIs such as <code>AddEvent</code> and <code>RecordException</code> are deprecated in the tracing specification</td><td>Existing span event data remains valid in the OTLP trace model</td></tr>
<tr><td>SDKs make log-based events first-class</td><td>Correlation across signals works the same way</td></tr>
<tr><td>Instrumentations and semantic conventions move to log-based events in their next major versions</td><td>Compatibility options can still show events on spans</td></tr>
</tbody>
</table>
<p>As the authors put it, they are deprecating the API for recording span events, not the ability to see events attached to spans<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<div class="callout"><p>The practical risk isn't broken code. It's a dashboard or alert that quietly stops showing exceptions because they now arrive as logs instead of span events.</p></div>
</section>

<section class="block">
<h2>What I'd do now</h2>
<ol>
<li><strong>Update instrumentation guidelines.</strong> New code emits events and exceptions as log-based events correlated with the current span.</li>
<li><strong>Check the logs pipeline.</strong> If logs aren't collected through OpenTelemetry yet, events will have nowhere to go. A Collector gateway, as in <a href="https://asksumanta.com/insights/opentelemetry-collector-deployment-patterns/">Collector deployment patterns</a>, is the natural place to route them.</li>
<li><strong>Audit dashboards and alerts</strong> that depend on span events, especially exception counts and error views, and test them after each instrumentation upgrade, as the project recommends<sup class="cite"><a href="#ref-1">1</a></sup>.</li>
<li><strong>Confirm backend support</strong> for showing log-based events in trace views, so engineers don't lose context when debugging.</li>
<li><strong>Watch costs.</strong> Moving events to the logs pipeline may change how they are priced and retained by your vendor. Model it before the switch.</li>
</ol>
</section>

<section class="block">
<h2>Why this matters for AI telemetry</h2>
<p>AI applications produce a lot of event-like data: prompts, responses, tool calls, guardrail decisions. Treating these as named, structured log events correlated with traces fits the GenAI observability work described in <a href="https://asksumanta.com/insights/llm-observability-opentelemetry-genai/">LLM observability with OpenTelemetry</a>. It also makes it easier to apply separate retention, redaction and access rules to sensitive content than when it is embedded in spans.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design observability platforms on OpenTelemetry and help teams plan migrations like this one without losing visibility. As a <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a> I can own that roadmap. Or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/opentelemetry-span-events-deprecation/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Clinical terminologies explained: SNOMED, LOINC, RxNorm and the OMOP vocabularies</title><link>https://asksumanta.com/insights/clinical-terminologies-omop-vocabularies/</link><guid isPermaLink="true">https://asksumanta.com/insights/clinical-terminologies-omop-vocabularies/</guid><pubDate>Thu, 22 Oct 2026 20:30:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>healthcare</category><category>omop</category><category>ontology</category><category>data</category><description>Healthcare data speaks many coding systems. How SNOMED CT, LOINC, RxNorm and ICD relate, how the OMOP Standardized Vocabularies unify them, and why this matters for health AI.</description><content:encoded><![CDATA[<p><em>The same diagnosis can arrive as an ICD code, a SNOMED concept, a Read code or free text. Any serious health data or AI platform has to reconcile them. The OMOP Standardized Vocabularies are one of the most practical ways to do it.</em></p><p>Healthcare has never had a single language. Hospitals bill in one coding system, record diagnoses in another, report lab results in a third and prescribe in a fourth. Countries add their own variants. Anyone building analytics, research or AI on health data meets this problem in the first week, and it is fundamentally an ontology problem.</p>

<section class="block">
<h2>The main terminologies</h2>
<table class="tbl">
<thead><tr><th>Terminology</th><th>Used mainly for</th><th>Typical role in analytics</th></tr></thead>
<tbody>
<tr><td>SNOMED CT</td><td>Clinical findings, conditions, procedures</td><td>Rich hierarchy for clinical meaning</td></tr>
<tr><td>ICD-9/ICD-10 and national variants</td><td>Diagnoses for billing and statistics</td><td>Common in source data; often mapped to SNOMED</td></tr>
<tr><td>LOINC</td><td>Laboratory tests and observations</td><td>Identifies what was measured</td></tr>
<tr><td>RxNorm</td><td>Medications</td><td>Normalised drugs, ingredients and doses</td></tr>
<tr><td>CPT4, HCPCS and others</td><td>Procedures and services</td><td>Common in US claims data</td></tr>
</tbody>
</table>
<p>Medical vocabularies go back centuries; The Book of OHDSI starts with London's Bills of Mortality. Over time each country, system and institution tended to develop its own, which is exactly what makes interoperability and multi-site research hard<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
</section>

<section class="block">
<h2>How OMOP unifies them</h2>
<p>The OMOP Standardized Vocabularies consolidate many vocabularies into one common format, refreshed regularly by the OHDSI vocabulary team, and they are mandatory reference tables for every OMOP CDM instance<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-3">3</a></sup>. Organisations download them from ATHENA, which also offers search across vocabularies; proprietary vocabularies require a licence<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-2">2</a></sup>.</p>
<p>The key idea is the <strong>standard concept</strong>. For each clinical meaning, one concept is designated standard and used to record data. The book's example: codes in MeSH, CIEL, SNOMED, ICD-9-CM and Read all describe atrial fibrillation, but only the SNOMED concept is standard; the others are source concepts mapped to it<sup class="cite"><a href="#ref-1">1</a></sup>. Classification concepts, such as MedDRA terms, take part in hierarchies for querying but aren't used to record data<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<figure class="fig"><div class="im"><img src="https://asksumanta.com/assets/img/clinical-terminologies-omop-vocabularies/hierarchy.webp" alt="Diagram of standard, non-standard source and classification concepts and their hierarchical relationships in the condition domain" width="1600" height="854" loading="lazy"></div><figcaption>Standard, source and classification concepts in the condition domain: source codes map to standard SNOMED concepts, which sit in a hierarchy with classification concepts. <span class="credit">Source: <a href="https://ohdsi.github.io/TheBookOfOhdsi/StandardizedVocabularies.html" target="_blank" rel="noopener">The Book of OHDSI, Standardized Vocabularies</a> · CC0 1.0</span></figcaption></figure>
<p>Standard designation is decided per domain, not per vocabulary: conditions mainly use SNOMED, measurements SNOMED and LOINC, drugs RxNorm, RxNorm Extension and CVX<sup class="cite"><a href="#ref-1">1</a></sup>. In the book's words, there is no such thing as a "standard vocabulary".</p>
</section>

<section class="block">
<h2>Domains are messier than they look</h2>
<p>Every concept is assigned a domain, such as condition, drug, procedure or measurement, which decides which CDM table it lands in. Source vocabularies often mix domains; the book shows that procedure vocabularies like CPT4 and HCPCS contain concepts from several domains<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<figure class="fig"><div class="im"><img src="https://asksumanta.com/assets/img/clinical-terminologies-omop-vocabularies/domains.webp" alt="Chart showing domain assignment of concepts in the CPT4 and HCPCS vocabularies, which contain a mix of procedure, measurement, drug, device and other domains" width="1200" height="1167" loading="lazy"></div><figcaption>Domain assignment in CPT4 and HCPCS: vocabularies you'd expect to hold procedures contain many other domains too. <span class="credit">Source: <a href="https://ohdsi.github.io/TheBookOfOhdsi/StandardizedVocabularies.html" target="_blank" rel="noopener">The Book of OHDSI, Standardized Vocabularies</a> · CC0 1.0</span></figcaption></figure>
<div class="callout"><p>Mapping isn't a one-off ETL task. Vocabularies change, concepts are deprecated and remapped, and every refresh can shift results. Version the vocabulary like any other dependency.</p></div>
</section>

<section class="block">
<h2>Why this matters for health AI</h2>
<ul>
<li><strong>Features and cohorts depend on it.</strong> A model trained on "diabetes" is only as good as the concept set behind it, as in <a href="https://asksumanta.com/insights/omop-cohort-definitions/">OMOP cohort definitions</a>.</li>
<li><strong>Portability depends on it.</strong> A model built on standard concepts can be validated at another site; one built on local codes usually can't.</li>
<li><strong>LLMs need grounding.</strong> Language models are good at suggesting codes and poor at being reliably right. Constrain them to look up concepts in the vocabulary rather than generate codes from memory, and validate outputs, in the spirit of <a href="https://asksumanta.com/insights/shacl-validation-knowledge-graphs/">SHACL validation for knowledge graphs</a>.</li>
<li><strong>Hierarchies enable better questions.</strong> Querying all descendants of a concept finds patients that a flat code list would miss.</li>
</ul>
<p>For the architecture around the vocabularies, see <a href="https://asksumanta.com/insights/fhir-to-omop-architecture/">FHIR to OMOP</a> and <a href="https://asksumanta.com/insights/omop-data-quality-checks/">OMOP data quality checks</a>.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design health data platforms with terminology and mapping at their core, from OMOP vocabularies to ontologies that make health data usable for AI. See <a href="https://asksumanta.com/healthcare-data-architecture/">healthcare data architecture</a> and <a href="https://asksumanta.com/ontology-knowledge-graph/">ontology and knowledge graphs</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/clinical-terminologies-omop-vocabularies/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Kubernetes admission policies in CEL: a playbook for retiring your webhooks</title><link>https://asksumanta.com/insights/kubernetes-admission-policies-cel/</link><guid isPermaLink="true">https://asksumanta.com/insights/kubernetes-admission-policies-cel/</guid><pubDate>Thu, 22 Oct 2026 20:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>kubernetes</category><category>security</category><category>platform</category><category>governance</category><description>ValidatingAdmissionPolicy is GA and MutatingAdmissionPolicy reached stable in v1.36. How CEL policies replace admission webhooks, and how I migrate cluster guardrails safely.</description><content:encoded><![CDATA[<p><em>Admission webhooks have guarded Kubernetes clusters for years, at the cost of extra services that can slow or break the API server. Kubernetes now has built-in, declarative alternatives for both validation and mutation.</em></p><p>Every mature Kubernetes platform ends up with guardrails: containers must not run as root, images must come from approved registries, every workload needs an owner label, and some defaults should be injected automatically. For years the standard way to enforce them was admission webhooks, separate services the API server calls on every relevant request. They work, but they're more infrastructure to run, they add latency, and a failing webhook can block deployments across a cluster.</p>

<section class="block">
<h2>Built-in policies, in CEL</h2>
<p><strong>ValidatingAdmissionPolicy</strong> reached general availability in Kubernetes 1.30. It lets you express validation rules declaratively in Common Expression Language (CEL), evaluated inside the API server, as an alternative to validating webhooks<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-2">2</a></sup>. The GA announcement walks through replacing a webhook that enforces least-privilege security context settings with an equivalent policy<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<p><strong>MutatingAdmissionPolicy</strong> does the same for changes. The documentation describes it as a declarative, in-process alternative to mutating webhooks, with mutations defined as an apply configuration merged using server-side apply rules, or as a JSON patch<sup class="cite"><a href="#ref-3">3</a></sup>. The feature gate list shows it moving through alpha and beta to stable in v1.36<sup class="cite"><a href="#ref-4">4</a></sup>.</p>
<p>A policy is made of a policy resource, a binding that scopes where it applies, and optional parameters, so one policy can be reused with different settings per namespace or environment<sup class="cite"><a href="#ref-2">2</a></sup><sup class="cite"><a href="#ref-3">3</a></sup>.</p>
</section>

<section class="block">
<h2>Webhooks, built-in policies, or a policy engine</h2>
<table class="tbl">
<thead><tr><th></th><th>Built-in CEL policies</th><th>Webhooks or policy engines</th></tr></thead>
<tbody>
<tr><td>Runs where</td><td>Inside the API server</td><td>Separate services the API server calls</td></tr>
<tr><td>Failure mode</td><td>No extra service to go down</td><td>Webhook outages can block or slow admission</td></tr>
<tr><td>Logic</td><td>CEL expressions over the request and parameters</td><td>Arbitrary code or rich policy languages</td></tr>
<tr><td>External calls</td><td>Not designed for them</td><td>Possible, for example image signature checks</td></tr>
<tr><td>Reporting</td><td>Basic</td><td>Often richer reports and policy libraries</td></tr>
</tbody>
</table>
<p>My rule of thumb: simple, high-volume guardrails move to built-in policies; checks that need external data or rich reporting stay in a policy engine.</p>
</section>

<section class="block">
<h2>The migration playbook</h2>
<ol>
<li><strong>Inventory webhooks</strong> and policies across clusters, including those installed by vendor charts, with their failure policies and timeouts.</li>
<li><strong>Classify each rule</strong>: expressible in CEL, needs external data, or needs complex logic.</li>
<li><strong>Write CEL equivalents</strong> for the first group, with test cases for allowed and rejected objects, kept in version control alongside your platform code.</li>
<li><strong>Roll out in audit or warn mode first</strong>, comparing results with the existing webhook before switching to deny.</li>
<li><strong>Use parameters and bindings</strong> to vary settings per environment instead of copying policies.</li>
<li><strong>Remove the old webhook</strong> only after the policy has matched its decisions in production for a period.</li>
</ol>
<div class="callout"><p>Every webhook you retire is one less service that can take down deployments at 2am. That operational simplicity is the main benefit, more than any feature.</p></div>
</section>

<section class="block">
<h2>Guardrails worth having on AI clusters</h2>
<ul>
<li>GPU workloads must declare an owner, cost centre and priority class, so costs and preemption are traceable, supporting <a href="https://asksumanta.com/insights/focus-finops-ai-cost-allocation/">AI cost allocation</a>.</li>
<li>Model-serving pods must not run privileged and must come from approved registries.</li>
<li>Namespaces holding regulated data must carry labels that other controls depend on, such as region or data class, as in <a href="https://asksumanta.com/insights/uae-health-data-law-localisation/">UAE health data localisation</a>.</li>
<li>Training jobs must use the queueing and scheduling setup in <a href="https://asksumanta.com/insights/kubernetes-gang-scheduling-ai/">Kubernetes gang scheduling</a> rather than bypassing it.</li>
</ul>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design Kubernetes platforms with guardrails that are simple to operate, and review cluster security in <a href="https://asksumanta.com/technical-due-diligence/">technical due diligence</a>. As a <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a> I can own the platform roadmap. Or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/kubernetes-admission-policies-cel/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Team Topologies for AI: where your AI engineers should actually sit</title><link>https://asksumanta.com/insights/team-topologies-for-ai-teams/</link><guid isPermaLink="true">https://asksumanta.com/insights/team-topologies-for-ai-teams/</guid><pubDate>Thu, 22 Oct 2026 16:30:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>leadership</category><category>ai</category><category>platform</category><category>strategy</category><description>Should AI engineers form a central team or join product teams? How I use Team Topologies&#x27; team types and interaction modes to organise AI work as a fractional CTO.</description><content:encoded><![CDATA[<p><em>Most companies building with AI eventually ask the same question: central AI team, or AI engineers in every product team? Team Topologies offers a better answer than either extreme.</em></p><p>The first AI hire is easy. By the fifth, someone usually asks where they should sit. One option is a central AI team that builds everything; it becomes a bottleneck and a queue. The other scatters AI engineers across product teams; each one reinvents model access, evaluation and guardrails, and nobody owns the shared risks. Neither works for long.</p>

<section class="block">
<h2>A useful vocabulary</h2>
<p>Team Topologies, the framework from Matthew Skelton and Manuel Pais, describes four team types<sup class="cite"><a href="#ref-1">1</a></sup>:</p>
<ul>
<li><strong>Stream-aligned</strong> teams deliver value along a flow of work, usually a product or customer journey.</li>
<li><strong>Platform</strong> teams provide internal services that reduce the load on others.</li>
<li><strong>Enabling</strong> teams help other teams build new capabilities, for a limited time, then move on.</li>
<li><strong>Complicated-subsystem</strong> teams own parts that need deep specialist knowledge.</li>
</ul>
<p>And three ways for teams to interact: <strong>collaboration</strong>, working closely towards a shared goal, mainly during discovery; <strong>X-as-a-Service</strong>, consuming what another team provides with minimal coordination; and <strong>facilitating</strong>, one team helping another learn<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-2">2</a></sup>. Interactions that fit none of these are often a sign that team boundaries are drawn badly<sup class="cite"><a href="#ref-2">2</a></sup>.</p>
</section>

<section class="block">
<h2>How I map AI work onto it</h2>
<table class="tbl">
<thead><tr><th>AI work</th><th>Team type</th><th>Why</th></tr></thead>
<tbody>
<tr><td>AI features in a product</td><td>Stream-aligned</td><td>The team that owns the journey owns the AI in it, including its quality</td></tr>
<tr><td>Model gateway, evaluation tooling, observability, GPU capacity</td><td>Platform</td><td>Shared once, consumed as a service by every product team</td></tr>
<tr><td>Teaching teams to build, evaluate and secure AI features</td><td>Enabling</td><td>Time-boxed help that leaves capability behind</td></tr>
<tr><td>Custom models, fine-tuning, a governed ontology</td><td>Complicated-subsystem</td><td>Genuinely specialist work that product teams shouldn't carry</td></tr>
</tbody>
</table>
<div class="callout"><p>The question isn't "central or embedded". It's which AI work is product work, which is platform work, and which is temporary teaching.</p></div>
</section>

<section class="block">
<h2>Interaction modes over time</h2>
<p>The modes should change as capability matures. Early on, an AI platform or enabling team collaborates closely with one or two product teams to discover what's needed. Once patterns stabilise, the platform offers them as a service: an approved gateway, evaluation pipelines, templates. Enabling help moves on to the next team. If a product team still needs constant hand-holding a year later, the platform's interfaces are probably the problem, which is exactly what the <a href="https://asksumanta.com/insights/platform-engineering-maturity/">platform engineering maturity model</a> helps diagnose.</p>
</section>

<section class="block">
<h2>Conway's law applies to AI too</h2>
<p>Melvin Conway observed in 1968 that organisations design systems that mirror their own communication structures<sup class="cite"><a href="#ref-3">3</a></sup>. In AI, the effect is easy to spot: a central AI team produces a central AI service that every product must queue for; fully scattered teams produce five slightly different gateways and no shared evaluation. Design the team structure you want the architecture to reflect.</p>
</section>

<section class="block">
<h2>What I put in place first</h2>
<ol>
<li><strong>Name owners for AI features</strong> in each product team, including their evaluation and incident handling.</li>
<li><strong>Create a small AI platform capability</strong> for the gateway, evaluation and observability, run as a product with internal users; see <a href="https://asksumanta.com/insights/llm-model-routing/">LLM model routing</a> and <a href="https://asksumanta.com/insights/focus-finops-ai-cost-allocation/">AI cost allocation</a> for what typically lives there.</li>
<li><strong>Time-box enabling work</strong>, with explicit exit criteria for each team supported.</li>
<li><strong>Declare interaction modes</strong> between teams, so expectations are clear and revisited.</li>
<li><strong>Record the design</strong> as an <a href="https://asksumanta.com/insights/architecture-decision-records-fractional-cto/">architecture decision record</a> and revisit it each half year.</li>
</ol>
</section>

<section class="block">
<h2>How I can help</h2>
<p>As a <a href="https://asksumanta.com/fractional-cto/">fractional CTO</a>, I help companies organise teams and architecture together, so AI work scales without bottlenecks or duplication. Or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/team-topologies-for-ai-teams/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>pgvector or a dedicated vector database? How I decide for RAG and search</title><link>https://asksumanta.com/insights/pgvector-or-vector-database/</link><guid isPermaLink="true">https://asksumanta.com/insights/pgvector-or-vector-database/</guid><pubDate>Thu, 22 Oct 2026 16:15:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>data</category><category>rag</category><category>ai</category><category>platform</category><description>Postgres with pgvector handles more vector search than many teams expect. What pgvector 0.8 changed for filtered queries, its limits, and when a dedicated vector database is worth it.</description><content:encoded><![CDATA[<p><em>Teams starting retrieval-augmented generation often reach for a new database before checking the one they already run. For many workloads, Postgres with pgvector is enough. For some it isn&#x27;t. Here is how I tell the difference.</em></p><p>A familiar pattern: a team decides to add RAG to its product, evaluates three vector databases, picks one, and six months later is running a second database with its own backups, security reviews, access controls and sync pipeline, all to store a few million embeddings next to data that already lives in Postgres.</p>
<p>Sometimes that's the right call. Often it isn't.</p>

<section class="block">
<h2>What pgvector gives you</h2>
<p>pgvector is an open-source Postgres extension for vector similarity search, supporting exact search as well as approximate indexes such as HNSW and IVFFlat<sup class="cite"><a href="#ref-1">1</a></sup>. The strongest argument for it isn't performance. It's that vectors live beside your relational data, under the same transactions, backups, access controls and operational tooling.</p>
<p>That matters most for filtering. Real RAG queries are rarely "the nearest chunks"; they are "the nearest chunks this user may see, from this tenant, in this product line, updated this year". In Postgres those filters are ordinary SQL against data you already govern.</p>
</section>

<section class="block">
<h2>The filtering problem, and the 0.8 fix</h2>
<p>Approximate indexes return a limited candidate set, and filters apply afterwards. With a selective filter, that can leave very few results: the Nile write-up of the release cites an example where a condition matching 10% of rows yields only about four results with default HNSW settings<sup class="cite"><a href="#ref-4">4</a></sup>.</p>
<p>pgvector 0.8.0, released in late 2024, added iterative index scans: if the first pass returns too few matches, the scan continues until it finds enough or hits a configured limit, with options for strict or relaxed ordering<sup class="cite"><a href="#ref-2">2</a></sup><sup class="cite"><a href="#ref-3">3</a></sup>. It also improved cost estimation so the planner makes better index choices when filtering<sup class="cite"><a href="#ref-2">2</a></sup>. The release notes add a useful reminder: where an ordinary index such as a B-tree can meet performance needs, it gives exact results<sup class="cite"><a href="#ref-2">2</a></sup>.</p>
<div class="callout"><p>Filtered retrieval is where many RAG systems quietly fail: the right document exists but the user is told nothing relevant was found. Test with your real filters, not unfiltered benchmarks.</p></div>
</section>

<section class="block">
<h2>How I decide</h2>
<table class="tbl">
<thead><tr><th>Favours pgvector</th><th>Favours a dedicated vector database</th></tr></thead>
<tbody>
<tr><td>Vectors relate closely to existing relational data</td><td>Vector search is the main workload, not a feature</td></tr>
<tr><td>Rich filters, permissions and multi-tenancy in SQL</td><td>Very large collections or very high query rates</td></tr>
<tr><td>Moderate scale that fits your Postgres capacity</td><td>Search load would compete with transactional work</td></tr>
<tr><td>Team already runs Postgres well</td><td>Need for features Postgres lacks in your setup</td></tr>
<tr><td>Strong consistency between data and embeddings</td><td>Independent scaling of search from the database</td></tr>
</tbody>
</table>
<p>A middle path is common: start on pgvector, measure, and move only the search workload if it outgrows Postgres. If your operational database is MongoDB, the equivalent question applies there, as in <a href="https://asksumanta.com/insights/mongodb-hybrid-search-rag/">hybrid search for RAG on MongoDB</a>.</p>
</section>

<section class="block">
<h2>Practical rules for pgvector</h2>
<ol>
<li><strong>Benchmark with your filters and your data</strong>, measuring recall as well as latency.</li>
<li><strong>Enforce permissions in the query</strong>, ideally with row-level security, so retrieval can't return documents a user shouldn't see. The same principle applies to tenants, as in <a href="https://asksumanta.com/insights/mongodb-multi-tenant-saas-patterns/">multi-tenant SaaS patterns</a>.</li>
<li><strong>Separate search load</strong> with read replicas if it begins to affect transactional performance.</li>
<li><strong>Combine with keyword search</strong>; Postgres full-text search plus vectors is a reasonable hybrid for many products.</li>
<li><strong>Evaluate retrieval quality</strong> with a labelled set, as in <a href="https://asksumanta.com/insights/rag-to-production-checklist/">the RAG to production checklist</a>, before tuning indexes.</li>
</ol>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design retrieval architectures and data platforms for AI products, choosing the simplest stack that will scale. See my <a href="https://asksumanta.com/ai-architect/">AI architecture work</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/pgvector-or-vector-database/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item><item><title>Evaluating AI agents: why reliability matters more than a single success rate</title><link>https://asksumanta.com/insights/evaluating-ai-agents-reliability/</link><guid isPermaLink="true">https://asksumanta.com/insights/evaluating-ai-agents-reliability/</guid><pubDate>Thu, 22 Oct 2026 12:30:00 +0400</pubDate><dc:creator>Sumanta Mukhopadhyay</dc:creator><category>ai</category><category>agents</category><category>llm</category><category>governance</category><description>Agents that succeed once may fail the next time. What τ-bench and τ²-bench reveal about agent reliability, the pass^k metric, and how I build agent evaluations for production.</description><content:encoded><![CDATA[<p><em>An agent demo succeeds because someone ran it until it did. Production runs every task once, for real users, thousands of times. Research on agent benchmarks shows how big that gap can be, and how to measure it.</em></p><p>Many agent evaluations report a single number: "the agent completes 80% of tasks." That number usually comes from running each task once, or from the best of several runs. For a chatbot answering questions, it might be enough. For an agent that changes bookings, issues refunds or updates records, it hides the question that matters: if a customer asks for the same thing ten times, how often does the agent get it right every time?</p>

<section class="block">
<h2>What τ-bench measures</h2>
<p>Sierra's τ-bench put agents in realistic customer service domains. The agent talks to a simulated user, calls domain APIs and must follow a written policy. Success is judged objectively: does the final state of the database match the expected outcome<sup class="cite"><a href="#ref-1">1</a></sup><sup class="cite"><a href="#ref-2">2</a></sup>?</p>
<p>It also introduced <strong>pass^k</strong>: the probability that an agent succeeds on all k independent attempts at the same task<sup class="cite"><a href="#ref-1">1</a></sup>. That is a reliability measure, unlike pass@k, which asks whether any attempt succeeds. The authors reported that even state-of-the-art function-calling agents at the time succeeded on fewer than half the tasks, and that consistency was worse, with pass^8 below 25% in the retail domain<sup class="cite"><a href="#ref-1">1</a></sup>.</p>
<div class="callout"><p>A 60% success rate on one attempt can mean a much lower chance of handling the same request correctly every time. Customers experience the second number.</p></div>
</section>

<section class="block">
<h2>When users act too</h2>
<p>Real support often involves the customer doing things: restarting a device, checking a setting, confirming a code. τ²-bench extended the idea to a dual-control setting where both agent and user use tools to change a shared environment, and reported that performance dropped noticeably when agents moved from no-user settings to dual control<sup class="cite"><a href="#ref-3">3</a></sup><sup class="cite"><a href="#ref-4">4</a></sup>. Guiding a person through a task is a skill of its own, and it needs its own tests.</p>
</section>

<section class="block">
<h2>How I build agent evaluations</h2>
<ol>
<li><strong>Judge outcomes, not transcripts.</strong> Wherever possible, check the end state in the system of record, as τ-bench does, rather than asking a model whether the conversation looked right.</li>
<li><strong>Write policies down, then test them.</strong> Refund limits, identity checks and escalation rules become explicit test cases, including ones where the right answer is "no".</li>
<li><strong>Simulate users with variety</strong>: impatient, confused, adversarial, and users who change their minds. Include prompt injection attempts, as in <a href="https://asksumanta.com/insights/prompt-injection-defence-for-agents/">prompt injection defence</a>.</li>
<li><strong>Run every task several times</strong> and report pass^k alongside the single-run rate. Release gates should use the reliability number.</li>
<li><strong>Grow the suite from production.</strong> Every incident and escalation becomes a test case, per <a href="https://asksumanta.com/insights/ai-incident-postmortems/">AI incident postmortems</a>.</li>
<li><strong>Trace everything.</strong> Tool calls, arguments and results, so a failing run can be diagnosed; see <a href="https://asksumanta.com/insights/llm-observability-opentelemetry-genai/">LLM observability</a>.</li>
</ol>
<p>This sits on top of the general method in <a href="https://asksumanta.com/insights/llm-evaluation-sets-that-predict-production/">evaluation sets that predict production</a>, with two additions specific to agents: state-based judging and repeated trials.</p>
</section>

<section class="block">
<h2>What to do with the results</h2>
<p>Low reliability isn't always a reason to stop. It's a reason to change the design: narrower tools, deterministic code for policy checks, human approval for irreversible actions, and the containment patterns in <a href="https://asksumanta.com/insights/mcp-apps-tool-annotations/">MCP Apps and tool annotations</a>. Often the best improvement isn't a better model but less for the model to decide.</p>
</section>

<section class="block">
<h2>How I can help</h2>
<p>I design agent architectures and the evaluation suites that decide whether they're ready for production. See my <a href="https://asksumanta.com/ai-architect/">AI architecture work</a>, or <a href="https://asksumanta.com/#assess">analyse your challenge</a> and bring the result to a call.</p>
</section><p><a href="https://asksumanta.com/insights/evaluating-ai-agents-reliability/">Read on asksumanta.com</a> for diagrams, references and related reading.</p>]]></content:encoded></item></channel></rss>
