<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Khalid Shams · Writing</title>
  <link>https://khalidshams.com/writing/</link>
  <atom:link href="https://khalidshams.com/feed.xml" rel="self" type="application/rss+xml"/>
  <description>Short essays on architecture, agentic AI, and the decisions that actually cost money.</description>
  <language>en-us</language>
  <item>
    <title>The cheapest migration is the one you skip</title>
    <link>https://khalidshams.com/writing/the-cheapest-migration-is-the-one-you-skip/</link>
    <guid isPermaLink="true">https://khalidshams.com/writing/the-cheapest-migration-is-the-one-you-skip/</guid>
    <pubDate>Thu, 15 Oct 2026 15:00:00 +0000</pubDate>
    <description>In one assessment, a third of the application estate had no owner. You don&#x27;t migrate that. You retire it.</description>
    <content:encoded><![CDATA[<p>In one assessment, about a third of the application estate had no clear owner.</p>
<p>Nobody could say who used it, what it fed, or what would break if it stopped. Some of it was still being patched, backed up, and paid for. A few of those systems were on the migration plan, with a wave number and an estimate.</p>
<p>You don&rsquo;t migrate that. You retire it. Or at least you ask the question out loud before you spend money moving it.</p>
<p>The cheapest migration is always the one you don&rsquo;t do. That sounds obvious until you&rsquo;re inside a programme with a deadline, a budget, and a wave plan that everyone signed. At that point the incentive is to move everything and sort it out later. Later never has budget.</p>
<p>What I&rsquo;ve come to do instead: before waves, before tooling, before the first lift and shift, run a simple ownership pass. Every application gets a named owner or gets a retirement date. No third option.</p>
<p>It is uncomfortable. Owners appear for things nobody wanted to own, because the alternative is losing them. That&rsquo;s fine. That&rsquo;s the point. Now you know what you&rsquo;re actually migrating.</p>
<p>The assessment that found $4.5M didn&rsquo;t find it in pricing. It found it in questions like this one.</p>
<p>How much of your estate has a named owner today?</p>]]></content:encoded>
  </item>
  <item>
    <title>A landing zone is a political document</title>
    <link>https://khalidshams.com/writing/a-landing-zone-is-a-political-document/</link>
    <guid isPermaLink="true">https://khalidshams.com/writing/a-landing-zone-is-a-political-document/</guid>
    <pubDate>Tue, 13 Oct 2026 15:00:00 +0000</pubDate>
    <description>The subscriptions and policies are the easy part. A landing zone is really an agreement about who owns what.</description>
    <content:encoded><![CDATA[<p>A landing zone is a political document that happens to be implemented in Azure.</p>
<p>The subscriptions, the hub and spoke, the policy assignments, the naming standard. All of that is a week of work if you know what you&rsquo;re doing. It&rsquo;s also the part everyone argues about, because it&rsquo;s the part you can see.</p>
<p>The part that decides whether the landing zone survives is invisible. Who owns the platform team. Who can say no to a workload. What happens when a business unit wants an exception on Friday afternoon. Who pays for the shared services, and how that shows up on someone&rsquo;s budget.</p>
<p>I&rsquo;ve watched beautifully designed landing zones rot in eighteen months because those questions were never written down. Every exception became precedent. Every precedent became the new standard. Eventually the &ldquo;landing zone&rdquo; was just the first subscription that got created, plus whatever grew around it.</p>
<p>The ones that last have a boring one-page charter. Ownership, funding, exception process, review cadence. The technology sits underneath that page, not the other way around.</p>
<p>If you&rsquo;re about to build one, spend the first week on the charter and the second on the Bicep. It feels backwards. It isn&rsquo;t.</p>
<p>Who can say no in your environment?</p>]]></content:encoded>
  </item>
  <item>
    <title>Where I put the human</title>
    <link>https://khalidshams.com/writing/where-i-put-the-human/</link>
    <guid isPermaLink="true">https://khalidshams.com/writing/where-i-put-the-human/</guid>
    <pubDate>Thu, 08 Oct 2026 15:00:00 +0000</pubDate>
    <description>I architected an EMR holding 250+ patient records, and it changed where I put the human.</description>
    <content:encoded><![CDATA[<p>I architected an EMR that now holds 250+ active patient records, and it changed how I think about AI.</p>
<p>Not because we put a model in the middle of care. Because we deliberately didn&rsquo;t.</p>
<p>Clinical evidence arrives messy. Documents in several languages. Scans. Labs. Records that refer to the same person three different ways. There&rsquo;s real temptation to let a model reconcile all of it and move on. It can, mostly. And &ldquo;mostly&rdquo; means something very different in healthcare than it does in a demo.</p>
<p>So the architecture put the machine where it belongs: intake, OCR, surfacing candidate matches, flagging what needs a look. Fast, tireless, valuable work.</p>
<p>And it put a human at every point where a judgment becomes part of someone&rsquo;s medical record.</p>
<p>Two rules held the whole thing together.</p>
<p>Never destroy the source. The original evidence stays, always, alongside anything derived from it.</p>
<p>Never blur what was observed with what was inferred. Provenance isn&rsquo;t a nice-to-have. It&rsquo;s the difference between a record and a rumour.</p>
<p>Immutable audit underneath. Deterministic validation before and after every deployment.</p>
<p>The best AI systems I&rsquo;ve built aren&rsquo;t the ones that decide the most. They&rsquo;re the ones clearest about what they don&rsquo;t decide.</p>
<p>Where have you drawn that line?</p>]]></content:encoded>
  </item>
  <item>
    <title>The agent inherits the user&#x27;s permissions</title>
    <link>https://khalidshams.com/writing/the-agent-inherits-the-user-s-permissions/</link>
    <guid isPermaLink="true">https://khalidshams.com/writing/the-agent-inherits-the-user-s-permissions/</guid>
    <pubDate>Tue, 06 Oct 2026 15:00:00 +0000</pubDate>
    <description>The most important design decision in an enterprise AI system isn&#x27;t the model.</description>
    <content:encoded><![CDATA[<p>The most important design decision in an enterprise AI system isn&rsquo;t the model.</p>
<p>It&rsquo;s this: the agent inherits the user&rsquo;s permissions, and never exceeds them.</p>
<p>Obvious when you say it out loud. Routinely violated in practice, usually by accident, usually by a service principal with broad access that got wired in during a prototype and never revisited. Then someone asks the assistant a question and it cheerfully returns data they were never cleared to see.</p>
<p>The fix isn&rsquo;t a policy document. It&rsquo;s architecture.</p>
<p>Identity boundaries the agent actually runs inside. Entra ID, RBAC, PIM for anything privileged.
Data it can reach that is already governed. A real lakehouse with real ownership, not a folder of extracts someone made for the pilot.
Policy enforced by the platform, not by the prompt.
Monitoring that tells you what was accessed, by whom, and on whose behalf.</p>
<p>Do that, and governance stops being the thing slowing AI down. It becomes the reason you can deploy it at all to people handling sensitive data.</p>
<p>Governance isn&rsquo;t the brake. It&rsquo;s what lets you take your foot off it.</p>
<p>Where does your AI get its permissions from?</p>]]></content:encoded>
  </item>
  <item>
    <title>Change the altitude, not the substance</title>
    <link>https://khalidshams.com/writing/change-the-altitude-not-the-substance/</link>
    <guid isPermaLink="true">https://khalidshams.com/writing/change-the-altitude-not-the-substance/</guid>
    <pubDate>Thu, 01 Oct 2026 15:00:00 +0000</pubDate>
    <description>An ad hoc note I was inspired to write. A conversation with people who think about building, and the one habit that lets you talk to a CTO and an engineer in the same hour without lying to either.</description>
    <content:encoded><![CDATA[<p>This is more of an ad hoc post, one I was inspired to write rather than planned. I spent an hour today with people who think about building the way I do, trading ideas about what to make next, and remembered that this is my favourite part of the job. Not the diagrams. The conversations.</p>
<p>A thank you first. The messages, the questions, the people who reached out after the last few notes and trusted me with a problem they&rsquo;re actually sitting on: I&rsquo;ve read every one. It&rsquo;s why I added the Learn AI section to khalidshams.com, from &ldquo;what is an agent&rdquo; through the full build workflows, so the next person who asks has somewhere to start that isn&rsquo;t a sales deck. New connections, old colleagues, the people who disagreed politely in the comments: thank you. Keep them coming.</p>
<p>Now the thing I wanted to say.</p>
<p>In one day I&rsquo;ll talk to a CTO about risk, cost and what the board will ask, then sit with an engineer about identity flows, permission boundaries, where state lives and what gets logged. People ask how I switch. I don&rsquo;t. Same substance, different altitude.</p>
<p>The executive doesn&rsquo;t need less truth. They need the same truth at the height where their decision lives: what it costs, what breaks if we&rsquo;re wrong, who owns it, when we&rsquo;ll know. The engineer needs it at ground level: which service, which boundary, which log line. If the facts change between those two rooms, one of them will eventually find out. Change the altitude, not the substance. That rule has done more for my career than any certification.</p>
<p>A small example. A customer was ready to buy a bigger database tier because performance had become a complaint. The easy answer was yes. We looked at how the workload actually behaved first, which queries, which tenants, which hours, and the honest answer was that the tier wasn&rsquo;t the problem. To the executive: &ldquo;we&rsquo;re not spending that yet, and here&rsquo;s what we&rsquo;ll measure before we decide.&rdquo; To the engineer: a list of queries. Same decision, two altitudes.</p>
<p>The hidden hack underneath all of this is reusable flows. Every time I break a big engineering effort into a shape a business person can see, I try to make that shape something I can use again: the questions to ask first, the boundaries to set, how to verify the result. It takes time and real attention to detail to map a solution so it survives the next client and the next team. But the day you watch one come to life in a room you&rsquo;ve never been in, with people you didn&rsquo;t train, is the most gratifying thing I know in this work.</p>
<p>Advice, since you&rsquo;re still reading. Surround yourself with people who are not only like-minded but smarter than you. Then listen more than you talk. You can learn something from everyone, from the intern&rsquo;s question to the CFO&rsquo;s objection, if the mindset is there.</p>
<p>What altitude is your next conversation at?</p>]]></content:encoded>
  </item>
  <item>
    <title>The dashboard that got applause</title>
    <link>https://khalidshams.com/writing/the-dashboard-that-got-applause/</link>
    <guid isPermaLink="true">https://khalidshams.com/writing/the-dashboard-that-got-applause/</guid>
    <pubDate>Thu, 01 Oct 2026 15:00:00 +0000</pubDate>
    <description>I&#x27;ve built dashboards that got applause and then quietly became the most expensive thing in the system.</description>
    <content:encoded><![CDATA[<p>I&rsquo;ve built dashboards that got applause and then quietly became the most expensive thing in the system.</p>
<p>Fast. Clean. Useful looking. And underneath, a backend still trying to catch up to everything the frontend had already promised.</p>
<p>That gap doesn&rsquo;t announce itself. It shows up months later as brittle data contracts, unclear ownership, shaky lineage, and a team spending most of its week keeping things upright instead of building anything new.</p>
<p>I&rsquo;ve learned to spend the unglamorous time first. Define the data clearly. Enforce quality. Make the foundation boring, resilient, and slightly over-built for what today needs.</p>
<p>It feels slow. It isn&rsquo;t. It&rsquo;s the only version that stays fast.</p>
<p>When the foundation holds, everything above it gets cheap: new dashboards, AI use cases, automation. When it doesn&rsquo;t, every one of those becomes a negotiation with your own architecture.</p>
<p>And you can&rsquo;t retrofit a foundation under a system people already depend on. Not without pain.</p>
<p>Build the engine before you shape the body.</p>
<p>What&rsquo;s one thing you&rsquo;d go back and build properly the first time?</p>]]></content:encoded>
  </item>
  <item>
    <title>Root cause before remediation</title>
    <link>https://khalidshams.com/writing/root-cause-before-remediation/</link>
    <guid isPermaLink="true">https://khalidshams.com/writing/root-cause-before-remediation/</guid>
    <pubDate>Tue, 29 Sep 2026 15:00:00 +0000</pubDate>
    <description>A PostgreSQL escalation, a room full of confident theories, and why we refused to resize first.</description>
    <content:encoded><![CDATA[<p>A PostgreSQL capacity escalation taught me more about architecture than most design sessions do.</p>
<p>The setup: an Azure Database for PostgreSQL Flexible Server under real pressure, a customer whose whole modernisation programme depended on it, and a room full of confident theories.</p>
<p>The instinct in that room is always to resize. Add capacity, buy time, move on.</p>
<p>We didn&rsquo;t, not first. We did the boring thing and established what was actually happening before deciding what to do about it. Where the load really came from. Which queries. What the resiliency posture actually was, versus what everyone assumed it was. Which regional options were real versus theoretical.</p>
<p>Root cause first. Remediation second.</p>
<p>The reason that ordering matters: if you resize before you understand, you now have the same problem at a higher bill, and you&rsquo;ve spent the credibility you were going to need for the harder conversation.</p>
<p>The remediation ended up implementation-ready, and the modernisation momentum survived. That second part was the real goal. An escalation that stalls a programme costs far more than the incident ever did.</p>
<p>Slow down at the diagnosis. Everything downstream gets faster.</p>
<p>When did resizing last actually fix it?</p>]]></content:encoded>
  </item>
  <item>
    <title>Ask to see the evaluation harness</title>
    <link>https://khalidshams.com/writing/ask-to-see-the-evaluation-harness/</link>
    <guid isPermaLink="true">https://khalidshams.com/writing/ask-to-see-the-evaluation-harness/</guid>
    <pubDate>Thu, 24 Sep 2026 15:00:00 +0000</pubDate>
    <description>The one question that separates real AI projects from expensive demos.</description>
    <content:encoded><![CDATA[<p>One question separates real AI projects from expensive demos:</p>
<p>&ldquo;Can you show me your evaluation harness?&rdquo;</p>
<p>Not the demo. Not the architecture diagram. The harness. The thing that runs a fixed set of cases and tells you whether today&rsquo;s version is better or worse than last week&rsquo;s.</p>
<p>If the answer is a pause, you&rsquo;re looking at a prototype wearing production clothes.</p>
<p>Here&rsquo;s why it matters. Every change to an agentic system, whether a prompt, a tool, a model version, or a retrieval tweak, has an unknown blast radius. Without a regression suite you aren&rsquo;t iterating. You&rsquo;re gambling and calling it iteration.</p>
<p>What I look for:</p>
<p>A fixed case set that includes the ugly inputs, not just the happy path.
A written catalogue of known failure modes.
Groundedness and citation checks, so &ldquo;confident&rdquo; and &ldquo;correct&rdquo; don&rsquo;t get confused.
At least one number that moves when quality moves.</p>
<p>None of this needs exotic tooling. It needs deciding that quality is measurable before you&rsquo;re under pressure to ship.</p>
<p>The teams that build this early ship faster later. Consistently.</p>
<p>What do you actually measure on your AI systems?</p>]]></content:encoded>
  </item>
  <item>
    <title>$4.5M without looking at a price sheet</title>
    <link>https://khalidshams.com/writing/4-5m-without-looking-at-a-price-sheet/</link>
    <guid isPermaLink="true">https://khalidshams.com/writing/4-5m-without-looking-at-a-price-sheet/</guid>
    <pubDate>Tue, 22 Sep 2026 15:00:00 +0000</pubDate>
    <description>$4.5M in cost avoidance without touching a price sheet. The savings weren&#x27;t in negotiating; they were in noticing.</description>
    <content:encoded><![CDATA[<p>We found $4.5M in cost avoidance without looking at a single price sheet.</p>
<p>The assessment covered around 3,000 employees and 10 vendors. By the end we had documented 32 gaps.</p>
<p>Almost none of them were &ldquo;you&rsquo;re paying too much.&rdquo;</p>
<p>They were things like: two teams licensing overlapping capability because neither knew the other had it. A DR plan that had never been tested against the actual dependency map. Identity sprawl that turned every new integration into a custom project. Tooling bought for a problem that had since been solved a different way.</p>
<p>The savings weren&rsquo;t in negotiating. They were in noticing.</p>
<p>That&rsquo;s the underrated part of assessments. People treat them as a procurement exercise, or a formality before a migration. Done properly, an assessment is the only moment an organisation sees itself whole. Applications, data, identity, security, cost, and dependencies, on one page.</p>
<p>Most organisations have never seen that page.</p>
<p>The headline number was $4.5M. The actual deliverable was clarity.</p>
<p>What&rsquo;s the most expensive thing your organisation is currently doing twice?</p>]]></content:encoded>
  </item>
  <item>
    <title>1,000 tenants and a problem you can&#x27;t reproduce</title>
    <link>https://khalidshams.com/writing/1-000-tenants-and-a-problem-you-can-t-reproduce/</link>
    <guid isPermaLink="true">https://khalidshams.com/writing/1-000-tenants-and-a-problem-you-can-t-reproduce/</guid>
    <pubDate>Thu, 17 Sep 2026 15:00:00 +0000</pubDate>
    <description>A performance problem nobody could reproduce across 1,000+ tenant databases, and why the fix was written rules, not a bigger tier.</description>
    <content:encoded><![CDATA[<p>A customer had 1,000+ Azure SQL tenant databases and a performance problem nobody could reproduce.</p>
<p>The complaint was &ldquo;the platform is slow.&rdquo; The reality was noisier. A handful of tenants consuming shared capacity in bursts, and everyone else feeling it as random latency. Classic noisy neighbour, at a scale where you can&rsquo;t just go look at it.</p>
<p>What moved the needle wasn&rsquo;t a bigger tier.</p>
<p>It was classification. Which tenants behave like enterprise workloads, which behave like trials, and which are quietly pathological. Then explicit graduation criteria: the written conditions under which a tenant earns Business Critical, rather than getting upgraded because someone complained loudly enough.</p>
<p>Once those criteria existed, three things changed.</p>
<p>Cost stopped being a negotiation.
Support stopped guessing.
And the path toward Fabric and AI readiness stopped being blocked by a foundation nobody trusted.</p>
<p>Multi-tenant SaaS punishes ambiguity. Every &ldquo;we&rsquo;ll figure it out per customer&rdquo; decision compounds into an estate no one can reason about.</p>
<p>Write the rules down. Imperfect written rules beat per-incident judgment at 1,000 tenants, every time.</p>
<p>How does your team decide when a tenant graduates?</p>]]></content:encoded>
  </item>
  <item>
    <title>The demo is never the hard part</title>
    <link>https://khalidshams.com/writing/the-demo-is-never-the-hard-part/</link>
    <guid isPermaLink="true">https://khalidshams.com/writing/the-demo-is-never-the-hard-part/</guid>
    <pubDate>Tue, 15 Sep 2026 15:00:00 +0000</pubDate>
    <description>Most agent demos work. Most agent systems don&#x27;t. The four things nobody demos are the whole difference.</description>
    <content:encoded><![CDATA[<p>Most agent demos work. Most agent systems don&rsquo;t.</p>
<p>I&rsquo;ve spent the last stretch building a complete agentic system on Anthropic&rsquo;s Claude platform, inception through delivery, and separately building agentic workflows in Azure AI Foundry with RAG grounding over governed data.</p>
<p>The gap between a demo and a system isn&rsquo;t model quality. It&rsquo;s four things nobody demos.</p>
<p>Agent boundaries. What each agent owns, where control passes, and where a human stays in the loop. Vague ownership is how an agent quietly does the wrong thing, confidently.</p>
<p>Grounding. If the data underneath isn&rsquo;t governed, the agent is fluent and wrong. Retrieval without provenance is a liability, not a feature.</p>
<p>Evaluation. Not &ldquo;it looked good in the demo.&rdquo; A harness, a regression suite, and a written catalogue of failure modes. If you can&rsquo;t measure a regression, you can&rsquo;t safely ship a change.</p>
<p>Blast radius. Typed and validated tool calls. Writes that are idempotent and reversible. Fallback paths. Cost controls per run.</p>
<p>None of that is glamorous. All of it is the difference between a pilot and something people depend on.</p>
<p>If you&rsquo;re evaluating an agentic project right now, ask one question: what happens when it&rsquo;s wrong?</p>
<p>The answer tells you whether it&rsquo;s ready.</p>]]></content:encoded>
  </item>
</channel>
</rss>
