<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Designed to Scale]]></title><description><![CDATA[Insights on enterprise architecture, AI systems, and scaling strategy - written for leaders building systems that last. Practical, personal, and focused on real-world delivery.]]></description><link>https://newsletter.aminollahi.com</link><image><url>https://substackcdn.com/image/fetch/$s_!WFfv!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b6af0ad-193d-438a-9d11-4ca70617b7e1_311x311.png</url><title>Designed to Scale</title><link>https://newsletter.aminollahi.com</link></image><generator>Substack</generator><lastBuildDate>Mon, 25 May 2026 23:40:14 GMT</lastBuildDate><atom:link href="https://newsletter.aminollahi.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Ryan Aminollahi]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[Designed-to-Scale@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[Designed-to-Scale@substack.com]]></itunes:email><itunes:name><![CDATA[Ryan Aminollahi]]></itunes:name></itunes:owner><itunes:author><![CDATA[Ryan Aminollahi]]></itunes:author><googleplay:owner><![CDATA[Designed-to-Scale@substack.com]]></googleplay:owner><googleplay:email><![CDATA[Designed-to-Scale@substack.com]]></googleplay:email><googleplay:author><![CDATA[Ryan Aminollahi]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[AI Will Not Fix a Broken Delivery Model]]></title><description><![CDATA[Why AI-native development requires organisations to redesign discovery, design, delivery and governance, not simply give developers faster coding tools.]]></description><link>https://newsletter.aminollahi.com/p/ai-will-not-fix-a-broken-delivery-model</link><guid isPermaLink="false">https://newsletter.aminollahi.com/p/ai-will-not-fix-a-broken-delivery-model</guid><dc:creator><![CDATA[Ryan Aminollahi]]></dc:creator><pubDate>Mon, 25 May 2026 20:42:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!auym!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4d21401-12e1-4e0d-b37f-b58f476af054_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!auym!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4d21401-12e1-4e0d-b37f-b58f476af054_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!auym!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4d21401-12e1-4e0d-b37f-b58f476af054_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!auym!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4d21401-12e1-4e0d-b37f-b58f476af054_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!auym!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4d21401-12e1-4e0d-b37f-b58f476af054_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!auym!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4d21401-12e1-4e0d-b37f-b58f476af054_1672x941.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!auym!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4d21401-12e1-4e0d-b37f-b58f476af054_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b4d21401-12e1-4e0d-b37f-b58f476af054_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1886886,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.aminollahi.com/i/198907466?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4d21401-12e1-4e0d-b37f-b58f476af054_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!auym!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4d21401-12e1-4e0d-b37f-b58f476af054_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!auym!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4d21401-12e1-4e0d-b37f-b58f476af054_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!auym!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4d21401-12e1-4e0d-b37f-b58f476af054_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!auym!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4d21401-12e1-4e0d-b37f-b58f476af054_1672x941.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>For the last few years, much of the conversation about AI in software development has focused on one promise: developers will write code faster.</p><p>The assumption is simple. Give engineers better coding assistants, reduce time spent on boilerplate, automate testing and documentation, and delivery velocity will improve.</p><p>But software delivery has never been limited by how quickly a developer can type code.</p><p>The real constraints usually sit elsewhere: unclear requirements, delayed decisions, fragmented ownership, missing context, late security reviews, inconsistent architecture, slow environments, weak governance and teams working from different versions of the same problem.</p><p>AI can generate code quickly. It cannot, by itself, repair a delivery system built on ambiguity.</p><p>That is why the conversation needs to move beyond AI-assisted coding and towards something more fundamental: an AI-native development lifecycle.</p><h2>The productivity paradox should make leaders uncomfortable</h2><p>A 2025 randomised controlled trial by METR studied experienced open-source developers working on mature repositories they already understood well. The developers expected AI tools to make them 24% faster. Even after completing the work, they believed AI had made them around 20% faster.</p><p>The measured result was the opposite. With AI tools available, they took 19% longer to complete the tasks.</p><p>This does not prove that AI is ineffective in software engineering. It does prove that perceived velocity and actual delivery performance are not the same thing.</p><p>That distinction matters.</p><p>AI-generated output creates a strong feeling of progress. Code appears quickly. Documentation can be drafted in seconds. Test cases can be suggested. Sequence diagrams can be generated. The blank page disappears.</p><p>But in a complex enterprise environment, output is not the same as value.</p><p>Every generated artefact must still be understood, validated, integrated, secured, tested, operated and governed. When the AI lacks the right business, architecture or operational context, teams may move faster in producing material while spending more time reviewing, correcting and aligning it later.</p><p>That is not transformation. It is faster production of uncertainty.</p><h2>The two ways organisations get AI wrong</h2><p>Most teams currently approach AI in one of two ways.</p><p>The first is to treat AI as an autonomous delivery engine: provide a prompt, expect a working solution and assume the team can review the output later. This may produce an impressive prototype. It becomes dangerous when applied to complex products, regulated environments, shared platforms or systems with important non-functional requirements.</p><p>AI does not naturally understand the full consequence of a design decision. It does not know which shortcut creates a future support burden, which integration assumption breaks a control boundary, or which apparently simple implementation introduces compliance or operational risk.</p><p>The second approach is safer, but often underwhelming. Teams use AI as a personal assistant for isolated tasks: complete this method, generate this unit test, explain this error, tidy this document.</p><p>That may save individual effort. It rarely changes the delivery outcome because the organisation is still operating through the same slow lifecycle: the same handovers, the same decision delays, the same scattered knowledge and the same governance checkpoints arriving too late.</p><p>One approach over-trusts AI. The other underuses it.</p><p>Neither changes the system of delivery.</p><h2>AI-DLC is not a new coding technique</h2><p>AWS introduced the concept of the <strong>AI-Driven Development Life Cycle</strong>, or AI-DLC, as an AI-centric approach in which AI creates plans, asks for clarification and implements work only after human validation. The second part of the model is equally important: cross-functional teams collaborate dynamically around decisions rather than operating through long, sequential handovers.</p><p>This is the important shift.</p><p>AI-DLC is not simply adding AI tools into an existing agile process. It is a challenge to the structure of that process.</p><p>Traditional delivery models often assume that work should move through stages: discovery, requirements, design, development, testing, security, deployment and operations. Each stage creates artefacts for the next group. Questions move backwards. Decisions wait for meetings. Important assumptions are discovered after implementation has already started.</p><p>AI changes the cost of producing options, documenting decisions, creating models, analysing code and testing assumptions. But those benefits only become meaningful when the people who need to make decisions are brought together around the same context.</p><p>This is why the concept of collaborative, AI-supported working sessions matters more than the coding assistant itself.</p><p>Bring product, architecture, engineering, quality, security and operations into the same problem space. Give the AI the right context. Ask it to produce options, surface gaps, create the initial artefacts and challenge assumptions. Then let the humans make the decisions that require accountability and judgement.</p><p>The value is not that AI replaces the team.</p><p>The value is that the team spends less time waiting for alignment and more time making informed decisions together.</p><h2>Discovery changes first</h2><p>The greatest opportunity for AI-native delivery may not be in development. It may be in discovery.</p><p>Many delivery failures start long before any code is written. The opportunity was poorly framed. The business outcome was vague. System impacts were incomplete. Dependencies were missed. Non-functional requirements appeared late. Delivery teams were asked to estimate a solution before the actual problem was understood.</p><p>Used properly, AI can help teams interrogate an opportunity earlier.</p><p>It can turn an initial business idea into structured questions. It can identify missing stakeholder decisions. It can map likely impacted systems. It can draft journeys, use cases, risks, assumptions, architectural options and test scenarios for the team to validate.</p><p>But the discipline matters: AI should not invent certainty. It should accelerate the identification of uncertainty.</p><p>A stronger discovery outcome is not a longer document generated faster. It is a team that can say, earlier and with greater confidence:</p><ul><li><p>This is the business outcome we are solving for.</p></li><li><p>These are the systems and controls affected.</p></li><li><p>These are the decisions that must be made.</p></li><li><p>These are the risks we will accept, mitigate or avoid.</p></li><li><p>This is the smallest useful slice we can safely deliver.</p></li></ul><p>That is architecture creating decision clarity, with AI improving the speed at which the clarity can be reached.</p><h2>Design becomes a conversation, not a handover</h2><p>In many organisations, solution design is still treated as something an architect prepares and then presents to delivery teams for review.</p><p>That model becomes less useful in an AI-native environment.</p><p>AI can quickly generate multiple design options, sequence diagrams, integration patterns, data flows, failure scenarios and initial threat considerations. The architect&#8217;s role is not reduced by this capability. It becomes more important.</p><p>Someone must decide whether the options are sensible in the real organisational context.</p><p>Someone must understand the existing platform constraints, the regulatory boundary, the long-term operating model, the technical debt already present and the trade-offs the organisation is genuinely willing to carry.</p><p>The architect is no longer spending most of the time creating the first draft of every diagram. The architect is shaping context, challenging generated options, guiding decisions and ensuring the design remains coherent beyond the immediate feature.</p><p>This is not architecture being automated away.</p><p>It is architecture moving closer to where its real value has always been: judgement.</p><h2>Delivery becomes faster only when context is controlled</h2><p>One of the most important principles in AI-driven delivery is that context matters more than prompting cleverness.</p><p>A developer asking AI to work across a large codebase without explaining system boundaries, integration contracts, architectural standards, security expectations or acceptance criteria is not accelerating delivery. They are asking the tool to make guesses faster.</p><p>In an AI-native delivery model, context must become an engineered asset.</p><p>That includes approved architecture principles, system boundaries, API specifications, coding standards, non-functional requirements, security patterns, deployment expectations, test strategies, previous decisions and known constraints.</p><p>Teams that curate this context will get better results from AI. Teams that leave their knowledge scattered across outdated documents, chat messages, individual memories and disconnected tickets will struggle.</p><p>This is a major organisational point.</p><p>AI adoption is not only a tooling decision. It is a knowledge architecture decision.</p><p>Before leaders ask how many developers have access to AI tools, they should ask whether the organisation has made its delivery context usable by those tools.</p><h2>Governance cannot remain at the end</h2><p>There is an obvious risk in AI-enabled delivery: teams can generate more code, more options and more artefacts than governance functions can reasonably review through traditional processes.</p><p>The answer is not to remove governance. It is to make governance continuous and closer to the work.</p><p>Security requirements, architecture principles, compliance controls, operational expectations and evidence needs should be part of the context given to AI from the beginning. The tool can help teams assess proposed changes against those expectations throughout discovery, design and development.</p><p>Human accountability remains essential. AI can identify a possible control gap. It cannot accept the risk on behalf of the organisation. AI can draft evidence. It cannot be accountable for whether that evidence is accurate and sufficient. AI can recommend an architecture option. It cannot carry the operational consequences if that option fails in production.</p><p>In regulated or high-trust environments, this distinction is critical.</p><p>AI should help governance become earlier, more consistent and more evidence-driven. It should never be used as an excuse to weaken ownership.</p><h2>Accountability does not disappear when the code is generated</h2><p>The most dangerous sentence in AI-enabled software delivery is: &#8220;The AI wrote it.&#8221;</p><p>That sentence has no value when a customer is affected, a vulnerability is discovered, a payment fails, data is exposed or a regulator asks how a control was implemented.</p><p>The organisation still owns the outcome.</p><p>The engineer approving generated code must understand what it does. The architect approving the solution must understand its trade-offs. The product owner accepting the feature must understand what problem has been solved. The security and compliance functions must understand whether required controls are present and effective.</p><p>AI can participate in the delivery lifecycle. It cannot become the accountable party.</p><p>That is why AI-native delivery is not a permission to reduce engineering discipline. It requires more disciplined context, clearer decision rights and stronger evidence of why a solution is safe to release.</p><h2>The real leadership question</h2><p>The wrong question for technology leaders is: <strong>Are our developers using AI?</strong></p><p>That question measures adoption of tools, not improvement in delivery.</p><p>The better questions are:</p><p>Are we using AI to improve discovery before we generate code?</p><p>Are product, architecture, engineering, security, quality and operations making decisions together, or are we simply pushing AI-generated outputs through the same slow handovers?</p><p>Have we curated the context AI needs to produce solutions aligned with our architecture and controls?</p><p>Can we demonstrate that AI-supported delivery is improving cycle time, quality, risk management and business outcomes, rather than simply increasing the volume of generated artefacts?</p><p>And most importantly: who remains accountable when AI-generated work reaches production?</p><p>AI will become part of how modern software is designed and delivered. That direction is no longer difficult to see.</p><p>But organisations will not become AI-native simply by giving developers new tools.</p><p>They will become AI-native when they redesign how problems are understood, how decisions are made, how context is managed, how solutions are governed and how accountability is maintained.</p><p>Because the future of software delivery is not about generating code faster.</p><p>It is about creating clarity faster  and turning that clarity into safe, valuable delivery.</p><p></p><h2>Is your organisation using AI tools or redesigning delivery for an AI-native future?</h2><p>AI adoption is no longer just an engineering productivity discussion. It is becoming an architecture, governance and operating model question.</p><p>I work with technology leaders to turn complex delivery challenges into clear architecture decisions, practical operating models and scalable technology strategies.</p><p><strong>If your organisation is exploring AI-enabled delivery, platform transformation or architecture governance, let&#8217;s connect.</strong></p>]]></content:encoded></item><item><title><![CDATA[AI-DLC: The Delivery Trap Leaders Won’t See Coming]]></title><description><![CDATA[AI can speed up delivery, but without lifecycle control it can also hide risk. The question is who owns the consequences.]]></description><link>https://newsletter.aminollahi.com/p/ai-dlc-delivery-trap-leaders-wont-see-coming</link><guid isPermaLink="false">https://newsletter.aminollahi.com/p/ai-dlc-delivery-trap-leaders-wont-see-coming</guid><dc:creator><![CDATA[Ryan Aminollahi]]></dc:creator><pubDate>Thu, 07 May 2026 00:10:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-jsI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4f5b22-9886-4476-a7d8-165c7c618353_1600x900.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-jsI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4f5b22-9886-4476-a7d8-165c7c618353_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-jsI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4f5b22-9886-4476-a7d8-165c7c618353_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!-jsI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4f5b22-9886-4476-a7d8-165c7c618353_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!-jsI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4f5b22-9886-4476-a7d8-165c7c618353_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!-jsI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4f5b22-9886-4476-a7d8-165c7c618353_1600x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-jsI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4f5b22-9886-4476-a7d8-165c7c618353_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de4f5b22-9886-4476-a7d8-165c7c618353_1600x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:511822,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.aminollahi.com/i/196707267?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4f5b22-9886-4476-a7d8-165c7c618353_1600x900.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-jsI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4f5b22-9886-4476-a7d8-165c7c618353_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!-jsI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4f5b22-9886-4476-a7d8-165c7c618353_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!-jsI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4f5b22-9886-4476-a7d8-165c7c618353_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!-jsI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde4f5b22-9886-4476-a7d8-165c7c618353_1600x900.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The biggest risk with AI in delivery is not that engineers will write code faster.</p><p>The bigger risk is that organisations will change how work gets done without changing how decisions are governed.</p><p>That is where many AI programmes will quietly fail.</p><p>A team adopts AI for requirements analysis. Another team uses it for code generation. Product managers use it to summarise discovery notes. Architects use it to draft diagrams. Testers use it to create test cases. Delivery leads use it to summarise risks and progress.</p><p>On the surface, everything looks faster.</p><p>But under the surface, something more important has changed.</p><p>The organisation has introduced a new layer into its delivery lifecycle. AI is now influencing discovery, design, implementation, testing, documentation and governance. It is shaping decisions, producing artefacts, interpreting requirements and sometimes nudging teams towards options they do not fully understand.</p><p>If the operating model does not change with it, speed can become a risk multiplier.</p><p>That is why I think the next serious conversation is not only about AI tools.</p><p>It is about AI-DLC.</p><p>AI-DLC means embedding AI into the full delivery lifecycle in a controlled, traceable and human-owned way. Not as a side tool. Not as a chatbot sitting next to the team. Not as an experiment hidden inside individual workflows.</p><p>As part of the delivery system itself.</p><h2><strong>AI-DLC is not SDLC with a chatbot</strong></h2><p>Most organisations will start with the easy version.</p><p>They will give teams access to AI tools and measure whether work feels faster. Code completion improves. Documents are drafted more quickly. Meeting notes are summarised. Test cases appear earlier. Architects can produce first-draft diagrams in minutes rather than days.</p><p>That is useful.</p><p>But it is not an operating model.</p><p>AI-DLC is not simply the software delivery lifecycle with AI sprinkled across it. It is a different way of thinking about how decisions, evidence, controls and delivery artefacts move through the organisation.</p><p>A traditional delivery lifecycle often assumes humans create artefacts, humans interpret them, humans review them, and humans carry context from one stage to another.</p><p>AI changes that.</p><p>It can generate artefacts. It can interpret artefacts. It can connect artefacts. It can challenge gaps. It can detect inconsistencies. It can also hallucinate, over-simplify, miss context, expose sensitive information, or create outputs that sound correct but are not fit for the organisation.</p><p>That is the trade-off.</p><p>AI can reduce effort, but it can also create a new form of architecture debt if the organisation does not control how it is used.</p><p>The answer is not to slow everything down.</p><p>The answer is to make the lifecycle clearer.</p><h2><strong>Discovery: stop losing architecture in workshop noise</strong></h2><p>Discovery is where many delivery problems begin.</p><p>Not because teams do not care. They usually do. The problem is that discovery creates a lot of fragmented information: workshop notes, Slack messages, Jira tickets, customer pain points, process maps, Figma screens, vendor documents, assumptions, risks, constraints and half-formed options.</p><p>A good architect can bring structure to that noise.</p><p>AI can help.</p><p>In AI-DLC, discovery should become less dependent on memory and more dependent on structured evidence. AI can read discovery material and help identify the business problem, impacted capabilities, current-state constraints, upstream and downstream dependencies, open assumptions, likely non-functional requirements and decision points.</p><p>That does not mean AI decides the architecture.</p><p>It means AI helps the team see the discovery landscape earlier.</p><p>The practical value is simple: fewer hidden assumptions.</p><p>In many programmes, the expensive problems are not the ones teams knew about early. They are the assumptions nobody wrote down. The dependency that was &#8220;obvious&#8221;. The data boundary nobody challenged. The support model that was assumed to exist. The vendor limitation discovered after the design had already been shaped.</p><p>AI can help surface those signals earlier if it is given the right material and the right guardrails.</p><p>This connects to a point I have written about before in <a href="https://newsletter.aminollahi.com/p/business-analysis-vs-solution-architecture">Where Business Analysis Ends and Solution Architecture Begins</a>. Business analysis helps clarify the need. Solution architecture has to test whether that need can survive the real system constraints.</p><p>AI-DLC should make that handover stronger, not blur it further.</p><p>The discovery question should not be:</p><p>Can AI summarise the workshop?</p><p>The better question is:</p><p>Can AI help us identify the decisions, risks and assumptions that must be owned before we move into design?</p><p>That is where the value is.</p><h2><strong>Design: architecture needs to become AI-readable</strong></h2><p>AI-DLC will not work if architecture remains trapped in scattered diagrams, stale Confluence pages and tribal knowledge.</p><p>AI needs context.</p><p>Engineers need context.</p><p>Governance needs context.</p><p>If the architecture artefacts are fragmented, outdated or hard to query, AI will not fix the problem. It will only make the gaps less visible.</p><p>This is why architecture-as-code matters.</p><p>I do not mean turning every architecture decision into heavy documentation. I mean making architecture artefacts structured, versioned, searchable and usable by both humans and AI.</p><p>A practical architecture-as-code repository might include:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;a4038f0b-4c13-40ca-8d9b-1b4a8e5756c9&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">/architecture
  /decisions
  /patterns
  /nfrs
  /risks
  /controls
  /api-contracts
  /data-boundaries
  /sequence-diagrams
  /operational-readiness</code></pre></div><p>The format does not need to be complicated. Markdown, Mermaid, PlantUML, OpenAPI, JSON and YAML can be enough.</p><p>The point is not the format.</p><p>The point is that architecture intent becomes explicit.</p><p>If AI is going to help developers write code, refine stories, generate tests or review pull requests, it needs to understand the approved patterns, system boundaries, integration contracts, security controls and non-functional expectations.</p><p>Otherwise, AI will optimise for generic correctness rather than organisational fit.</p><p>That is dangerous.</p><p>A generated implementation may look technically reasonable and still violate the actual architecture. It may bypass an approved integration pattern. It may log sensitive data. It may introduce coupling the platform was trying to avoid. It may produce code that works locally but creates supportability problems later.</p><p>This is why I keep coming back to technical ownership.</p><p>Technical ownership is not about being the person who writes the code. It is about protecting the technical integrity of the outcome across architecture, delivery, security, data, integration, operations and long-term maintainability.</p><p>AI does not remove that responsibility.</p><p>It makes it more important.</p><h2><strong>Delivery: context before code</strong></h2><p>The most visible AI use case in delivery is code generation.</p><p>That is also where many organisations will make the shallowest mistake.</p><p>They will measure AI adoption by how many developers use a coding assistant. That may be useful as a productivity signal, but it does not prove the organisation is delivering better systems.</p><p>Good delivery is not only about writing code faster.</p><p>It is about building the right thing with the right constraints, in a way the organisation can operate, secure, change and govern.</p><p>In AI-DLC, AI-assisted delivery should be grounded in context. A developer should not only give the AI a Jira ticket and ask it to produce code. The AI should also understand the architecture decision, approved pattern, API contract, data classification, security controls, observability expectations and test strategy.</p><p>That is the difference between AI coding and AI-assisted delivery.</p><p>A Jira story on its own can be too thin. It may describe the task but not the architecture consequence. It may tell the engineer what to build but not explain what not to break.</p><p>The context bundle matters.</p><p>Before AI generates implementation guidance, the team should be able to attach:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;ddd16f8f-a234-4d18-9e8f-d9363bbbab31&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">- The user story or delivery ticket
- The relevant architecture decision record
- The approved integration pattern
- The API or event contract
- The data classification
- The non-functional requirements
- The threat model or control checklist
- The expected test coverage
- The observability requirements
- The release and rollback guardrails</code></pre></div><p>This is where AI-DLC becomes practical.</p><p>AI can help turn architecture decisions into acceptance criteria. It can generate negative test cases from risks. It can suggest missing logs and metrics. It can compare a pull request against an approved design. It can highlight where the implementation has drifted from the decision record.</p><p>But the human team still owns the judgement.</p><p>AI can accelerate the path.</p><p>It cannot own the consequence.</p><h2><strong>Governance: move from late review to continuous assurance</strong></h2><p>Traditional architecture governance often arrives too late.</p><p>A team has already shaped the solution. Engineering has already started. Dependencies are already committed. Then the architecture review asks whether the design is aligned.</p><p>At that point, governance can become a theatre of approval.</p><p>AI-DLC gives us a better option.</p><p>Governance can become more continuous.</p><p>That does not mean more meetings. It should mean fewer surprises.</p><p>AI can help check whether key artefacts exist, whether risks have mitigations, whether decision records are linked to delivery work, whether data classification has been considered, whether non-functional requirements are missing, and whether implementation evidence supports the architecture intent.</p><p>This matters because AI creates a traceability problem.</p><p>If teams are using AI across discovery, design and delivery, leaders need to know how decisions are being shaped. Which outputs were generated? Which were reviewed? Which were accepted? Which risks were identified? Which controls were applied? Who made the final call?</p><p>That is not bureaucracy.</p><p>That is accountability.</p><p>I wrote about decision ownership in <a href="https://newsletter.aminollahi.com/p/rapid-vs-daci-architecture-decisions-templates">RAPID vs DACI: The decision matrix every CIO should steal</a>. The same principle applies here. AI can assist the decision process, but it cannot replace decision rights.</p><p>Someone still needs to own the call.</p><p>Someone still needs to record the why.</p><p>Someone still needs to revisit the decision when assumptions change.</p><p>AI-DLC should make this easier by creating living evidence, not more paperwork.</p><h2><strong>The governance model must include AI-specific risk</strong></h2><p>There is another layer that cannot be ignored.</p><p>AI introduces risks that traditional delivery governance was not designed to handle properly.</p><p>Prompt injection. Sensitive data disclosure. Insecure tool use. Model hallucination. Unreviewed generated code. Excessive agent permissions. Weak audit trails. Private information being pasted into external tools. AI outputs being treated as evidence when they are really suggestions.</p><p>These are not theoretical risks.</p><p>They are delivery risks.</p><p>They need to be managed in the same lifecycle as architecture, security, privacy and operational readiness.</p><p>This is where external frameworks are useful, but they are not enough on their own. NIST&#8217;s AI Risk Management Framework gives a useful risk management structure around Govern, Map, Measure and Manage. OWASP&#8217;s LLM guidance highlights application-level risks such as prompt injection and sensitive information disclosure. Google&#8217;s SAIF gives a security lens for AI systems. Microsoft&#8217;s Responsible AI material connects governance with engineering practices and team enablement.</p><p>But frameworks do not implement themselves.</p><p>The architecture question is:</p><p>How do these controls show up in daily delivery?</p><p>A policy document is not enough.</p><p>The controls need to appear in story refinement, design review, code review, testing, release readiness, vendor assessment, access control, logging, incident response and post-implementation learning.</p><p>Otherwise, AI governance becomes another document that looks mature but does not change behaviour.</p><p>That is one of the most common enterprise architecture anti-patterns: governance that exists on paper but not in the operating model. I explored that broader problem in <a href="https://newsletter.aminollahi.com/p/enterprise-architecture-anti-patterns">When Enterprise Architecture Goes Sideways: 4 Anti-patterns and Fixes</a>.</p><p>AI-DLC needs to avoid the same trap.</p><h2><strong>The real operating model</strong></h2><p>The practical AI-DLC operating model is not complicated.</p><p>But it does need to be explicit.</p><p>Discovery should produce decision-ready evidence.</p><p>Design should produce AI-readable architecture intent.</p><p>Delivery should use AI with controlled context, not isolated prompts.</p><p>Testing should be generated from requirements, risks and failure modes.</p><p>Governance should continuously check traceability, controls and evidence.</p><p>Post-implementation review should feed learning back into the architecture knowledge base.</p><p>That last part is important.</p><p>AI-DLC should improve with every delivery cycle. If a design assumption was wrong, capture it. If a generated test missed an edge case, update the pattern. If a security review found a new class of risk, add it to the control library. If a prompt created poor output, improve the reusable prompt pattern. If engineers repeatedly ask the same architecture question, make the architecture guidance clearer.</p><p>This is how AI-DLC becomes a learning system.</p><p>Not because AI is magic.</p><p>Because the organisation finally treats delivery knowledge as an asset.</p><h2><strong>Do not confuse AI speed with platform maturity</strong></h2><p>AI can make immature delivery look more productive for a while.</p><p>That is the trap.</p><p>A team with unclear ownership can produce more documents. A team with weak architecture can produce more diagrams. A team with poor testing discipline can produce more test cases. A team with fragmented governance can produce more evidence packs.</p><p>But volume is not maturity.</p><p>The real test is whether AI improves decision quality.</p><p>Are assumptions clearer?</p><p>Are risks surfaced earlier?</p><p>Are architecture decisions easier to trace?</p><p>Are security controls applied consistently?</p><p>Are teams reusing approved patterns?</p><p>Are non-functional requirements being designed in, not added late?</p><p>Are support, observability and operational readiness considered before release?</p><p>Are leaders making better trade-offs with better evidence?</p><p>If the answer is no, AI is probably accelerating activity rather than improving the system.</p><p>This is similar to the issue I described in <a href="https://newsletter.aminollahi.com/p/operational-over-tooling-fix-tool-sprawl">Operational Over-Tooling: When Your Stack Becomes the Product</a>. More tools do not automatically create better operations. More AI does not automatically create better delivery.</p><p>The operating model matters.</p><h2><strong>Data quality becomes even more important</strong></h2><p>There is one uncomfortable truth many AI transformation plans underplay.</p><p>AI is only as useful as the context it receives.</p><p>If requirements are vague, architecture documents are stale, system ownership is unclear, data classification is inconsistent and decision records do not exist, AI will not magically create maturity. It may simply produce confident output from poor inputs.</p><p>Bad input becomes bad guidance.</p><p>Bad guidance becomes delivery risk.</p><p>That is why data quality and knowledge quality matter in AI-DLC. Your architecture repository, delivery artefacts, risk registers, design patterns and operational runbooks become part of the context that AI uses to support the team.</p><p>If that context is weak, the AI output becomes weak.</p><p>This connects directly to the issue I wrote about in <a href="https://newsletter.aminollahi.com/p/bad-data-virus-antipattern-fix">Bad Data Virus: The Enterprise Anti-Pattern That Breaks Trust</a>. Bad data does not always fail loudly. It quietly contaminates decisions.</p><p>The same is true for bad architecture knowledge.</p><p>If your AI assistant is learning from stale patterns, unclear boundaries and old assumptions, it may help teams move faster in the wrong direction.</p><p>AI-DLC needs clean, governed, current knowledge.</p><p>Not perfect knowledge.</p><p>But trustworthy enough to support decisions.</p><h2><strong>What leaders should ask before adopting AI-DLC</strong></h2><p>The wrong question is:</p><p>Which AI tool should we buy?</p><p>The better questions are:</p><p>What parts of our lifecycle are ready for AI assistance?</p><p>Which decisions must always remain human-owned?</p><p>What data can and cannot be shared with AI tools?</p><p>How will AI outputs be reviewed?</p><p>Where will architecture decisions be stored?</p><p>How will generated code be tested and traced?</p><p>How will we detect architecture drift?</p><p>How will we prove security and compliance controls were considered?</p><p>How will we prevent every team from creating its own AI delivery process?</p><p>These questions are not designed to slow adoption.</p><p>They are designed to make adoption safe enough to scale.</p><p>There is a difference between experimentation and operating model change. Experimentation can live inside a team. Operating model change affects the enterprise.</p><p>AI-DLC is an operating model change.</p><p>That means architecture, security, engineering, product, delivery and governance need to work together from the start.</p><h2><strong>A practical AI-DLC maturity path</strong></h2><p>The first step is not to automate everything.</p><p>The first step is to create clarity.</p><p>Start by mapping where AI is already being used across discovery, design, delivery, testing and governance. Most organisations will discover that AI adoption is already happening informally.</p><p>Then classify the usage.</p><p>Low-risk use cases might include summarising public documentation, drafting meeting notes or producing first-draft outlines.</p><p>Medium-risk use cases might include story refinement, test generation, documentation updates and architecture draft support.</p><p>High-risk use cases include code generation for critical systems, AI agents with tool access, security-sensitive workflows, customer data handling, regulated processes and decisions that affect financial, legal, privacy or operational outcomes.</p><p>Once the organisation understands the usage, it can define guardrails.</p><p>Not every AI use case needs the same control.</p><p>A draft meeting summary does not need the same review model as generated code in a payments platform. A public blog outline does not need the same governance as an AI agent with access to internal systems.</p><p>Good governance is proportionate.</p><p>That is how you avoid both extremes: uncontrolled adoption and governance theatre.</p><h2><strong>Architecture&#8217;s role in AI-DLC</strong></h2><p>Architecture should not try to own every AI tool.</p><p>That would be the wrong model.</p><p>Architecture should own the integrity of the lifecycle.</p><p>That means helping the organisation define where AI fits, what context it needs, what decisions it can support, what decisions it cannot own, what artefacts must be traceable, and what risks need controls.</p><p>Architecture should also help create the reusable patterns.</p><p>Prompt patterns. Design patterns. Review checklists. Architecture-as-code templates. Decision record formats. Control libraries. Context packs. Governance workflows.</p><p>This is where enterprise architecture can become more useful, not more bureaucratic.</p><p>The value is not in telling teams, &#8220;You need approval before using AI.&#8221;</p><p>The value is in giving teams a safe path to use AI without creating hidden risk.</p><p>That is a different kind of governance.</p><p>It is governance as enablement.</p><h2><strong>The strategic lesson</strong></h2><p>AI-DLC is not about replacing delivery teams.</p><p>It is about making delivery knowledge more structured, more reusable and more governed.</p><p>Used well, AI can help teams move faster with better evidence. It can surface risks earlier, connect decisions to implementation, generate stronger test coverage, improve documentation and make governance more continuous.</p><p>Used poorly, it can hide risk behind speed.</p><p>That is the delivery trap.</p><p>An organisation may believe it is becoming AI-native because teams are using AI tools. But AI-native delivery is not measured by tool usage. It is measured by whether the organisation can use AI while still protecting decision quality, architecture integrity, security, supportability and accountability.</p><p>The real question is not:</p><p>Are our teams using AI?</p><p>The better question is:</p><p>Can our delivery lifecycle absorb AI without losing control of the decisions that matter?</p><p>That is where AI-DLC becomes important.</p><p>Not as another framework.</p><p>As a way to make sure speed does not outrun ownership.</p><h2><strong>Subscribe to Designed to Scale</strong></h2><p>I write about enterprise architecture, AI systems, platform strategy and the real trade-offs behind technical decisions.</p><p>Subscribe to <strong><a href="https://newsletter.aminollahi.com/">Designed to Scale</a></strong> if you want practical architecture thinking for leaders building systems that need to survive real delivery, real growth and real operational pressure.</p><p></p><h2><strong>Read more from Designed to Scale</strong></h2><ul><li><p><a href="https://newsletter.aminollahi.com/p/ai-infrastructure-enterprise-strategy">AI Infrastructure Strategy for Enterprise Architects</a></p></li></ul><ul><li><p><a href="https://newsletter.aminollahi.com/p/business-analysis-vs-solution-architecture">Where Business Analysis Ends and Solution Architecture Begins</a></p></li></ul><ul><li><p><a href="https://newsletter.aminollahi.com/p/enterprise-architecture-anti-patterns">When Enterprise Architecture Goes Sideways: 4 Anti-patterns and Fixes</a></p></li></ul><ul><li><p><a href="https://newsletter.aminollahi.com/p/rapid-vs-daci-architecture-decisions-templates">RAPID vs DACI: The decision matrix every CIO should steal</a></p></li></ul><ul><li><p><a href="https://newsletter.aminollahi.com/p/operational-over-tooling-fix-tool-sprawl">Operational Over-Tooling: When Your Stack Becomes the Product</a></p></li></ul>]]></content:encoded></item><item><title><![CDATA[Tap-and-Go: 1-Page Architecture & Control Checklist for CIOs]]></title><description><![CDATA[What every CIO should know about payment flows, PCI scope, and the controls that actually matter]]></description><link>https://newsletter.aminollahi.com/p/tap-and-go-plain-english-pci-dss-cio-checklist</link><guid isPermaLink="false">https://newsletter.aminollahi.com/p/tap-and-go-plain-english-pci-dss-cio-checklist</guid><dc:creator><![CDATA[Ryan Aminollahi]]></dc:creator><pubDate>Sun, 08 Mar 2026 21:03:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!oyxS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f9914e6-8ee6-401f-a09a-de72e47d04f3_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oyxS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f9914e6-8ee6-401f-a09a-de72e47d04f3_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oyxS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f9914e6-8ee6-401f-a09a-de72e47d04f3_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!oyxS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f9914e6-8ee6-401f-a09a-de72e47d04f3_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!oyxS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f9914e6-8ee6-401f-a09a-de72e47d04f3_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!oyxS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f9914e6-8ee6-401f-a09a-de72e47d04f3_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oyxS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f9914e6-8ee6-401f-a09a-de72e47d04f3_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f9914e6-8ee6-401f-a09a-de72e47d04f3_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2311590,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.aminollahi.com/i/190162839?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f9914e6-8ee6-401f-a09a-de72e47d04f3_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!oyxS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f9914e6-8ee6-401f-a09a-de72e47d04f3_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!oyxS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f9914e6-8ee6-401f-a09a-de72e47d04f3_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!oyxS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f9914e6-8ee6-401f-a09a-de72e47d04f3_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!oyxS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f9914e6-8ee6-401f-a09a-de72e47d04f3_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Every tap-and-go payment is a trust event.</p><p>A customer taps a card, a phone, or a wearable and expects the transaction to feel effortless. Underneath that simplicity sits a chain of systems, networks, service providers, and decisions that must work securely in seconds. When they do, nobody notices. When they fail, the damage is rarely limited to one bug or one team. It becomes a trust problem, an operating problem, and often a board-level problem. That is the real business context behind PCI DSS. In your series, PCI DSS is framed not as an auditor&#8217;s checklist, but as disciplined engineering: segmentation, minimalism, encryption, accountability, and continuous vigilance.</p><p>Most CIOs do not need to memorise the standard. They do need to understand five things:</p><ol><li><p>how a payment flows in plain English</p></li><li><p>where card data appears</p></li><li><p>how scope quietly expands</p></li><li><p>what controls matter most</p></li><li><p>what questions leadership should ask before an incident forces the answer</p></li></ol><p>That is the purpose of this brief.</p><h2>Tap-and-Go in plain English</h2><p>At a high level, a card payment is simple.</p><p><strong>Customer taps card &#8594; merchant app or terminal &#8594; payment gateway or processor &#8594; card network and issuer &#8594; approval or decline returns</strong></p><p>The customer sees a beep and a receipt. The architecture team sees something else: data crossing trust boundaries. A single transaction may pass through multiple organisations and systems before a decision comes back. Each hop is a chance to expose cardholder data if the architecture is sloppy, if data is logged carelessly, or if connected systems absorb more information than they should. Part 1 of your series makes this point clearly: payment security is not abstract. It is about what happens to card data wherever it lives, moves, or hides.</p><p>This is why PCI DSS matters to CIOs. Not because the document is long, but because payment architecture tends to sprawl unless somebody at leadership level keeps asking the right questions.</p><h2>The architecture boundary that matters most</h2><p>When people hear &#8220;PCI&#8221;, they often jump straight to encryption, firewalls, or audit evidence. The more important starting point is scope.</p><p>Before you can protect anything, you need to know what data you are dealing with and where it exists. Part 2 of your series separates payment data into two categories: <strong>Cardholder Data (CHD)</strong>, such as PAN, cardholder name, and expiry date; and <strong>Sensitive Authentication Data (SAD)</strong>, such as CVV, PINs, or full track or chip data. CHD may be stored if properly protected. SAD must not be retained after authorisation, even if encrypted.</p><p>That distinction is not academic. It is the difference between a bounded payment environment and a contaminated estate.</p><p>The CIO question is not only, &#8220;Do we store card data?&#8221; The sharper question is, &#8220;Where can payment data appear today, including by accident?&#8221; Because scope expansion is rarely dramatic. It is usually quiet.</p><p>A developer turns on verbose logging.</p><p>A tester copies production transactions into QA.</p><p>An analytics feed consumes transaction payloads for &#8220;customer insights&#8221;.</p><p>A support workflow exposes more than masked data.</p><p>A monitoring platform indexes payloads that nobody meant to retain.</p><p>Each of those decisions can pull new systems into PCI scope. Your series treats this as one of the core lessons: the biggest PCI cost is often not the initial design, but the systems that become in scope because the architecture was not kept deliberately small.</p><p>That is why the most important architectural principle in payments is simple:</p><p><strong>Keep card data away from internal systems wherever you can.</strong></p><p>Tokenisation, strong encryption, segmentation, and careful provider choices all support that goal. Mature payment architecture is not about heroics. It is about keeping the island small.</p><h2>What PCI DSS really tests</h2><p>PCI DSS is often described as a compliance standard. In practice, it is also a test of operational discipline.</p><p>Part 3 of your series translates the standard into a clearer idea: protect payment data through strong design, disciplined operation, and continuous vigilance. That is a much better executive framing than &#8220;12 requirements&#8221;. The standard may be structured as twelve requirements across six families, but a CIO should see it as a way to test whether payment handling is deliberate or accidental.</p><p>A strong payment environment usually shows the same characteristics:</p><ul><li><p>clear boundaries</p></li><li><p>minimal data exposure</p></li><li><p>deliberate encryption and key handling</p></li><li><p>tightly controlled privileged access</p></li><li><p>secure change practices</p></li><li><p>monitoring that catches drift early</p></li><li><p>teams that understand their role in keeping scope small</p></li></ul><p>A weak environment usually shows the opposite:</p><ul><li><p>unclear ownership</p></li><li><p>logs and tools treated as harmless by default</p></li><li><p>PCI left to security alone</p></li><li><p>audit evidence assembled late</p></li><li><p>delivery speed bought at the cost of discipline</p></li></ul><p>That is why PCI maturity is as much about habits as it is about controls. Part 4 and the final review both reinforce that compliance does not live in the document library. It lives in everyday decisions, every commit, every test path, every deployment, and every exception someone thinks is temporary.</p><h2>The CIO&#8217;s 1-page architecture and control checklist</h2><p>Below is the version I would put in front of a CIO, not as an audit worksheet, but as a leadership checklist.</p><h3>1) Keep the payment estate small</h3><p>Can the team clearly show where card data enters, moves, and stops? Can they explain which systems are in scope today and why? If this map is vague, your risk is already higher than you think. Part 2 repeatedly emphasises that scope definition is the most overlooked part of compliance and the one that shapes how painful everything else becomes.</p><h3>2) Keep sensitive data out of general systems</h3><p>Can the team prove that CVV, PIN-related data, full track data, and other prohibited elements are not being retained after authorisation? Can they prove that logs, dashboards, tickets, support tools, and email templates do not expose more than they should? Your series is very clear here: some data can be protected and retained under strict controls; some data simply must not remain.</p><h3>3) Protect every hand-off</h3><p>Are transmissions encrypted across all relevant paths, not only internet-facing ones but internal APIs and service-to-service communications as well? Are certificates validated properly? Is storage protection deliberate rather than assumed? Part 3 notes that internal traffic is often wrongly treated as &#8220;safe&#8221;, even though encryption in transit matters there too.</p><h3>4) Restrict privileged access and make it attributable</h3><p>Who can access payment systems, secrets, logs, consoles, and supporting platforms? Is that access limited by role, reviewed regularly, and attributable to named individuals? Strong PCI posture requires accountability, not generic administrative convenience. That theme runs across Part 1, Part 3, and Part 4.</p><h3>5) Build controls into delivery, not after delivery</h3><p>Do architecture reviews, design patterns, code reviews, testing, release gates, and project plans include payment-control expectations from the start? Or does PCI only become visible near audit time? Your series consistently argues that good compliance is a natural extension of good engineering, not a clean-up exercise at the end.</p><h3>6) Detect scope drift early</h3><p>Would the organisation know quickly if PAN-like data appeared in logs, databases, reports, analytics feeds, or non-production environments? Part 4 recommends automated scans for PAN-like patterns and treating that detection capability as part of normal engineering hygiene, not an emergency response technique.</p><h3>7) Rehearse response, not just prevention</h3><p>If card data appeared tomorrow in a non-CDE system, what happens next? Who owns containment? Who verifies eradication? Who re-assesses scope? Who informs stakeholders? The final review in your series makes an important point: PCI competence is not just knowing the rules when calm, but applying them instinctively under deadline pressure and operational stress.</p><h2>Three red flags every CIO should recognise</h2><h3>Red flag 1: &#8220;We don&#8217;t store card data&#8221;</h3><p>This statement is often true in spirit and false in practice.</p><p>Many teams mean they do not deliberately store card data in a business database. That does not answer whether card data appears in debug logs, observability tooling, reports, email templates, message queues, or copied test datasets. Your series uses multiple examples of accidental contamination to show that unplanned exposure is still exposure.</p><h3>Red flag 2: PCI is treated as the security team&#8217;s job</h3><p>That is a governance smell.</p><p>Architects define boundaries. Developers decide what gets logged and transmitted. Testers validate masking and data hygiene. Project managers decide whether compliance work is visible or perpetually postponed. Part 4 makes this explicit: compliance happens in daily choices across roles, not inside one specialised function.</p><h3>Red flag 3: Audit readiness begins late</h3><p>When evidence gathering starts close to assessment time, it usually means controls are not embedded deeply enough in delivery.</p><p>Healthy environments produce evidence naturally because the underlying habits already exist: controlled access, repeatable builds, disciplined logging, scanning, segmentation, and clear ownership. Unhealthy ones produce frantic spreadsheet work. PCI is expensive when it is bolted on. It is much cheaper when it is built in. That is one of the clearest through-lines of the entire series.</p><h2>Three questions every CIO should ask this quarter</h2><p>The point of this brief is not to turn CIOs into assessors. It is to sharpen leadership questions.</p><p>Here are the three I would use.</p><p><strong>1. Where exactly can PAN appear today across production, logs, observability, support workflows, and non-production environments?</strong></p><p>A vague answer here is a genuine warning sign. Scope cannot be managed if data location is fuzzy.</p><p><strong>2. Which systems would become in scope tomorrow if a developer enabled verbose logging or if real data was copied into a test path?</strong></p><p>This question gets people thinking about blast radius, not just current-state diagrams. It also exposes whether teams understand contamination pathways.</p><p><strong>3. Who owns payment-scope reduction as an architecture objective, not just a compliance activity?</strong></p><p>If nobody owns scope reduction, scope expansion will happen by default. This is one of the most important strategic ideas in your series.</p><h2>The leadership takeaway</h2><p>The real lesson of PCI DSS is not that payment systems need more paperwork. It is that payment systems need sharper boundaries.</p><p>When payment architecture is deliberately small, heavily bounded, and handled with engineering discipline, compliance becomes more manageable. Audits become less painful. Incidents become less likely. Delivery becomes more predictable. When payment data is allowed to drift into logs, tooling, test environments, and loosely governed integrations, every future change becomes harder and every future assurance activity becomes more expensive. That is the operating logic running through all five pieces in the series.</p><p>So the best CIO question is not:</p><p><strong>&#8220;Are we compliant?&#8221;</strong></p><p>It is:</p><p><strong>&#8220;Can we prove our payment scope is as small and controlled as we think it is?&#8221;</strong></p><p>That question does more than prepare you for an assessment. It drives better architecture.</p><p></p><h2>Continue the payments series</h2><p><strong>This article is the canonical entry point for the full series.</strong></p><ol><li><p><strong>Foundations:</strong> <em><a href="https://newsletter.aminollahi.com/p/pci-dss-foundations-trust-secure-card-payments-1">The secret rulebook behind every tap-and-go payment (Part 1)</a></em><a href="https://newsletter.aminollahi.com/p/pci-dss-foundations-trust-secure-card-payments-1">, why PCI DSS exists and why trust matters.</a></p></li><li><p><strong>Data &amp; Scope:</strong> <em><a href="https://newsletter.aminollahi.com/p/pci-dss-data-scope-cardholder-environment">The secret rulebook behind every tap-and-go payment (Part 2)</a></em><a href="https://newsletter.aminollahi.com/p/pci-dss-data-scope-cardholder-environment">, what counts as cardholder data, what belongs in scope, and how scope expands.</a></p></li><li><p><strong>The 12 Requirements:</strong> <em><a href="https://newsletter.aminollahi.com/p/pci-dss-12-requirements-simplified-3">The secret rulebook behind every tap-and-go payment (Part 3)</a></em><a href="https://newsletter.aminollahi.com/p/pci-dss-12-requirements-simplified-3">, the control model in plain language.</a></p></li><li><p><strong>Roles &amp; Breach Lessons:</strong> <em><a href="https://newsletter.aminollahi.com/p/pci-dss-role-based-awareness-breach-lessons">The secret rulebook behind every tap-and-go payment (Part 4)</a></em><a href="https://newsletter.aminollahi.com/p/pci-dss-role-based-awareness-breach-lessons">, how everyday decisions turn theory into practice.</a></p></li><li><p><strong>Final Review:</strong> <em><a href="https://newsletter.aminollahi.com/p/pci-dss-final-review-integrative-challenge">PCI DSS Final Review: Real-World Scenarios, Scope Reduction &amp; the PCI Mindset</a></em><a href="https://newsletter.aminollahi.com/p/pci-dss-final-review-integrative-challenge">, scenarios, judgement, and the final mindset test.</a></p></li></ol>]]></content:encoded></item><item><title><![CDATA[RAPID vs DACI: The decision matrix every CIO should steal]]></title><description><![CDATA[A practical guide for architecture decisions, with copy-paste templates, meeting scripts, and an ADR-ready record.]]></description><link>https://newsletter.aminollahi.com/p/rapid-vs-daci-architecture-decisions-templates</link><guid isPermaLink="false">https://newsletter.aminollahi.com/p/rapid-vs-daci-architecture-decisions-templates</guid><dc:creator><![CDATA[Ryan Aminollahi]]></dc:creator><pubDate>Sun, 15 Feb 2026 20:00:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Si9D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9563571f-8c86-4b7d-b80d-483e0f75a599_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Si9D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9563571f-8c86-4b7d-b80d-483e0f75a599_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Si9D!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9563571f-8c86-4b7d-b80d-483e0f75a599_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Si9D!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9563571f-8c86-4b7d-b80d-483e0f75a599_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Si9D!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9563571f-8c86-4b7d-b80d-483e0f75a599_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Si9D!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9563571f-8c86-4b7d-b80d-483e0f75a599_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Si9D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9563571f-8c86-4b7d-b80d-483e0f75a599_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9563571f-8c86-4b7d-b80d-483e0f75a599_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:835994,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.aminollahi.com/i/187905957?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9563571f-8c86-4b7d-b80d-483e0f75a599_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Si9D!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9563571f-8c86-4b7d-b80d-483e0f75a599_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Si9D!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9563571f-8c86-4b7d-b80d-483e0f75a599_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Si9D!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9563571f-8c86-4b7d-b80d-483e0f75a599_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Si9D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9563571f-8c86-4b7d-b80d-483e0f75a599_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>If you&#8217;re a CIO choosing RAPID vs DACI for architecture decisions, use the matrix above. Pick one model per decision, name the roles in 10 minutes, and write the decision down in an ADR so you don&#8217;t relitigate it next month. Because the fastest way to slow a tech organisation down isn&#8217;t a bad architecture choice, it&#8217;s a decision that never actually lands. You&#8217;ve seen the pattern: &#8220;just one more stakeholder&#8221;, &#8220;we need alignment&#8221;, &#8220;let&#8217;s socialise it&#8221;, and suddenly a simple call turns into a four-week saga. This article gives you a clean way to choose the right decision model, run the meeting, and ship the outcome without turning governance into theatre.</p><h2>The real problem isn&#8217;t the framework, it&#8217;s decision fog</h2><p>Decision fog is what happens when nobody can clearly answer three questions: What are we deciding? Who decides? When is it decided? In architecture, it shows up as endless pre-reads that nobody finishes, &#8220;quick alignments&#8221; that turn into debate clubs, silent vetoes that appear after the meeting, and surprise stakeholders joining late with &#8220;one more concern&#8221; that resets the whole conversation.</p><p>The cost isn&#8217;t just frustration. Decision fog slows delivery, pushes teams into building their own versions of &#8220;the standard&#8221;, and creates security gaps because controls get negotiated differently every time. Over a few quarters, it turns into platform drift: five logging patterns, three ways of doing auth, two pipelines &#8220;temporarily&#8221; bypassing checks, and an Architecture Review Board that feels like a weekly rerun.</p><p>Mini-story: I&#8217;ve sat in ARB sessions where the room is full of smart people and the doc is 20 pages long&#8230; and still, nobody can name the decider. Everyone has input, someone has a concern, the meeting ends with &#8220;we&#8217;ll take it offline&#8221;, and the team ships anyway because the sprint clock doesn&#8217;t care.</p><p>By the end of this, you&#8217;ll know when to use RAPID vs DACI, and you&#8217;ll have templates you can copy-paste into your next decision so it sticks.</p><h2>RAPID and DACI in one minute</h2><h3>RAPID (roles)</h3><p>RAPID is built for decisions where ownership and follow-through are the main risks. It forces you to name who proposes, who can block, who ships, and who makes the final call.</p><p>&#9;&#8226;&#9;R &#8212; Recommend: writes the proposal and options</p><p>&#9;&#8226;&#9;A &#8212; Agree: limited, explicit veto / approval points</p><p>&#9;&#8226;&#9;P &#8212; Perform: owns delivery and adoption</p><p>&#9;&#8226;&#9;I &#8212; Input: consulted experts</p><p>&#9;&#8226;&#9;D &#8212; Decide: final decision maker</p><h3>DACI (roles)</h3><p>DACI is built for decisions where coordination and clarity are the main risks. It makes the process visible: who drives it, who approves it, who contributes, and who just needs to know.</p><p>&#9;&#8226;&#9;D &#8212; Driver: runs the process, keeps it moving</p><p>&#9;&#8226;&#9;A &#8212; Approver: final call</p><p>&#9;&#8226;&#9;C &#8212; Contributors: provide input and work</p><p>&#9;&#8226;&#9;I &#8212; Informed: kept in the loop, not part of the decision</p><p>The difference in one line: RAPID makes execution ownership explicit; DACI makes facilitation and participation explicit.</p><h2>When RAPID wins for architecture decisions</h2><p>RAPID is your pick when the decision isn&#8217;t the hard part, getting it executed across teams is. It&#8217;s built for calls that need a clear decider, explicit guardrails, and a named owner who will actually make it real in delivery.</p><h3>Best-fit decision types (examples)</h3><p>Use RAPID for decisions like these:</p><p>&#9;&#8226;&#9;Cloud landing zone standards, guardrails, and exceptions</p><p>Things like network patterns, identity boundaries, logging baselines, and the &#8220;no, you can&#8217;t do that&#8221; rules, plus the exception process.</p><p>&#9;&#8226;&#9;&#8220;Build vs buy&#8221; for a shared platform capability</p><p>CI/CD platforms, observability stacks, API gateways, feature flag platforms, and secrets tooling choices that will shape teams for years.</p><p>&#9;&#8226;&#9;Security boundary calls</p><p>CDE scope, tokenisation boundaries, encryption approach, key management patterns, where secrets live, what&#8217;s allowed in which environment.</p><p>&#9;&#8226;&#9;Integration patterns that affect many squads</p><p>Sync vs async, eventing vs request/response, canonical models, contract standards, idempotency rules, the stuff that becomes organisational muscle memory.</p><h3>What to watch for (failure modes)</h3><p>RAPID works brilliantly&#8230; until people blur the roles.</p><p>&#9;&#8226;&#9;Too many &#8220;Agree&#8221; roles becomes a hidden committee</p><p>&#8220;Agree&#8221; is not &#8220;everyone who cares&#8221;. Keep it to true veto points (security, risk, legal) or you&#8217;ve rebuilt the problem you were trying to fix.</p><p>&#9;&#8226;&#9;The decider avoids deciding and turns &#8220;Input&#8221; into voting</p><p>If &#8220;Input&#8221; becomes a poll, you&#8217;ll get &#8220;alignment&#8221; and still no outcome. Input is advice, not a referendum.</p><p>&#9;&#8226;&#9;&#8220;Perform&#8221; isn&#8217;t named, so the decision never lands in production</p><p>This is the silent killer. If there&#8217;s no delivery owner, the decision becomes a document, not a change. RAPID only works when &#8220;Perform&#8221; is a real person with capacity and a plan.</p><h2>When DACI wins for architecture decisions</h2><p>DACI is the better tool when the main problem is coordination. You don&#8217;t need a heavyweight decision chain; you need one person to drive the process, pull in the right contributors, and land the outcome cleanly without everyone feeling like they have to attend every meeting.</p><h3>Best-fit decision types (examples)</h3><p>DACI works well for decisions like:</p><p>&#9;&#8226;&#9;API standards updates and versioning rules</p><p>Naming conventions, error formats, pagination rules, deprecation timelines, and decisions that need consistency and a simple way to socialise change.</p><p>&#9;&#8226;&#9;Reference architecture updates</p><p>Logging and tracing standards, CI/CD guardrails, &#8220;golden path&#8221; patterns where the goal is repeatability and predictable adoption.</p><p>&#9;&#8226;&#9;Repeated &#8220;same-shaped&#8221; decisions across squads</p><p>The sort of decisions you make every month: &#8220;Which pattern is the default?&#8221;, &#8220;What&#8217;s the exception path?&#8221;, &#8220;What&#8217;s the minimum bar?&#8221; If you&#8217;ll do it again, DACI keeps it lightweight.</p><p>&#9;&#8226;&#9;Tooling choices inside a lane</p><p>Observability, feature flags, testing strategy, secrets tooling, especially when it&#8217;s a platform capability that needs input from a few teams but shouldn&#8217;t become an all-hands debate.</p><h3>What to watch for (failure modes)</h3><p>DACI breaks down when the roles become symbolic.</p><p>&#9;&#8226;&#9;The Driver becomes a note-taker instead of a closer</p><p>The Driver&#8217;s job is to move the decision to a finish line: set deadlines, chase inputs, frame options, and force a call with the Approver. If the Driver is only capturing comments, you&#8217;ll loop forever.</p><p>&#9;&#8226;&#9;Too many Contributors, no quality bar for input</p><p>If everyone is a contributor, nobody is accountable. Keep contributors tight, and ask for input in a useful shape: risks, trade-offs, and a recommendation, not essay-length opinions.</p><p>&#9;&#8226;&#9;&#8220;Informed&#8221; stakeholders show up late and try to reopen the call</p><p>This is where DACI needs backbone. Informed means they get the decision, not a seat at the table. If someone comes in late with new information, treat it as a change request; don&#8217;t replay the whole decision.</p><h2>The &#8220;architecture decision types&#8221; checklist (pick a model fast)</h2><p>Use this like a quick diagnostic. Don&#8217;t overthink it. Count the &#8220;yes&#8221; answers and pick the model that matches the shape of the decision.</p><h3>Score RAPID if you answer &#8220;yes&#8221; to 3+</h3><p>&#9;&#8226;&#9;Does the decision require cross-team execution and adoption? (Multiple squads will need to change how they build, deploy, or integrate.)</p><p>&#9;&#8226;&#9;Are there true veto points (security, risk, legal, finance)? (Someone must be able to say &#8220;no&#8221; for real reasons, not preference.)</p><p>&#9;&#8226;&#9;Will this decision change delivery roadmaps or operational load? (New work across teams, new on-call burden, new runbooks, new costs.)</p><p>&#9;&#8226;&#9;Is there a high cost of rollback? (Undoing it later would be expensive, disruptive, or risky.)</p><h3>Score DACI if you answer &#8220;yes&#8221; to 3+</h3><p>&#9;&#8226;&#9;Is the main pain coordination and stakeholder clarity? (The decision itself isn&#8217;t scary,  the process keeps wobbling.)</p><p>&#9;&#8226;&#9;Is this a recurring decision pattern (you&#8217;ll do it again soon)? (Standards, templates, playbooks, &#8220;default patterns&#8221; that repeat.)</p><p>&#9;&#8226;&#9;Do you need one person to drive inputs and timeboxes? (The herding cats problem. You need a Driver who closes.)</p><p>&#9;&#8226;&#9;Is the change easy to roll forward with a clear standard? (You can iterate, refine, and improve without massive rollback risk.)</p><h2>Templates (copy-paste)</h2><p>These are designed to be fast. Paste them into Confluence/Notion/Google Docs, fill the blanks, and you&#8217;re ready to run the decision.</p><h3>Template 1: RAPID roles table (one decision)</h3><p><strong>Decision statement: </strong>[One sentence: what are we deciding?]</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!joTQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f248535-70f1-4f1a-a329-0952ca6d9e60_722x406.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!joTQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f248535-70f1-4f1a-a329-0952ca6d9e60_722x406.png 424w, https://substackcdn.com/image/fetch/$s_!joTQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f248535-70f1-4f1a-a329-0952ca6d9e60_722x406.png 848w, https://substackcdn.com/image/fetch/$s_!joTQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f248535-70f1-4f1a-a329-0952ca6d9e60_722x406.png 1272w, https://substackcdn.com/image/fetch/$s_!joTQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f248535-70f1-4f1a-a329-0952ca6d9e60_722x406.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!joTQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f248535-70f1-4f1a-a329-0952ca6d9e60_722x406.png" width="722" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f248535-70f1-4f1a-a329-0952ca6d9e60_722x406.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:722,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:387442,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.aminollahi.com/i/187905957?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f248535-70f1-4f1a-a329-0952ca6d9e60_722x406.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!joTQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f248535-70f1-4f1a-a329-0952ca6d9e60_722x406.png 424w, https://substackcdn.com/image/fetch/$s_!joTQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f248535-70f1-4f1a-a329-0952ca6d9e60_722x406.png 848w, https://substackcdn.com/image/fetch/$s_!joTQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f248535-70f1-4f1a-a329-0952ca6d9e60_722x406.png 1272w, https://substackcdn.com/image/fetch/$s_!joTQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f248535-70f1-4f1a-a329-0952ca6d9e60_722x406.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>Timebox + meeting date:</strong></p><ul><li><p>Input closes: DD MMM</p></li><li><p>Decision meeting: DD MMM (max 30&#8211;45 mins)</p></li><li><p>Decision locked in ADR by: DD MMM (same day)</p></li></ul><p><strong>&#8220;Agree&#8221; guardrails (what counts as a veto):</strong></p><ul><li><p>Veto is valid only if it&#8217;s tied to: security / legal / risk / finance policy</p></li><li><p>Must include: specific concern + impact + proposed mitigation/alternative</p></li><li><p>No &#8220;veto by vibe&#8221;</p></li></ul><p></p><h3>Template 2: DACI roles table (one decision)</h3><p><strong>Decision statement: </strong>[One sentence: what are we deciding?]</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!W-a8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F353dadb7-a5bc-4840-9d8c-c31cfa06d978_721x406.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!W-a8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F353dadb7-a5bc-4840-9d8c-c31cfa06d978_721x406.png 424w, https://substackcdn.com/image/fetch/$s_!W-a8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F353dadb7-a5bc-4840-9d8c-c31cfa06d978_721x406.png 848w, https://substackcdn.com/image/fetch/$s_!W-a8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F353dadb7-a5bc-4840-9d8c-c31cfa06d978_721x406.png 1272w, https://substackcdn.com/image/fetch/$s_!W-a8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F353dadb7-a5bc-4840-9d8c-c31cfa06d978_721x406.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!W-a8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F353dadb7-a5bc-4840-9d8c-c31cfa06d978_721x406.png" width="721" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/353dadb7-a5bc-4840-9d8c-c31cfa06d978_721x406.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:721,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:397456,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.aminollahi.com/i/187905957?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F353dadb7-a5bc-4840-9d8c-c31cfa06d978_721x406.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!W-a8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F353dadb7-a5bc-4840-9d8c-c31cfa06d978_721x406.png 424w, https://substackcdn.com/image/fetch/$s_!W-a8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F353dadb7-a5bc-4840-9d8c-c31cfa06d978_721x406.png 848w, https://substackcdn.com/image/fetch/$s_!W-a8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F353dadb7-a5bc-4840-9d8c-c31cfa06d978_721x406.png 1272w, https://substackcdn.com/image/fetch/$s_!W-a8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F353dadb7-a5bc-4840-9d8c-c31cfa06d978_721x406.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>Input deadline + decision date:</strong></p><ul><li><p>Input due: DD MMM (written input, max 5 bullets each)</p></li><li><p>Decision date: DD MMM</p></li><li><p>Publish outcome by: DD MMM (same day)</p></li></ul><p><strong>How the outcome will be shared:</strong></p><ul><li><p>Posted in: #architecture (Slack/Teams) + linked in Confluence</p></li><li><p>Recorded as: ADR-###</p></li><li><p>Rollout note: who changes what by when</p></li></ul><p></p><h3>Template 3: One-page architecture decision brief (works for both)</h3><p><strong>Title:</strong> Decision: [X]</p><p><strong>Owner:</strong> [Name]</p><p><strong>Decision date:</strong> DD MMM YYYY</p><p><strong>Framework:</strong> RAPID / DACI</p><p><strong>Context (3 bullets)</strong></p><ul><li><p>What&#8217;s happening / why now?</p></li><li><p>What&#8217;s broken or at risk?</p></li><li><p>What success looks like</p></li></ul><p><strong>Options (2&#8211;3 options, with trade-offs)</strong></p><ul><li><p><strong>Option A:</strong> &#8230;</p><ul><li><p>Pros: &#8230;</p></li><li><p>Cons: &#8230;</p></li><li><p>Risks: &#8230;</p></li></ul></li><li><p><strong>Option B:</strong> &#8230;</p><ul><li><p>Pros: &#8230;</p></li><li><p>Cons: &#8230;</p></li><li><p>Risks: &#8230;</p></li></ul></li><li><p><strong>Option C (if needed):</strong> &#8230;</p></li></ul><p><strong>Recommendation (1 paragraph)</strong></p><p>State the call, the core reason, and the trade-off you&#8217;re accepting.</p><p><strong>Risks and mitigations</strong></p><ul><li><p>Risk: &#8230; &#8594; Mitigation: &#8230;</p></li><li><p>Risk: &#8230; &#8594; Mitigation: &#8230;</p></li></ul><p><strong>Rollout plan (who, when, how we measure)</strong></p><ul><li><p>Who: Perform/Owners</p></li><li><p>When: milestones + dates</p></li><li><p>Measures: adoption %, incident rate, cost, latency, time-to-ship, etc.</p></li></ul><p><strong>Decision record (ADR link)</strong></p><ul><li><p>ADR-###: [link]</p></li></ul><p></p><h3>Template 4: ADR mini-template (so decisions stick)</h3><p><strong>Title:</strong> Decision: [X]</p><p><strong>Status:</strong> Proposed / Accepted / Superseded</p><p><strong>Date:</strong> DD MMM YYYY</p><p><strong>Owner:</strong> [Name]</p><p><strong>Decision</strong></p><p>What we decided, in 2&#8211;5 lines.</p><p><strong>Rationale (trade-offs)</strong></p><ul><li><p>Why this option over the others</p></li><li><p>What we&#8217;re optimising for</p></li><li><p>What we&#8217;re consciously accepting</p></li></ul><p><strong>Consequences</strong></p><ul><li><p>Positive: &#8230;</p></li><li><p>Negative: &#8230;</p></li><li><p>Follow-ups: &#8230; (tickets, migration plan, deprecation)</p></li></ul><p><strong>Links</strong></p><ul><li><p>Decision brief: &#8230;</p></li><li><p>Threat model / risk assessment: &#8230;</p></li><li><p>Diagrams: &#8230;</p></li><li><p>Related ADRs: &#8230;</p></li></ul><p></p><h2>Meeting scripts (short lines that actually work)</h2><p>These are the lines you can use in the room without sounding like you&#8217;re quoting a framework. Short, calm, and they move things forward.</p><p>When the meeting starts to spiral</p><p>&#9;&#8226;&#9;&#8220;We&#8217;re mixing input with decision. Who&#8217;s the decider for this call?&#8221;</p><p>&#9;&#8226;&#9;&#8220;Let&#8217;s timebox. What do you need to be comfortable, and by when?&#8221;</p><p>When someone wants a vote</p><p>&#9;&#8226;&#9;&#8220;Happy to take input. We&#8217;re trading off, not running a poll.&#8221;</p><p>When late stakeholders try to reopen it</p><p>&#9;&#8226;&#9;&#8220;If there&#8217;s new information, let&#8217;s log it as a change request against the ADR.&#8221;</p><p></p><h2>How to operationalise this in your architecture governance</h2><p>Frameworks don&#8217;t fix anything on their own. What changes behaviour is making the decision process repeatable and boring: same roles, same timeboxes, same place to record outcomes. That&#8217;s what enterprise architecture governance is meant to do: keep standards consistent, make decision rights visible, and stop every team inventing their own &#8220;rules&#8221; in isolation.</p><h3>Where it fits</h3><p>&#9;&#8226;&#9;Squad-level decisions (DACI most of the time)</p><p>Most day-to-day architecture calls are local: API patterns, small tooling choices, reference implementation updates. DACI keeps it lightweight and fast, with a clear Driver and Approver so it doesn&#8217;t stall.</p><p>&#9;&#8226;&#9;Cross-domain decisions (RAPID for clarity)</p><p>When a decision spans squads, platforms, or risk domains, RAPID keeps it clean: one decider, explicit veto points, and a named &#8220;Perform&#8221; who owns delivery and adoption.</p><p>&#9;&#8226;&#9;ARB as &#8220;red lines only&#8221; with explicit veto criteria</p><p>Treat the ARB like a safety rail, not a weekly court hearing. If something doesn&#8217;t hit a red line (security boundary, compliance, material risk, major cost), it shouldn&#8217;t need ARB airtime. And if it does hit a red line, the veto criteria should be written down so it&#8217;s predictable, not personal.</p><h3>Simple cadence</h3><p>&#9;&#8226;&#9;Weekly decision slot (30 mins)</p><p>One recurring slot for decisions that need cross-team visibility. Keep it tight: two decisions max, timeboxed discussion, clear outcome.</p><p>&#9;&#8226;&#9;Decisions written same day (ADR link)</p><p>Don&#8217;t rely on memory. Publish the decision and the &#8220;why&#8221; while it&#8217;s fresh, then link it everywhere the delivery teams will actually see it.</p><p>&#9;&#8226;&#9;Monthly review of exceptions and drift (standards vs reality)</p><p>This is where governance earns its keep. Review what teams are deviating from, why they needed exceptions, and whether the standard should change. Standards that don&#8217;t match reality don&#8217;t get followed, they get worked around.</p><h2>Close: your operating model in 5 lines</h2><p>&#9;&#8226;&#9;Pick one model per decision.</p><p>&#9;&#8226;&#9;Name roles in 10 minutes.</p><p>&#9;&#8226;&#9;Timebox inputs.</p><p>&#9;&#8226;&#9;Decide once, record it (ADR).</p><p>&#9;&#8226;&#9;Review exceptions, not old arguments.</p><p>If you want architecture playbooks you can run on Monday morning, subscribe to my newsletter.</p>]]></content:encoded></item><item><title><![CDATA[Operational Over-Tooling: When Your Stack Becomes the Product]]></title><description><![CDATA[How tool sprawl quietly breaks delivery, on-call, and governance, and the fixes that actually stick.]]></description><link>https://newsletter.aminollahi.com/p/operational-over-tooling-fix-tool-sprawl</link><guid isPermaLink="false">https://newsletter.aminollahi.com/p/operational-over-tooling-fix-tool-sprawl</guid><dc:creator><![CDATA[Ryan Aminollahi]]></dc:creator><pubDate>Sun, 08 Feb 2026 20:41:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qgC-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8abf6294-67d8-437b-91fc-d38bc4fcdee6_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qgC-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8abf6294-67d8-437b-91fc-d38bc4fcdee6_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qgC-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8abf6294-67d8-437b-91fc-d38bc4fcdee6_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!qgC-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8abf6294-67d8-437b-91fc-d38bc4fcdee6_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!qgC-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8abf6294-67d8-437b-91fc-d38bc4fcdee6_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!qgC-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8abf6294-67d8-437b-91fc-d38bc4fcdee6_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qgC-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8abf6294-67d8-437b-91fc-d38bc4fcdee6_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8abf6294-67d8-437b-91fc-d38bc4fcdee6_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:707825,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/187235435?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8abf6294-67d8-437b-91fc-d38bc4fcdee6_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qgC-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8abf6294-67d8-437b-91fc-d38bc4fcdee6_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!qgC-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8abf6294-67d8-437b-91fc-d38bc4fcdee6_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!qgC-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8abf6294-67d8-437b-91fc-d38bc4fcdee6_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!qgC-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8abf6294-67d8-437b-91fc-d38bc4fcdee6_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Friday 4:47 pm. A payment flow is failing. Slack is loud. Someone drops a screenshot of a red dashboard&#8230; then another. Then a link to logs. Then a different log tool &#8220;because this service ships there&#8221;. Traces are in a third place. Alerts are coming from a bot only one person knows how to tune, and they&#8217;re away today. Twelve tabs later, you still don&#8217;t have a single story of what happened, just fragments, guesses, and rising heart rates.</p><p>This is operational over-tooling in the wild. It doesn&#8217;t just add licences; it adds <em>load</em>. It turns incident response into a scavenger hunt and makes &#8220;moving fast&#8221; feel like gambling.</p><p>Over-tooling is an architecture anti-pattern because it shifts complexity out of code and into day-to-day operations, where it taxes every release and every outage.</p><p>Before you buy &#8220;one more tool&#8221;, use this decision matrix. It forces the real question: keep, consolidate, or retire and who owns it.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HiID!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab1f128-001c-4b2d-aa0a-6cc34dd09d52_2156x518.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HiID!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab1f128-001c-4b2d-aa0a-6cc34dd09d52_2156x518.png 424w, https://substackcdn.com/image/fetch/$s_!HiID!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab1f128-001c-4b2d-aa0a-6cc34dd09d52_2156x518.png 848w, https://substackcdn.com/image/fetch/$s_!HiID!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab1f128-001c-4b2d-aa0a-6cc34dd09d52_2156x518.png 1272w, https://substackcdn.com/image/fetch/$s_!HiID!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab1f128-001c-4b2d-aa0a-6cc34dd09d52_2156x518.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HiID!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab1f128-001c-4b2d-aa0a-6cc34dd09d52_2156x518.png" width="1200" height="288.46153846153845" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bab1f128-001c-4b2d-aa0a-6cc34dd09d52_2156x518.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:350,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:103667,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/187235435?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab1f128-001c-4b2d-aa0a-6cc34dd09d52_2156x518.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HiID!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab1f128-001c-4b2d-aa0a-6cc34dd09d52_2156x518.png 424w, https://substackcdn.com/image/fetch/$s_!HiID!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab1f128-001c-4b2d-aa0a-6cc34dd09d52_2156x518.png 848w, https://substackcdn.com/image/fetch/$s_!HiID!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab1f128-001c-4b2d-aa0a-6cc34dd09d52_2156x518.png 1272w, https://substackcdn.com/image/fetch/$s_!HiID!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab1f128-001c-4b2d-aa0a-6cc34dd09d52_2156x518.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><h2>What &#8220;operational over-tooling&#8221; looks like in real teams</h2><p>It usually starts with a good reason.</p><p>A team ships a new service. They need visibility fast, so they pick a monitoring tool they already know. Another team has a different stack and chooses something else. Security rolls out a scanner &#8220;just for coverage&#8221;. A platform team adds a CI/CD tool to unblock delivery. None of these choices are reckless. In isolation, they&#8217;re sensible.</p><p>Then a Friday incident happens and all the sensible choices collide.</p><p>You&#8217;re in the war room and the questions sound familiar: <em>&#8220;Where are the logs for this one?&#8221;</em> <em>&#8220;Which dashboard is the source of truth?&#8221;</em> <em>&#8220;Why is the alert firing when the trace looks clean?&#8221;</em> Someone shares a link, then another, then another. The team isn&#8217;t debugging the payment flow anymore they&#8217;re debugging the tooling around the payment flow.</p><p>That&#8217;s operational over-tooling: when your stack becomes a second system you have to operate before you can operate the product.</p><h3>The symptoms you can feel (not just measure)</h3><ul><li><p><strong>Same job, three tools.</strong> Monitoring is split, CI/CD is split, feature flags are split. Everyone has a reason. Nobody has the full picture.</p></li><li><p><strong>Incidents become a scavenger hunt.</strong> Logs live here, traces live there, alerts come from somewhere else, and correlation becomes guesswork.</p></li><li><p><strong>&#8220;Hidden&#8221; work becomes the real work.</strong> Agents, connectors, pipelines, retention rules, token rotation, webhook retries. It&#8217;s not visible on the roadmap, but it eats the roadmap anyway.</p></li><li><p><strong>Ownership gets blurry.</strong> When something breaks, the question isn&#8217;t &#8220;how do we fix it?&#8221; &#8212; it&#8217;s &#8220;who even owns this tool?&#8221;</p></li><li><p><strong>Tooling turns into a career moat.</strong> One person can tune the alerting bot, manage the permissions model, or fix the pipeline when it jams. When they&#8217;re away, progress slows to a crawl.</p></li></ul><p>The giveaway is emotional, not technical: teams start sounding tired. They stop trusting signals. They default to &#8220;ask Sam, he knows the system&#8221;. That&#8217;s not resilience, that&#8217;s dependency.</p><h3>The root cause (it&#8217;s rarely the tool)</h3><p>This pattern doesn&#8217;t exist because teams are bad at picking tools. It exists because the organisation is bad at owning them.</p><ul><li><p><strong>Procurement-by-pain.</strong> The last incident hurts, so the next purchase feels urgent. Speed beats design, and the tool ships faster than the operating model.</p></li><li><p><strong>Local optimisation beats global outcomes.</strong> Each team improves their corner, but the company pays the integration and support tax across every corner.</p></li><li><p><strong>No thin-core standards.</strong> Without a few non-negotiables (identity, observability, policy enforcement), every new tool becomes its own mini-platform with its own rules.</p></li><li><p><strong>Decisions don&#8217;t get revisited.</strong> Tool choices get made once, then slide into auto-renew. The cost isn&#8217;t just the licence, it&#8217;s the permanent operational burden.</p></li></ul><p>If you&#8217;ve ever watched an incident drift from &#8220;what&#8217;s failing?&#8221; to &#8220;which tool do we trust?&#8221;, you&#8217;ve seen the anti-pattern. And it&#8217;s exactly why the decision matrix matters: it forces a clear call to keep, consolidate, or retire before &#8220;one more tool&#8221; becomes &#8220;one more system to run.&#8221;</p><h2>Why it&#8217;s an architecture anti-pattern (not a shopping problem)</h2><p>If this was just a shopping problem, you could solve it with a better shortlist, a sharper RFP, and a hard negotiation. But operational over-tooling keeps coming back because it&#8217;s really an architecture and operating-model problem: you&#8217;re creating more moving parts than your organisation can reliably run.</p><h3>It increases operational load faster than delivery speed</h3><p>Every tool promises &#8220;faster delivery&#8221;. Then it quietly adds a new slice of operational reality that someone has to own, secure, integrate, monitor, upgrade, and pay for. Multiply that by a few teams, a few years, and a few &#8220;temporary&#8221; exceptions, and your stack becomes a second product.</p><p>Each new tool tends to add:</p><ul><li><p><strong>another auth model</strong> (roles, groups, service accounts, break-glass access)</p></li><li><p><strong>another data model</strong> (naming, tagging, schemas, retention rules)</p></li><li><p><strong>another billing line</strong> (renewals, tier creep, usage surprises)</p></li><li><p><strong>another integration surface</strong> (agents, APIs, webhooks, connectors, plugins)</p></li><li><p><strong>another failure mode</strong> (outages, rate limits, misconfig, noisy alerts)</p></li></ul><p>That&#8217;s why tool-centric DevOps without the operating model creates failure and fatigue. You don&#8217;t just buy software, you buy ongoing work, plus a new way to fail.</p><h3>It slows incident response</h3><p>Over-tooling doesn&#8217;t usually break the system directly. It breaks the <em>story</em> of the system.</p><p>When telemetry is split across tools, teams lose the ability to correlate signals quickly: the alert fires in one place, the logs are somewhere else, traces are incomplete, and dashboards disagree. Time-to-detect stretches because nobody trusts the first signal. Time-to-recover stretches because you&#8217;re stitching together fragments under pressure.</p><p>The result looks like this: more Slack messages, more screenshots, more &#8220;can someone check X?&#8221; and less actual diagnosis.</p><h3>It makes governance either heavy or useless</h3><p>Tool sprawl pushes governance into two bad extremes.</p><ul><li><p><strong>Heavy governance:</strong> endless approvals and architecture reviews because nobody trusts the stack&#8217;s risk profile anymore. Every tool request becomes a debate about identity, data access, auditability, and support because those basics aren&#8217;t standardised.</p></li><li><p><strong>Useless governance:</strong> &#8220;teams can choose anything&#8221; until a breach, audit finding, or major outage forces a reset. Then you swing back to heavy governance, usually with a blunt consolidation program and a lot of resentment.</p></li></ul><p>A healthy setup sits in the middle: a thin core of standards, clear ownership, and a simple decision loop. Without that, you&#8217;re not managing tools, you&#8217;re managing chaos with invoices attached.</p><h2>The &#8220;keep vs consolidate&#8221; decision framework</h2><p>Here&#8217;s the mistake most organisations make: they treat every tool decision like a feature decision. One team has a need, they pick a tool, and the business moves on. That works right up until the tool becomes shared infrastructure, then you&#8217;re no longer choosing a product, you&#8217;re choosing an operating burden.</p><p>So instead of arguing &#8220;Tool A vs Tool B&#8221;, make the first decision simpler: <strong>is this a local choice, or does it belong on the platform?</strong> Once you agree on the lane, the vendor discussion becomes much easier (and a lot less political).</p><h3>Scannable checklist (copy/paste ready)</h3><p>A tool can be a <strong>local choice</strong> only if <strong>all</strong> of these are true:</p><ul><li><p><strong>No customer data classification surprises</strong></p><p>It doesn&#8217;t store, process, or expose sensitive data in ways that will bite you later.</p></li><li><p><strong>No privileged access outside standard IAM</strong></p><p>It uses your normal identity patterns (SSO, MFA, least privilege). No rogue admin accounts.</p></li><li><p><strong>No dependency in incident response</strong></p><p>If the tool is down, you can still debug production. It&#8217;s helpful, not required.</p></li><li><p><strong>Can be replaced inside a sprint</strong></p><p>Low switching cost. If you had to rip it out, you wouldn&#8217;t need a six-month program.</p></li><li><p><strong>Has a named owner and a clear exit plan</strong></p><p>Someone is accountable for cost, security, and lifecycle, and you already know how you&#8217;d leave.</p></li></ul><p><strong>If any answer is &#8220;no&#8221;, it goes into the platform lane.</strong> That means: standardise it, support it properly, and make it part of the &#8220;thin core&#8221; rather than another optional add-on.</p><p>And yes, this ties straight back to the matrix at the top: <strong>local choice = keep</strong>, <strong>platform lane = consolidate</strong>, and anything that fails both (duplicate, low value, no owner) is a <strong>retire</strong> candidate.</p><div><hr></div><p>Relatd Artciles:</p><ul><li><p><a href="https://www.aminollahi.com/p/stop-design-by-committee-architecture-governance">Stop &#8220;Design by Committee&#8221; in Architecture</a></p></li><li><p><a href="https://www.aminollahi.com/p/bad-data-virus-antipattern-fix">Bad Data Virus: The Enterprise Anti-Pattern That Breaks Trust</a></p></li><li><p><a href="https://www.aminollahi.com/p/fix-swiss-army-knife-integration-anti-pattern">Stop Building the Swiss Army Knife Integration Hub</a></p></li></ul><div><hr></div><p></p><h2>Fix pattern 1: Build a thin core, then give teams freedom above it</h2><p>The fastest way to shrink tool sprawl without starting a civil war is to separate <em>standards</em> from <em>preferences</em>. Most teams don&#8217;t actually want unlimited choice. They want freedom where it helps delivery and consistency where inconsistency hurts.</p><p>That&#8217;s the &#8220;thin core + autonomy above&#8221; move: lock down the few foundations that make systems safe and operable, then let teams innovate on top without reinventing the basics every time.</p><h3>The non-negotiables (thin core)</h3><p>These are the pieces that should feel boring because boring is reliable:</p><ul><li><p><strong>Identity and access patterns</strong></p><p>SSO, MFA, least privilege, consistent service account handling, break-glass rules.</p></li><li><p><strong>Observability standards</strong></p><p>Common fields, correlation IDs, agreed retention, and one standard pipeline for logs/metrics/traces.</p></li><li><p><strong>Deployment and rollback guardrails</strong></p><p>Release patterns, rollback expectations, feature toggle rules, and what &#8220;safe deploy&#8221; means here.</p></li><li><p><strong>Policy enforcement points</strong></p><p>Where controls live: gateway for ingress policy, runtime for service controls, CI for build-time checks.</p></li></ul><p>This pattern shows up again and again because it reduces sprawl without freezing delivery. Teams can still move quickly, they&#8217;re just moving quickly on rails instead of inventing a new train track each sprint.</p><h3>What autonomy actually means (examples)</h3><p>Autonomy isn&#8217;t &#8220;do whatever you want&#8221;. It&#8217;s &#8220;choose freely inside safe boundaries&#8221;.</p><ul><li><p>Teams can choose <strong>UI dashboards</strong>, but <strong>logs must land in the standard pipeline</strong> with the standard fields.</p></li><li><p>Teams can choose <strong>feature flag products</strong>, but <strong>kill switches follow one pattern</strong> (naming, ownership, where they&#8217;re documented).</p></li><li><p>Teams can <strong>experiment</strong>, but experiments <strong>expire unless adopted</strong> (time-boxed, owned, and reviewed).</p></li></ul><p>The goal isn&#8217;t to win an argument about tools. It&#8217;s to make sure every tool choice doesn&#8217;t quietly become a company-wide dependency.</p><p></p><h2>Fix pattern 2: Platform engineering and an Internal Developer Platform (IDP)</h2><p>If thin core is the rules, an IDP is the shortcut.</p><p>Most tool sprawl happens because teams are trying to assemble a working delivery and operations experience from scratch: build, deploy, observe, secure, repeat. An Internal Developer Platform bundles those capabilities into something that&#8217;s supported, consistent, and easy to adopt.</p><h3>What an IDP does (plain English)</h3><ul><li><p><strong>Provides &#8220;golden paths&#8221;</strong> that make the right thing the easy thing</p><p>Create a service, get standard logging, safe deploy, sensible alerts, and a runbook template without begging three teams.</p></li><li><p><strong>Reduces tool sprawl</strong> by packaging a supported set of capabilities</p><p>Build, deploy, and observe with defaults that work and integrations that are already done.</p></li><li><p><strong>Treats developer experience as a product</strong></p><p>There&#8217;s a roadmap, a support model, clear ownership, and feedback loops, not a pile of scripts nobody owns.</p></li></ul><h3>The trap to avoid</h3><ul><li><p><strong>Don&#8217;t build a &#8220;platform of platforms&#8221;</strong></p><p>If your platform needs a platform team to operate it, you&#8217;ve recreated the problem with a nicer logo.</p></li><li><p><strong>Keep it small, opinionated, and measured by adoption</strong></p><p>Adoption is the score. If teams avoid it, it&#8217;s not a platform, it&#8217;s a side project.</p></li></ul><p></p><h2>Fix pattern 3: A lightweight governance loop that prevents relapse</h2><p>Even with a thin core and a platform, sprawl returns if decisions don&#8217;t have a lifecycle. The fix isn&#8217;t heavy approvals. It&#8217;s a simple loop that keeps visibility and ownership alive.</p><h3>The Tooling Decision Record (TDR) in one page</h3><p>Think of this as the smallest artefact that stops &#8220;we bought it because reasons&#8221;.</p><p>Include:</p><ul><li><p><strong>What problem are we solving?</strong></p></li><li><p><strong>Who owns it?</strong> (service owner + platform owner)</p></li><li><p><strong>What is the exit plan?</strong></p></li><li><p><strong>What data and access does it touch?</strong></p></li><li><p><strong>What is the success measure?</strong> (adoption, incident reduction, cost)</p></li></ul><p>If the TDR can&#8217;t be written clearly, that&#8217;s usually a signal the tool choice isn&#8217;t clear either.</p><h3>Quarterly rationalisation cadence (30 minutes per domain)</h3><p>This isn&#8217;t a big program. It&#8217;s maintenance &#8212; like brushing your teeth.</p><ul><li><p><strong>Keep / consolidate / retire review</strong></p></li><li><p><strong>Licence true-up</strong></p></li><li><p><strong>Security review refresh</strong></p></li><li><p><strong>Decommission plan for &#8220;retire&#8221;</strong></p></li></ul><p>This matches what actually works in sprawl governance: visibility, ownership, regular review, and renewal control without turning every request into theatre.</p><p></p><h2>Fix pattern 4: Use AI to reduce friction, not to multiply tools</h2><p>AI can either cut your operational overhead or become the newest category of sprawl. The difference is whether AI is used to <em>simplify workflows</em> or to <em>introduce new platforms</em> with new permissions, new data paths, and new vendors.</p><h3>Where AI helps immediately</h3><ul><li><p><strong>Draft TDRs</strong> from a template (problem statement, risks, owners, exit plan)</p></li><li><p><strong>Generate migration runbooks and test checklists</strong> (so consolidation doesn&#8217;t stall)</p></li><li><p><strong>Summarise incidents</strong> across Slack + tickets + telemetry (faster shared understanding)</p></li></ul><h3>Where AI makes sprawl worse</h3><ul><li><p><strong>&#8220;AI tool of the week&#8221; procurement</strong></p><p>Every team trialling a different assistant with a different data policy.</p></li><li><p><strong>Multiple copilots with different permissions and data paths</strong></p><p>Now you&#8217;ve got duplicated tooling <em>and</em> a mess of access, retention, and compliance questions.</p></li></ul><p>Use AI like power steering, not a new engine. If it makes your stack bigger, noisier, or harder to govern, it&#8217;s not helping; it&#8217;s just moving the burden somewhere else.</p><h2>A practical 30/60/90-day plan (doable, not heroic)</h2><p>You don&#8217;t fix tool sprawl with a big-bang program and a six-month steering committee. You fix it by stopping new sprawl, consolidating one capability end-to-end, then locking in a lightweight loop so you don&#8217;t slide back.</p><h3>First 30 days: stop the bleeding</h3><p>Your goal in the first month is simple: <strong>no more surprise tooling</strong>.</p><ul><li><p><strong>Freeze new tools in the platform lane unless a TDR exists</strong></p><p>If a tool affects identity, customer data, or incident response, it needs a one-page Tooling Decision Record. No TDR, no new dependency.</p></li><li><p><strong>Inventory the top 20 tools by pain, not by popularity</strong></p><p>Rank them by:</p><ul><li><p>cost (licence + hidden support effort)</p></li><li><p>access risk (privileged roles, data exposure)</p></li><li><p>incident dependency (do you need it to debug production?)</p></li></ul></li><li><p><strong>Pick two consolidation targets</strong></p><p>Start with the two areas that create the most fragmentation:</p><ul><li><p><strong>observability</strong> (logs/metrics/traces/alerts)</p></li><li><p><strong>CI/CD</strong> (pipelines, releases, rollback patterns)</p></li></ul></li></ul><p>Keep it focused. Two targets is realistic. Ten targets is theatre.</p><h3><strong>60 days: consolidate one lane</strong></h3><p>Now you do one consolidation properly. Not &#8220;we chose a tool&#8221;. Real consolidation: standards, migration, ownership.</p><ul><li><p><strong>Choose the standard for one capability</strong></p><p>Example: logging + tracing correlation. Define the required fields, correlation IDs, and the source of truth pipeline.</p></li><li><p><strong>Migrate the highest pain services first</strong></p><p>Don&#8217;t start with the easiest. Start with the services that:</p><ul><li><p>page people most often</p></li><li><p>block incident response</p></li><li><p>have the messiest &#8220;where do I look?&#8221; story</p></li></ul></li></ul><p>That&#8217;s how you earn trust fast.</p><ul><li><p><strong>Publish golden path docs and a support model</strong></p><p>One page that answers:</p><ul><li><p>how to onboard a service in under an hour</p></li><li><p>what&#8217;s supported (and what&#8217;s not)</p></li><li><p>who to contact when it breaks</p></li></ul></li></ul><p>If teams can&#8217;t adopt it quickly, they won&#8217;t adopt it at all.</p><h3>90 days: lock in governance</h3><p>By day 90, you want the system to stay clean without constant heroics from you.</p><ul><li><p><strong>Run a quarterly rationalisation meeting</strong></p><p>30 minutes per domain: keep, consolidate, retire. Decisions recorded. Owners assigned.</p></li><li><p><strong>Require a TDR for renewals</strong></p><p>This is where you win. Tool sprawl often survives because renewals are automatic. Make renewals earn their place.</p></li><li><p><strong>Make exceptions expire unless renewed</strong></p><p>Every exception has an end date. If it&#8217;s still valuable, renew it with a fresh TDR. If not, it disappears quietly, which is exactly what you want.</p></li></ul><p>The aim isn&#8217;t to have fewer tools for the sake of it. It&#8217;s to have fewer <em>operational stories</em> your team needs to remember at 4:47 pm on a Friday.</p><h2>The takeaway</h2><p>Back to Friday 4:47pm. The payment flow didn&#8217;t fail because the team lacked tools. It failed because, in the moment that mattered, nobody could see a single, trusted story. The signals were scattered, the dashboards disagreed, and the &#8220;one person who knows the bot&#8221; wasn&#8217;t online. That&#8217;s the real cost of over-tooling: not licences, but minutes and mental load when pressure is high.</p><p>Here&#8217;s the truth in one line: <strong>the fix is less about tools, more about ownership and boundaries.</strong> Your best engineers shouldn&#8217;t be doing archaeology across dashboards.</p><p><strong>If you want architecture playbooks you can run on Monday, subscribe to my newsletter.</strong></p>]]></content:encoded></item><item><title><![CDATA[Stop Building the Swiss Army Knife Integration Hub]]></title><description><![CDATA[Use this CIO-ready matrix to pick API, events, iPaaS or ESB, then unwind the &#8220;do-everything&#8221; layer safely.]]></description><link>https://newsletter.aminollahi.com/p/fix-swiss-army-knife-integration-anti-pattern</link><guid isPermaLink="false">https://newsletter.aminollahi.com/p/fix-swiss-army-knife-integration-anti-pattern</guid><dc:creator><![CDATA[Ryan Aminollahi]]></dc:creator><pubDate>Sun, 01 Feb 2026 20:22:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!chbJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1f21a4-0a8c-443a-b1a2-90e54e8b2e93_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!chbJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1f21a4-0a8c-443a-b1a2-90e54e8b2e93_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!chbJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1f21a4-0a8c-443a-b1a2-90e54e8b2e93_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!chbJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1f21a4-0a8c-443a-b1a2-90e54e8b2e93_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!chbJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1f21a4-0a8c-443a-b1a2-90e54e8b2e93_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!chbJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1f21a4-0a8c-443a-b1a2-90e54e8b2e93_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!chbJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1f21a4-0a8c-443a-b1a2-90e54e8b2e93_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c1f21a4-0a8c-443a-b1a2-90e54e8b2e93_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:757926,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/186259266?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1f21a4-0a8c-443a-b1a2-90e54e8b2e93_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!chbJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1f21a4-0a8c-443a-b1a2-90e54e8b2e93_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!chbJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1f21a4-0a8c-443a-b1a2-90e54e8b2e93_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!chbJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1f21a4-0a8c-443a-b1a2-90e54e8b2e93_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!chbJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1f21a4-0a8c-443a-b1a2-90e54e8b2e93_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>Integration decision matrix</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cwAA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35092c4f-80dd-471f-9827-b392b2120a07_1193x462.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cwAA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35092c4f-80dd-471f-9827-b392b2120a07_1193x462.png 424w, https://substackcdn.com/image/fetch/$s_!cwAA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35092c4f-80dd-471f-9827-b392b2120a07_1193x462.png 848w, https://substackcdn.com/image/fetch/$s_!cwAA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35092c4f-80dd-471f-9827-b392b2120a07_1193x462.png 1272w, https://substackcdn.com/image/fetch/$s_!cwAA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35092c4f-80dd-471f-9827-b392b2120a07_1193x462.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cwAA!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35092c4f-80dd-471f-9827-b392b2120a07_1193x462.png" width="1200" height="464.71081307627827" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/35092c4f-80dd-471f-9827-b392b2120a07_1193x462.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:462,&quot;width&quot;:1193,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:91880,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/186259266?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35092c4f-80dd-471f-9827-b392b2120a07_1193x462.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cwAA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35092c4f-80dd-471f-9827-b392b2120a07_1193x462.png 424w, https://substackcdn.com/image/fetch/$s_!cwAA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35092c4f-80dd-471f-9827-b392b2120a07_1193x462.png 848w, https://substackcdn.com/image/fetch/$s_!cwAA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35092c4f-80dd-471f-9827-b392b2120a07_1193x462.png 1272w, https://substackcdn.com/image/fetch/$s_!cwAA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35092c4f-80dd-471f-9827-b392b2120a07_1193x462.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3>Quick &#8220;Swiss Army knife&#8221; risk check</h3><p>Tick <strong>4+</strong> and you&#8217;re in the danger zone:</p><ul><li><p>One integration service owns routing <strong>and</strong> mapping <strong>and</strong> retries <strong>and</strong> auth <strong>and</strong> business rules</p></li><li><p>Every new project says: &#8220;Just add it to the hub&#8221;</p></li><li><p>Changes require a central team queue and a lot of coordination</p></li><li><p>A single deploy can break multiple unrelated domains</p></li><li><p>Teams can&#8217;t ship value without waiting on the hub</p></li><li><p>The hub keeps adding &#8220;optional fields&#8221; and &#8220;one endpoint for everything&#8221;</p></li></ul><p></p><p>If you&#8217;re a CIO choosing <strong>API gateway vs iPaaS/ESB vs event broker</strong>, use the matrix above and make the call in 10 minutes. Then hold the line. The fastest way to slow delivery is letting one integration layer turn into the Swiss Army knife that &#8220;handles everything&#8221;. It feels tidy at first &#8212; one team, one platform, one place to plug things in. Then the queue forms. Every change needs a coordination meeting. One deploy breaks three unrelated journeys. Suddenly your integration layer isn&#8217;t enabling delivery; it&#8217;s rationing it. And the worst part? Domain ownership quietly slips away, because the real business logic ends up living in &#8220;the hub&#8221; instead of the teams that should own it.</p><h3>The story: how the &#8220;helpful&#8221; integration hub became the choke point</h3><p>It usually starts with good intentions. Two systems need to talk, the timeline is tight, and one team offers a &#8220;temporary&#8221; integration service to get things moving. It&#8217;s a sensible call: one connector, one mapping, one place to manage retries. It ships. People celebrate. Then the next project comes along and someone says, &#8220;Just run it through the integration hub; it&#8217;s already there.&#8221; And then the next one. Before long, the hub isn&#8217;t a shortcut; it&#8217;s the default.</p><p>Six months later, a small change goes out on a Thursday afternoon. It looks harmless. By Friday morning, five domains are dealing with failures they didn&#8217;t cause and can&#8217;t fix. Nobody wants to deploy without a war room. That&#8217;s when the nickname sticks: &#8220;The Octopus&#8221;, because everything runs through it,&#8202;&#8202;and when it thrashes, everyone gets dragged under.</p><h4>The moment you realise you&#8217;re stuck</h4><p>The hub becomes a queue, not a platform. Instead of teams owning their integrations, they file tickets and wait. Integration turns into a central dependency, and delivery slows to the speed of the busiest team.</p><h3>What the Swiss Army knife integration anti-pattern looks like</h3><p>You can spot it without reading a single line of code. It shows up in day-to-day behaviour, team habits, and the shape of the interfaces.</p><ul><li><p><strong>Interface bloat:</strong> &#8220;kitchen sink&#8221; endpoints appear in one API that tries to serve every consumer. Schemas grow into mega-objects with endless optional fields because &#8220;someone might need it later&#8221;.</p></li><li><p><strong>Responsibility bloat:</strong> the same component starts enforcing security policy, transforming payloads, orchestrating multi-step workflows, and quietly embedding domain rules (&#8220;if VIP customer then&#8230;&#8221;).</p></li><li><p><strong>Coupling bloat:</strong> every system&#8217;s release plan becomes dependent on the hub&#8217;s release cycle. Teams stop shipping independently because the integration layer is now the shared choke point.</p></li><li><p><strong>Operational bloat:</strong> retries, dead-letter handling, monitoring dashboards, data fixes, and one-off scripts all pile into the same codebase. The hub becomes a production support tool as much as a runtime.</p></li></ul><p>The net effect is predictable: changes feel risky, testing becomes expensive, and the blast radius grows. People start avoiding improvements because &#8220;touching the hub&#8221; is a career-limiting move.</p><h4>Why it happens in enterprises (not because people are silly)</h4><p>It&#8217;s usually a rational response to pressure. The pitch is simple: a central team will be faster and more consistent. Vendor platforms reinforce it by selling &#8220;do-everything&#8221; toolkits that make it easy to add one more connector, one more flow, one more rule. And without a clear split between <strong>gateway duties</strong> (policy and traffic management) and <strong>integration runtime duties</strong> (bounded orchestration and transformation), everything collapses into one place by default.</p><h2>The real costs (and why they sneak up on you)</h2><p>The Swiss Army knife hub doesn&#8217;t fail loudly on day one. It fails slowly, in ways that look like &#8220;just normal delivery friction&#8221; until you add it up.</p><ul><li><p><strong>Delivery:</strong> every change waits for the hub team. Even small tweaks carry a coordination tax: extra ceremonies, extra handovers, extra testing across journeys that don&#8217;t belong together. Your best engineers spend time negotiating the queue instead of shipping outcomes.</p></li><li><p><strong>Reliability:</strong> the blast radius grows. One bad deploy, one misconfigured retry policy, one schema tweak, and suddenly multiple flows across unrelated domains degrade at once. Incidents become harder to isolate because the hub sits in the middle of everything.</p></li><li><p><strong>Security and compliance:</strong> the hub becomes a privilege magnet. It needs secrets, tokens, elevated network access, and broad permissions &#8220;because it integrates with everything&#8221;. That&#8217;s exactly how you end up with a single component that&#8217;s both operationally critical and over-privileged.</p></li><li><p><strong>Architecture drift:</strong> business rules leak into integration glue. The hub starts deciding things domains should own, and your domain boundaries get fuzzy. Over time, the real system behaviour lives in flows and mappings, not in the services that should be accountable.</p></li></ul><h3>A quick smell test</h3><p>Ask two questions:</p><ul><li><p>Can a domain ship value without changing the hub?</p></li><li><p>Do we have more than one way to integrate, and do we know why?</p></li></ul><h2>Root causes in plain English</h2><p>This anti-pattern isn&#8217;t a tooling problem. It&#8217;s what happens when a few small decisions stack up and nobody draws a boundary early.</p><p>First, <strong>integration concerns get mixed with product decisions</strong>. Instead of domains owning what their data means and how it should change, the hub starts making those calls in mappings and flows. Second, <strong>&#8220;reuse&#8221; gets pushed too far</strong>. Someone introduces a mega canonical model to &#8220;standardise everything&#8221;, and now every team must contort their reality to fit one schema. That&#8217;s not reuse; that&#8217;s a shared constraint you&#8217;ll pay for forever.</p><p>Third, there&#8217;s <strong>no product thinking</strong>. The hub has users (engineering teams), but it rarely has a clear service promise, a catalogue of what it offers, or a roadmap that&#8217;s aligned with business priorities. Finally, a <strong>governance gap</strong> seals the deal: there are no lightweight rules that stop the hub from swallowing the next use case.</p><p>That&#8217;s the Swiss Army knife in a sentence: <strong>one interface trying to serve every use case and becoming worse for all of them.</strong></p><h3>The fix: split the problem into lanes</h3><p>The way out is to stop arguing about &#8220;the right tool&#8221; and start agreeing on <strong>lanes</strong>. Each lane has a job, a boundary, and a failure mode you actively avoid. When you split the problem this way, you get a clean target state: teams can choose the right pattern for the job, ship independently, and you stop feeding the Octopus.</p><h4>Lane 1: API gateway is for policy and proxy</h4><p>Use the gateway for <strong>traffic management</strong>, not business logic:</p><ul><li><p>AuthN/AuthZ, rate limits, WAF, routing, versioning, observability hooks</p></li><li><p>Avoid turning it into a &#8220;brain&#8221;. If the gateway is doing payload mapping, workflow branching, or domain decisions, it&#8217;s no longer a gateway; it&#8217;s a brittle integration service with a shiny badge.</p></li></ul><h4>Lane 2: Integration runtime is for bounded orchestration</h4><p>This is where <strong>connectors and workflow steps</strong> belong:</p><ul><li><p>Transformations, protocol translation, retries, and multi-step orchestration</p></li><li><p>The key rule: orchestration must have an <strong>owner</strong> and a <strong>domain boundary</strong>. If it&#8217;s &#8220;enterprise-wide glue&#8221;, you&#8217;re rebuilding the same anti-pattern with a different logo.</p></li></ul><h4>Lane 3: Event broker is for decoupling and fan-out</h4><p>Use events to publish facts and let teams subscribe by need:</p><ul><li><p>Publish &#8220;what happened&#8221;, not &#8220;how to do the job&#8221;</p></li><li><p>Keep event contracts lean and versioned, avoid fat events that try to carry the whole world. And be honest: event-driven isn&#8217;t magic. It needs discipline around contracts, idempotency, and observability.</p></li></ul><h4>Lane 4: Data pipelines are for analytics, not operational flow</h4><p>Keep reporting and backfills in <strong>data plumbing</strong>, not runtime integration. Separate them so operational reliability and analytics flexibility don&#8217;t sabotage each other.</p><h3>A practical 30/60/90-day plan to unwind the hub</h3><p>You don&#8217;t fix a Swiss Army knife hub by &#8220;rewriting integration&#8221;. You fix it by <strong>stopping the bleeding</strong>, then moving work out in small, safe cuts. The goal in 90 days isn&#8217;t perfection, it&#8217;s momentum, lower risk, and a clear path where teams can ship without asking permission.</p><h4>Days 0&#8211;30: Stabilise and put fences up</h4><p>Start with a simple rule: no new &#8220;just add it to the hub&#8221; work unless it passes the decision matrix. That one move reduces future debt straight away. Next, make the hub visible. Pick the critical flows (the ones that wake people up at 2 am) and create <strong>one dashboard per flow</strong>. Add basic SLOs so you can say what &#8220;good&#8221; looks like. Then improve change safety: introduce contract tests for the top integrations and agree on a basic rollback plan. If you can&#8217;t roll back quickly, you&#8217;ll never move fast safely.</p><h4>Days 31&#8211;60: Split by ownership, not by technology</h4><p>Identify the top five flows by business criticality and map who should own the behaviour. Then carve out <strong>thin adapters</strong> at the edge and move domain rules back into the services that own the outcomes. This is the big mindset shift: you&#8217;re not &#8220;modernising integration&#8221;, you&#8217;re restoring accountability. Introduce a lightweight integration catalogue: what exists, who owns it, how changes happen, and where the contracts live.</p><h4>Days 61&#8211;90: Migrate, retire, and measure</h4><p>Replace one end-to-end workflow with either events or bounded orchestration, then retire what it replaced. Decommission at least one hub capability, a connector, a mega mapping, or a reporting job. Finally, track the metrics that prove it&#8217;s working: lead time, incident rate, blast radius, and deployment frequency.</p><p></p><h2>Governance that prevents the next Swiss Army knife</h2><p>Governance only works if it&#8217;s light enough to survive contact with delivery. You don&#8217;t need a committee for every integration; you need a few clear rules that make the right choice the easy choice.</p><p>Start with a <strong>one-page integration decision record</strong>. It should capture two things: <em>why this pattern</em> (API, runtime, events, or data pipeline) and <em>who owns it</em> end-to-end. No owner, no build. Next, publish simple <strong>guardrails</strong>: the gateway does policy and proxy, the integration runtime does bounded orchestration, and events are for fan-out. Make these rules visible and repeat them until they become habit.</p><p>Then lock in a practical <strong>definition of done</strong>: contracts are versioned, observability exists at the flow level, and ownership is explicit (including who&#8217;s on the hook when it breaks). Finally, use <strong>AI where it helps</strong>: let it draft mappings, generate contract tests, and propose runbooks, but keep human approval in the loop. That gives you speed without handing control to the tool or the hub.</p><p>&#8220;The Octopus&#8221; wasn&#8217;t evil. It was overloaded to be a gateway, an orchestrator, a translator, a rules engine, and a support console all at once. Once you see that, the fix becomes clear: this is less about swapping tools and more about restoring <strong>ownership and boundaries</strong> so teams can ship safely without a central choke point.</p><p>If you want more run-it-on-Monday architecture and governance playbooks (no fluff), subscribe to my newsletter.</p>]]></content:encoded></item><item><title><![CDATA[Bad Data Virus: The Enterprise Anti-Pattern That Breaks Trust]]></title><description><![CDATA[How to spot it early, contain the spread, and build &#8220;quality by design&#8221; with contracts, tests, and observability.]]></description><link>https://newsletter.aminollahi.com/p/bad-data-virus-antipattern-fix</link><guid isPermaLink="false">https://newsletter.aminollahi.com/p/bad-data-virus-antipattern-fix</guid><dc:creator><![CDATA[Ryan Aminollahi]]></dc:creator><pubDate>Sun, 11 Jan 2026 19:43:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!6CGQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250853e9-f80a-4c61-b9d7-65923895dd52_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6CGQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250853e9-f80a-4c61-b9d7-65923895dd52_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6CGQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250853e9-f80a-4c61-b9d7-65923895dd52_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!6CGQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250853e9-f80a-4c61-b9d7-65923895dd52_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!6CGQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250853e9-f80a-4c61-b9d7-65923895dd52_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!6CGQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250853e9-f80a-4c61-b9d7-65923895dd52_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6CGQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250853e9-f80a-4c61-b9d7-65923895dd52_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/250853e9-f80a-4c61-b9d7-65923895dd52_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2563483,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/184080541?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250853e9-f80a-4c61-b9d7-65923895dd52_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6CGQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250853e9-f80a-4c61-b9d7-65923895dd52_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!6CGQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250853e9-f80a-4c61-b9d7-65923895dd52_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!6CGQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250853e9-f80a-4c61-b9d7-65923895dd52_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!6CGQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250853e9-f80a-4c61-b9d7-65923895dd52_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>If you&#8217;re a CIO choosing centralised data clean-up vs distributed data ownership, use the matrix below.</p><p>Bad data doesn&#8217;t fail loudly. It quietly rewrites decisions.</p><p>Most teams only notice when the numbers don&#8217;t match in an exec meeting or when a customer asks the awkward question first.</p><p>In 7 minutes you&#8217;ll have a way to diagnose, contain, and prevent it.</p><h2>The CIO matrix: &#8220;Clean-up squad&#8221; vs &#8220;Quality by design&#8221;</h2><p>Most leaders don&#8217;t choose between these because they love one approach. They choose because something has already gone wrong: a board pack number is challenged, a revenue metric shifts overnight, or three dashboards tell three stories.</p><p>This matrix is a quick way to decide what you need <strong>first:</strong>  a fast containment move, or a structural fix that stops repeat outbreaks.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0jjZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e31915-bdf0-45f5-a6aa-9bbb8b690668_2026x832.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0jjZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e31915-bdf0-45f5-a6aa-9bbb8b690668_2026x832.png 424w, https://substackcdn.com/image/fetch/$s_!0jjZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e31915-bdf0-45f5-a6aa-9bbb8b690668_2026x832.png 848w, https://substackcdn.com/image/fetch/$s_!0jjZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e31915-bdf0-45f5-a6aa-9bbb8b690668_2026x832.png 1272w, https://substackcdn.com/image/fetch/$s_!0jjZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e31915-bdf0-45f5-a6aa-9bbb8b690668_2026x832.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0jjZ!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e31915-bdf0-45f5-a6aa-9bbb8b690668_2026x832.png" width="1200" height="492.85714285714283" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/88e31915-bdf0-45f5-a6aa-9bbb8b690668_2026x832.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:598,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:156842,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/184080541?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e31915-bdf0-45f5-a6aa-9bbb8b690668_2026x832.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0jjZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e31915-bdf0-45f5-a6aa-9bbb8b690668_2026x832.png 424w, https://substackcdn.com/image/fetch/$s_!0jjZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e31915-bdf0-45f5-a6aa-9bbb8b690668_2026x832.png 848w, https://substackcdn.com/image/fetch/$s_!0jjZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e31915-bdf0-45f5-a6aa-9bbb8b690668_2026x832.png 1272w, https://substackcdn.com/image/fetch/$s_!0jjZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e31915-bdf0-45f5-a6aa-9bbb8b690668_2026x832.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now the honest bit: most enterprises need both. Option A is what you do when the house is already smoky. It buys you time and restores confidence. Option B is what stops the next fire by making quality part of normal delivery, not an after-hours rescue mission. A contains today&#8217;s outbreak. B is the vaccine.</p><h3>10-point &#8220;Bad Data Virus&#8221; early warning checklist</h3><p>If you want the fastest diagnosis, don&#8217;t start with tooling. Start with behaviour. When a bad data virus is spreading, you&#8217;ll see it in how people act before you see it in logs.</p><p>Read this like a quick health check. If you&#8217;re nodding along to three or more, you&#8217;re not dealing with a one-off defect&#8202;&#8212;&#8202;you&#8217;re dealing with a pattern.</p><ul><li><p>Same metric, three dashboards, three answers (and everyone has a &#8220;reason&#8221;)</p></li><li><p>Teams can&#8217;t name the source of truth, only the dashboard they prefer</p></li><li><p>Manual CSV &#8220;fixes&#8221; happen right before every exec meeting</p></li><li><p>No shared definitions for key fields (customer, active, churn)</p></li><li><p>Pipelines succeed, but the numbers are wrong, green jobs, red outcomes</p></li><li><p>Schema changes ship without notice, and downstream teams find out the hard way</p></li><li><p>Data quality checks exist, but nobody watches alerts (or alerts are ignored noise)</p></li><li><p>Ownership is unclear (producer vs consumer blame cycle)</p></li><li><p>AI/ML outputs drift and nobody can trace which inputs changed</p></li><li><p>The data team is stuck doing ad-hoc reconciliations instead of building capability</p></li></ul><p>If this feels familiar, good news: you don&#8217;t need a miracle platform. You need a clean decision on containment vs prevention and then a simple operating model that makes quality repeatable.</p><h2>What the &#8220;Bad Data Virus&#8221; anti-pattern looks like</h2><h3>The pattern in one sentence</h3><p>Bad data enters quietly, gets copied everywhere, and becomes &#8220;truth&#8221; through repetition.</p><h3>Why &#8220;virus&#8221; is the right metaphor</h3><p>It rarely arrives as a big, obvious failure. It slips in as a missing field, a duplicated record, a &#8220;temporary&#8221; mapping, or a late change to a definition. Then it multiplies. ETL jobs pick it up, extracts ship it to other teams, reverse ETL pushes it back into operational tools, and downstream marts bake it into KPIs. Before long, it&#8217;s in spreadsheets, board decks, and AI features &#8212; and unwinding it becomes harder than building it correctly in the first place.</p><h3>The cost isn&#8217;t just wrong numbers</h3><p>The real damage is behavioural. Decision latency creeps in: teams hesitate, double-check, and delay because they stop trusting what they see. Then governance overhead follows: more meetings, more approvals, more &#8220;alignment&#8221;, and less delivery.</p><p>A useful anchor: data quality is simply fitness for use.</p><h2>How bad data spreads in modern architectures</h2><h3>Three common transmission paths</h3><p>Bad data doesn&#8217;t need a fancy failure mode. It spreads through normal delivery work, especially when speed wins, and nobody owns the &#8220;downstream blast radius&#8221;.</p><p><strong>Path 1: Operational systems &#8594; analytics.</strong></p><p>Source systems aren&#8217;t built for clean reporting. Capture rules vary by team, fields get reused for new meanings, and updates arrive late. Add duplicate keys, merges, and backfills, and you get dashboards that look stable until they suddenly aren&#8217;t.</p><p><strong>Path 2: &#8220;Helpful&#8221; transformations.</strong></p><p>This is where good intentions turn into long-term pain. Someone patches a logic gap in a pipeline: a mapping table, a filter, a &#8220;quick fix&#8221; to match finance numbers. If that logic isn&#8217;t documented and tested, it becomes invisible business policy, and it quietly diverges from what the business thinks is happening.</p><p><strong>Path 3: Self-serve scale.</strong></p><p>Self-serve analytics is great, until it isn&#8217;t. More consumers means more extracts, more copies, and more versions of &#8220;truth&#8221;. Two teams can start from the same dataset and still ship conflicting definitions of the same metric.</p><h3>The silent killer: breaking changes</h3><p>Schema drift and incompatible changes break consumers even when pipelines are &#8220;green&#8221;. The jobs run. The tables load. The numbers are just wrong, or worse, wrong in a way that looks plausible.</p><h2>Root causes CIOs should look for</h2><h3>Ownership gaps</h3><p>The most common root cause is also the least technical: nobody can clearly say who owns quality for a dataset that matters. &#8220;The data team owns quality&#8221; sounds tidy, but it becomes a loophole. Producers change fields, tweak definitions, or ship new logic to hit delivery dates. Consumers then discover the impact days later, usually when a KPI shifts and someone starts asking for screenshots. The blast radius lands downstream, and everyone argues about whose job it is to fix it.</p><h3>No contracts, no tests, no alarms</h3><p>When there&#8217;s no contract, expectations live in people&#8217;s heads: what a field means, what &#8220;complete&#8221; looks like, how fresh the data should be. That&#8217;s tribal knowledge, not an engineering system. Without tests, regressions slip through even the boring ones like not-null, uniqueness, and referential integrity. And without observability, you don&#8217;t find out early. You find out in the exec meeting, with a graph on screen and zero time to explain it.</p><h3>Misaligned incentives</h3><p>Most organisations reward feature shipping. Data correctness is treated as &#8220;maintenance&#8221; until it becomes a crisis. When incentives don&#8217;t match the risk, bad data becomes predictable.</p><h2>The fix in three moves: contain, treat, vaccinate</h2><h3>1) Contain the outbreak (what to do this month)</h3><p>When trust is already wobbling, your first job is to stop the spread. Pick the KPI that&#8217;s causing the most noise (usually revenue, active customers, churn, or risk exposure) and quarantine the metric. Name one &#8220;official&#8221; dataset for that KPI and freeze definition changes for a short window. You&#8217;re not trying to solve all data quality this month you&#8217;re buying stability so people can make decisions again.</p><p>Next, create a lightweight data incident loop. Keep it simple: P0 for exec metrics and board reporting, P1 for customer impact, P2 for internal issues. Use one channel and one comms owner, so updates aren&#8217;t scattered across Slack threads, email chains, and meetings. If you can&#8217;t say who owns comms, you don&#8217;t have an incident process; you have chaos with a spreadsheet.</p><p>Finally, stop the worst replication. The fastest way bad data becomes permanent is through uncontrolled extracts and &#8220;shadow marts&#8221; that nobody admits owning. For critical domains, temporarily block or gate ad-hoc exports and duplicate marts until the official source is stable.</p><h3>2) Treat the source (what to do this quarter)</h3><p>Containment is triage. Treatment is where you remove the root cause. Start by defining &#8220;fitness for use&#8221; for each critical dataset in plain language. Don&#8217;t overthink it, just be explicit about the basics: accuracy, completeness, timeliness, uniqueness, and consistency.</p><p>Then implement automated checks where the data lives, not three layers downstream. Begin with high-signal tests that catch real breakages early: not-null, uniqueness, accepted values, and relationship tests (think referential integrity between key tables). Add richer rules only when you need them, using a validation framework like Great Expectations, especially for complex expectations or anomaly-style checks.</p><p>Make quality visible. Track it like a product metric, not a one-off project. A weekly scorecard for the top 10 datasets visible to both producers and consumers changes behaviour fast. When teams see quality trends, they stop treating data issues as &#8220;random&#8221; and start treating them as engineering.</p><h3>3) Vaccinate with &#8220;quality by design&#8221; (what to do over 6&#8211;12 months)</h3><p>Now you prevent recurrence. For critical data products, introduce data contracts and treat them like APIs for data: schema, constraints, freshness expectations, and change rules. This is how you stop &#8220;surprise&#8221; from becoming normal.</p><p>Back it with schema evolution discipline. Backwards compatible changes by default. Breaking changes require explicit versioning and a migration plan. No exceptions for &#8220;it&#8217;s just analytics&#8221;.</p><p>Add data observability so you learn early: monitor freshness, volume, distribution shifts, lineage, and failures. If the first time you notice a problem is the monthly exec pack, you&#8217;re running blind.</p><p>Finally, build governance teams can live with: federated guardrails, not a central bottleneck. Set minimum controls and clear decision rights, then let teams move fast inside the rails.</p><h2>A practical operating model (so this doesn&#8217;t become theatre)</h2><h3>Decision rights (keep it crisp)</h3><p>Most data programs fail for the same reason: everyone agrees quality matters, then nobody has the pen when a trade-off shows up. The fix is boring, clear decision rights.</p><ul><li><p>Data Producer owns correctness at the source. They control schema changes and they&#8217;re accountable for contract compliance when they publish data.</p></li><li><p>Data Product Owner owns definitions, SLAs, and consumer outcomes. They decide what &#8220;active customer&#8221; means and what &#8220;good enough&#8221; looks like for freshness and completeness.</p></li><li><p>Platform Team provides the paved road: tooling, pipelines, observability, templates, and patterns that make the right thing the easy thing.</p></li><li><p>Governance sets minimum controls and arbitrates red lines (the small number of issues where risk or compliance means you can&#8217;t &#8220;just ship it&#8221;).</p></li></ul><h3>Two rules that stop 80% of pain</h3><ul><li><p>No breaking changes without a version and a migration plan.</p></li><li><p>No tier 1 KPI without tests and a clear alerting path (who gets paged, and what &#8220;action&#8221; looks like).</p></li></ul><h2>30/60/90-day plan (actionable, not heroic)</h2><p>Days 0&#8211;30: Pick three exec KPIs and declare a single source of truth for each. Write the definition in plain English and publish it where teams actually look. Add basic tests (not-null, uniqueness, accepted values) and route alerts to one channel with a named owner, so issues don&#8217;t die in silence.</p><p>Days 31&#8211;60: Publish data contracts for those KPIs: schema, constraints, freshness targets, and change rules. Put a schema change workflow in place (review + versioning) so breaking changes can&#8217;t sneak in as &#8220;just a small tweak&#8221;.</p><p>Days 61&#8211;90: Expand the approach to the top 10 datasets that drive decisions. Start measuring reliability like an engineering outcome: incidents per month, MTTR, and a simple &#8220;trust score&#8221; your execs can understand.</p><h2>Closing</h2><p>Bad data isn&#8217;t a tooling problem first. It&#8217;s an ownership and change-management problem that tools can enforce. Containment buys you time. Contracts and tests buy you trust, and trust is what lets teams move fast without weekly reconciliation theatre.</p><p>If you want more run-it-on-Monday architecture and governance playbooks, subscribe to the newsletter.</p>]]></content:encoded></item><item><title><![CDATA[Stop “Design by Committee” in Architecture]]></title><description><![CDATA[Keep stakeholders involved without turning every decision into a meeting series]]></description><link>https://newsletter.aminollahi.com/p/stop-design-by-committee-architecture-governance</link><guid isPermaLink="false">https://newsletter.aminollahi.com/p/stop-design-by-committee-architecture-governance</guid><dc:creator><![CDATA[Ryan Aminollahi]]></dc:creator><pubDate>Sun, 04 Jan 2026 19:23:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!tVCA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1df7b4aa-fbe2-42cf-96ee-29deb52e1eff_1536x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tVCA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1df7b4aa-fbe2-42cf-96ee-29deb52e1eff_1536x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tVCA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1df7b4aa-fbe2-42cf-96ee-29deb52e1eff_1536x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!tVCA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1df7b4aa-fbe2-42cf-96ee-29deb52e1eff_1536x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!tVCA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1df7b4aa-fbe2-42cf-96ee-29deb52e1eff_1536x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!tVCA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1df7b4aa-fbe2-42cf-96ee-29deb52e1eff_1536x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tVCA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1df7b4aa-fbe2-42cf-96ee-29deb52e1eff_1536x1024.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1df7b4aa-fbe2-42cf-96ee-29deb52e1eff_1536x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:446379,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/183194604?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1df7b4aa-fbe2-42cf-96ee-29deb52e1eff_1536x1024.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!tVCA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1df7b4aa-fbe2-42cf-96ee-29deb52e1eff_1536x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!tVCA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1df7b4aa-fbe2-42cf-96ee-29deb52e1eff_1536x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!tVCA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1df7b4aa-fbe2-42cf-96ee-29deb52e1eff_1536x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!tVCA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1df7b4aa-fbe2-42cf-96ee-29deb52e1eff_1536x1024.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MpZ0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbac17ab-97f3-4152-8b1f-515a0fa5fea7_7880x2587.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MpZ0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbac17ab-97f3-4152-8b1f-515a0fa5fea7_7880x2587.png 424w, https://substackcdn.com/image/fetch/$s_!MpZ0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbac17ab-97f3-4152-8b1f-515a0fa5fea7_7880x2587.png 848w, https://substackcdn.com/image/fetch/$s_!MpZ0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbac17ab-97f3-4152-8b1f-515a0fa5fea7_7880x2587.png 1272w, https://substackcdn.com/image/fetch/$s_!MpZ0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbac17ab-97f3-4152-8b1f-515a0fa5fea7_7880x2587.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MpZ0!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbac17ab-97f3-4152-8b1f-515a0fa5fea7_7880x2587.png" width="1200" height="393.9593908629442" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cbac17ab-97f3-4152-8b1f-515a0fa5fea7_7880x2587.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:2587,&quot;width&quot;:7880,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:882813,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/183194604?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F087e36e0-81e7-4e0b-9eb5-5c10c201faba_7880x2587.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MpZ0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbac17ab-97f3-4152-8b1f-515a0fa5fea7_7880x2587.png 424w, https://substackcdn.com/image/fetch/$s_!MpZ0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbac17ab-97f3-4152-8b1f-515a0fa5fea7_7880x2587.png 848w, https://substackcdn.com/image/fetch/$s_!MpZ0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbac17ab-97f3-4152-8b1f-515a0fa5fea7_7880x2587.png 1272w, https://substackcdn.com/image/fetch/$s_!MpZ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbac17ab-97f3-4152-8b1f-515a0fa5fea7_7880x2587.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you&#8217;re a CIO choosing between &#8216;the architecture review board as the gate&#8217; and &#8216;empowered teams with guardrails&#8217;, use the matrix above and pick your default. If decisions keep bouncing between recurring meetings, and every stakeholder feels like they get a vote, you&#8217;re living the design-by-committee anti-pattern. The good news is you don&#8217;t need a dictatorship to fix it. You need clear decision rights, a fast path for input, and a simple way to record the call so you stop re-arguing the same topics next quarter.</p><h2>What &#8220;design by committee&#8221; looks like in real architecture work</h2><p>You don&#8217;t usually see it written on a Jira ticket. You feel it. The calendar fills up, the same diagram gets re-litigated, and the &#8220;decision&#8221; turns into a series of polite compromises that nobody&#8217;s proud to own. If you&#8217;ve ever left a meeting thinking <em>&#8220;Wait&#8230; did we actually decide anything?&#8221;</em> this is what you&#8217;re dealing with.</p><h3>The symptoms (you can almost hear them)</h3><ul><li><p><strong>Every decision needs &#8220;one more meeting&#8221;</strong></p><p>There&#8217;s always another stakeholder to &#8220;bring along&#8221;, another review to &#8220;sanity check&#8221;, another forum to &#8220;socialise the approach&#8221;.</p></li><li><p><strong>Architecture turns into negotiation, not trade-offs</strong></p><p>Instead of cost, risk, operability, and time-to-value, you&#8217;re bartering preferences: &#8220;If we add your requirement, can we keep mine?&#8221;</p></li><li><p><strong>Solutions grow features to satisfy everyone, then satisfy no one</strong></p><p>You end up with the &#8220;camel&#8221; solution: heavy, awkward, and expensive to run. It technically includes everyone&#8217;s request, yet it misses the actual goal.</p></li><li><p><strong>People leave meetings unclear on who decided what</strong></p><p>There&#8217;s a vague sense of alignment, but no decision owner, no decision record, and no next step that anyone can quote later.</p></li><li><p><strong>The system gets complex, inconsistent, and hard to operate</strong></p><p>More moving parts, more exceptions, more bespoke integrations. The on-call experience gets worse, and delivery slows because every change has hidden dependencies.</p></li></ul><h3>Why it happens (good intent, bad mechanics)</h3><p>Most teams don&#8217;t choose this on purpose. It&#8217;s usually a well-meaning response to pressure.</p><ul><li><p><strong>Leaders want alignment and risk reduction</strong></p><p>When the blast radius is high (security, compliance, shared platforms), leaders understandably want visibility and confidence.</p></li><li><p><strong>Decision rights are unclear, so consensus becomes the fallback</strong></p><p>If nobody can point to a decision owner, the group defaults to agreement-by-exhaustion. It feels safe, but it&#8217;s slow, and it avoids accountability.</p></li><li><p><strong>The architecture review board (ARB) becomes the place where work goes to slow down</strong></p><p>Instead of a focused escalation path for &#8220;red line&#8221; decisions, the ARB becomes a queue. Teams start designing for approval, not for outcomes.</p></li></ul><h2>The hidden cost: speed, coherence, and accountability</h2><p>Design by committee feels polite. Everyone gets heard, risk feels &#8220;managed&#8221;, and nobody walks out upset. Then the bill arrives in delivery time, system quality, and ownership. You don&#8217;t notice it in a single sprint. You notice it when the same decisions resurface, the platform drifts, and teams stop taking initiative because initiative gets punished with meetings.</p><h3>Speed tax</h3><ul><li><p><strong>Lead time balloons because feedback is serial, not parallel</strong></p><p>One review triggers another review, which triggers another stakeholder request. Each loop adds days, sometimes weeks, and none of it shows up cleanly on your delivery dashboard.</p></li><li><p><strong>Teams wait for permission instead of shipping evidence</strong></p><p>When the default is &#8220;get everyone to agree first&#8221;, teams stop running small experiments. They stop bringing options with data. They bring slide decks and hope for a blessing. That&#8217;s how architecture governance turns into a queue instead of a capability.</p></li></ul><h3>Coherence tax</h3><ul><li><p><strong>&#8220;Camel architecture&#8221;: stitched compromises, no unifying direction</strong></p><p>You end up with a solution built from negotiated pieces rather than a clear set of trade-offs. The result usually has extra components, inconsistent patterns, and awkward seams. It works&#8230; until it has to scale, or be operated at 2am, or be secured properly.</p></li></ul><h3>Accountability tax</h3><ul><li><p><strong>When everyone is involved, no one owns the outcome</strong></p><p>A group can create a decision, but it can&#8217;t carry responsibility the way a named decision owner can. When the outcome is messy, you get finger-pointing or silence &#8212; neither helps the next decision.</p></li><li><p><strong>Decisions are hard to revisit because the reasoning was never captured</strong></p><p>Without an Architecture Decision Record (ADR) or similar, you can&#8217;t tell whether you&#8217;re reversing a bad call or repeating a good one in a new context. So you re-run the debate from scratch, with a slightly different cast, and call it &#8220;alignment&#8221;.</p></li></ul><h2>The fix in one sentence</h2><p>Separate <strong>input</strong> from <strong>authority</strong>, then <strong>record the decision</strong> so you can move fast without losing control.</p><p>Here&#8217;s what that looks like in practice: you still invite strong input from security, platforms, data, finance, and delivery, but you don&#8217;t pretend it&#8217;s a vote. You name a <strong>decision owner</strong>, timebox the consultation, make the call, and capture the &#8220;why&#8221; in an <strong>Architecture Decision Record (ADR)</strong>. That&#8217;s lightweight governance: fewer meetings, clearer decision rights, and far less d&#233;j&#224; vu the next time the topic comes up.</p><p></p><h2>Step-by-step playbook to kill design by committee (without killing collaboration)</h2><p>You don&#8217;t fix this by telling people to &#8220;be decisive&#8221;. You fix it by changing the operating system: decision types, decision rights, and a simple record of what got decided. Here&#8217;s a playbook you can roll out in a week, then tighten over the next month.</p><h3>1) Define decision types and the escalation line</h3><p>Start by sorting decisions into three buckets. This stops the ARB (or &#8220;governance&#8221;) being dragged into everything.</p><ul><li><p><strong>Team decisions</strong>: local, reversible, low blast radius</p><p>Examples: library choice for a service, minor refactors, feature flags, internal API shaping.</p></li><li><p><strong>Platform decisions</strong>: shared, hard to reverse, multi-team impact</p><p>Examples: standard logging pattern, event contracts, shared CI/CD approach, platform authentication method.</p></li><li><p><strong>Enterprise &#8220;red line&#8221; decisions</strong>: security, regulatory, major spend</p><p>Examples: anything touching regulated data, material vendor lock-in, new payment rails, material cost commitments.</p></li></ul><p><strong>One rule that changes everything:</strong> if it&#8217;s a <strong>red line</strong> decision, it gets a <strong>timeboxed review</strong>. Everything else stays with the team. No exceptions &#8220;because someone&#8217;s curious&#8221;.</p><h3>2) Assign decision rights using DACI or RAPID (pick one)</h3><p>If you want to stop consensus-by-default, you need a decision model people can remember on a busy Tuesday.</p><ul><li><p><strong>Use DACI</strong> when you want a simple model that most teams can apply without training wheels.</p><p>(Driver, Approver, Contributors, Informed.)</p></li><li><p><strong>Use RAPID</strong> when decisions span layers and you need clarity on who recommends versus who decides.</p><p>(Recommend, Agree, Perform, Input, Decide.)</p></li></ul><p><strong>Quick callout:</strong> <strong>RACI</strong> often fails for decisions because it&#8217;s task-flavoured. It tells you who&#8217;s &#8220;responsible&#8221; for work, not who has the authority to decide when opinions clash.</p><h3>3) Install a single &#8220;decision owner&#8221; per decision</h3><p>This is the moment everything speeds up.</p><ul><li><p><strong>One person is accountable for the call</strong></p><p>Name them. Put it on the doc. If you can&#8217;t name them, you&#8217;ve found the real problem.</p></li><li><p><strong>Many people can be consulted</strong></p><p>Consultation is encouraged. Chaos isn&#8217;t.</p></li><li><p><strong>Input is a gift, not a vote</strong></p><p>People should feel heard. They shouldn&#8217;t feel entitled to a veto.</p></li></ul><p>A practical line to use: <em>&#8220;We&#8217;ll take input widely, then the decision owner will make the call and record it.&#8221;</em></p><h3>4) Use a one-page pre-read so meetings become decisions</h3><p>Most architecture meetings fail before they start: no pre-read, no options, no trade-offs, no decision needed. Fix that and half your committee problem disappears.</p><p><strong>One-page pre-read template</strong></p><ul><li><p><strong>Context and constraints</strong> (what&#8217;s true, what&#8217;s non-negotiable)</p></li><li><p><strong>Options</strong> (2&#8211;3 max, if you bring 7, you&#8217;re not ready)</p></li><li><p><strong>Trade-offs</strong> (cost, risk, time, operability)</p></li><li><p><strong>Recommendation</strong> and <strong>&#8220;what would change my mind?&#8221;</strong></p></li><li><p><strong>Decision needed today</strong> (yes/no plus the selected option)</p></li></ul><p>If the pre-read isn&#8217;t ready, don&#8217;t hold the meeting. You&#8217;re just creating calendar noise.</p><h3>5) Record the decision with ADRs (lightweight, searchable)</h3><p>This is how you stop re-arguing decisions every quarter.</p><ul><li><p><strong>Store ADRs with the code or in a shared repo</strong></p><p>Somewhere searchable, versioned, and easy to link.</p></li><li><p><strong>Keep them short:</strong> context, decision, consequences</p><p>You&#8217;re writing a memory aid, not a novel.</p></li><li><p><strong>Link ADRs to principles and standards when relevant</strong></p><p>That way the decision isn&#8217;t floating on vibes; it&#8217;s connected to the operating model.</p></li></ul><p>The win here is cultural: teams learn that decisions are made once, recorded, and revisited only when assumptions change.</p><h3>6) Turn the ARB into a service, not a gate</h3><p>An ARB can be useful. The problem is when it becomes the choke point.</p><ul><li><p><strong>Office hours for early advice</strong></p><p>Bring rough ideas early and get directional feedback before it becomes a political document.</p></li><li><p><strong>Async review with a 48-hour SLA for red line items</strong></p><p>Give teams a predictable path. Timebox the feedback. Move on.</p></li><li><p><strong>Publish &#8220;approved patterns&#8221;</strong></p><p>If you keep re-reviewing the same choices (logging, auth, secrets, networking), publish the patterns and let teams reuse them without re-litigating.</p></li></ul><p>Net result: better architecture governance, less theatre, and teams that can actually deliver.</p><h2>A simple checklist you can copy </h2><p>Paste this into your project space and use it at the start of any architecture discussion. It&#8217;s a quick way to spot when a healthy consult is turning into committee mode.</p><h3>&#8220;Are we drifting into committee mode?&#8221;</h3><ul><li><p><strong>Do we know who decides (a name, not a group)?</strong></p></li><li><p><strong>Is the decision reversible? If yes, why is it stuck?</strong></p></li><li><p><strong>Are we debating preferences instead of constraints (security, cost, time, operability)?</strong></p></li><li><p><strong>Are we missing architecturally significant requirements</strong> (security, latency, audit, availability, data retention)?</p></li><li><p><strong>Did we timebox consultation</strong> (who gets input, by when)?</p></li><li><p><strong>Will we publish an ADR within 24 hours of the decision</strong> (context, decision, consequences)?</p></li></ul><h2>What to say in the room </h2><p>You don&#8217;t need to &#8220;win&#8221; the meeting. You just need to steer it back to a decision. These lines keep things respectful while still moving forward.</p><h3>When the meeting starts to spiral</h3><ul><li><p>&#8220;Let&#8217;s separate concerns from decisions. What input do we still need, and who&#8217;s deciding today?&#8221;</p></li><li><p>&#8220;If we can&#8217;t name the decision owner, that&#8217;s the real problem.&#8221;</p></li><li><p>&#8220;Quick reset: are we here to explore options, or to decide one?&#8221;</p></li></ul><h3>When someone wants a vote</h3><ul><li><p>&#8220;Happy to take your input. We&#8217;re not voting, we&#8217;re trading off.&#8221;</p></li><li><p>&#8220;Let&#8217;s capture your concern as a constraint. Then the decision owner can weigh it with the others.&#8221;</p></li><li><p>&#8220;If this is a veto, say it plainly; otherwise, it&#8217;s input.&#8221;</p></li></ul><h3>When someone raises risk late</h3><ul><li><p>&#8220;Great catch. Is this a red line risk? If yes, we escalate. If no, we document and proceed.&#8221;</p></li><li><p>&#8220;What would need to be true for this risk to be acceptable?&#8221;</p></li><li><p>&#8220;Let&#8217;s record it in the ADR with a mitigation and an owner, so it doesn&#8217;t vanish after this call.&#8221;</p></li></ul><p></p><h3>Closing: your operating model in 3 bullets</h3><ul><li><p><strong>Clear decision rights</strong> (DACI or RAPID), with <strong>named decision owners</strong></p></li><li><p><strong>Lightweight governance</strong> (ARB for <strong>red lines only</strong>, timeboxed so delivery keeps moving)</p></li><li><p><strong>ADRs as memory</strong> (so you don&#8217;t re-litigate the past every quarter)</p></li></ul><p></p><p>If you want more patterns like this, follow and <strong>subscribe to the newsletter</strong>. I share practical architecture operating models you can run on Monday morning.</p>]]></content:encoded></item><item><title><![CDATA[When Enterprise Architecture Goes Sideways: 4 Anti-patterns and Fixes]]></title><description><![CDATA[Practical warning signs, metrics, and governance moves you can use this quarter.]]></description><link>https://newsletter.aminollahi.com/p/enterprise-architecture-anti-patterns</link><guid isPermaLink="false">https://newsletter.aminollahi.com/p/enterprise-architecture-anti-patterns</guid><dc:creator><![CDATA[Ryan Aminollahi]]></dc:creator><pubDate>Sun, 21 Dec 2025 19:14:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!CB34!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40af1c58-f8b3-4b79-bade-b72935995a8f_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CB34!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40af1c58-f8b3-4b79-bade-b72935995a8f_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CB34!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40af1c58-f8b3-4b79-bade-b72935995a8f_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!CB34!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40af1c58-f8b3-4b79-bade-b72935995a8f_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!CB34!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40af1c58-f8b3-4b79-bade-b72935995a8f_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!CB34!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40af1c58-f8b3-4b79-bade-b72935995a8f_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CB34!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40af1c58-f8b3-4b79-bade-b72935995a8f_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/40af1c58-f8b3-4b79-bade-b72935995a8f_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:749196,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/182220696?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40af1c58-f8b3-4b79-bade-b72935995a8f_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!CB34!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40af1c58-f8b3-4b79-bade-b72935995a8f_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!CB34!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40af1c58-f8b3-4b79-bade-b72935995a8f_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!CB34!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40af1c58-f8b3-4b79-bade-b72935995a8f_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!CB34!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40af1c58-f8b3-4b79-bade-b72935995a8f_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>A team I worked with did everything &#8220;right&#8221; on paper. We had a clear business goal, a tight deadline, and a talented group of engineers who could ship fast. And we did. The first release landed quickly, stakeholders were happy, and the roadmap looked achievable.</p><p>Then the second phase arrived.</p><p>Suddenly, every sprint started with a long meeting about &#8220;the right&#8221; database. Then another about messaging. Then another about observability tools. Decisions dragged because too many people needed to agree, but nobody owned the final call. To buy time, we ran more spikes. To reduce risk, we added more tools. To &#8220;future-proof&#8221; analytics, we copied more data into more places.</p><p>A few months later, the delivery pace slowed to a crawl. The architecture wasn&#8217;t broken because the team lacked skill. It broke because a handful of well-meant choices multiplied across the enterprise: decision-making drifted, data spread without ownership, integration layers became overloaded, and tooling started running the teams instead of supporting them.</p><p>In this article, you&#8217;ll learn four enterprise architecture anti-patterns, how to spot them early using simple signals and metrics, and the practical steps to fix them before they become expensive habits.</p><h2>What is an anti-pattern in enterprise architecture?</h2><p>Enterprise architecture is full of &#8220;best practice&#8221; advice. The catch is that the same idea can be brilliant in one context and painful in another. That&#8217;s where patterns and anti-patterns matter.</p><h3>Patterns vs anti-patterns (plain-English definitions)</h3><ul><li><p><strong>Pattern:</strong> a repeatable approach that solves a known problem in a specific context. It has trade-offs, but the benefits are worth it when the conditions fit.</p></li><li><p><strong>Anti-pattern:</strong> something that looks smart at the start, often because it feels efficient or &#8220;safe&#8221;, but it creates recurring pain once the organisation scales.</p></li><li><p><strong>Quick tell:</strong> if teams keep saying <strong>&#8220;we&#8217;ll fix it later&#8221;</strong>, you&#8217;re probably already in anti-pattern territory. &#8220;Later&#8221; becomes the roadmap, and the architecture starts accruing interest.</p></li></ul><p>A useful mindset shift is this: an anti-pattern is rarely stupidity. It&#8217;s usually speed, fear, or unclear ownership showing up as &#8220;design&#8221;.</p><h3>A grounded definition of &#8220;architecture&#8221;</h3><p>To keep this practical (and avoid word games), anchor on a simple, standards-based view:</p><blockquote><p>Architecture describes the&nbsp;fundamental elements of a system, the&nbsp;relationships between those elements, the&nbsp;environment&nbsp;in which the system operates, and the&nbsp;guiding principles&nbsp;that shape how the system is designed and how it evolves over time.</p></blockquote><p>That last part matters. Architecture is not just a diagram of what exists today. It&#8217;s also the set of rules that decide how change happens tomorrow. When those rules are missing or messy, anti-patterns spread fast.</p><h2>The four layers where EA anti-patterns show up</h2><p>Enterprise architecture anti-patterns don&#8217;t appear in one place. They spread across layers, and each layer has its own style of failure. If you only look at apps, you&#8217;ll miss the business decision problem. If you only look at tooling, you&#8217;ll miss the data lifecycle problem.</p><h3>A simple lens: Business, Data, Application, Technology</h3><ul><li><p><strong>Business:</strong> decision-making, priorities, operating model</p><p>This is where anti-patterns show up as slow decisions, unclear ownership, competing agendas, and &#8220;everyone approves, nobody owns&#8221;.</p></li><li><p><strong>Data:</strong> quality, retention, governance, value</p><p>This is where anti-patterns look like uncontrolled replication, mystery datasets, poor classification, and growing risk wrapped in &#8220;just in case&#8221;.</p></li><li><p><strong>Application:</strong> service boundaries, integration, coupling</p><p>This is where anti-patterns appear as messy service responsibilities, overloaded integration layers, brittle dependencies, and change that breaks unrelated teams.</p></li><li><p><strong>Technology:</strong> platform, tooling, operational practices</p><p>This is where anti-patterns show up as tool sprawl, inconsistent environments, fragile automation, and operational effort that keeps rising even when &#8220;everything is automated&#8221;.</p></li></ul><p>Same enterprise, different layer, different failure mode.</p><h2>Anti-pattern 1: Design by committee</h2><p>&#8220;Design by committee&#8221; usually starts with good intent: get the right people in the room, reduce risk, and avoid bad calls. The problem is what happens next. Decision-making turns into a recurring meeting series, and architecture becomes a negotiation instead of a discipline.</p><h3>What it looks like in real teams</h3><ul><li><p>Endless architecture meetings that end with <strong>&#8220;let&#8217;s do another spike&#8221;</strong></p></li><li><p>No clear decision owner</p></li><li><p>Everyone can block, nobody can close</p></li></ul><p>You&#8217;ll often see a team shipping early, then stalling as complexity rises. The meeting load goes up while delivery slows down.</p><h3>Early warning signs</h3><ul><li><p>Too many decision-makers in one room</p></li><li><p>Repeated debates on storage, messaging, frameworks</p></li><li><p>Increasing tech debt and refactoring churn</p></li><li><p>Delivery dates slip because decisions arrive late</p></li></ul><p>A classic symptom is &#8220;decision drift&#8221;: the team starts coding without a decision, then later discovers a half-written guideline somewhere and tries to retrofit it.</p><h3>Metrics you can track (even without fancy tooling)</h3><p>You don&#8217;t need a big governance platform to spot this. Track a few simple indicators:</p><ul><li><p><strong>Number of architecture meetings per decision</strong></p></li><li><p><strong>Time from &#8220;decision needed&#8221; to &#8220;decision published&#8221;</strong></p></li><li><p><strong>Count of spikes raised due to decision ambiguity</strong></p></li><li><p><strong>Rework rate:</strong> stories reopened due to architectural changes</p></li></ul><p>If those numbers trend up together, you&#8217;re paying a &#8220;decision tax&#8221; every sprint.</p><h3>Fix: a lightweight decision system, not a heavyweight committee</h3><p>The goal isn&#8217;t less collaboration. It&#8217;s clearer ownership and faster closure.</p><ul><li><p><strong>Define decision roles</strong></p><p>One accountable owner for the decision, plus a small review group. Keep the decision-making circle tight; widen the feedback circle instead.</p></li><li><p><strong>Standardise decisions with ADRs and a simple lifecycle</strong></p><p>Use a consistent format and statuses such as <strong>proposed, accepted, superseded, rejected</strong>. The point is clarity: what we decided, why, what we didn&#8217;t choose, and when it changes.</p></li><li><p><strong>Set a &#8220;decision SLA&#8221; for common choices</strong></p><p>Example: &#8220;Most decisions close within <strong>5 working days</strong>.&#8221; If it can&#8217;t close, force the next question: what information is missing and who owns getting it?</p></li><li><p><strong>Publish a small set of viewpoints and tools</strong></p><p>Pick the minimum that keeps teams aligned (for example <strong>C4/UML</strong>, <strong>draw.io/PlantUML</strong>, and <strong>one shared repository</strong> for diagrams and ADRs). Consistency beats perfection.</p></li></ul><h3>Two &#8220;hidden traps&#8221; to call out (quick and human)</h3><ul><li><p><strong>Ivory tower architect</strong>: decisions appear, but nobody can ask questions. The team learns by guessing, and gaps turn into rework.</p></li><li><p><strong>Architect plays golf</strong>: the architect leaves, and the team inherits a design they can&#8217;t evolve. The architecture becomes a relic, not a living guide.</p></li></ul><p>Design by committee is a process smell. Fix the decision system, and the architecture starts behaving like a product again: owned, iterated, and measurable.</p><h2>Anti-pattern 2: Bad data virus</h2><p>Bad data rarely arrives with a bang. It spreads quietly. One &#8220;temporary&#8221; dataset becomes a permanent table. One export becomes a pipeline. One replica becomes a lake. Then suddenly you&#8217;re paying for data nobody trusts, nobody owns, and nobody can confidently delete.</p><h3>What it looks like</h3><ul><li><p>Old, unused data gets replicated into new systems (replicas, lakes, analytics, AI)</p></li><li><p>Nobody can explain why certain datasets exist</p></li><li><p>Storage and risk grow together</p></li></ul><p>The giveaway is when the enterprise keeps copying the same uncertainty into new platforms. The data looks more &#8220;modern&#8221;, but the confusion stays.</p><h3>Why it happens</h3><ul><li><p>Fear of deleting data</p></li><li><p>Weak classification and ownership</p></li><li><p>Retention handled as an afterthought</p></li></ul><p>Most teams don&#8217;t choose this deliberately. They&#8217;re trying to stay safe, keep options open, and avoid being blamed for deleting &#8220;something important&#8221;. Over time, &#8220;safe&#8221; becomes expensive.</p><h3>Early warning signs</h3><ul><li><p>Low usage datasets with high storage cost</p></li><li><p>Unclear sensitivity classification</p></li><li><p>&#8220;We might need it later&#8221; becomes the default policy</p></li></ul><p>If your data discussions are mostly about where to store it, not why it exists and who uses it, you&#8217;re already slipping.</p><h3>Metrics to watch</h3><p>You can make this measurable without turning it into a massive governance program:</p><ul><li><p><strong>Data access frequency</strong> (reads/writes per dataset)</p></li><li><p><strong>Age distribution of data</strong> (how much is stale)</p></li><li><p><strong>Percentage classified vs unclassified</strong></p></li><li><p><strong>Audit findings tied to data governance gaps</strong></p></li></ul><p>A simple starting point: rank your top datasets by cost, then overlay usage. The scary ones rise to the top fast.</p><h3>Fix: treat data like a product with a lifecycle</h3><p>The cure is less about new platforms and more about basic hygiene and accountability.</p><ul><li><p><strong>Run a data assessment</strong> (what exists, who owns it, who uses it)</p><p>Build a lightweight inventory: dataset name, owner, purpose, consumers, retention rule, and sensitivity level.</p></li><li><p><strong>Classify data and align retention policies</strong></p><p>Classify by value and risk, then set retention based on actual need (not fear). If you can&#8217;t explain the purpose, it&#8217;s not ready to spread.</p></li><li><p><strong>Introduce deletion and archiving automation</strong></p><p>Manual deletion rarely happens. Automate it with clear approvals, logging, and safety rails (archive first, delete after a defined window).</p></li><li><p><strong>Tie dark data reduction to security outcomes</strong></p><p>Less unknown data means fewer places sensitive information can hide, leak, or get copied into tools that were never designed to protect it. Smaller attack surface, cleaner audits, and less time arguing about what&#8217;s safe to share.</p></li></ul><p>Bad data virus is the anti-pattern where &#8220;just in case&#8221; becomes the default architecture. Fix it by making data ownership, lifecycle, and retention normal operational work, like patching or access reviews.</p><h2>Anti-pattern 3: Swiss Army knife integration</h2><p>This one is sneaky because it often starts as a rescue mission. Teams move to event-driven patterns to reduce tight coupling, then the integration layer slowly becomes the place where &#8220;everything gets solved&#8221;. Over time, the broker turns into a Swiss Army knife: handy, overloaded, and impossible to hand to someone new without cutting yourself.</p><h3>What it looks like in 2025 systems</h3><ul><li><p>The message broker or integration layer starts doing everything: routing, transforms, auth logic, orchestration, even business rules</p></li><li><p>A small &#8220;core team&#8221; becomes a bottleneck because only they understand the glue</p></li></ul><p>It&#8217;s the modern version of the old &#8220;mega-database with magic stored procedures&#8221;. Different tool, same problem: logic hidden in a place that&#8217;s hard to test, hard to version, and hard to reason about.</p><h3>Symptoms you&#8217;ll hear out loud</h3><ul><li><p>&#8220;We can&#8217;t change that, it might break other flows&#8221;</p></li><li><p>&#8220;It&#8217;s all in the broker rules&#8221;</p></li><li><p>&#8220;We need the one person who built it&#8221;</p></li></ul><p>When those phrases show up, your integration layer has stopped being plumbing and started being a shadow application.</p><h3>Metrics that reveal it</h3><ul><li><p><strong>Growth in message types and transformations</strong></p></li><li><p><strong>Incidents tied to broker changes</strong></p></li><li><p><strong>Mean time to recover when messaging breaks</strong></p></li><li><p><strong>Percentage of business rules living outside services</strong></p></li></ul><p>A practical check: if a broker change needs the same level of analysis and testing as a service release, you&#8217;ve turned the broker into a product without admitting it.</p><h3>Fix: move intelligence to services, keep pipes simple</h3><p>The goal isn&#8217;t &#8220;no integration logic&#8221;. The goal is to keep the broker focused on transport and coordination, while services own the domain rules.</p><ul><li><p><strong>Reduce transformation logic in the broker</strong></p><p>Minimise mapping scripts and embedded decision trees. If transformations must exist, make them simple, visible, and versioned like code.</p></li><li><p><strong>Standardise contracts and versioning</strong></p><p>Define event/message schemas, version them explicitly, and treat compatibility as a first-class concern.</p></li><li><p><strong>Push business rules back into domain services (&#8220;smart endpoints&#8221;)</strong></p><p>Keep decision-making close to the domain. Services should validate, decide, and act. The integration layer should pass messages, not &#8220;think&#8221;.</p></li><li><p><strong>Add tracing and clear observability for message flows</strong></p><p>Make every hop visible: correlation IDs, distributed tracing, and meaningful metrics (latency, failures, retries). If you can&#8217;t see the flow end-to-end, you can&#8217;t manage the risk.</p></li></ul><p>Swiss Army knife integration feels efficient until the day you need to change it quickly. Then it becomes a single point of confusion, delay, and fragility. Keep pipes simple, and your teams get their autonomy back.</p><h2>Anti-pattern 4: Operational over-tooling</h2><p>Tools are meant to remove friction. Operational over-tooling does the opposite: it adds layers of dashboards, scanners, pipelines, and platforms until teams spend more time managing the toolchain than improving the product. The result is a noisy, expensive system that still wakes people up at 2am.</p><h3>What it looks like</h3><ul><li><p>Tool sprawl: overlapping CI/CD, logging, monitoring, security scanners, dashboards</p></li><li><p>Teams spend more time operating tools than shipping outcomes</p></li><li><p>Automation exists, but the on-call pain stays</p></li></ul><p>A clear sign is when &#8220;keeping the platform running&#8221; becomes a bigger job than building the thing the platform exists to support.</p><h3>Common causes</h3><ul><li><p>Tool adoption driven by trends or CV-building</p></li><li><p>&#8220;DevOps equals automation&#8221; thinking</p></li><li><p>No exit plan once a tool is in</p></li></ul><p>A lot of over-tooling is fear in disguise: fear of manual work, fear of incidents, fear of being seen as behind. So the response is &#8220;add another tool&#8221;.</p><h3>Metrics to track</h3><ul><li><p><strong>Tool count per category</strong> (CI, observability, security, IaC)</p></li><li><p><strong>Feature usage rate</strong> (how much of the tool you actually use)</p></li><li><p><strong>Integration effort per tool</strong> (time to onboard, maintain, upgrade)</p></li><li><p><strong>Training/support load per quarter</strong></p></li></ul><p>If the tool count rises while incident rates and lead time don&#8217;t improve, you&#8217;re buying complexity, not reliability.</p><h3>Fix: governance that helps teams move faster</h3><p>This isn&#8217;t about banning tools. It&#8217;s about making tool decisions deliberate, visible, and reversible.</p><ul><li><p><strong>Run a tooling audit and create a simple inventory</strong></p><p>List the tools, licences, owners, purpose, cost, and which teams rely on them. You can&#8217;t fix sprawl if nobody can see it.</p></li><li><p><strong>Set tool adoption criteria</strong></p><p>For every new tool: define the problem, compare options, write a decision record, run a trial, and set a rollout plan (including success measures).</p></li><li><p><strong>Standardise where it pays off, allow exceptions with an ADR</strong></p><p>Standardisation reduces cognitive load and onboarding time. Exceptions are fine, but they should be explicit and justified so they don&#8217;t quietly become the new default.</p></li><li><p><strong>Use Well-Architected style anti-pattern checks as a review prompt</strong></p><p>Treat reviews as a way to catch operational smells early: duplicated tooling, noisy alerting, brittle pipelines, and automation that creates work instead of removing it.</p></li></ul><p>Operational over-tooling is the moment your tooling becomes the product. The fix is simple governance that keeps choice intentional and keeps teams focused on outcomes, not operating a maze.</p><h2>A practical cadence to prevent anti-patterns (without slowing delivery)</h2><p>Most anti-patterns don&#8217;t arrive as a single bad decision. They grow when teams are busy, deadlines are real, and &#8220;we&#8217;ll clean it up later&#8221; feels like the only way to move. The fix isn&#8217;t heavier governance. It&#8217;s a repeatable cadence that keeps decisions small, visible, and testable.</p><h3>A six-step loop your teams can repeat</h3><p>Think of this as an architecture &#8220;heartbeat&#8221; you can run every iteration or every PI, depending on your scale:</p><ul><li><p><strong>Gather stakeholder inputs</strong></p><p>Short, purposeful conversations: product, delivery, ops, security, data, and the teams building the work. Capture what success looks like and what pain must be avoided.</p></li><li><p><strong>Identify ASRs, constraints, risks, assumptions</strong></p><p>Make the hidden stuff explicit. What must be true for this to work? What can&#8217;t change? What are we betting on? What could hurt customers or delivery?</p></li><li><p><strong>Choose principles and tactics</strong></p><p>Agree on a few guiding rules (security-by-design, minimise coupling, prefer managed services, etc.) and the tactics that support them.</p></li><li><p><strong>Compare options, make trade-offs, publish ADRs</strong></p><p>Don&#8217;t debate forever. Compare a small set of options, state the trade-offs, and publish the decision so teams can move with confidence.</p></li><li><p><strong>Create the few diagrams people will read</strong></p><p>Resist the urge to document everything. Create the minimum set that helps teams build, operate, and change safely.</p></li><li><p><strong>Build a delivery roadmap, then iterate</strong></p><p>Translate architecture into delivery slices: sequencing, dependencies, risks, and checkpoints. Then revisit as reality changes (because it will).</p></li></ul><p>This loop keeps architecture close to delivery. It also makes anti-patterns easier to spot early, because you&#8217;re repeatedly surfacing decisions, ownership, and trade-offs.</p><h3>&#8220;Fitness functions&#8221; as your guardrails</h3><p>Fitness functions are simple measurable checks that protect the architecture over time. They reduce arguments because the system tells you when you&#8217;re drifting.</p><p>Keep the list short and tied to outcomes, for example:</p><ul><li><p><strong>Latency</strong> (end-to-end response time targets)</p></li><li><p><strong>Cost</strong> (unit cost per transaction or per customer)</p></li><li><p><strong>Recovery time</strong> (RTO/RPO, or time-to-restore for key services)</p></li><li><p><strong>Security events</strong> (unauthorised access attempts, critical vulnerabilities, failed controls)</p></li><li><p><strong>Data retention compliance</strong> (datasets with owners, classification, and enforced retention)</p></li></ul><p>If a change improves features but fails the fitness functions, it&#8217;s a signal to pause, adjust, and avoid baking in the next anti-pattern.</p><h2>Simple checklist you can run this week</h2><p>Anti-patterns rarely start as disasters. They start as shortcuts that quietly become habits. The earlier you notice them, the cheaper they are to fix.</p><p>Here&#8217;s a quick recap of the four anti-patterns we covered:</p><ul><li><p><strong>Design by committee</strong>: decisions stall, spikes multiply, and delivery slows because nobody owns the call.</p></li><li><p><strong>Bad data virus</strong>: unused data spreads into replicas, lakes, analytics, and AI, while cost and risk climb together.</p></li><li><p><strong>Swiss Army knife integration</strong>: the broker/integration layer absorbs routing, transforms, and business rules until one team becomes the bottleneck.</p></li><li><p><strong>Operational over-tooling</strong>: tool sprawl grows, cognitive load rises, and on-call pain stays even when &#8220;everything is automated&#8221;.</p></li></ul><p>If you want a practical next step, run this mini-checklist in your next architecture sync:</p><ul><li><p>Do we have a clear decision owner for each major choice?</p></li><li><p>Are we capturing decisions in a consistent way (even a lightweight ADR)?</p></li><li><p>Which datasets exist &#8220;just in case&#8221;, and who owns them?</p></li><li><p>Is our integration layer doing transport, or is it doing business logic?</p></li><li><p>Which tools do we pay for but barely use, and what problem are they meant to solve?</p></li></ul><p>If you comment your context (team size, delivery model, and where you&#8217;re feeling the most pain), I&#8217;ll suggest the top two anti-patterns to tackle first and a small, realistic plan to unwind them without slowing delivery.</p><p></p>]]></content:encoded></item><item><title><![CDATA[The secret rulebook behind every tap-and-go payment (Part 5)]]></title><description><![CDATA[From awareness to ownership: the final PCI mindset test]]></description><link>https://newsletter.aminollahi.com/p/pci-dss-final-review-integrative-challenge</link><guid isPermaLink="false">https://newsletter.aminollahi.com/p/pci-dss-final-review-integrative-challenge</guid><dc:creator><![CDATA[Ryan Aminollahi]]></dc:creator><pubDate>Sun, 14 Dec 2025 19:42:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!W0iE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdf7435b-c5a8-4163-a888-88a9132f8dc4_1248x832.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!W0iE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdf7435b-c5a8-4163-a888-88a9132f8dc4_1248x832.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!W0iE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdf7435b-c5a8-4163-a888-88a9132f8dc4_1248x832.jpeg 424w, https://substackcdn.com/image/fetch/$s_!W0iE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdf7435b-c5a8-4163-a888-88a9132f8dc4_1248x832.jpeg 848w, https://substackcdn.com/image/fetch/$s_!W0iE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdf7435b-c5a8-4163-a888-88a9132f8dc4_1248x832.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!W0iE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdf7435b-c5a8-4163-a888-88a9132f8dc4_1248x832.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!W0iE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdf7435b-c5a8-4163-a888-88a9132f8dc4_1248x832.jpeg" width="1248" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bdf7435b-c5a8-4163-a888-88a9132f8dc4_1248x832.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1248,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:148014,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/181546937?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdf7435b-c5a8-4163-a888-88a9132f8dc4_1248x832.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!W0iE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdf7435b-c5a8-4163-a888-88a9132f8dc4_1248x832.jpeg 424w, https://substackcdn.com/image/fetch/$s_!W0iE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdf7435b-c5a8-4163-a888-88a9132f8dc4_1248x832.jpeg 848w, https://substackcdn.com/image/fetch/$s_!W0iE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdf7435b-c5a8-4163-a888-88a9132f8dc4_1248x832.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!W0iE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdf7435b-c5a8-4163-a888-88a9132f8dc4_1248x832.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://aminollahi.substack.com/p/pci-dss-foundations-trust-secure-card-payments-1">Part 1</a>, <a href="https://aminollahi.substack.com/p/pci-dss-data-scope-cardholder-environment">Part 2</a>, <a href="https://aminollahi.substack.com/p/pci-dss-12-requirements-simplified-3">Part 3</a>, <a href="https://aminollahi.substack.com/p/pci-dss-role-based-awareness-breach-lessons">Part 4</a></p><h1>Chapter 6: Final Review &amp; Integrative Challenge</h1><p>By now, you&#8217;ve explored the what, why, and how of PCI DSS from understanding its origins and scope, to learning how every architect, developer, tester, and project manager contributes to compliance.<br>But understanding the standard isn&#8217;t the goal.<br><strong>Applying it instinctively</strong> even under pressure, deadlines, and complexity is.</p><p>This final chapter helps you bring all the pieces together through real-world scenarios, reflection, and a closing synthesis of the PCI mindset.</p><h2>6.1 The Real Meaning of &#8220;Compliance&#8221;</h2><p>When most people hear the word <em>compliance</em>, they picture checklists and audits. But in PCI, compliance isn&#8217;t a destination, it&#8217;s a rhythm.<br>You don&#8217;t &#8220;get&#8221; compliant; you <em>stay</em> compliant, every day, through a thousand small actions.</p><p>It&#8217;s like driving safely. You don&#8217;t pass the driving test once and forget the road rules. Every journey, every traffic light, every weather change demands awareness.</p><p>The same applies to PCI.<br>The audit report or Attestation of Compliance (AoC) is just the snapshot.<br>The real protection lives in daily behaviour: encrypting data, reviewing logs, patching systems, and keeping curiosity alive.</p><h2>6.2 The Integrative Scenario; &#8220;The New Checkout Project&#8221;</h2><p>Let&#8217;s step into a realistic situation that mirrors what many modern teams face.</p><p>Your company, <strong>AuroraPay</strong>, is launching a new checkout microservice to process payments for digital gift cards. You are part of a cross-functional squad with an architect, developers, testers, and a project manager. The CTO has made one thing clear: the system <em>must</em> be PCI DSS compliant by design, no last-minute clean-ups.</p><p>You&#8217;ve been given this initial plan:</p><ol><li><p><strong>Frontend:</strong> A React single-page application (SPA) that collects card details and calls the backend API.</p></li><li><p><strong>Backend:</strong> A Node.js microservice running on AWS Fargate that sends card data to an external payment processor (Adyen).</p></li><li><p><strong>Database:</strong> A PostgreSQL instance storing transactions, order details, and some user metadata.</p></li><li><p><strong>Logs and Monitoring:</strong> CloudWatch for logs, Datadog for metrics.</p></li><li><p><strong>Project Timeline:</strong> 10 weeks until production release.</p></li></ol><p>Everything looks neat. But PCI awareness means seeing what others miss.</p><p>Let&#8217;s test that awareness.</p><h3>Challenge Part 1: Scoping the CDE</h3><p><strong>Question:</strong> Which components are <em>in scope</em> for PCI DSS?</p><p>At first glance, you might think only the backend API is.<br>But remember Chapter 2: <em>any system that stores, processes, or transmits cardholder data</em> even temporarily, falls into the <strong>Cardholder Data Environment (CDE)</strong>.</p><p>That means:</p><ul><li><p>The <strong>React frontend</strong> (if it captures raw card numbers)</p></li><li><p>The <strong>API</strong> (since it transmits card data)</p></li><li><p>The <strong>network segment</strong> where the API runs</p></li><li><p>The <strong>logging and monitoring systems</strong> capturing any CHD accidentally</p></li></ul><p>Now imagine the React app is hosted on the same domain as your marketing site. Suddenly, the entire web environment is connected and your PCI scope just exploded.</p><h3>Challenge Part 2: Designing for Scope Reduction</h3><p>You propose a different design:</p><ul><li><p>Use Adyen&#8217;s <strong>hosted payment page</strong> or client-side encryption so that the browser never sends raw card data to your backend.</p></li><li><p>The backend receives only a <strong>token</strong>, which represents the transaction.</p></li><li><p>All logs contain order IDs and masked PANs only (e.g. **** **** **** 1234).</p></li><li><p>The backend stores transaction metadata, but not card numbers.</p></li><li><p>TLS 1.3 enforced across all communication.</p></li><li><p>Access to the database restricted by IAM roles and MFA.</p></li></ul><p><strong>Result:</strong> The backend is now <em>out of scope</em> for PCI DSS because it never touches CHD or SAD.<br>Your CDE shrinks to the external payment processor&#8217;s domain and the PCI burden moves to them (supported by their AoC).</p><p>You&#8217;ve achieved the architect&#8217;s dream: <strong>security through design simplicity.</strong></p><h3>Challenge Part 3: The Logging Trap</h3><p>Two sprints later, a developer adds this debug statement:</p><p><code>console.log(&#8221;Payment request body:&#8221;, JSON.stringify(req.body));<br></code></p><p>What happens?</p><p>That single line, harmless during local testing, writes full card data to CloudWatch logs which sync to Datadog.<br>In one commit, your observability pipeline becomes part of the CDE.<br>You&#8217;ve turned a one-system scope into a multi-vendor audit nightmare.</p><p><strong>Lesson:</strong> PCI compliance isn&#8217;t about encryption keys or firewalls.<br>It&#8217;s about awareness. Every log, every payload, every variable can either keep you safe or expose your entire environment.</p><h3>Challenge Part 4: Vendor and People Risks</h3><p>During testing, the PM signs a contract with an analytics vendor to &#8220;track customer purchase behaviour.&#8221; The vendor asks for API access to the transaction database.</p><p>As an architect, your alarm bells ring:<br>Analytics systems often aren&#8217;t PCI-compliant. If they can access even tokenised data with partial PANs, you may inadvertently expose CHD.</p><p><strong>Action Plan:</strong></p><ul><li><p>Verify the vendor&#8217;s <strong>PCI Attestation of Compliance</strong>.</p></li><li><p>Restrict access via a <strong>read-only view</strong> with masked data.</p></li><li><p>Ensure the data export process is logged, encrypted, and approved.</p></li><li><p>Document this design decision in your PCI scope register.</p></li></ul><p>Meanwhile, a developer leaves the company.<br>Offboarding fails to revoke their access to CloudWatch. Two weeks later, auditors find an active user account.</p><p><strong>PCI DSS violation:</strong> Requirement 8, <em>every user must have unique access and timely revocation upon termination.</em></p><p>Small oversights, big consequences.</p><h3>Challenge Part 5: The Test Data Dilemma</h3><p>Your QA environment needs sample transactions to verify refunds and partial authorisations.<br>A new tester, unaware of PCI, exports a few real production transactions &#8220;for realism.&#8221;</p><p>Suddenly, your test environment now holds live card data and therefore, becomes part of the CDE.<br>Your scope just tripled.</p><p><strong>Correct approach:</strong></p><ul><li><p>Use <strong>synthetic tokens</strong> or dummy card numbers provided by Adyen.</p></li><li><p>Validate with test-mode APIs only.</p></li><li><p>Prohibit real data replication across environments.</p></li><li><p>Automate nightly scans for PAN-like patterns in logs and databases.</p></li></ul><p>Testing securely is as important as coding securely.</p><h2>6.3 The Human Side of Compliance</h2><p>PCI DSS is a technical standard, but failures are almost always human.<br>People skip steps when they&#8217;re tired, or they make assumptions when documentation lags.</p><p>That&#8217;s why Requirement 12, maintaining security policy and training is so essential.<br>Compliance is sustained not through one-off audits but through <strong>habits, rituals, and accountability</strong>.</p><p>Every person in the PCI ecosystem has a small part to play:</p><ul><li><p>The <strong>architect</strong> defines safe boundaries.</p></li><li><p>The <strong>developer</strong> guards data at the code level.</p></li><li><p>The <strong>tester</strong> hunts for leaks before they spread.</p></li><li><p>The <strong>project manager</strong> ensures processes don&#8217;t drift.</p></li></ul><p>Individually, each role might seem minor. Together, they build resilience.</p><blockquote><p>&#8220;PCI isn&#8217;t a firewall. It&#8217;s a culture of carefulness.&#8221;</p></blockquote><h2>6.4 Reflection Exercise; The Team Retrospective</h2><p>Imagine your squad has just completed the AuroraPay project.<br>During your sprint retrospective, your manager asks three questions:</p><ol><li><p>What did we do well in our PCI implementation?</p></li><li><p>Where did we take unnecessary risks or shortcuts?</p></li><li><p>How can we make compliance automatic next time?</p></li></ol><p>Spend a few minutes writing honest answers from your perspective and from another role&#8217;s.<br>For instance:</p><ul><li><p>If you&#8217;re a developer, how can you make life easier for testers?</p></li><li><p>If you&#8217;re a PM, how can you ensure architects have enough time for design reviews?</p></li><li><p>If you&#8217;re a tester, how can you share findings that influence coding standards?</p></li></ul><p>Compliance is teamwork under pressure. Reflection keeps the team humble and sharp.</p><h2>6.5 The &#8220;What If?&#8221; Game</h2><p>Let&#8217;s test your instincts with short, thought-based scenarios.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZgWb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df980d9-8d8b-4d1d-b085-a4319b0dea05_1534x1040.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZgWb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df980d9-8d8b-4d1d-b085-a4319b0dea05_1534x1040.png 424w, https://substackcdn.com/image/fetch/$s_!ZgWb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df980d9-8d8b-4d1d-b085-a4319b0dea05_1534x1040.png 848w, https://substackcdn.com/image/fetch/$s_!ZgWb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df980d9-8d8b-4d1d-b085-a4319b0dea05_1534x1040.png 1272w, https://substackcdn.com/image/fetch/$s_!ZgWb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df980d9-8d8b-4d1d-b085-a4319b0dea05_1534x1040.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZgWb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df980d9-8d8b-4d1d-b085-a4319b0dea05_1534x1040.png" width="1456" height="987" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5df980d9-8d8b-4d1d-b085-a4319b0dea05_1534x1040.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:987,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:257342,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/181546937?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df980d9-8d8b-4d1d-b085-a4319b0dea05_1534x1040.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZgWb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df980d9-8d8b-4d1d-b085-a4319b0dea05_1534x1040.png 424w, https://substackcdn.com/image/fetch/$s_!ZgWb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df980d9-8d8b-4d1d-b085-a4319b0dea05_1534x1040.png 848w, https://substackcdn.com/image/fetch/$s_!ZgWb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df980d9-8d8b-4d1d-b085-a4319b0dea05_1534x1040.png 1272w, https://substackcdn.com/image/fetch/$s_!ZgWb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df980d9-8d8b-4d1d-b085-a4319b0dea05_1534x1040.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>These &#8220;micro-decisions&#8221; are where PCI lives or dies.<br>Every choice above affects multiple requirements &#8212; from access control to vulnerability management.</p><h2>6.6 Group Discussion Prompts</h2><p>Use these prompts for a 20-minute discussion:</p><ol><li><p>How can your organisation make PCI training less of a compliance exercise and more of a shared culture?</p></li><li><p>Which PCI controls feel most natural to your role? Which feel alien?</p></li><li><p>What would a &#8220;PCI by Design&#8221; culture look like in your product teams?</p></li><li><p>Should PCI be integrated into sprint reviews, definition of done, or architecture sign-off?</p></li><li><p>How can you collaborate with vendors to share responsibility transparently?</p></li></ol><p>The goal isn&#8217;t to find right answers, it&#8217;s to surface blind spots.</p><h2>6.7 The Final Checklist; Can You Explain PCI in Plain English?</h2><p>By the end of this course, you should be able to explain PCI DSS without jargon.<br>Try this exercise:</p><blockquote><p>&#8220;Explain PCI DSS to a new engineer in two minutes.&#8221;</p></blockquote><p>Here&#8217;s a model answer:</p><blockquote><p>&#8220;PCI DSS is a global security standard that protects payment card data.<br>It applies to anyone who stores, processes, or transmits cardholder data.<br>The goal is to minimise where that data exists and secure it through encryption, restricted access, and continuous monitoring.<br>It has 12 core requirements &#8212; things like firewalls, secure coding, and logging.<br>Compliance isn&#8217;t just about passing audits; it&#8217;s about building systems that keep customer trust safe every day.&#8221;</p></blockquote><p>If you can deliver that confidently, you&#8217;ve achieved awareness, the purpose of this entire program.</p><h2>6.8 From Awareness to Ownership</h2><p>Take ten minutes and write a brief &#8220;PCI Pledge&#8221; in your own words.<br>What habits will you personally maintain after this course?</p><p>Here are a few examples:</p><ul><li><p><em>I will never store or log unmasked card data, even temporarily.</em></p></li><li><p><em>I will challenge designs that blur PCI boundaries, no matter who proposes them.</em></p></li><li><p><em>I will keep learning about new attack patterns and mitigation techniques.</em></p></li><li><p><em>I will treat compliance as part of engineering excellence, not bureaucracy.</em></p></li></ul><p>Awareness without ownership fades. Ownership turns rules into reflex.</p><h2>6.9 Building a PCI Mindset</h2><p>Let&#8217;s close the loop.</p><p><strong>PCI DSS</strong> isn&#8217;t about avoiding fines or impressing auditors. It&#8217;s about <strong>protecting trust</strong> the invisible currency behind every tap, click, and swipe.</p><p>When you secure cardholder data, you protect not only your customers but also your team&#8217;s integrity and your company&#8217;s reputation.</p><p>Across these six chapters, you&#8217;ve learned to:</p><ol><li><p>Understand <em>why</em> PCI DSS exists and what it protects.</p></li><li><p>Identify <em>what</em> data is in scope and <em>how</em> to reduce exposure.</p></li><li><p>Apply the <em>12 requirements</em> in plain, practical language.</p></li><li><p>See <em>how each role</em> contributes to compliance daily.</p></li><li><p>Learn from <em>real-world breaches</em> where negligence had a cost.</p></li><li><p>Integrate all of this into <em>one coherent mindset</em>: design small, protect deeply, monitor continuously.</p></li></ol><p>If you take nothing else away, remember this truth:</p><blockquote><p><strong>PCI DSS is not a standard for computers, it&#8217;s a standard for people who build them responsibly.</strong></p></blockquote><h2>6.10 Mini-Final Quiz</h2><ol><li><p>What is the fastest way to reduce PCI scope in an application design?</p></li><li><p>Why must test environments follow the same rules as production?</p></li><li><p>Which three requirements would be violated by logging raw PANs?</p></li><li><p>What human behaviour caused most major PCI breaches discussed in Chapter 5?</p></li><li><p>What&#8217;s the difference between compliance and security in practice?</p></li><li><p>What one action can you personally take tomorrow to strengthen PCI compliance at work?</p></li></ol><h1>The Quiet Confidence</h1><p>True PCI mastery isn&#8217;t loud. It doesn&#8217;t rely on security slogans or compliance badges.<br>It&#8217;s quiet, the calm confidence that every line of code, every diagram, every decision was made with respect for the people whose data you hold.</p><p>You&#8217;ll never meet most of them. They&#8217;ll never know your name. But their trust is in your hands every time they swipe or click.</p><p>And that is what being PCI-aware truly means.</p>]]></content:encoded></item><item><title><![CDATA[The secret rulebook behind every tap-and-go payment (Part 4)]]></title><description><![CDATA[How everyday roles and famous breaches turn PCI DSS from theory into daily discipline]]></description><link>https://newsletter.aminollahi.com/p/pci-dss-role-based-awareness-breach-lessons</link><guid isPermaLink="false">https://newsletter.aminollahi.com/p/pci-dss-role-based-awareness-breach-lessons</guid><dc:creator><![CDATA[Ryan Aminollahi]]></dc:creator><pubDate>Sun, 07 Dec 2025 21:42:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9XY1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743c40d7-c31f-4735-9704-d150d91221db_1248x832.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9XY1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743c40d7-c31f-4735-9704-d150d91221db_1248x832.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9XY1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743c40d7-c31f-4735-9704-d150d91221db_1248x832.png 424w, https://substackcdn.com/image/fetch/$s_!9XY1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743c40d7-c31f-4735-9704-d150d91221db_1248x832.png 848w, https://substackcdn.com/image/fetch/$s_!9XY1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743c40d7-c31f-4735-9704-d150d91221db_1248x832.png 1272w, https://substackcdn.com/image/fetch/$s_!9XY1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743c40d7-c31f-4735-9704-d150d91221db_1248x832.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9XY1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743c40d7-c31f-4735-9704-d150d91221db_1248x832.png" width="1248" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/743c40d7-c31f-4735-9704-d150d91221db_1248x832.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1248,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:371287,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/180986774?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743c40d7-c31f-4735-9704-d150d91221db_1248x832.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9XY1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743c40d7-c31f-4735-9704-d150d91221db_1248x832.png 424w, https://substackcdn.com/image/fetch/$s_!9XY1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743c40d7-c31f-4735-9704-d150d91221db_1248x832.png 848w, https://substackcdn.com/image/fetch/$s_!9XY1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743c40d7-c31f-4735-9704-d150d91221db_1248x832.png 1272w, https://substackcdn.com/image/fetch/$s_!9XY1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743c40d7-c31f-4735-9704-d150d91221db_1248x832.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><br><a href="https://www.aminollahi.com/p/pci-dss-foundations-trust-secure-card-payments-1">Part 1</a></p><p><a href="https://www.aminollahi.com/p/pci-dss-data-scope-cardholder-environment">Part 2</a></p><p><a href="https://www.aminollahi.com/p/pci-dss-12-requirements-simplified-3">Part 3</a></p><h1>Chapter 4: ROLE-BASED AWARENESS</h1><p>When people first learn about PCI DSS, it can feel abstract, twelve requirements, dozens of controls, hundreds of acronyms.<br>But compliance doesn&#8217;t happen in the document library; it happens in the choices people make each day.<br>Every commit, every deployment, every configuration file either strengthens or weakens the protection of cardholder data.</p><p>This chapter takes you inside four everyday roles, <strong>Solution Architect</strong>, <strong>Software Developer</strong>, <strong>Tester</strong>, and <strong>Project Manager</strong> to show how each one keeps the organisation within the PCI guardrails.<br>You&#8217;ll see that PCI isn&#8217;t the job of &#8220;the security team.&#8221; It&#8217;s a shared language of safety.</p><h2>4.1 The Solution Architect, Guardian of Boundaries</h2><p>The architect&#8217;s super-power is design foresight. Long before a single line of code is written, you decide <strong>where card data will flow and where it won&#8217;t</strong>.<br>That boundary, more than any single control, determines the size of your PCI scope and the effort to keep it secure.</p><h3>Defining the CDE</h3><p>Start every payment-related project by drawing the <strong>data-flow diagram</strong>.<br>Ask, step by step:</p><ol><li><p>Where does card data enter?</p></li><li><p>Where is it transformed, stored, or transmitted?</p></li><li><p>Who or what touches it on the way out?</p></li></ol><p>Every arrow on that diagram is a potential exposure.<br>Architects who design without mapping data flow are like electricians wiring a house blindfolded.</p><p><strong>Example:</strong><br>An architect at an e-commerce firm noticed that a marketing plug-in was receiving full card numbers via analytics tags. By simply changing the integration point to fire <em>after</em> tokenisation, he removed an entire vendor from scope, saving the company tens of thousands in audit costs.</p><h3>Building Segmentation and Isolation</h3><p>Think of segmentation as the moat around your castle.<br>Your PCI zone should be a small, self-contained island: isolated networks, restricted subnets, minimal connectivity to non-PCI systems.</p><p>Use:</p><ul><li><p>Separate <strong>VPCs or network segments</strong> for the CDE.</p></li><li><p><strong>Firewall rules</strong> allowing only required traffic.</p></li><li><p><strong>Jump hosts or bastions</strong> for administrative access.</p></li></ul><p><strong>Golden rule:</strong> <em>If a server doesn&#8217;t need to talk to the CDE, it must not be able to.</em></p><h3>Designing for Tokenisation and Outsourcing</h3><p>Every architect faces a pivotal choice: <em>build or delegate?</em><br>If a third-party payment gateway can safely process card data, let them.<br>By externalising the sensitive part, you reduce your internal exposure and shift the compliance burden to a specialist whose entire business is PCI.</p><p>However, you must validate the vendor&#8217;s <strong>Attestation of Compliance (AoC)</strong> and ensure contracts specify PCI responsibilities.<br>Outsourcing does not mean abdication, it means partnership under written assurance.</p><h3>Architect&#8217;s Checklist</h3><ul><li><p>Card data flow mapped and documented</p></li><li><p>Network segmentation diagram approved</p></li><li><p>Encryption and tokenisation designed end-to-end</p></li><li><p>Vendor AoCs reviewed and stored</p></li><li><p>Non-functional requirements include PCI controls (IAM, monitoring, DR)</p></li></ul><h3>Reflection Pause</h3><p>If you drew your current system&#8217;s boundaries today, could you clearly mark which components are in PCI scope?<br>If you can&#8217;t, that&#8217;s your first priority tomorrow.</p><h2>4.2 The Software Developer, Defender of Data</h2><p>Developers are closest to the raw material of compliance: code.<br>A single logging statement can undo a million dollars of architecture.<br>Yet, developers are also best placed to stop problems early because they control how data is handled at the source.</p><h3>The Rule of Least Exposure</h3><p>The simplest way to stay compliant is <strong>never handle real card data</strong>.<br>Where possible, use <strong>client-side tokenisation</strong> or <strong>hosted payment pages</strong> so the browser sends the PAN directly to the payment provider, not to your API.<br>Your backend receives a harmless token instead of the real number.</p><p>If you must handle CHD, immediately encrypt or tokenise it before any persistence or logging occurs.</p><h3>Secure Coding Habits</h3><ol><li><p><strong>Validate inputs strictly.</strong> Never trust user data, sanitise, whitelist, and type-check.</p></li><li><p><strong>Use parameterised queries.</strong> Prevent SQL injection.</p></li><li><p><strong>Mask logs.</strong> Replace sensitive digits with <code>XXXX</code> or omit them entirely.</p></li><li><p><strong>Protect secrets.</strong> Store keys in managed services (AWS Secrets Manager, Azure Key Vault).</p></li><li><p><strong>Avoid real data in tests.</strong> Use gateway-supplied dummy cards.</p></li></ol><h3>Story: The Danger of Debug Logs</h3><p>During integration testing, a developer left <code>console.log(request.body)</code> active inside a Lambda. It worked fine until real payments began. Overnight, hundreds of PANs appeared in CloudWatch logs.<br>No breach occurred, but the company&#8217;s entire observability stack became in-scope for PCI. It took weeks to cleanse and re-architect.</p><p>The fix? Introduce a <strong>logging filter middleware</strong> that automatically masks any field named <code>card</code>, <code>pan</code>, or <code>cvv</code> before writing logs.<br>A ten-line utility now protects millions of transactions.</p><h3>Code Review and Automation</h3><p>Security reviews shouldn&#8217;t depend on human memory. Integrate <strong>Static Application Security Testing (SAST)</strong> and <strong>Dependency Scanning</strong> into CI/CD pipelines.<br>Flag issues early, before merge.<br>Treat a failed security scan the same way you treat a failed unit test.</p><h3>Developer&#8217;s Checklist</h3><ul><li><p>No CHD/SAD logged or stored</p></li><li><p>Encryption libraries validated and tested</p></li><li><p>Secrets managed through approved vaults</p></li><li><p>Automated scanning in pipeline</p></li><li><p>Dummy cards only in non-production</p></li></ul><h3>Reflection Pause</h3><p>Open your latest codebase. Search for the words &#8220;card&#8221;, &#8220;cvv&#8221;, &#8220;pan&#8221;, or &#8220;payment&#8221;.<br>Would any of those lines raise a red flag to an auditor?<br>If yes, fix them today, future-you will thank present-you.</p><h2>4.3 The Tester, Detective of Exposure</h2><p>Testers are the quality guardians.<br>While developers ensure data is handled correctly, testers confirm that <strong>nothing slips through the cracks</strong>.<br>They are the ones who can catch data leakage before it becomes a breach.</p><h3>Testing for Data Safety</h3><p>When testing payment flows:</p><ul><li><p><strong>Inspect responses and logs.</strong> Ensure no API returns or stores full PANs or CVVs.</p></li><li><p><strong>Check error handling.</strong> Failed transactions must never echo card details.</p></li><li><p><strong>Verify TLS.</strong> Capture network traffic and confirm encryption throughout the chain.</p></li><li><p><strong>Validate data masking.</strong> Reports, dashboards, and exports should display only partial PANs (e.g. <code>**** **** **** 1234</code>).</p></li></ul><h3>Negative Testing and Abuse Cases</h3><p>Attackers don&#8217;t follow the happy path, and neither should you.<br>Try:</p><ul><li><p>Submitting malformed payloads or very long numbers.</p></li><li><p>Attempting to upload files where text is expected.</p></li><li><p>Replaying valid tokens twice.</p></li></ul><p>Your goal isn&#8217;t to break the system maliciously, but to <strong>prove that defences hold even under stress</strong>.</p><h3>Story: The QA Hero</h3><p>At a Sydney start-up, a tester noticed that refund emails included full card numbers, a feature added &#8220;for convenience.&#8221;<br>She raised a ticket, and it turned out the template engine was using raw API responses.<br>Had those emails been sent to customers, thousands of PANs would have left the CDE.<br>Her curiosity saved the company from a breach and a fine.<br>That&#8217;s the value of critical testing.</p><h3>Automating PCI Validation</h3><p>Use scripts or static analysis tools that search for PAN-like patterns (<code>\b[0-9]{13,19}\b</code>) in logs and databases.<br>Run them nightly. If they ever match, alert immediately.</p><p>Many organisations integrate these scans into CI/CD or SIEM systems. Prevention through automation keeps humans from missing patterns.</p><h3>Tester&#8217;s Checklist</h3><ul><li><p>No card data in responses or logs</p></li><li><p>TLS validated end-to-end</p></li><li><p>Reports show masked data only</p></li><li><p>Abuse and replay scenarios tested</p></li><li><p>Automated pattern scans in place</p></li></ul><h3>Reflection Pause</h3><p>When was the last time your QA suite explicitly checked for data masking or encryption?<br>Testing functional correctness is good; testing <em>data hygiene</em> is better.</p><h2>4.4 The Project Manager, Coordinator of Compliance</h2><p>Project Managers may not configure firewalls or write code, but they decide <strong>whether PCI tasks are prioritised or postponed</strong>.<br>Their influence determines if compliance stays visible or quietly drifts into &#8220;later.&#8221;</p><h3>Making Compliance Part of Delivery</h3><p>In agile terms, PCI is not a &#8220;nice-to-have.&#8221; It&#8217;s a <strong>definition-of-done</strong>.<br>Every user story that touches payments should include acceptance criteria such as:</p><ul><li><p>&#8220;All card data tokenised before storage.&#8221;</p></li><li><p>&#8220;Logs verified for masking.&#8221;</p></li><li><p>&#8220;Security review approved.&#8221;</p></li></ul><p>By embedding compliance into the backlog, PMs prevent last-minute scrambles before audits.</p><h3>Tracking Evidence and Attestations</h3><p>PCI audits thrive on documentation.<br>PMs ensure:</p><ul><li><p>Vendor <strong>AoCs</strong> are collected and renewed annually.</p></li><li><p>Architecture diagrams and DFDs are version-controlled.</p></li><li><p>Training records are stored.</p></li><li><p>Jira or Confluence pages capture proof of each requirement.</p></li></ul><p>A well-maintained evidence trail turns audit season from panic to paperwork.</p><h3>Scheduling Security and Training</h3><p>Requirement 12 mandates regular awareness training.<br>PMs coordinate these sessions, ensuring new joiners complete induction within 30 days and all staff refresh annually.</p><p>They also schedule <strong>quarterly vulnerability scans</strong> and <strong>annual penetration tests</strong> in the roadmap so they&#8217;re never forgotten when delivery pressure mounts.</p><h3>Story: The Project That Forgot Security</h3><p>A mobile wallet project once treated PCI items as &#8220;phase 2.&#8221; The launch went ahead with tokenisation incomplete. Within weeks, a partner bank refused integration until the system passed PCI validation. The resulting delay cost more than the original sprint budget.</p><p>The PM later said, &#8220;We learned the hard way that compliance work <em>is</em> delivery work.&#8221;</p><h3>PM&#8217;s Checklist</h3><ul><li><p>PCI requirements built into backlog</p></li><li><p>AoCs collected and tracked</p></li><li><p>Security scans and pen-tests scheduled</p></li><li><p>Training compliance reported monthly</p></li><li><p>Risk register includes PCI items</p></li></ul><h3>Reflection Pause</h3><p>Open your project board.<br>Are PCI-related stories visible, with owners and due dates?<br>If not, they&#8217;ll quietly slip behind feature requests and reappear only when auditors call.</p><h2>4.5 The Shared Responsibility Mindset</h2><p>PCI DSS works only when everyone pulls together.<br>Architects limit exposure; developers code securely; testers verify integrity; PMs keep the machine disciplined.<br>It&#8217;s like an orchestra, different instruments, one melody: <strong>protect cardholder data</strong>.</p><h3>Cross-Role Collaboration</h3><ul><li><p><strong>Design reviews:</strong> Architects and developers discuss data flows with testers present, so everyone agrees on boundaries before a single deployment.</p></li><li><p><strong>Security stand-ups:</strong> Once a fortnight, each squad surfaces new risks or near-misses.</p></li><li><p><strong>Incident simulations:</strong> PMs run tabletop exercises, &#8220;What if logs leaked CHD?&#8221;, so roles are clear when reality strikes.</p></li></ul><p>These rituals turn PCI from a static document into a living culture.</p><h2>4.6 Mini-Review Quiz</h2><ol><li><p>What is the architect&#8217;s primary goal during PCI design?</p></li><li><p>Why should developers avoid handling real card data whenever possible?</p></li><li><p>Name two ways testers can confirm that card data isn&#8217;t leaking.</p></li><li><p>What evidence must project managers collect to support audits?</p></li><li><p>How does embedding compliance tasks in sprints improve outcomes?</p></li></ol><h2>4.7 Summary, The Everyday Champions</h2><p>PCI compliance is not a project milestone; it&#8217;s a <em>habit</em>.<br>Architects draw boundaries, developers guard data, testers catch leaks, and PMs keep the rhythm.</p><p>When each role treats security as part of craftsmanship, PCI DSS stops feeling like bureaucracy and starts feeling like pride in doing things properly.</p><blockquote><p>&#8220;A compliant system is simply a secure system that was built by people who cared.&#8221;</p></blockquote><h1>Chapter 5: Real-World Mistakes and Lessons</h1><p>When you read a PCI DSS control, &#8220;encrypt transmission&#8221; or &#8220;restrict access&#8221;, it can sound abstract, even bureaucratic. But behind every clause sits a painful story: a company that learned the hard way what happens when controls fail.</p><p>These are not cautionary tales from unknown startups; they&#8217;re from <strong>global enterprises with entire departments dedicated to security</strong>. The mistakes were small, the consequences enormous.</p><h2>5.1 The Home Depot Breach; The Chain-of-Trust Failure</h2><p>In 2014, <strong>Home Depot</strong>, one of the world&#8217;s largest home-improvement retailers, suffered a data breach that exposed <strong>56 million customer payment cards</strong>.</p><h3>What Happened</h3><p>Attackers didn&#8217;t storm the main network head-on.<br>They entered through the <strong>credentials of a third-party vendor</strong>, a small heating and air-conditioning contractor who had remote VPN access for billing. Once inside, the attackers moved laterally into Home Depot&#8217;s <strong>point-of-sale (POS)</strong> environment and installed malware that captured card data in memory as transactions were processed.</p><h3>PCI DSS Violations</h3><ul><li><p><strong>Requirement 7 &amp; 8:</strong> Access not restricted by business need-to-know; shared credentials between vendor systems.</p></li><li><p><strong>Requirement 11:</strong> Lack of intrusion detection and log correlation.</p></li><li><p><strong>Requirement 1:</strong> Weak network segmentation, once the attackers entered, they could move freely.</p></li></ul><h3>The Root Cause</h3><p>The weakest link wasn&#8217;t technology, it was <em>trust without verification</em>. The vendor connection bypassed strong access controls, and network segmentation between corporate and POS systems was incomplete.</p><h3>The Cost</h3><p>Home Depot paid over <strong>US $179 million in settlements and fines</strong>, not including brand damage and years of litigation.</p><h3>The Lesson</h3><p>For architects: <em>segmentation is sacred</em>. Vendors should connect through tightly scoped APIs or bastion gateways, never directly into sensitive networks.<br>For project managers: always collect and verify <strong>vendor AoCs</strong> and monitor their access continuously.<br>For everyone: your PCI scope includes your partners, whether you like it or not.</p><h2>5.2 Target; When Monitoring Exists but Nobody Looks</h2><p>In 2013, <strong>Target Corporation</strong> experienced one of the most publicised PCI-related breaches in history. Around <strong>40 million cards</strong> were compromised, plus 70 million customer records.</p><h3>What Happened</h3><p>Just like Home Depot, the attackers came in through a <strong>third-party vendor</strong>, in this case, an HVAC maintenance company. They used stolen credentials to access Target&#8217;s internal network and deploy malware on POS terminals.</p><p>The tragedy?<br>Target&#8217;s <strong>intrusion detection system (FireEye)</strong> actually raised alerts in real time. But those alerts were <strong>ignored</strong>. The SOC team was overloaded and under-trained.</p><h3>PCI DSS Violations</h3><ul><li><p><strong>Requirement 10:</strong> Logs and alerts must be actively reviewed.</p></li><li><p><strong>Requirement 12:</strong> Lack of trained personnel and effective incident-response process.</p></li><li><p><strong>Requirement 5:</strong> Failure to keep endpoint protection signatures updated.</p></li></ul><h3>The Cost</h3><p>More than <strong>US $290 million</strong> in settlements, legal fees, and remediation plus a CEO resignation and multi-year reputation hit.</p><h3>The Lesson</h3><p>Monitoring is meaningless without <strong>human vigilance</strong>.<br>PCI doesn&#8217;t just ask for logs; it asks for <strong>log review</strong>.</p><p>Architects and PMs must ensure that monitoring alerts flow to trained teams who have authority to act. Testers can help by simulating incidents and confirming alerts trigger correctly.</p><blockquote><p>&#8220;Detection without response is decoration.&#8221;</p></blockquote><h2>5.3 British Airways; The JavaScript Injection Disaster</h2><p>In 2018, <strong>British Airways</strong> was fined <strong>&#163;20 million (AUD &#8776; 40 million)</strong> after a cyber-attack redirected customers to a fraudulent payment page.</p><h3>What Happened</h3><p>Hackers injected malicious JavaScript into British Airways&#8217; website. When customers entered payment details, the script silently sent card data to an attacker-controlled domain.</p><p>The compromise lasted <strong>two months</strong> and affected about <strong>400,000 cardholders</strong>.</p><h3>PCI DSS Violations</h3><ul><li><p><strong>Requirement 6:</strong> Failure to maintain secure web applications and patch vulnerabilities.</p></li><li><p><strong>Requirement 11:</strong> Insufficient change-detection mechanisms on scripts.</p></li><li><p><strong>Requirement 10:</strong> Lack of logging around client-side integrity changes.</p></li></ul><h3>Root Cause</h3><p>The attackers exploited outdated third-party libraries and unmonitored front-end changes, a blind spot in most PCI programs that focus on back-end servers.</p><h3>The Lesson</h3><p>For developers: PCI applies to <strong>client-side code</strong> too.<br>If your JavaScript collects payment data, treat it like part of the CDE. Use <strong>sub-resource integrity (SRI)</strong> checks, <strong>content-security policies (CSPs)</strong>, and <strong>code signing</strong> to prevent tampering.</p><p>For architects: maintain an inventory of external scripts and libraries. Implement automated integrity checks in CI/CD.</p><blockquote><p>Even the front-end is a door; lock it.</p></blockquote><h2>5.4 Marriott International; When Data Lives Too Long</h2><p>In 2018, <strong>Marriott International</strong> revealed that attackers had accessed the <strong>guest reservation system of Starwood</strong>, a hotel chain it had acquired. The intrusion had persisted undetected for <strong>four years</strong>, exposing data from over <strong>383 million guests</strong>, including card numbers, passport details, and addresses.</p><h3>What Happened</h3><p>Attackers breached Starwood&#8217;s network in 2014, well before the merger. The compromised systems including databases containing encrypted card data, were migrated into Marriott&#8217;s infrastructure without thorough re-assessment. The attackers retained access post-migration.</p><h3>PCI DSS Violations</h3><ul><li><p><strong>Requirement 6 &amp; 11:</strong> Inadequate vulnerability testing and failure to re-validate security after major changes.</p></li><li><p><strong>Requirement 3:</strong> Long-term storage of cardholder data without re-encryption or key rotation.</p></li><li><p><strong>Requirement 10:</strong> Insufficient monitoring and anomaly detection.</p></li></ul><h3>The Cost</h3><p>Marriott was fined <strong>&#163;18.4 million</strong> by the UK Information Commissioner&#8217;s Office and spent hundreds of millions on remediation and customer support.</p><h3>The Lesson</h3><p>Architects: every acquisition or major system migration resets your PCI clock.<br>Always perform a <strong>fresh CDE scoping and validation exercise</strong>.<br>Never assume the inherited environment is compliant, compliance is not transferable.</p><p>Project Managers: treat mergers, cloud migrations, and platform rebuilds as PCI-impacting events requiring new risk assessments.</p><h2>5.5 Equifax; Patch Management and the Cost of Delay</h2><p>In 2017, <strong>Equifax</strong>, one of the largest credit-reporting agencies, suffered a breach that exposed personal and financial data of <strong>147 million people</strong> worldwide. Although not strictly a PCI merchant, the event demonstrates a perfect storm of PCI DSS violations.</p><h3>What Happened</h3><p>A known vulnerability in Apache Struts (CVE-2017-5638) had been publicly disclosed in March 2017. Equifax failed to patch it for months. Attackers exploited the flaw, accessed databases containing card and identity data, and exfiltrated it undetected.</p><h3>PCI DSS Relevance</h3><ul><li><p><strong>Requirement 6.2:</strong> Install critical patches within one month of release.</p></li><li><p><strong>Requirement 11:</strong> Regularly scan and test for new vulnerabilities.</p></li><li><p><strong>Requirement 10:</strong> Ensure logging is centralised and alerts are reviewed.</p></li></ul><h3>The Cost</h3><p>Equifax paid over <strong>US $1.4 billion</strong> in fines, compensation, and upgrades and permanently damaged its brand credibility.</p><h3>The Lesson</h3><p>For developers and PMs: treat vulnerability notifications like fire alarms, not calendar reminders.<br>For architects: build automatic patch pipelines; don&#8217;t rely on human tracking.<br>For testers: verify patch levels in environments as part of regression testing.</p><blockquote><p>A single missed update can undo every encryption key and firewall you&#8217;ve deployed.</p></blockquote><h2>5.6 NAB (National Australia Bank); The Cloud Misconfiguration Wake-Up Call</h2><p>In 2019, <strong>National Australia Bank (NAB)</strong> publicly disclosed that the personal details of about <strong>13,000 customers</strong> had been accidentally shared with a third-party data-validation service.</p><h3>What Happened</h3><p>During a routine system migration, customer information including names, addresses, and account numbers, was uploaded to a cloud server operated by an external provider without proper redaction or encryption.</p><p>Although the exposure was accidental and quickly contained, it prompted intense regulatory scrutiny because NAB is a <strong>card issuer and PCI DSS Level 1 entity</strong>.</p><h3>PCI DSS Implications</h3><ul><li><p><strong>Requirement 3:</strong> Data not adequately protected before transmission.</p></li><li><p><strong>Requirement 7:</strong> Data shared beyond business need.</p></li><li><p><strong>Requirement 12:</strong> Lack of defined data-handling process for external validation.</p></li></ul><h3>The Lesson</h3><p>Even in highly mature institutions, <strong>configuration drift</strong> and <strong>human error</strong> are constant risks.<br>For architects: implement <em>data-loss prevention (DLP)</em> tooling and enforce encryption at upload.<br>For PMs: every data exchange with a third-party vendor must pass a <strong>PCI data-handling checklist</strong> before execution.</p><blockquote><p>&#8220;It wasn&#8217;t a hack, it was a handshake done carelessly.&#8221;</p></blockquote><h2>5.7 Lessons Across the Board</h2><p>After studying these incidents, several recurring themes emerge.<br>Each one maps directly to PCI principles but, more importantly, to human behaviour.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6bue!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ef5f4fa-6dbd-4871-af23-1c3cfb9734fb_1526x1124.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6bue!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ef5f4fa-6dbd-4871-af23-1c3cfb9734fb_1526x1124.png 424w, https://substackcdn.com/image/fetch/$s_!6bue!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ef5f4fa-6dbd-4871-af23-1c3cfb9734fb_1526x1124.png 848w, https://substackcdn.com/image/fetch/$s_!6bue!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ef5f4fa-6dbd-4871-af23-1c3cfb9734fb_1526x1124.png 1272w, https://substackcdn.com/image/fetch/$s_!6bue!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ef5f4fa-6dbd-4871-af23-1c3cfb9734fb_1526x1124.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6bue!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ef5f4fa-6dbd-4871-af23-1c3cfb9734fb_1526x1124.png" width="1456" height="1072" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ef5f4fa-6dbd-4871-af23-1c3cfb9734fb_1526x1124.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1072,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:234507,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/180986774?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ef5f4fa-6dbd-4871-af23-1c3cfb9734fb_1526x1124.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6bue!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ef5f4fa-6dbd-4871-af23-1c3cfb9734fb_1526x1124.png 424w, https://substackcdn.com/image/fetch/$s_!6bue!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ef5f4fa-6dbd-4871-af23-1c3cfb9734fb_1526x1124.png 848w, https://substackcdn.com/image/fetch/$s_!6bue!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ef5f4fa-6dbd-4871-af23-1c3cfb9734fb_1526x1124.png 1272w, https://substackcdn.com/image/fetch/$s_!6bue!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ef5f4fa-6dbd-4871-af23-1c3cfb9734fb_1526x1124.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The moral is clear: <strong>non-compliance rarely comes from malice</strong>.<br>It comes from small oversights, an unpatched system, a forgotten script, a blind trust in a partner.</p><h2>5.8 Reflection Pause</h2><p>Take a quiet moment and consider your own environment.</p><ul><li><p>Do you know every third-party system that can reach your CDE?</p></li><li><p>Who reviews alerts when your monitoring tool screams in the middle of the night?</p></li><li><p>How long is payment data retained in your databases or backups?</p></li><li><p>Are there front-end scripts on your payment pages that no one &#8220;owns&#8221;?</p></li></ul><p>Write down three small actions you can take this week to reduce your organisation&#8217;s PCI risk.<br>They might feel trivial but so did those missed patches, unreviewed alerts, and forgotten test logs that triggered global headlines.</p><h2>5.9 Mini-Review Quiz</h2><ol><li><p>Which PCI requirements did the Home Depot breach violate, and how?</p></li><li><p>What was the fundamental failure in Target&#8217;s monitoring process?</p></li><li><p>Why does client-side JavaScript fall under PCI scope, as shown by the British Airways incident?</p></li><li><p>What compliance lesson can we learn from Marriott&#8217;s acquisition of Starwood?</p></li><li><p>How does the Equifax breach illustrate the importance of Requirement 6.2?</p></li><li><p>What practical steps can teams take to prevent accidental data exposure like NAB&#8217;s?</p></li></ol><h2>5.10 Summary; The Price of Complacency</h2><p>Every breach you&#8217;ve just read about could have been prevented by fulfilling one or two existing PCI controls.<br>That&#8217;s what makes these stories haunting.</p><p>They prove that <strong>compliance is not paperwork, it&#8217;s discipline</strong>.<br>It&#8217;s patching on time, reviewing logs, verifying vendors, and deleting what you no longer need.</p><p>PCI DSS isn&#8217;t a shield you buy once; it&#8217;s a reflex you practise daily.</p><blockquote><p>&#8220;Security fails when familiarity breeds comfort.<br>Compliance survives when curiosity never sleeps.&#8221;</p></blockquote>]]></content:encoded></item><item><title><![CDATA[The secret rulebook behind every tap-and-go payment (Part 3)]]></title><description><![CDATA[Turning the 12 PCI DSS requirements into everyday design, coding, and operating decisions.]]></description><link>https://newsletter.aminollahi.com/p/pci-dss-12-requirements-simplified-3</link><guid isPermaLink="false">https://newsletter.aminollahi.com/p/pci-dss-12-requirements-simplified-3</guid><dc:creator><![CDATA[Ryan Aminollahi]]></dc:creator><pubDate>Sun, 30 Nov 2025 20:58:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!jVrd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F575591ca-a706-47db-9c16-5528862761c1_1248x832.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jVrd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F575591ca-a706-47db-9c16-5528862761c1_1248x832.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jVrd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F575591ca-a706-47db-9c16-5528862761c1_1248x832.png 424w, https://substackcdn.com/image/fetch/$s_!jVrd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F575591ca-a706-47db-9c16-5528862761c1_1248x832.png 848w, https://substackcdn.com/image/fetch/$s_!jVrd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F575591ca-a706-47db-9c16-5528862761c1_1248x832.png 1272w, https://substackcdn.com/image/fetch/$s_!jVrd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F575591ca-a706-47db-9c16-5528862761c1_1248x832.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jVrd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F575591ca-a706-47db-9c16-5528862761c1_1248x832.png" width="1248" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/575591ca-a706-47db-9c16-5528862761c1_1248x832.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1248,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:371287,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/180286007?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F575591ca-a706-47db-9c16-5528862761c1_1248x832.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jVrd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F575591ca-a706-47db-9c16-5528862761c1_1248x832.png 424w, https://substackcdn.com/image/fetch/$s_!jVrd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F575591ca-a706-47db-9c16-5528862761c1_1248x832.png 848w, https://substackcdn.com/image/fetch/$s_!jVrd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F575591ca-a706-47db-9c16-5528862761c1_1248x832.png 1272w, https://substackcdn.com/image/fetch/$s_!jVrd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F575591ca-a706-47db-9c16-5528862761c1_1248x832.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><a href="https://aminollahi.substack.com/p/pci-dss-foundations-trust-secure-card-payments-1">Part 1</a></p><p><a href="https://aminollahi.substack.com/p/pci-dss-data-scope-cardholder-environment">Part 2</a></p><h1>Chapter 3: The 12 PCI DSS Requirements Simplified</h1><p>When most people hear &#8220;PCI DSS,&#8221; they picture a long list of rules.<br>And they&#8217;re right; there are many of them.<br>But behind the technical language lies a simple idea:</p><blockquote><p><em>&#8220;Protect payment data through strong design, disciplined operation, and continuous vigilance.&#8221;</em></p></blockquote><p>To make that possible, PCI DSS breaks down into <strong>12 core requirements</strong> organised into <strong>six logical families</strong>.<br>Think of these as six walls of a fortress protecting cardholder data.<br>Each wall is made up of smaller bricks, the individual requirements, that together create layered defence.</p><p>In this chapter, you&#8217;ll walk through each family in plain English.<br>You&#8217;ll learn not just what the control says, but why it exists, and how it plays out in daily architecture and coding decisions.</p><h2>3.1 The Six Families at a Glance</h2><ol><li><p><strong>Build and Maintain a Secure Network and Systems</strong><br> Set the foundation. Prevent intruders from getting in.</p></li><li><p><strong>Protect Cardholder Data</strong><br> Shield the information itself, whether stored or transmitted.</p></li><li><p><strong>Maintain a Vulnerability Management Program</strong><br> Keep your systems patched, hardened, and secure from known flaws.</p></li><li><p><strong>Implement Strong Access Control Measures</strong><br> Restrict who can touch sensitive systems.</p></li><li><p><strong>Regularly Monitor and Test Networks</strong><br> Detect what&#8217;s happening in real time.</p></li><li><p><strong>Maintain an Information Security Policy</strong><br> Keep people accountable and trained.</p></li></ol><p>Let&#8217;s explore them one by one.</p><h2>Family 1: Build and Maintain a Secure Network and Systems</h2><p>Imagine your PCI environment as a castle.<br>Before worrying about gold inside the vault, you must build the moat and the walls.</p><p>That&#8217;s what this first family is about; the perimeter.</p><h3>Requirement 1: Install and Maintain a Firewall Configuration</h3><p>Firewalls are your gates.<br>They decide who can talk to what, across which ports, and for what purpose.<br>In a cloud world, this might mean VPC security groups, routing tables, and API gateway access controls.</p><p><strong>Common failure:</strong> &#8220;Allow all&#8221; inbound rules for convenience.<br>If your security group looks like <code>0.0.0.0/0</code>, you&#8217;ve left your castle doors wide open.</p><p><strong>Architect tip:</strong></p><ul><li><p>Document every inbound/outbound rule.</p></li><li><p>Justify it against business need.</p></li><li><p>Automate it through IaC (Terraform, CloudFormation) so changes are traceable.</p></li></ul><p><strong>Story:</strong><br>At one Australian fintech, a misconfigured AWS security group allowed inbound SSH from anywhere. A researcher discovered it, and while no data was taken, the company failed its PCI scan because it couldn&#8217;t prove segmentation. The lesson: even <em>potential</em> exposure is non-compliance.</p><h3>Requirement 2: Do Not Use Vendor Defaults</h3><p>Many breaches start with laziness, not genius.<br>Default usernames and passwords; <code>admin/admin</code>, <code>password123</code>, are still shockingly common.</p><p>When a new system is deployed, PCI DSS insists that <strong>every default credential and configuration</strong> be changed before going live.</p><p><strong>Developer tip:</strong> If your code depends on default admin credentials to connect to a service, fix it now. That&#8217;s a red flag.</p><p><strong>Architect tip:</strong> Bake this into CI/CD. Use configuration scanners (like AWS Config Rules) to detect default credentials automatically.</p><p><strong>Mini Reflection:</strong><br>Think about the last environment you deployed. Were any services launched with default accounts, public endpoints, or &#8220;temporary&#8221; passwords that were never changed?<br>Write down one improvement you could make this week.</p><h2>Family 2: Protect Cardholder Data</h2><p>Now that your perimeter is guarded, it&#8217;s time to protect what&#8217;s inside the vault.</p><h3>Requirement 3: Protect Stored Cardholder Data</h3><p>This requirement is the backbone of PCI DSS. It says:</p><blockquote><p>&#8220;If you store card data, you must render it unreadable.&#8221;</p></blockquote><p>That means encryption at rest, using strong algorithms like AES-256 or, better yet, not storing the data at all.</p><p>When storage is unavoidable, apply <strong>data minimisation</strong>: store only what&#8217;s strictly necessary. Mask PANs, truncate them (e.g., show only last 4 digits), and protect keys as if they were gold.</p><p><strong>Real-world example:</strong><br>A retailer kept full PANs in a database for &#8220;customer convenience.&#8221; When their app was breached, attackers stole millions of numbers. If the data had been tokenised or truncated, the impact would&#8217;ve been negligible.</p><p><strong>Architect lesson:</strong> If you can design the system so you never touch real card data, you&#8217;ve won half the battle. Outsource vaulting to a certified provider.</p><h3>Requirement 4: Encrypt Transmission of Cardholder Data Across Open, Public Networks</h3><p>Data isn&#8217;t just vulnerable at rest, it&#8217;s also at risk in transit.<br>Whenever CHD travels over the internet, it must be encrypted using <strong>TLS 1.2 or higher</strong>.</p><p>Common traps:</p><ul><li><p>Using HTTP instead of HTTPS in internal APIs.</p></li><li><p>Hardcoding endpoints without enforcing HTTPS.</p></li><li><p>Sending payment payloads through insecure queues or logs.</p></li></ul><p><strong>Developer tip:</strong> Always validate certificates and enforce HTTPS redirects in code.<br><strong>Tester tip:</strong> Run scans (e.g., OWASP ZAP, Burp) to ensure no endpoints downgrade connections.</p><p><strong>Architect analogy:</strong> Think of encryption in transit as putting your data in a secure truck before crossing the border. Never send it in an open ute.</p><h3>Reflection Pause</h3><p>If your organisation uses multiple APIs or microservices, do you know which ones handle payment tokens or PANs?<br>Are all those communications encrypted with TLS, including internal traffic?<br>Many breaches come from <em>inside</em> networks where teams assume &#8220;internal = safe.&#8221;</p><h2>Family 3: Maintain a Vulnerability Management Program</h2><p>Having secure systems today doesn&#8217;t guarantee they&#8217;ll be secure tomorrow.<br>New vulnerabilities appear daily.<br>This family of requirements keeps your environment resilient through proactive maintenance.</p><h3>Requirement 5: Protect All Systems Against Malware and Regularly Update Anti-Virus Software</h3><p>Malware is like termites, quiet, invisible, devastating if ignored.<br>Requirement 5 ensures that every server, endpoint, or container running PCI workloads is monitored for malicious code.</p><p>In modern cloud systems, this means:</p><ul><li><p>Endpoint Detection &amp; Response (EDR) agents</p></li><li><p>Automated patching</p></li><li><p>Continuous vulnerability scanning</p></li></ul><p><strong>Developer connection:</strong> Even if your app runs in a Docker container, you&#8217;re still responsible for the base image. Keep it patched.</p><h3>Requirement 6: Develop and Maintain Secure Systems and Applications</h3><p>This is the <strong>developer&#8217;s rulebook</strong>.<br>PCI DSS doesn&#8217;t just ask for security tools, it expects secure behaviour during coding.</p><p>Key practices:</p><ul><li><p>Follow <strong>secure coding standards</strong> (like OWASP Top 10).</p></li><li><p>Run <strong>SAST/DAST scans</strong> before release.</p></li><li><p>Perform code reviews that focus on security.</p></li><li><p>Apply security patches quickly. PCI requires that critical patches be applied within 30 days.</p></li></ul><p><strong>Story:</strong><br>A developer copied sample code from Stack Overflow that used unsanitised SQL input. Six months later, an attacker exploited it through an API endpoint.<br>The vulnerability existed not because the team ignored PCI, but because they thought it only applied to networks, not code.<br>Requirement 6 closes that gap.</p><p><strong>Architect tip:</strong> Integrate security checks into CI/CD pipelines. Compliance shouldn&#8217;t rely on memory; it should rely on automation.</p><p><strong>Reflection:</strong><br>When was the last time your team reviewed code with a security lens? Do you have automated scanning tools integrated into your pipeline?</p><h2>Family 4: Implement Strong Access Control Measures</h2><p>Data breaches don&#8217;t always come from outsiders.<br>Often, they come from employees with too much access.<br>PCI DSS enforces the principle of <strong>least privilege</strong>, only give access to what&#8217;s necessary for a role.</p><h3>Requirement 7: Restrict Access to Cardholder Data by Business Need-to-Know</h3><p>Not everyone needs to see card data.<br>An engineer might need to test APIs, but not see full PANs.<br>A support rep might view partial data, but not the CVV.</p><p><strong>Example:</strong><br>An Australian bank adopted role-based access controls (RBAC). Developers could see masked card details; only the payment service could decrypt full numbers. Even if a database admin went rogue, they couldn&#8217;t extract unmasked PANs.</p><h3>Requirement 8: Identify and Authenticate Access to System Components</h3><p>Every user must have a unique ID.<br>No shared &#8220;admin&#8221; or &#8220;root&#8221; logins.<br>If two developers use the same account, auditors can&#8217;t tell who did what.</p><p>Multi-Factor Authentication (MFA) is also required for any administrative or remote access to the CDE.<br>That includes VPNs, AWS consoles, CI/CD pipelines, anything touching PCI systems.</p><p><strong>Tester tip:</strong> During reviews, check that password complexity, rotation, and lockout rules align with PCI minimums.</p><h3>Requirement 9: Restrict Physical Access to Cardholder Data</h3><p>In a world of cloud, it&#8217;s easy to forget the physical.<br>But PCI still cares about who can walk into your office, your data centre, or even your backup facility.</p><p>Even if you&#8217;re fully cloud-hosted, you rely on data centres (AWS, Azure, GCP) to secure physical access on your behalf which is why their <strong>Attestations of Compliance (AoC)</strong> are part of your vendor documentation.</p><p>For in-house systems, physical controls might include:</p><ul><li><p>Access badges</p></li><li><p>CCTV</p></li><li><p>Visitor logs</p></li><li><p>Locked server racks</p></li></ul><p><strong>Reflection Pause</strong></p><p>In your environment, who has root-level access to production?<br>How many people <em>actually</em> need it?<br>Access control isn&#8217;t about mistrust; it&#8217;s about accountability.<br>Can you trace every admin action to an individual person?</p><h2>Family 5: Regularly Monitor and Test Networks</h2><p>Security is not a one-time act; it&#8217;s a living, breathing process.<br>This family ensures you detect problems before attackers do.</p><h3>Requirement 10: Track and Monitor All Access to Network Resources and Cardholder Data</h3><p>Logs are memory. Without them, you have no story when something goes wrong.</p><p>PCI DSS requires:</p><ul><li><p>Detailed logs for every access, transaction, and administrative action</p></li><li><p>Centralised storage in a secure log management system</p></li><li><p>Regular review of logs for suspicious activity</p></li></ul><p><strong>Architect example:</strong> Use CloudTrail, CloudWatch, or Datadog for centralised visibility. Retain logs for at least one year, with three months immediately available.</p><p><strong>Developer tip:</strong> Never disable audit logging for &#8220;performance reasons&#8221; without documented risk acceptance.</p><p><strong>Tester tip:</strong> Verify that logs mask or truncate PANs; logging full card numbers violates Requirement 3 as well as 10.</p><h3>Requirement 11: Regularly Test Security Systems and Processes</h3><p>No matter how confident you are, PCI DSS requires validation.<br>You must conduct:</p><ul><li><p><strong>Vulnerability scans</strong> at least quarterly.</p></li><li><p><strong>Penetration tests</strong> annually or after major changes.</p></li><li><p><strong>Intrusion detection/prevention systems (IDS/IPS)</strong> to monitor networks.</p></li></ul><p>Testing isn&#8217;t just for auditors; it&#8217;s your early warning system.<br>Every environment changes over time: new APIs, new vendors, new risks.</p><p><strong>Real-world lesson:</strong><br>A company passed its PCI audit in January, but by June, an intern had opened a public S3 bucket for &#8220;temporary testing.&#8221; The breach wasn&#8217;t discovered until October; too late. Compliance snapshots fade fast; continuous validation keeps you safe.</p><p><strong>Reflection:</strong><br>When was the last time your organisation ran a vulnerability scan?<br>Who reviews the results, and how quickly are findings fixed?</p><h2>Family 6: Maintain an Information Security Policy</h2><p>All the technology in the world is useless without disciplined people.<br>This final family focuses on culture, governance, and accountability.</p><h3>Requirement 12: Maintain a Policy That Addresses Information Security for All Personnel</h3><p>PCI DSS insists that organisations formalise their commitment to security through clear policies, roles, and training.</p><p>Everyone, from developers to executives, must understand:</p><ul><li><p>What their responsibilities are.</p></li><li><p>What to do in case of an incident.</p></li><li><p>How to handle data securely.</p></li></ul><p>Policies alone don&#8217;t protect data; behaviour does. But policies make expectations explicit and enforceable.</p><p><strong>Project Manager tip:</strong> Schedule annual PCI awareness refreshers. Keep sign-in sheets or LMS records as evidence during audits.</p><p><strong>Architect tip:</strong> Embed compliance checkpoints into design reviews. A &#8220;security champion&#8221; in each squad helps keep awareness alive.</p><h3>Story: The Forgotten Contractor</h3><p>A large organisation once onboarded a temporary developer to fix bugs in a payment API. Nobody told him about PCI restrictions.<br>He added a few debug statements, deployed to test, and forgot them.<br>Those logs captured PANs for weeks before anyone noticed.</p><p>When auditors traced the issue, they didn&#8217;t blame the contractor, they blamed leadership for lacking a training policy.<br>Requirement 12 exists to prevent that kind of gap.<br>Security training isn&#8217;t optional; it&#8217;s the glue holding every other control together.</p><h2>3.12 Tying It All Together</h2><p>You can think of the 12 requirements as a chain.<br>Break one link, and the whole chain fails.</p><p>A firewall (Requirement 1) means nothing if developers use default credentials (Requirement 2).<br>Encryption (Requirement 3) is pointless if anyone can read logs (Requirement 10).<br>Access control (Requirement 7) collapses if there&#8217;s no monitoring (Requirement 11).</p><p>Compliance works only when the <em>system as a whole</em> behaves securely, not just each team in isolation.</p><h3>Reflection Pause</h3><p>Take a moment to rate your current team&#8217;s maturity for each family:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Kxl7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b85ab6-94b4-4e12-928a-7f13cf5deb54_1536x812.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Kxl7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b85ab6-94b4-4e12-928a-7f13cf5deb54_1536x812.png 424w, https://substackcdn.com/image/fetch/$s_!Kxl7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b85ab6-94b4-4e12-928a-7f13cf5deb54_1536x812.png 848w, https://substackcdn.com/image/fetch/$s_!Kxl7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b85ab6-94b4-4e12-928a-7f13cf5deb54_1536x812.png 1272w, https://substackcdn.com/image/fetch/$s_!Kxl7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b85ab6-94b4-4e12-928a-7f13cf5deb54_1536x812.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Kxl7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b85ab6-94b4-4e12-928a-7f13cf5deb54_1536x812.png" width="1456" height="770" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/93b85ab6-94b4-4e12-928a-7f13cf5deb54_1536x812.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:770,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:146894,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/180286007?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b85ab6-94b4-4e12-928a-7f13cf5deb54_1536x812.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Kxl7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b85ab6-94b4-4e12-928a-7f13cf5deb54_1536x812.png 424w, https://substackcdn.com/image/fetch/$s_!Kxl7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b85ab6-94b4-4e12-928a-7f13cf5deb54_1536x812.png 848w, https://substackcdn.com/image/fetch/$s_!Kxl7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b85ab6-94b4-4e12-928a-7f13cf5deb54_1536x812.png 1272w, https://substackcdn.com/image/fetch/$s_!Kxl7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b85ab6-94b4-4e12-928a-7f13cf5deb54_1536x812.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Even one low-scoring area is a risk worth discussing at your next planning session.</p><h3>Mini-Review Quiz</h3><ol><li><p>What are the six control families in PCI DSS?</p></li><li><p>Give two examples of how architects can meet Requirement 1.</p></li><li><p>Why does PCI forbid shared accounts?</p></li><li><p>What&#8217;s the purpose of Requirement 6 for developers?</p></li><li><p>Which requirement ensures continuous monitoring and logging?</p></li><li><p>Why does PCI emphasise training and awareness in Requirement 12?</p></li></ol><h3>3.13 Summary: The Human Firewall</h3><p>Technology enforces rules, but people enforce discipline.<br>PCI DSS isn&#8217;t just a checklist; it&#8217;s a way of thinking.</p><p>When architects design with segmentation, developers code with security in mind, testers validate data handling, and PMs track compliance tasks, PCI becomes a natural part of delivery.</p><blockquote><p>&#8220;The most secure system isn&#8217;t the one with the strongest firewall, it&#8217;s the one where every person understands why the firewall exists.&#8221;</p></blockquote>]]></content:encoded></item><item><title><![CDATA[The secret rulebook behind every tap-and-go payment (Part 2)]]></title><description><![CDATA[Why &#8220;scope&#8221; can make or break your PCI DSS compliance]]></description><link>https://newsletter.aminollahi.com/p/pci-dss-data-scope-cardholder-environment</link><guid isPermaLink="false">https://newsletter.aminollahi.com/p/pci-dss-data-scope-cardholder-environment</guid><dc:creator><![CDATA[Ryan Aminollahi]]></dc:creator><pubDate>Sun, 23 Nov 2025 20:07:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ZTqz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b225d2-2ec3-4d78-8d47-ea7e8b5680b2_1000x609.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZTqz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b225d2-2ec3-4d78-8d47-ea7e8b5680b2_1000x609.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZTqz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b225d2-2ec3-4d78-8d47-ea7e8b5680b2_1000x609.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZTqz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b225d2-2ec3-4d78-8d47-ea7e8b5680b2_1000x609.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZTqz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b225d2-2ec3-4d78-8d47-ea7e8b5680b2_1000x609.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZTqz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b225d2-2ec3-4d78-8d47-ea7e8b5680b2_1000x609.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZTqz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b225d2-2ec3-4d78-8d47-ea7e8b5680b2_1000x609.jpeg" width="1000" height="609" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/76b225d2-2ec3-4d78-8d47-ea7e8b5680b2_1000x609.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:609,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:201603,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/179290939?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b225d2-2ec3-4d78-8d47-ea7e8b5680b2_1000x609.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZTqz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b225d2-2ec3-4d78-8d47-ea7e8b5680b2_1000x609.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZTqz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b225d2-2ec3-4d78-8d47-ea7e8b5680b2_1000x609.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZTqz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b225d2-2ec3-4d78-8d47-ea7e8b5680b2_1000x609.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZTqz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b225d2-2ec3-4d78-8d47-ea7e8b5680b2_1000x609.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><a href="https://aminollahi.substack.com/p/pci-dss-foundations-trust-secure-card-payments-1">Part 1</a></p><h1>Chapter 2: Understanding Data and Scope</h1><p>When people talk about PCI DSS, they often jump straight to firewalls and encryption keys.<br>But before you can protect anything, you need to know <em>what</em> you&#8217;re protecting and <em>where</em> it lives.</p><p>This is the most overlooked part of compliance: <strong>defining scope</strong>.<br>Scope decides how big or small your PCI world becomes, how much you must secure, and how painful your next audit will be.</p><h3>2.1 The Two Kinds of Payment Data</h3><p>Let&#8217;s start by unpacking the heart of PCI DSS, the data itself.</p><p>When you buy a coffee and tap your card, two categories of information move through the system.</p><ol><li><p><strong>Cardholder Data (CHD)</strong>, the basics printed on the card.</p><ul><li><p><strong>Primary Account Number (PAN)</strong></p></li><li><p><strong>Cardholder Name</strong></p></li><li><p><strong>Expiry Date</strong></p></li><li><p><strong>Service Code</strong> (a tiny number inside the magnetic stripe telling machines what can be done with the card)</p></li></ul></li><li><p><strong>Sensitive Authentication Data (SAD)</strong>, the secret ingredients that make transactions work.</p><ul><li><p>The <strong>CVV or CVC</strong> (the three- or four-digit code on the card)</p></li><li><p><strong>PINs</strong> or <strong>PIN blocks</strong></p></li><li><p><strong>Full magnetic-stripe or chip data</strong></p></li></ul></li></ol><p>The distinction is vital.<br><strong>Cardholder Data</strong> may be stored, provided it&#8217;s protected properly encrypted, truncated, or tokenised.<br><strong>Sensitive Authentication Data</strong>, however, is untouchable after authorisation. PCI DSS forbids keeping it, even if encrypted.</p><p>Think of CHD as <em>radioactive material in a sealed drum</em>; you can store it if your safety gear is perfect.<br>SAD is <em>plutonium dust</em>, you don&#8217;t store it at all.</p><h3>2.2 Why These Definitions Matter</h3><p>During audits, assessors don&#8217;t care about your intentions; they care about your evidence.<br>If they find a database table with &#8220;cvv&#8221; in the column name, you&#8217;re immediately in violation, even if you thought it was fake data.</p><p>Teams sometimes say, &#8220;But it&#8217;s just for testing!&#8221;<br>PCI DSS doesn&#8217;t recognise that excuse. The rule is simple: if a dataset looks like real card data, you must prove it isn&#8217;t or treat it as real.</p><p>That&#8217;s why clear data classification and sanitisation are so important.</p><h3>2.3 The Cardholder Data Environment (CDE)</h3><p>The <strong>CDE</strong> is the beating heart of PCI compliance.<br>It&#8217;s defined as <em>the people, processes, and technologies that store, process, or transmit cardholder data or sensitive authentication data</em>.</p><p>Imagine drawing a bubble around every system that ever handles card data. That bubble and everything it touches is your <strong>scope</strong>.</p><p>Inside the bubble:</p><ul><li><p>Application servers that receive card numbers</p></li><li><p>Databases that store tokens or partial PANs</p></li><li><p>Network segments routing those transactions</p></li><li><p>Logging or monitoring systems that capture the same traffic</p></li></ul><p>Outside the bubble might be your marketing site or HR system but only if you&#8217;ve <strong>designed clear separation</strong>.</p><p>Once data crosses into a component, that component inherits all PCI requirements.<br>Scope spreads like liquid: a single leak can turn an entire environment into the CDE.</p><h3>2.4 How Scope Expands (and How to Shrink It)</h3><p>Scope expansion is sneaky.<br>Maybe a developer adds debug logging that captures card numbers.<br>Maybe a tester copies production data into a staging environment.<br>Maybe your analytics pipeline receives transaction payloads for &#8220;customer behaviour tracking.&#8221;</p><p>Each of these actions quietly pulls new systems into PCI scope.</p><p>To shrink scope again, you need containment strategies:</p><ol><li><p><strong>Tokenisation</strong>: replace the card number with a random, non-sensitive value (a token).<br>The payment provider keeps the real PAN in its vault; you store only the token.</p></li><li><p><strong>Encryption</strong>: protect data both &#8220;at rest&#8221; (in databases, backups, and storage) and &#8220;in transit&#8221; (across APIs and networks).<br>Even if someone intercepts it, they can&#8217;t read it without keys.</p></li><li><p><strong>Network Segmentation</strong>: isolate PCI systems from everything else using firewalls, subnets, or separate VPCs.<br>The smaller the island, the easier to defend.</p></li><li><p><strong>Outsourcing to PCI-certified providers</strong>: offload payment processing to gateways like Stripe, Adyen, or Braintree.<br>You never see the card data; they carry the compliance load.</p></li></ol><p>In mature organisations, architecture revolves around a simple goal: <em>keep card data away from internal systems altogether.</em></p><h3>2.5 The Power of Tokenisation. A Short Story</h3><p>Years ago, a small Australian fintech processed its own payments. Their engineers built a sleek checkout API that accepted full card details.<br>It worked beautifully until a penetration test revealed that an old log file still contained real card numbers. Overnight, their PCI scope ballooned: every system that could access that log was now part of the CDE.</p><p>They decided to switch to tokenisation.<br>The next month, card details went straight from the customer&#8217;s browser to their payment gateway; the internal API only saw a harmless token like <code>tok_f92d8e...</code>.</p><p>The difference was night and day. Their audit dropped from hundreds of controls to a fraction.<br>That&#8217;s the magic of <strong>scope reduction by design</strong>.</p><h3>2.6 Mapping the Data Flow</h3><p>A PCI project always starts with a diagram, not of code, but of <strong>data</strong>.<br>A <strong>Data Flow Diagram (DFD)</strong> traces where card data enters, where it travels, and where it exits.</p><p>Each arrow on that map raises questions:</p><ul><li><p>Does this transmission contain CHD or SAD?</p></li><li><p>Is it encrypted with TLS 1.2 or higher?</p></li><li><p>Who has access to the system at each end?</p></li><li><p>How long is the data retained?</p></li></ul><p>Every time the answer is &#8220;I&#8217;m not sure,&#8221; your risk grows.<br>Every time you can say &#8220;encrypted, limited, logged, documented,&#8221; your risk shrinks.</p><p>For architects, DFDs become living documents; for developers, they clarify exactly which microservices must never see real card numbers; for testers, they guide what to probe; for project managers, they define scope boundaries for scheduling and reporting.</p><h3>2.7 The Concept of Containment</h3><p>Imagine a hospital handling infectious material.<br>Not every room needs full protective gear, only those handling samples directly.<br>The key is <em>containment</em>: knowing which areas are &#8220;clean&#8221; and which are &#8220;hot.&#8221;</p><p>PCI DSS works the same way.<br>Your payment processor&#8217;s vault is the &#8220;hot zone.&#8221;<br>Your reporting dashboard should stay &#8220;clean.&#8221;</p><p>Firewalls, access controls, and tokenisation act like airlocks, keeping contamination from spreading.</p><p>When architects forget this principle, compliance costs explode.<br>Suddenly, your whole AWS account becomes the CDE, and every Lambda, ECS service, and RDS instance must meet PCI controls.</p><p>Containment, therefore, is the architect&#8217;s super-power: <strong>design small, sealed PCI zones</strong>.</p><h3>2.8 The Illusion of &#8220;Safe Logs&#8221;</h3><p>One of the most common mistakes in software projects is assuming logs are harmless.<br>Developers log everything for visibility, request bodies, headers, database queries.<br>Then, when a card transaction passes through, those same logs quietly store full PANs and CVVs.</p><p>Because monitoring tools often aggregate logs from multiple environments, that single mistake spreads CHD across your whole platform.</p><p>PCI auditors love logs; they reveal everything you thought you&#8217;d hidden.<br>Before a system goes live, always ask: <em>&#8220;If I opened my logs right now, could I find a card number?&#8221;</em><br>If the answer is yes, you&#8217;re already out of compliance.</p><h3>2.9 Test Environments and Dummy Data</h3><p>Another common misconception: <em>&#8220;We only use test cards, so PCI doesn&#8217;t apply.&#8221;</em></p><p>In reality, PCI DSS doesn&#8217;t differentiate between &#8220;test&#8221; and &#8220;production.&#8221;<br>If your testing environment could <em>accept</em> real CHD, it must follow the same rules.</p><p>The correct approach is to use:</p><ul><li><p><strong>Synthetic tokens</strong> or <strong>dummy card numbers</strong> provided by your payment gateway.</p></li><li><p><strong>Configuration flags</strong> that block any live card data from entering non-production systems.</p></li><li><p><strong>Automated scans</strong> that detect 16-digit PAN-like patterns in logs or datasets.</p></li></ul><p>Even fake numbers can look real to an auditor, so always mark them clearly: <code>4111 1111 1111 1111 (TEST CARD ONLY)</code>.</p><h3>2.10 People and Process Are Part of Scope</h3><p>PCI DSS doesn&#8217;t stop at servers.<br>Your <strong>people</strong> and <strong>processes</strong> are part of the CDE too.</p><p>An engineer with production access can accidentally extract card data.<br>A tester with admin rights on logging platforms might download sensitive logs.<br>A project manager might store screenshots of transactions in a shared folder.</p><p>Scope is not just digital; it&#8217;s human.<br>Training, access reviews, and policies matter because humans are often the weakest link.</p><h3>2.11 Reflection Pause</h3><p>Take a moment to map the flow of card data in your current project:</p><ol><li><p>Where does the customer first enter their card information?</p></li><li><p>Which systems see the raw PAN?</p></li><li><p>Is that data encrypted immediately?</p></li><li><p>What&#8217;s stored afterwards, the card itself, a token, or both?</p></li><li><p>Who has access to those systems?</p></li></ol><p>Sketch it out.<br>Even a quick hand-drawn diagram can reveal surprising exposure points.<br>If your payment journey crosses multiple teams or vendors, remember: <em>the boundary of your scope is the weakest link between you and them.</em></p><h3>2.12 Mini-Review Quiz</h3><ol><li><p>What are the four components of Cardholder Data?</p></li><li><p>Which types of Sensitive Authentication Data are never allowed to be stored?</p></li><li><p>Define the Cardholder Data Environment in your own words.</p></li><li><p>List three methods to reduce PCI scope.</p></li><li><p>Why can logs unexpectedly pull a system into PCI scope?</p></li><li><p>How does tokenisation help architects and developers simplify compliance?</p></li></ol><h3>2.13 Summary</h3><p>Scope is everything.<br>PCI DSS compliance success or failure depends less on how strong your encryption is, and more on <strong>where</strong> card data exists.<br>Once you understand the difference between CHD and SAD, and you can clearly draw your CDE boundary, you&#8217;ve already achieved half of compliance.</p><p>The mantra for every team is simple:</p><blockquote><p>&#8220;Don&#8217;t collect what you can&#8217;t protect.&#8221; Design small, secure PCI zones.<br>Keep radioactive data sealed. And treat every log, test dataset, and network connection as a potential leak until proven safe.</p></blockquote>]]></content:encoded></item><item><title><![CDATA[The secret rulebook behind every tap-and-go payment (Part 1)]]></title><description><![CDATA[Inside PCI DSS, the quiet standard stopping your card data from leaking every time you pay online or in-store]]></description><link>https://newsletter.aminollahi.com/p/pci-dss-foundations-trust-secure-card-payments-1</link><guid isPermaLink="false">https://newsletter.aminollahi.com/p/pci-dss-foundations-trust-secure-card-payments-1</guid><dc:creator><![CDATA[Ryan Aminollahi]]></dc:creator><pubDate>Sun, 16 Nov 2025 20:59:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Aykw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27325d58-ab45-4eab-a7d3-9eb5ae8db40c_1248x832.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Aykw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27325d58-ab45-4eab-a7d3-9eb5ae8db40c_1248x832.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Aykw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27325d58-ab45-4eab-a7d3-9eb5ae8db40c_1248x832.png 424w, https://substackcdn.com/image/fetch/$s_!Aykw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27325d58-ab45-4eab-a7d3-9eb5ae8db40c_1248x832.png 848w, https://substackcdn.com/image/fetch/$s_!Aykw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27325d58-ab45-4eab-a7d3-9eb5ae8db40c_1248x832.png 1272w, https://substackcdn.com/image/fetch/$s_!Aykw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27325d58-ab45-4eab-a7d3-9eb5ae8db40c_1248x832.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Aykw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27325d58-ab45-4eab-a7d3-9eb5ae8db40c_1248x832.png" width="1248" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/27325d58-ab45-4eab-a7d3-9eb5ae8db40c_1248x832.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1248,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:371287,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/179081354?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27325d58-ab45-4eab-a7d3-9eb5ae8db40c_1248x832.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Aykw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27325d58-ab45-4eab-a7d3-9eb5ae8db40c_1248x832.png 424w, https://substackcdn.com/image/fetch/$s_!Aykw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27325d58-ab45-4eab-a7d3-9eb5ae8db40c_1248x832.png 848w, https://substackcdn.com/image/fetch/$s_!Aykw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27325d58-ab45-4eab-a7d3-9eb5ae8db40c_1248x832.png 1272w, https://substackcdn.com/image/fetch/$s_!Aykw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27325d58-ab45-4eab-a7d3-9eb5ae8db40c_1248x832.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><a href="https://aminollahi.substack.com/p/pci-dss-data-scope-cardholder-environment">Part 2</a></p><h1>Preface</h1><p>In today&#8217;s digital economy, trust is the real currency.<br>Every time a customer enters their payment card details, they are extending that trust &#8212; trusting that the systems we design, the code we write, and the processes we follow will protect their data from harm.</p><p>This trust is not automatic; it is earned through disciplined engineering and consistent adherence to standards such as the <strong>Payment Card Industry Data Security Standard (PCI DSS)</strong>.</p><p>Yet for many technical professionals, PCI DSS is often seen as something mysterious, a document for auditors, or a checklist to be ticked at the end of a project.<br>This course and textbook were created to change that perception.</p><p><strong>PCI DSS Awareness for Technical Teams</strong> is designed for those who build, operate, and deliver technology in environments where cardholder data might pass, <strong>Solution Architects, Software Developers, Testers, and Project Managers.</strong></p><p>Its purpose is not merely to explain the standard, but to show how <strong>compliance is a natural extension of good engineering.</strong><br>When done well, PCI DSS does not slow delivery; it strengthens design.<br>It enforces the very qualities that make systems reliable, segmentation, minimalism, encryption, accountability, and continuous monitoring.</p><p>This is not an audit guide. It&#8217;s a learning journey.<br>Across six chapters, you&#8217;ll explore:</p><ol><li><p><strong>The Foundations of PCI DSS</strong>; why it exists, who enforces it, and how it evolved from industry cooperation, not regulation.</p></li><li><p><strong>Data &amp; Scope</strong>, what counts as cardholder data, what belongs inside the Cardholder Data Environment (CDE), and how to shrink that boundary intelligently.</p></li><li><p><strong>The 12 PCI DSS Requirements</strong>, translated into plain, actionable language relevant to modern cloud, microservice, and API architectures.</p></li><li><p><strong>PCI in Practice</strong>, real guidance for architects, developers, testers, and project managers on what to do day-to-day.</p></li><li><p><strong>Real-World Mistakes and Lessons</strong>, case studies from major global companies that show how simple lapses lead to massive consequences.</p></li><li><p><strong>Final Review and Integrative Challenge</strong>, a hands-on scenario designed to connect all the pieces into practical decision-making.</p></li></ol><p>The material has been written deliberately in <strong>story-driven, conversational form</strong>, rather than as a dense manual. You will find analogies, reflection prompts, and thought experiments that mirror the real decisions engineers make under pressure.</p><p>This book assumes you already understand basic technology concepts, networking, APIs, cloud services but may not yet see how compliance intersects with them.<br>It will help you build not just knowledge, but a <strong>PCI mindset</strong>:<br>to design small, protect deeply, and operate with continuous vigilance.</p><p>The goal of PCI awareness is not to create security specialists, it is to make every technologist an active participant in protecting customer trust.</p><p>If, by the end of this course, you can explain PCI DSS confidently in plain English and instinctively recognise where cardholder data might leak, then you have achieved what this textbook set out to do.</p><h1>Chapter 1: The Foundations of PCI DSS</h1><p>When you buy something online or tap your card at a caf&#233;, a stream of invisible data rushes through networks, systems, and companies. That single transaction might pass through five or ten different organisations before the merchant receives the money. Each stop along that path has the potential to expose your card number.</p><p><strong>PCI DSS</strong>, the <em>Payment Card Industry Data Security Standard</em> exists to stop that from happening.</p><p>It is not a government law. It&#8217;s an industry standard created by the <strong>PCI Security Standards Council (PCI SSC)</strong>, a global body founded by the five major card brands, Visa, Mastercard, American Express, Discover, and JCB. These companies realised years ago that every data breach damages public trust in the entire payment system, not just in one brand. So they came together to define a consistent set of expectations for anyone who handles card data.</p><p>If your organisation <em>stores</em>, <em>processes</em>, or <em>transmits</em> payment card information, PCI DSS applies to you. It doesn&#8217;t matter if you&#8217;re a global bank or a small SaaS startup running on AWS if card data touches your system, you have obligations.</p><h3><strong>Why PCI DSS Exists</strong></h3><p>PCI DSS was born out of a simple truth: <strong>trust drives commerce</strong>. If people lose trust in electronic payments, they stop spending. Every breach whether it&#8217;s from hackers or careless code, erodes that trust.</p><p>Before PCI DSS, each card brand had its own security rules. Merchants complained of confusion and overlapping requirements. In 2006, the card brands united to create a single common standard, one language for data protection.</p><p>At its core, PCI DSS isn&#8217;t about ticking boxes. It&#8217;s about <strong>reducing risk</strong>. It asks: &#8220;What&#8217;s the minimum every organisation should do to stop criminals from stealing card data?&#8221;</p><h3><strong>Why It Matters to You</strong></h3><p>If you are a <strong>solution architect</strong>, you shape how systems communicate which networks talk to each other, how data flows, and where encryption happens.<br>If you are a <strong>developer</strong>, you write the code that could accidentally log someone&#8217;s credit card to a file.<br>If you are a <strong>tester</strong>, you validate the flows that might expose card numbers in unexpected places.<br>And if you are a <strong>project manager</strong>, you decide whether those risks are surfaced, tracked, and resolved or quietly ignored.</p><p>PCI DSS is everyone&#8217;s responsibility because card data moves through every part of a system&#8217;s lifecycle.</p><h3><strong>A Real-World Lesson</strong></h3><p>In 2019, a well-known Australian retailer faced a compliance nightmare.<br>During a code deployment, developers had temporarily enabled &#8220;verbose logging&#8221; to troubleshoot failed transactions. Nobody turned it off. For months, those logs stored thousands of raw card numbers unencrypted, unmasked, and indexed in their monitoring tool.</p><p>No external hacker was needed; the company had compromised itself.<br>When auditors found the issue, the company was forced to treat the entire logging platform as part of its <strong>Cardholder Data Environment (CDE)</strong> a huge and expensive problem.</p><p>That&#8217;s the essence of PCI DSS: <em>you don&#8217;t have to be hacked to be non-compliant.</em></p><h3><strong>The Spirit Behind the Standard</strong></h3><p>The standard&#8217;s formal documents are over a hundred pages long, full of &#8220;shall&#8221; and &#8220;must&#8221;. But the spirit of PCI DSS can be summarised in one sentence:</p><blockquote><p>&#8220;Protect cardholder data wherever it lives, moves, or hides.&#8221;</p></blockquote><p>PCI DSS doesn&#8217;t just care about firewalls or encryption. It cares about behaviour, discipline, culture. It&#8217;s about building secure habits into design, development, testing, and delivery.</p><p>For architects, that might mean designing <strong>segmented networks</strong> that isolate card data from the rest of your cloud environment.<br>For developers, it means never logging or storing <strong>Sensitive Authentication Data (SAD)</strong> like CVV codes.<br>For testers, it means verifying that encryption is working end-to-end.<br>And for project managers, it means tracking compliance milestones just like any other deliverable.</p><h3><strong>Who Enforces PCI DSS?</strong></h3><p>There&#8217;s no global &#8220;PCI police.&#8221; Instead, enforcement happens through <strong>contracts</strong> between card brands, banks, and merchants.</p><p>When you sign a merchant agreement to accept Visa or Mastercard, you&#8217;re agreeing to follow PCI DSS. If you don&#8217;t, and a breach occurs, your acquiring bank can fine you or terminate your ability to accept payments.</p><p>For most organisations, enforcement happens through <strong>quarterly scans</strong>, <strong>annual self-assessment questionnaires (SAQs)</strong>, or full <strong>audits</strong> conducted by Qualified Security Assessors (QSAs).</p><p>Even if you&#8217;re not directly audited, the companies you integrate with such as payment gateways or distributors may require proof that you follow PCI standards before they&#8217;ll connect to you.</p><h3><strong>PCI DSS vs. Other Standards</strong></h3><p>You might have heard of ISO 27001, SOC 2, or GDPR. Each plays a role in data protection, but PCI DSS is uniquely focused on <strong>cardholder data</strong>.</p><ul><li><p><strong>ISO 27001</strong> covers information security management across the whole organisation.</p></li><li><p><strong>SOC 2</strong> focuses on trust principles for service providers.</p></li><li><p><strong>GDPR</strong> deals with privacy and personal data.</p></li><li><p><strong>PCI DSS</strong> goes deep into the <em>how</em>: encryption algorithms, network segmentation, access control, and secure coding.</p></li></ul><p>If ISO 27001 is a <em>management system</em>, PCI DSS is a <em>technical rulebook</em>. It tells you exactly what must be done to protect card data.</p><h3><strong>Why It&#8217;s Everyone&#8217;s Job</strong></h3><p>Many teams assume PCI DSS belongs to &#8220;security&#8221; or &#8220;compliance&#8221;. But in reality, it&#8217;s woven into daily technical decisions.</p><p>A single careless choice, for example, placing debugging logs in CloudWatch that include PANs, can trigger months of remediation work.</p><p>PCI DSS rewards prevention. Building secure patterns early keeps your architecture simple and your audit scope small. Once card data contaminates multiple systems, cleaning it up becomes exponentially harder.</p><h3><strong>Analogy: The Radioactive Data</strong></h3><p>Imagine that every credit card number is slightly radioactive.<br>It&#8217;s safe as long as it&#8217;s sealed inside a lead container (encryption). But if you spill it onto your application logs or test data, everything it touches becomes contaminated.</p><p>That&#8217;s why PCI DSS spends so much time defining &#8220;scope.&#8221;<br>Your job isn&#8217;t just to protect card data; it&#8217;s to <strong>limit where it exists</strong> in the first place.</p><h3><strong>Reflection Pause</strong></h3><p>Take a moment to think about your current project or platform:</p><ul><li><p>Where could cardholder data potentially appear, in logs, in API payloads, in monitoring dashboards?</p></li><li><p>Do you know exactly which components are <em>in scope</em> for PCI DSS?</p></li><li><p>If you discovered a card number in your logs tomorrow, how many systems would instantly fall into scope?</p></li></ul><p>Write down one example from your own work where PCI thinking could prevent a future headache.</p><h3><strong>Mini-Review Quiz</strong></h3><ol><li><p>Who created PCI DSS, and why?</p></li><li><p>Is PCI DSS a law or a contractual obligation?</p></li><li><p>What happens when a system &#8220;touches&#8221; card data?</p></li><li><p>Why is it risky to log raw card numbers, even temporarily?</p></li><li><p>In your role (architect, developer, tester, or PM), name one action you can take this week to strengthen PCI compliance.</p></li></ol>]]></content:encoded></item><item><title><![CDATA[PCI DSS 4.0 Rules: What They Mean for Your Business]]></title><description><![CDATA[The world&#8217;s toughest payment security standard just got tougher; here&#8217;s what&#8217;s changed and why it matters.]]></description><link>https://newsletter.aminollahi.com/p/pci-dss-4-0-changes-business-guide</link><guid isPermaLink="false">https://newsletter.aminollahi.com/p/pci-dss-4-0-changes-business-guide</guid><dc:creator><![CDATA[Ryan Aminollahi]]></dc:creator><pubDate>Sun, 09 Nov 2025 20:01:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lXIj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87b71a61-adc6-4e2d-9d4a-e565025f5ac2_1000x563.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lXIj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87b71a61-adc6-4e2d-9d4a-e565025f5ac2_1000x563.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lXIj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87b71a61-adc6-4e2d-9d4a-e565025f5ac2_1000x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!lXIj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87b71a61-adc6-4e2d-9d4a-e565025f5ac2_1000x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!lXIj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87b71a61-adc6-4e2d-9d4a-e565025f5ac2_1000x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!lXIj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87b71a61-adc6-4e2d-9d4a-e565025f5ac2_1000x563.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lXIj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87b71a61-adc6-4e2d-9d4a-e565025f5ac2_1000x563.jpeg" width="1000" height="563" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/87b71a61-adc6-4e2d-9d4a-e565025f5ac2_1000x563.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:563,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:306564,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/178403480?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87b71a61-adc6-4e2d-9d4a-e565025f5ac2_1000x563.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lXIj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87b71a61-adc6-4e2d-9d4a-e565025f5ac2_1000x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!lXIj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87b71a61-adc6-4e2d-9d4a-e565025f5ac2_1000x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!lXIj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87b71a61-adc6-4e2d-9d4a-e565025f5ac2_1000x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!lXIj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87b71a61-adc6-4e2d-9d4a-e565025f5ac2_1000x563.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If your business handles card payments, big changes are already here.</p><p>The <strong>Payment Card Industry Data Security Standard (PCI DSS)</strong> is the global rulebook for protecting cardholder information. It&#8217;s what keeps customer payment data safe, whether you&#8217;re a retailer, fintech, or enterprise dealing with online transactions.</p><p>Version <strong>4.0</strong> of the standard was released two years ago, but 2025 is when it truly starts to matter. The transition period is ending, and organisations are now being assessed against the new, stricter requirements.</p><p>Unlike earlier versions, PCI DSS 4.0 isn&#8217;t just about passing audits or collecting compliance badges. It&#8217;s designed to push businesses toward <strong>continuous security,</strong> stronger access controls, tighter third-party oversight, and better encryption practices that actually reduce risk, not just paperwork.</p><p>In this article, we&#8217;ll unpack what&#8217;s changed, what&#8217;s expected of you now, and how Australian businesses can turn compliance into a genuine advantage.</p><h2>What Is PCI DSS and Why It Exists</h2><p>The Payment Card Industry Data Security Standard (PCI DSS) was introduced in 2004 by the major card schemes Visa, Mastercard, American Express, Discover, and JCB to create a unified global standard for protecting cardholder data. Before PCI DSS, each card brand had its own security program, which made compliance confusing and inconsistent for businesses. The goal was simple: stop data breaches and reduce fraud by setting one clear, enforceable rulebook for everyone handling payment cards.</p><p>PCI DSS is built around six security goals, twelve core requirements, and over three hundred detailed controls. These cover everything from network security and access management to encryption, monitoring, and incident response. In short, it&#8217;s a complete framework designed to protect how card data is stored, processed, and transmitted.</p><p>Any business that touches cardholder data,  whether directly or indirectly, falls under PCI scope. That includes retailers, payment processors, software platforms, and even marketing agencies that manage eCommerce data.</p><p>For Australian companies, PCI DSS compliance isn&#8217;t just a box to tick; it&#8217;s a legal and reputational safeguard. With the rise of online payments, local fintechs, SaaS providers, and digital marketplaces are all expected to align with PCI&#8217;s standards. A single data breach can trigger fines, lost partnerships, and long-term trust damage. Compliance, in that sense, isn&#8217;t optional; it&#8217;s a baseline for operating responsibly in today&#8217;s digital economy.</p><h2>What&#8217;s New in PCI DSS 4.0</h2><p>While PCI DSS 4.0 isn&#8217;t new anymore, released two years ago, <strong>2025 marks the point where enforcement becomes real</strong>. Businesses are now being audited against the updated controls, and those who haven&#8217;t adapted are starting to feel the pressure. The changes introduced in version 4.0 weren&#8217;t just technical tweaks; they redefined how compliance is approached.</p><p>Here&#8217;s what&#8217;s different and what it means in practice.</p><p></p><h3>1. Security Over Compliance</h3><p>PCI DSS 4.0 shifts the focus from &#8220;passing the audit&#8221; to <strong>proving ongoing security maturity</strong>.</p><p>Instead of treating compliance as a once-a-year checkbox exercise, the new model encourages continuous improvement, regular reviews, adaptive controls, and real-time monitoring.</p><p>The reward? Organisations that embed security into daily operations will find compliance becomes a natural outcome rather than a burden. Those that rely on paperwork and legacy templates will struggle to keep up. PCI now recognises that protecting cardholder data is a living process, not an annual project.</p><p></p><h3>2. More Specific Technical Controls</h3><p>The technical bar has been raised. Version 4.0 introduces <strong>stricter requirements around authentication, encryption, and network segmentation</strong> areas that were previously open to interpretation.</p><p>Multi-factor authentication (MFA), for example, is now required for <em>anyone</em> accessing systems with card data, not just administrators. Encryption standards are clearer and more prescriptive, reducing the grey areas around legacy algorithms or partial encryption of stored data. Network segmentation, too, must be demonstrably effective, not just claimed in documentation.</p><p>Put simply: <strong>if your MFA only protects admins, that&#8217;s no longer enough.</strong></p><p></p><h3>3. Third-Party Accountability</h3><p>One of the biggest real-world shifts in PCI DSS 4.0 is its stance on <strong>third-party risk</strong>.</p><p>Businesses are now explicitly responsible for the security of any vendor or partner that can access or impact cardholder data, even if they&#8217;re &#8220;outside&#8221; your direct control.</p><p>This means a vulnerability in your payment processor, hosting provider, or integration partner could count as <strong>your breach</strong>.</p><p>Australian companies that outsource parts of their infrastructure, particularly fintechs and SaaS vendors, will need to tighten contracts, perform due diligence, and request evidence of ongoing PCI compliance from every partner in their payment ecosystem.</p><p></p><h3>4. Customised Approaches</h3><p>PCI DSS 4.0 also introduces more flexibility through what&#8217;s called the <strong>&#8220;customised approach.&#8221;</strong></p><p>Rather than following the traditional prescriptive checklist, organisations can now design their own security controls provided they deliver an equivalent or stronger outcome.</p><p>This model is ideal for <strong>larger enterprises or cloud-native environments</strong> that want to align PCI with modern architectures, automation, or shared-responsibility models in AWS and Azure.</p><p>However, with flexibility comes risk: proving equivalence can be complex, and QSAs (Qualified Security Assessors) will expect strong evidence, documentation, and rationale. For most organisations, sticking to the defined controls remains the simpler path, but for advanced teams, the customised approach offers a way to innovate while staying compliant.</p><p></p><h2>What Australian Businesses Should Do Next</h2><p>With PCI DSS 4.0 now fully enforceable, Australian businesses can&#8217;t afford to treat it as a &#8220;security project&#8221; that&#8217;s owned by IT alone. The organisations that succeed under the new model are those that treat compliance as a <strong>shared responsibility</strong> across teams, systems, and partners.</p><p>Here&#8217;s a clear, practical roadmap for what to do next.</p><p></p><h3>1. Review Your Scope</h3><p>Start by <strong>mapping where cardholder data actually flows</strong> through your business. You can&#8217;t protect what you can&#8217;t see.</p><p>Identify every system, API, database, and integration that stores, processes, or transmits card data. Then determine what&#8217;s <em>in</em> and <em>out</em> of PCI scope, including third-party platforms and cloud services.</p><p>Many Australian businesses discover their &#8220;out of scope&#8221; systems are still indirectly connected to the cardholder environment. Fixing this early will save time, cost, and headaches when your next assessment comes around.</p><p></p><h3>2. Strengthen Access Controls</h3><p>Access control remains one of the most common weak points in PCI reviews.</p><p>Under version 4.0, <strong>multi-factor authentication (MFA)</strong> must be applied to <em>everyone</em> who can access card data, not just admins or developers.</p><p>Now&#8217;s the time to <strong>revisit least-privilege access</strong> policies and ensure each user only has the minimum permissions required for their role. Combine this with strong password policies, session timeouts, and regular access reviews.</p><p>The principle is simple: if someone doesn&#8217;t need access to card data, they shouldn&#8217;t have it.</p><p></p><h3>3. Validate Your Vendors</h3><p>Your compliance is only as strong as your weakest vendor.</p><p>Audit every partner or service provider that touches your cardholder environment, payment gateways, hosting providers, SaaS integrations, and customer support tools.</p><p>Request their <strong>Attestation of Compliance (AoC)</strong> or equivalent proof that they meet PCI standards. For Australian fintechs and e-commerce platforms that rely on third-party APIs, this step is critical. If a partner fails to protect data properly, you could still be held responsible.</p><p></p><h3>4. Build Security Culture</h3><p>PCI DSS 4.0 turns compliance into a <strong>continuous practice</strong>, not a yearly event.</p><p>That means your people are as important as your systems. Run regular staff awareness training on data handling, phishing prevention, and incident reporting.</p><p>Encourage <strong>accountability across all teams</strong>: engineering, operations, marketing, and finance, not just IT. Everyone who touches customer or payment data plays a part in protecting it.</p><p>When security becomes part of everyday culture, compliance follows naturally.</p><p></p><h2>Common Mistakes to Avoid</h2><p>Even with the right intentions, many organisations stumble when it comes to PCI DSS 4.0. The difference between passing an assessment and failing one often comes down to mindset. Here are some of the most common mistakes that continue to trip up Australian businesses and how to avoid them.</p><p></p><h3>1. Treating PCI as a One-Time Project</h3><p>PCI DSS isn&#8217;t something you &#8220;complete.&#8221; It&#8217;s a living framework designed to be part of your ongoing operations. Many companies scramble once a year before their audit, only to find gaps have reopened months later.</p><p>The fix? Build PCI controls into your daily routines, automate evidence collection, monitor changes continuously, and run internal spot checks throughout the year.</p><p></p><h3>2. Ignoring &#8220;Out-of-Scope&#8221; Systems</h3><p>Just because a system is <em>labelled</em> &#8220;out of scope&#8221; doesn&#8217;t mean it&#8217;s risk-free. A single integration, misconfigured API, or shared identity provider can create a backdoor into your cardholder environment.</p><p>Assess all connected systems, even those that don&#8217;t store or process card data, to confirm they can&#8217;t be used as a bridge to your PCI zone.</p><p></p><h3>3. Relying on Outdated Segmentation or Tokenisation Assumptions</h3><p>Network segmentation and tokenisation remain powerful PCI tools, but only when implemented and tested properly. Too often, businesses assume segmentation is effective because it exists on paper.</p><p>Under PCI DSS 4.0, you&#8217;ll need to <strong>prove</strong> that segmentation and token boundaries actually isolate cardholder data with regular penetration tests, evidence, and documented results.</p><p></p><h3>4. Outsourcing Responsibility Without Clear Controls</h3><p>Outsourcing payments to a vendor doesn&#8217;t remove your PCI obligations.</p><p>If your partners or processors handle card data on your behalf, you still share accountability for how it&#8217;s secured. Many breaches occur when businesses assume &#8220;the vendor&#8217;s got it covered.&#8221;</p><p>To stay compliant, ensure every third-party contract clearly defines PCI responsibilities, review their compliance status regularly, and keep evidence of their controls on file.</p><p>Avoiding these traps isn&#8217;t just about passing audits; it&#8217;s about maintaining real, measurable security over time.</p><h3>Final Thoughts</h3><p>PCI DSS 4.0 isn&#8217;t about ticking boxes; it&#8217;s about protecting trust.</p><p>Every control, audit, and policy ultimately serves one goal: to keep customers&#8217; payment information safe and maintain confidence in your brand.</p><p>Businesses that take this seriously are already seeing the upside. Those who modernise their security early not only <strong>avoid costly fines</strong> but also <strong>build long-term credibility</strong> with banks, partners, and consumers. In a market where trust is everything, compliance becomes a quiet competitive edge.</p><p>Rather than treating PCI as a burden, see it as an opportunity to <strong>upgrade your security posture</strong>, simplify legacy systems, and align your organisation with best-practice architecture. The payoff isn&#8217;t just compliance, it&#8217;s resilience.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uXhj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46fcb181-5d91-4fa1-b89c-0b42d621d9f9_2460x3264.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uXhj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46fcb181-5d91-4fa1-b89c-0b42d621d9f9_2460x3264.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uXhj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46fcb181-5d91-4fa1-b89c-0b42d621d9f9_2460x3264.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uXhj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46fcb181-5d91-4fa1-b89c-0b42d621d9f9_2460x3264.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uXhj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46fcb181-5d91-4fa1-b89c-0b42d621d9f9_2460x3264.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uXhj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46fcb181-5d91-4fa1-b89c-0b42d621d9f9_2460x3264.jpeg" width="304" height="403.38461538461536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/46fcb181-5d91-4fa1-b89c-0b42d621d9f9_2460x3264.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1932,&quot;width&quot;:1456,&quot;resizeWidth&quot;:304,&quot;bytes&quot;:499838,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/178403480?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46fcb181-5d91-4fa1-b89c-0b42d621d9f9_2460x3264.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uXhj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46fcb181-5d91-4fa1-b89c-0b42d621d9f9_2460x3264.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uXhj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46fcb181-5d91-4fa1-b89c-0b42d621d9f9_2460x3264.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uXhj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46fcb181-5d91-4fa1-b89c-0b42d621d9f9_2460x3264.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uXhj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46fcb181-5d91-4fa1-b89c-0b42d621d9f9_2460x3264.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3>Ready to make compliance your competitive edge?</h3><p>If you&#8217;re leading architecture, security, or payments for your organisation, follow <strong>Ryan Aminollahi&#8217;s Designed to Scale</strong> for practical insights on <strong>secure, scalable enterprise design</strong> where compliance meets innovation.</p><p> <strong><a href="https://aminollahi.com">Subscribe at aminollahi.com &#8594; &#8220;Designed to Scale&#8221;</a></strong></p>]]></content:encoded></item><item><title><![CDATA[Spot the Scam: 6 Red Flags of Fraud You Can’t Ignore]]></title><description><![CDATA[Simple ways to protect yourself and your business from clever fraud traps.]]></description><link>https://newsletter.aminollahi.com/p/red-flags-of-fraud-guide</link><guid isPermaLink="false">https://newsletter.aminollahi.com/p/red-flags-of-fraud-guide</guid><dc:creator><![CDATA[Ryan Aminollahi]]></dc:creator><pubDate>Sun, 26 Oct 2025 19:12:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2Wt8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41078165-e352-4e5b-8fb6-4f7c87cca39e_1000x667.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2Wt8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41078165-e352-4e5b-8fb6-4f7c87cca39e_1000x667.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2Wt8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41078165-e352-4e5b-8fb6-4f7c87cca39e_1000x667.jpeg 424w, https://substackcdn.com/image/fetch/$s_!2Wt8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41078165-e352-4e5b-8fb6-4f7c87cca39e_1000x667.jpeg 848w, https://substackcdn.com/image/fetch/$s_!2Wt8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41078165-e352-4e5b-8fb6-4f7c87cca39e_1000x667.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!2Wt8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41078165-e352-4e5b-8fb6-4f7c87cca39e_1000x667.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2Wt8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41078165-e352-4e5b-8fb6-4f7c87cca39e_1000x667.jpeg" width="1000" height="667" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/41078165-e352-4e5b-8fb6-4f7c87cca39e_1000x667.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:667,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:483589,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/177065465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41078165-e352-4e5b-8fb6-4f7c87cca39e_1000x667.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2Wt8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41078165-e352-4e5b-8fb6-4f7c87cca39e_1000x667.jpeg 424w, https://substackcdn.com/image/fetch/$s_!2Wt8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41078165-e352-4e5b-8fb6-4f7c87cca39e_1000x667.jpeg 848w, https://substackcdn.com/image/fetch/$s_!2Wt8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41078165-e352-4e5b-8fb6-4f7c87cca39e_1000x667.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!2Wt8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41078165-e352-4e5b-8fb6-4f7c87cca39e_1000x667.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Every year, thousands of Australians lose money to scams that <em>seem harmless at first glance</em>. From fake investment opportunities to online marketplace tricks, scammers have become sharper, faster, and harder to spot. The numbers tell the story: Australians lost over <strong>$2.7 billion to fraud in 2024</strong>, and most victims thought it could never happen to them.</p><p>What makes scams so effective isn&#8217;t just technology; it&#8217;s human psychology. Scammers play on trust, fear, urgency, and hope. They make you <em>feel</em> before you think. And that&#8217;s where they win.</p><p>But once you learn the patterns, you can see through the disguise. Whether it&#8217;s a &#8220;too-good-to-be-true&#8221; offer or a landlord who can&#8217;t show the property, these clues are easy to recognise once you know what to look for.</p><p>Here are <strong>six clear red flags</strong> to help you cut through the noise, stay sharp, and protect what matters: your money, your data, and your peace of mind.</p><h3>1. Emotional Appeal - When They Play on Your Feelings</h3><p>Scammers are experts at pushing emotional buttons. They use fear, excitement, or sympathy to make you act before you think. Once your emotions take over, it&#8217;s easy to miss the warning signs that something doesn&#8217;t feel right.</p><p>Think of those messages that say <em>&#8220;urgent tax refund,&#8221; &#8220;your account is suspended,&#8221;</em> or <em>&#8220;this investment closes tonight.&#8221;</em> They sound convincing because they trigger emotional reactions, such as fear of missing out, guilt, or panic. That&#8217;s exactly what scammers want.</p><p>Fraudsters often pose as trusted sources, a charity, a government department, or even a friend in trouble, to make you feel responsible or hopeful. The emotional hook distracts you from checking the facts.</p><p><strong>Tip:</strong> Before reacting, pause. Step back and take a breath. Ask yourself,  <em>would a real business or government agency rush me to decide right now?</em> Legitimate organisations never pressure emotions or ask for instant decisions.</p><p>By slowing down, you shift from reacting to reasoning, and that&#8217;s where protection starts.</p><h3>2. Sense of Urgency - &#8220;Act Now or Miss Out&#8221;</h3><p>Scammers thrive on pressure. They want you to <em>rush</em> to act before your logical brain catches up. Urgency is their strongest weapon because it blocks clear thinking and fuels panic or excitement.</p><p>You&#8217;ve probably seen phrases like <em>&#8220;limited spots left,&#8221; &#8220;offer expires today,&#8221;</em> or <em>&#8220;your account will be closed if you don&#8217;t respond now.&#8221;</em> These aren&#8217;t signs of a great deal; they&#8217;re warning lights. When someone pushes you to decide immediately, they&#8217;re trying to control your reaction, not earn your trust.</p><p>Legitimate companies and government bodies don&#8217;t rush people. They provide space to think, compare options, and ask questions. Real offers hold up under time; scams crumble under it.</p><p><strong>Buyer tip:</strong> If you feel pressured to act fast, take a pause. Talk it through with a friend, check the source, or search online for similar scams. Genuine businesses give you <em>time</em> to decide because confident sellers don&#8217;t need to create panic.</p><h3>3. Strange Payment Requests</h3><p>One of the clearest warning signs of fraud is when someone asks you to pay in an unusual way. Gift cards, wire transfers, and cryptocurrency might sound convenient, but for scammers, they&#8217;re gold because these methods are almost impossible to trace or refund once the money&#8217;s gone.</p><p>Think about it: no legitimate business will ever ask for payment in <em>Apple gift cards</em> or <em>Bitcoin</em>. These requests usually come with some form of urgency: <em>&#8220;Pay now to unlock your prize&#8221;</em> or <em>&#8220;settle this debt before your account is closed.&#8221;</em> Once you send the money, there&#8217;s rarely a way back.</p><p>Fraudsters use these unorthodox payment methods because they leave you with no protection and no paper trail. They rely on confusion, pressure, and your trust. Real businesses, on the other hand, use official, secure payment channels, such as credit cards, verified bank transfers, or invoicing systems with receipts.</p><p><strong>Tip:</strong> If someone insists on an unusual payment method, stop right there. Contact the company directly through an official website or phone number. A quick check can save you from a painful loss.</p><h3>4. Questionable Explanations or Stories</h3><p>When something doesn&#8217;t quite add up, it usually means it&#8217;s worth a second look. Scammers rely on believable stories that fall apart once you start asking questions. Maybe it&#8217;s a <em>&#8220;landlord overseas&#8221;</em> who can&#8217;t show you the property, or a <em>buyer</em> who claims to be <em>&#8220;sending a courier with extra payment.&#8221;</em> These explanations are designed to sound reasonable, but they don&#8217;t make sense when you stop to think about them.</p><p>This is where the <strong>Gap Selling</strong> mindset helps. Focus on the <em>gap</em> between what they say and what reality allows. If someone&#8217;s story feels inconsistent, like claiming to own a property they can&#8217;t access, or working for a company you can&#8217;t verify, that&#8217;s your cue to dig deeper.</p><p>Scammers depend on politeness. They hope you&#8217;ll avoid asking direct questions or checking details. But smart buyers and investors verify everything ownership, ID, email domains, ABNs, and even LinkedIn profiles. Legitimate people have no issue proving who they are or what they&#8217;re offering.</p><p><strong>Tip:</strong> If their story sounds off, it probably is. Ask for proof. Check public records. Trust your logic as much as your gut. Real opportunities hold up under scrutiny, fake ones fall apart fast.</p><h3>5. &#8220;You&#8217;ve Won!&#8221; - But You Must Pay First</h3><p>Getting a message that says you&#8217;ve won a prize or landed a dream job feels exciting, and that&#8217;s exactly what scammers count on. They hook you with good news, then slip in a small &#8220;processing fee,&#8221; &#8220;shipping charge,&#8221; or &#8220;security deposit.&#8221; Once you pay, they disappear.</p><p>Real prizes never ask for money up front. If you truly win something, all costs are covered by the organisation running the competition. The moment someone asks for a payment to claim your reward, that&#8217;s your red flag waving loud and clear.</p><p>Scammers often make these offers sound official, complete with fake company logos, convincing emails, or even phone calls. They might say you&#8217;ve won a new phone, a luxury holiday, or that a company wants to hire you urgently. But when they ask for payment before you see any result, it&#8217;s a scam, plain and simple.</p><p><strong>Tip:</strong> Always check the organisation&#8217;s official website or verified social media pages before paying anything. Type the web address manually rather than clicking links in the message. A quick Google search with the phrase &#8220;scam&#8221; plus the company name can reveal whether others have been targeted too.</p><p>Staying sceptical doesn&#8217;t make you negative; it makes you smart. Genuine opportunities hold up under research; scams fall apart when you start checking.</p><h3>6. Your Gut Knows - Trust It</h3><p>If something sounds too good to be true, it probably is. Deep down, most people can sense when something feels off, a quiet signal that says, <em>&#8220;This doesn&#8217;t add up.&#8221;</em> That&#8217;s your intuition speaking, and in most scam situations, it&#8217;s the best warning system you have.</p><p>Scammers often hide behind grand promises of a <em>high-paying work-from-home job</em>, a <em>sudden inheritance from a distant relative</em>, or a <em>once-in-a-lifetime investment.</em> They use excitement and greed to dull your instincts. But your gut is smarter than that; it spots patterns your mind might overlook.</p><p>When something triggers that uneasy feeling, pause and check. Don&#8217;t rush, don&#8217;t reply, and don&#8217;t send money. Talk it through with someone you trust or look it up online. Scammers rely on you ignoring your instincts; that&#8217;s why trusting them is your first line of defence.</p><p><strong>Human insight:</strong> Intuition is your built-in fraud detector. It&#8217;s there to protect you. If something doesn&#8217;t feel right, step back and investigate before acting. Listening to that inner voice can save your time, money, and peace of mind.</p><h3>What to Do If You Suspect a Scam</h3><p>Even the most cautious people can get caught off guard. Scammers are clever, but staying calm and acting fast can limit the damage. Here&#8217;s what to do the moment you think something isn&#8217;t right.</p><h4>Step 1 - Stop and Review</h4><p>Don&#8217;t click, pay, or reply. Take a breath. Scammers thrive on panic and speed &#8212; they want you to react, not think. By pausing, you break their control.</p><p>Ask yourself: <em>Does this sound real? Have I verified the sender? Is this how the company normally contacts me?</em></p><p>A short pause can prevent a big mistake.</p><h4>Step 2 - Check Official Channels</h4><p>If you&#8217;re unsure, go straight to the source. Visit the company&#8217;s official website by typing the URL yourself. Don&#8217;t click links in texts or emails.</p><p>If it&#8217;s a bank, government department, or retailer, call their verified phone number or log in through their app.</p><p>Legitimate organisations will confirm whether the message is genuine or fake. A quick call can give you peace of mind and prevent a scammer from getting through.</p><h4>Step 3 - Report It</h4><p>If you&#8217;ve spotted or fallen for a scam, reporting it helps stop others from getting caught too. Go to <strong><a href="https://www.scamwatch.gov.au">Scamwatch.gov.au</a></strong> and share the details.</p><p>If you&#8217;ve already sent money or shared personal information, contact your <strong>bank immediately</strong>. Many banks can freeze transfers or trace payments if reported early.</p><p>Your action could protect someone else, and it shows scammers that Australians are fighting back.</p><h3>Why People Still Fall for Scams</h3><p>Scammers don&#8217;t just target your money; they target your emotions. They understand how people think and react. They use <strong>trust</strong>, <strong>urgency</strong>, and <strong>hope</strong>, the same levers that great marketers and communicators use, but with opposite intentions.</p><p>When a legitimate business uses these tools, it&#8217;s to inform and help you make better decisions. When a scammer uses them, it&#8217;s to confuse and control you. That&#8217;s the key difference in <strong>intent</strong>. One builds trust, the other abuses it.</p><p>Many Australians fall for scams because they&#8217;re busy, distracted, or simply too polite to question something that looks official. That&#8217;s not foolishness; it&#8217;s human nature. We&#8217;re wired to believe in opportunity and connection, two things scammers know how to imitate perfectly.</p><p>At <strong>Intellicy</strong>, we believe education is the strongest firewall. The more people understand how scams work, the less power fraudsters have. Awareness isn&#8217;t just defence, it&#8217;s empowerment.</p><h3>Final Thoughts - Stay Curious, Stay Sceptical</h3><p>Fraudsters evolve fast. But awareness spreads faster. Every time someone learns to spot a scam, a fraudster loses a chance to exploit trust. Staying curious and sceptical is how we win as individuals and as a community.</p><p>If this article helped you, share it with a friend, colleague, or family member. A quick read might save them from a costly mistake.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sC-v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad5e4914-b43f-484a-b620-ccfdcd8db1c6_241x320.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sC-v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad5e4914-b43f-484a-b620-ccfdcd8db1c6_241x320.jpeg 424w, https://substackcdn.com/image/fetch/$s_!sC-v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad5e4914-b43f-484a-b620-ccfdcd8db1c6_241x320.jpeg 848w, https://substackcdn.com/image/fetch/$s_!sC-v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad5e4914-b43f-484a-b620-ccfdcd8db1c6_241x320.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!sC-v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad5e4914-b43f-484a-b620-ccfdcd8db1c6_241x320.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sC-v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad5e4914-b43f-484a-b620-ccfdcd8db1c6_241x320.jpeg" width="241" height="320" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ad5e4914-b43f-484a-b620-ccfdcd8db1c6_241x320.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:320,&quot;width&quot;:241,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:23741,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/177065465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad5e4914-b43f-484a-b620-ccfdcd8db1c6_241x320.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sC-v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad5e4914-b43f-484a-b620-ccfdcd8db1c6_241x320.jpeg 424w, https://substackcdn.com/image/fetch/$s_!sC-v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad5e4914-b43f-484a-b620-ccfdcd8db1c6_241x320.jpeg 848w, https://substackcdn.com/image/fetch/$s_!sC-v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad5e4914-b43f-484a-b620-ccfdcd8db1c6_241x320.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!sC-v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad5e4914-b43f-484a-b620-ccfdcd8db1c6_241x320.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Need a hand with your fraud detection system?</h2><p>I help teams turn business risk into real-time AI products from the first diagram to live deployment.</p><p>Whether you&#8217;re starting from scratch or rethinking a broken pipeline, we can design something that actually works in production.</p><p>Let&#8217;s build it right. Get in touch or book a discovery chat.</p>]]></content:encoded></item><item><title><![CDATA[How to Build Real-Time Fraud Detection AI from Scratch]]></title><description><![CDATA[A practical, end-to-end guide to designing and deploying fraud detection systems that actually work]]></description><link>https://newsletter.aminollahi.com/p/fraud-detection-ai-from-scratch</link><guid isPermaLink="false">https://newsletter.aminollahi.com/p/fraud-detection-ai-from-scratch</guid><dc:creator><![CDATA[Ryan Aminollahi]]></dc:creator><pubDate>Sun, 12 Oct 2025 19:28:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GIW7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ca28f5-bf72-4477-afc8-ab2cdb238d1b_1000x566.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GIW7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ca28f5-bf72-4477-afc8-ab2cdb238d1b_1000x566.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GIW7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ca28f5-bf72-4477-afc8-ab2cdb238d1b_1000x566.jpeg 424w, https://substackcdn.com/image/fetch/$s_!GIW7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ca28f5-bf72-4477-afc8-ab2cdb238d1b_1000x566.jpeg 848w, https://substackcdn.com/image/fetch/$s_!GIW7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ca28f5-bf72-4477-afc8-ab2cdb238d1b_1000x566.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!GIW7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ca28f5-bf72-4477-afc8-ab2cdb238d1b_1000x566.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GIW7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ca28f5-bf72-4477-afc8-ab2cdb238d1b_1000x566.jpeg" width="1000" height="566" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/87ca28f5-bf72-4477-afc8-ab2cdb238d1b_1000x566.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:566,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:328891,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/175502971?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ca28f5-bf72-4477-afc8-ab2cdb238d1b_1000x566.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!GIW7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ca28f5-bf72-4477-afc8-ab2cdb238d1b_1000x566.jpeg 424w, https://substackcdn.com/image/fetch/$s_!GIW7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ca28f5-bf72-4477-afc8-ab2cdb238d1b_1000x566.jpeg 848w, https://substackcdn.com/image/fetch/$s_!GIW7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ca28f5-bf72-4477-afc8-ab2cdb238d1b_1000x566.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!GIW7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ca28f5-bf72-4477-afc8-ab2cdb238d1b_1000x566.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Fraud detection isn&#8217;t a new problem, but it&#8217;s one that keeps getting smarter. So why are so many systems still lagging behind?</p><p>The short answer? Most fraud detection tools are built like dashboards, not products. They work after the damage is already done. By the time fraud is flagged, the money&#8217;s moved, the damage is real, and recovery costs more than prevention ever would.</p><p>Let&#8217;s be blunt: <strong>batch fraud detection doesn&#8217;t cut it anymore.</strong></p><h3>Why fraud is still slipping through the cracks</h3><p>Fraudsters don&#8217;t wait for your reports to run. They exploit gaps in your process, not just your tech. Here&#8217;s what&#8217;s really going wrong:</p><ul><li><p>The detection happens after the transaction, not during.</p></li><li><p>Teams rely on static rules or pre-trained models with no feedback loop.</p></li><li><p>Most setups are optimised for BI, not real-time decisioning.</p></li><li><p>There&#8217;s no &#8220;product&#8221; owner for fraud&#8212;just a bunch of siloed analysts reacting to alerts.</p></li></ul><p>If you&#8217;ve ever sat in a fraud investigation meeting, you&#8217;ve probably heard someone say,</p><p><strong>&#8220;We saw the signs, but it was too late.&#8221;</strong></p><h3>Why real-time detection changes the game</h3><p>When fraud detection happens in real time, the model becomes part of the transaction flow&#8212;not an afterthought.</p><p>Here&#8217;s what changes:</p><ul><li><p><strong>Speed:</strong> Events are flagged <em>before</em> damage is done.</p></li><li><p><strong>Precision:</strong> Models use context from current and past behaviour.</p></li><li><p><strong>Action:</strong> You can trigger blocks, flags, or step-ups instantly.</p></li></ul><p>You don&#8217;t need a &#8220;perfect model.&#8221; You need something that catches fast-moving fraud and keeps learning.</p><h3>Who this article is for</h3><p>This isn&#8217;t a theoretical piece. It&#8217;s for builders, people trying to turn business risk into working code.</p><p>You&#8217;ll get the most out of this if you&#8217;re:</p><ul><li><p>A <strong>founder</strong> building fraud features into your fintech or platform</p></li><li><p>A <strong>data engineer</strong> standing up pipelines or streaming ingestion</p></li><li><p>A <strong>solution architect</strong> mapping out services, rules, and latency constraints</p></li><li><p>A <strong>security or fraud lead</strong> looking for better tools and decisioning logic</p></li></ul><p>This guide walks through what it actually takes from event ingestion to model training, deployment, and learning loops. It&#8217;s not a checklist. It&#8217;s a product strategy that happens to be built with AI.</p><h2>Part 1: Understand the Problem Before Building</h2><h3>Start with Real Business Pain</h3><p>Before you touch a line of code, take a beat.</p><p>Building fraud detection AI is not a data project, it&#8217;s a product response to real financial loss. That means you can&#8217;t start with the dataset. You have to start with the people chasing fraud every day.</p><p>If you&#8217;re only speaking to the data team, you&#8217;re missing the full picture. Talk to the people who get the 3am call when funds go missing. The ones handling chargebacks, fake accounts, and dodgy behaviour that gets past your existing systems.</p><p><strong>Here&#8217;s what to do instead:</strong></p><ul><li><p>Sit with the <strong>fraud team</strong>, not just the data scientists. Watch how they catch fraud today; often, it&#8217;s just instinct, red flags in a CRM, or digging through logs.</p></li><li><p>Map out the <strong>manual steps</strong> they follow. What triggers an investigation? What patterns are they seeing again and again?</p></li><li><p>Audit your current tools. Most &#8220;fraud systems&#8221; are dashboards with alerts, not decision engines. What actually gets actioned?</p></li></ul><p>The goal here isn&#8217;t just gathering pain points; it&#8217;s seeing the opportunity to build a <strong>system that learns from pain.</strong></p><p></p><h3>Questions to Ask Before You Build Anything</h3><p>If you skip these, you&#8217;ll build noise instead of signal.</p><h4>&#8226; What does a &#8220;fraud&#8221; case actually look like?</h4><p>Is it a stolen identity? A series of suspicious logins? Payment from a blocked IP?</p><p>Get examples. Screenshot-level clarity. Ask for the tickets that led to loss, or where human intervention saved the day.</p><h4>&#8226; What&#8217;s the cost of a false positive vs a false negative?</h4><p>Blocking a real customer creates friction and churn. Letting a fraudster through costs real money. But not all fraud costs the same.</p><p>A failed payment might be annoying. A fake merchant draining payouts is a crisis.</p><p>Model decisions must balance this trade-off.</p><h4>&#8226; Where do current systems fail?</h4><p>Look at actual misses. Not theoretical ones.</p><p>Was the user flagged but not stopped? Was there too much delay between detection and action? Was the alert buried in 300 others?</p><p>Failures tell you more than success stories. They&#8217;re your blueprint.</p><p></p><p><strong>Real-time fraud detection starts with real-time insight into the people, not just the models.</strong></p><p>That&#8217;s how you build something that actually works in the wild.</p><h2>Design the AI Pipeline</h2><h3>Your Data Is the Product</h3><p>You&#8217;re not building a fraud model.</p><p>You&#8217;re building a <strong>real-time decision engine,</strong> and <strong>your data pipeline is the product</strong>.</p><p>Here&#8217;s the truth most teams learn too late: you don&#8217;t need perfect data. You need data that flows.</p><p>That means designing for <strong>change, speed, and feedback</strong>, not just accuracy.</p><p>Static CSVs and nightly jobs won&#8217;t catch fraudsters moving in real time. If someone can sign up, pay, and cash out before your model runs, you&#8217;ve already lost.</p><p>The right move? Build around <strong>event-driven architecture</strong> from day one.</p><ul><li><p>Use <strong>event streams</strong> like Kafka, SNS/SQS, or Pulsar to capture user behaviour as it happens.</p></li><li><p>Think about every <strong>transaction</strong>, <strong>login</strong>, <strong>IP change</strong>, or <strong>device fingerprint</strong> as a signal.</p></li><li><p>Push those signals through a pipeline that constantly learns.</p></li></ul><h3>Pipeline Components (Think Lego, Not Monolith)</h3><p>Let&#8217;s break it down into core parts. You can swap pieces later&#8212;what matters is getting the flow right.</p><h4>Event Ingestion</h4><p>You need to track the moments fraud happens:</p><ul><li><p>New payment attempts</p></li><li><p>Login from new location or device</p></li><li><p>Multiple failed logins in short bursts</p></li><li><p>Rapid signups from similar IPs</p></li></ul><p>These are raw events&#8212;your pipeline starts by capturing them reliably and in real time.</p><h4>Feature Engineering</h4><p>This is where signal is made from noise.</p><p>You&#8217;re not just looking at a single action. You&#8217;re measuring patterns:</p><ul><li><p>Frequency of IP usage across accounts</p></li><li><p>Velocity of transactions after signup</p></li><li><p>Geolocation mismatches (e.g. billing in Sydney, IP in Lagos)</p></li><li><p>Known fraud fingerprints (e.g. disposable emails, emulators, Tor exit nodes)</p></li></ul><p>These features turn raw behaviour into model-ready input.</p><h4>Labelling Transactions</h4><p>This is your foundation for training and improvement.</p><ul><li><p>Tag known fraud (chargebacks, disputes, confirmed abuse)</p></li><li><p>Tag clean behaviour (verified customers, positive history)</p></li><li><p>Store these with enough metadata to trace back</p></li></ul><p>You don&#8217;t need millions of examples; you need clean labels and traceability.</p><p></p><p><strong>Here&#8217;s the trick:</strong></p><p>Don&#8217;t wait for the data to be &#8220;ready.&#8221;</p><p>Build a pipeline that <strong>makes it ready</strong> and gets better over time.</p><p>This is how you go from dashboards that warn&#8230; to systems that act.</p><h2>Part 3: Choose the Right Models</h2><h3>One Model Won&#8217;t Cut It</h3><p>If you&#8217;re trying to fight fraud with a single algorithm, you&#8217;re setting yourself up to lose.</p><p>Fraud evolves too quickly. What worked last month might be useless today.</p><p>So the answer isn&#8217;t <strong>one perfect model,</strong> it&#8217;s <strong>a flexible toolkit</strong>.</p><p>Start simple:</p><ul><li><p>Try <strong>logistic regression</strong> to benchmark. It&#8217;s interpretable and fast.</p></li><li><p>Add <strong>isolation forest</strong> to flag outliers and unusual behaviour.</p></li><li><p>Use <strong>XGBoost</strong> when you&#8217;re ready for more power without needing deep learning.</p></li></ul><p>Mix <strong>supervised learning</strong> (to detect known patterns) with <strong>unsupervised learning</strong> (to catch new ones).</p><p>Think of this stage like security at an airport. You don&#8217;t just scan passports, you watch for strange behaviour, trigger alerts, and layer checks.</p><h3>Model Tips to Keep It Real (and Working)</h3><p>Models in theory are easy. Models that survive production are different. Here&#8217;s how to avoid the common traps.</p><h4>Don&#8217;t Overfit</h4><p>You&#8217;re not building a Kaggle leaderboard. You&#8217;re trying to catch real fraud without burning real users.</p><ul><li><p>Fraud tactics shift quickly</p></li><li><p>False positives hurt real people</p></li><li><p>Real fraudsters learn and adapt</p></li></ul><p>If your model is perfect in training but awful in the wild, it&#8217;s overfitted. Pull it back.</p><h4>Use Ensembles and Fallbacks</h4><p>You need multiple lines of defence.</p><ul><li><p><strong>Ensemble models</strong> combine different views of the data</p></li><li><p><strong>Rule-based fallbacks</strong> act as a safety net if ML confidence is low</p></li><li><p><strong>Thresholds</strong> can be adjusted over time based on risk appetite</p></li></ul><p>Real-time fraud detection isn&#8217;t just AI, it&#8217;s <strong>AI with knobs you can tweak</strong>.</p><h4>Feedback Loops from Real Investigators</h4><p>Your fraud analysts and investigators aren&#8217;t just users; they&#8217;re part of the system.</p><ul><li><p>Feed their decisions back into model retraining</p></li><li><p>Track false positives and false negatives with context</p></li><li><p>Let humans influence thresholds and rule updates</p></li></ul><p>Fraud AI isn&#8217;t just about precision; it&#8217;s about trust.</p><p></p><p>You&#8217;re now at the point where the system doesn&#8217;t just catch fraud, it <strong>learns from it</strong>.<br></p><h2><br>Part 4: Deploy the System</h2><h3>Real-Time Detection Needs Real-Time Infra</h3><p>You&#8217;ve built the models. They&#8217;re working on dev. Now comes the real test: can they <em>catch fraud before it hits your bottom line</em>?</p><p><strong>Batch processing isn&#8217;t fast enough.</strong></p><p>In a world of instant payments, delayed detection is no detection.</p><p>You need infrastructure that makes decisions in real time, <em>sub-second, every time</em>. That&#8217;s the line between catching fraud and cleaning up after it.</p><h3>Tools to Consider (That Actually Work in Production)</h3><p>Here&#8217;s what we&#8217;ve seen work when deploying fraud detection systems that need to act in milliseconds&#8212;not minutes.</p><h4>Model Serving: FastAPI or SageMaker</h4><ul><li><p><strong>FastAPI</strong> gives you quick model APIs with minimal overhead.</p></li><li><p><strong>SageMaker endpoints</strong> work well if you&#8217;re already on AWS and want scalability.</p></li></ul><p>Whichever you choose, aim for inference latency below <strong>300ms</strong>. Beyond that, the fraudster&#8217;s already gone.</p><h4>Alert Routing: Pub/Sub All the Way</h4><ul><li><p>Stream alerts directly to your <strong>fraud ops team</strong>, not just logs.</p></li><li><p>Use <strong>SNS/SQS</strong>, <strong>Kafka</strong>, or <strong>GCP Pub/Sub</strong> to route flagged events to Slack, Jira, or custom dashboards.</p></li><li><p>Make sure high-risk alerts stand out and get triaged fast.</p></li></ul><p>Speed without action is pointless. Make it actionable.</p><h4>Feature Store: Keep Training and Serving Aligned</h4><p>Your model is only as smart as the data you feed it&#8212;<em>in real time</em>.</p><ul><li><p>Use a <strong>feature store</strong> to manage features across training and live inference.</p></li><li><p>Keep engineered features (like IP velocity, new device scores) consistent and versioned.</p></li><li><p>Don&#8217;t recalculate on the fly, pull from the store to keep latency low and accuracy high.</p></li></ul><p>This avoids the dreaded &#8220;training-serving skew&#8221; where your model behaves like two different people depending on context.</p><p></p><p>Deploying real-time AI for fraud isn&#8217;t just technical, it&#8217;s operational.</p><p>It needs clean handoffs between data, models, infra, and humans.</p><p>When you get that right, you go from fraud detection to <strong>fraud prevention,</strong> and that&#8217;s the real win.</p><h2>Part 5: Build Feedback Loops That Learn</h2><h3>Humans Stay in the Loop</h3><p>AI can spot patterns fast, but it&#8217;s the humans behind the screen who decide what matters.</p><p>If you&#8217;re not closing the loop between flagged events and actual outcomes, you&#8217;re flying blind.</p><p>Every flagged event should be treated like gold:</p><ul><li><p>Did the fraud team act on it?</p></li><li><p>Was it a false alarm?</p></li><li><p>What was the outcome: caught, missed, or blocked?</p></li></ul><p>This isn&#8217;t about over-engineering. It&#8217;s about <strong>logging what people did</strong> and <strong>learning from it fast</strong>.</p><h4>Here&#8217;s what to log:</h4><ul><li><p><strong>Investigator decision</strong> (fraud vs. clean)</p></li><li><p><strong>Override reason</strong> (why a flagged event was ignored or escalated)</p></li><li><p><strong>Final outcome</strong> (money saved, loss prevented, refund issued)</p></li></ul><p>These aren&#8217;t just logs, they&#8217;re <strong>free labels for your next model retrain</strong>.</p><p></p><h3>Monitor and Retrain Like a Pro</h3><p>Fraud patterns don&#8217;t sit still. Your model shouldn&#8217;t either.</p><p>Set up <strong>daily or weekly retraining</strong> pipelines even if the changes are subtle.</p><p>Track more than just precision and recall. Track <strong>actual business impact</strong>.</p><h4>Metrics to track:</h4><ul><li><p><strong>Precision</strong>: How accurate are your fraud flags?</p></li><li><p><strong>Recall</strong>: How much fraud are you catching?</p></li><li><p><strong>F1 Score</strong>: Your balance between the two</p></li><li><p><strong>$$$ Saved</strong>: What matters to leadership and investors</p></li></ul><p>Data science loves metrics. Business loves outcomes. Speak both languages.</p><p></p><p>When feedback loops are working, you create a system that <strong>gets smarter with every decision</strong>.</p><p>You start to see not just what happened, but how to prevent it next time.</p><p>And that&#8217;s where your AI starts becoming an asset, not just a tool.</p><p></p><h2>Part 6: Common Pitfalls to Avoid</h2><h3>Where Teams Usually Get Stuck</h3><p>It&#8217;s not always the model that fails, it&#8217;s how the team treats the project.</p><p>Here are the most common ways fraud detection efforts fall apart before they add value:</p><ul><li><p><strong>Waiting for a &#8220;perfect&#8221; model</strong></p><p>Teams get caught chasing a 99% accuracy rate. But in fraud, the game changes daily. Shipping something that works now beats perfect later.</p></li><li><p><strong>Treating it like a data science experiment</strong></p><p>Fraud detection isn&#8217;t a Kaggle competition. It&#8217;s a live product that needs to balance speed, accuracy, and trust.</p></li><li><p><strong>Ignoring latency</strong></p><p>Real-time means real-time. If your model takes 2 seconds to respond, fraudsters will already be gone.</p><p>Worse, many teams don&#8217;t simulate production traffic until go-live, then scramble to fix bottlenecks.</p></li></ul><p></p><h3>Pro tip: Build a sandbox that mirrors production</h3><p>Before you ship, test your pipeline in a sandbox that mimics real production latency and data volume.</p><p>What to include:</p><ul><li><p><strong>Live event ingestion</strong>: Payments, logins, new devices</p></li><li><p><strong>Streaming data tools</strong>: Kafka, SNS/SQS, Kinesis</p></li><li><p><strong>Sub-second model inference</strong></p></li><li><p><strong>Feedback simulation</strong>: Log how your fraud team might interact with alerts</p></li></ul><p>This environment doesn&#8217;t just help you spot slowdowns; it gives your team the <strong>confidence to deploy faster</strong>.</p><p></p><p>Most importantly, keep the mindset of building a <strong>product</strong>, not just a prototype.</p><p>The goal is real-time fraud prevention that actually runs in the wild and keeps learning while it&#8217;s at it.'</p><h2>Conclusion: Ship Fast, Learn Fast, Catch Fraud</h2><p>Fraud detection isn&#8217;t a dashboard you review once a week. It&#8217;s a product. It needs to live in production, adapt fast, and deliver results where they count <em>on the bottom line</em>.</p><p>You don&#8217;t need a PhD in machine learning to make this work. What you do need is:</p><ul><li><p>A clear understanding of business impact</p></li><li><p>Smart use of real-time data</p></li><li><p>A working feedback loop with human fraud reviewers</p></li></ul><p>The teams that win are the ones who <strong>ship fast</strong>, <strong>learn from real cases</strong>, and <strong>cut fraud losses before they snowball</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4-Je!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d81700-b767-4698-a835-458089b28e1d_241x320.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4-Je!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d81700-b767-4698-a835-458089b28e1d_241x320.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4-Je!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d81700-b767-4698-a835-458089b28e1d_241x320.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4-Je!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d81700-b767-4698-a835-458089b28e1d_241x320.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4-Je!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d81700-b767-4698-a835-458089b28e1d_241x320.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4-Je!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d81700-b767-4698-a835-458089b28e1d_241x320.jpeg" width="241" height="320" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1d81700-b767-4698-a835-458089b28e1d_241x320.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:320,&quot;width&quot;:241,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:23741,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/175502971?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d81700-b767-4698-a835-458089b28e1d_241x320.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4-Je!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d81700-b767-4698-a835-458089b28e1d_241x320.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4-Je!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d81700-b767-4698-a835-458089b28e1d_241x320.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4-Je!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d81700-b767-4698-a835-458089b28e1d_241x320.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4-Je!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d81700-b767-4698-a835-458089b28e1d_241x320.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Ryan Aminollahi</figcaption></figure></div><h3>Need a hand with your fraud detection system?</h3><p>I help teams turn business risk into real-time AI products from the first diagram to live deployment.</p><p>Whether you&#8217;re starting from scratch or rethinking a broken pipeline, we can design something that actually works in production.</p><p>Let&#8217;s build it right. Get in touch or book a discovery chat.</p>]]></content:encoded></item><item><title><![CDATA[Digital Forensics for Fraud: Techniques That Work]]></title><description><![CDATA[How investigators recover evidence, expose schemes, and keep cases court-ready.]]></description><link>https://newsletter.aminollahi.com/p/digital-forensics-fraud-techniques</link><guid isPermaLink="false">https://newsletter.aminollahi.com/p/digital-forensics-fraud-techniques</guid><dc:creator><![CDATA[Ryan Aminollahi]]></dc:creator><pubDate>Sun, 28 Sep 2025 20:51:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ABte!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e533aa-9127-409c-a84e-9fe80ce73044_1000x667.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ABte!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e533aa-9127-409c-a84e-9fe80ce73044_1000x667.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ABte!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e533aa-9127-409c-a84e-9fe80ce73044_1000x667.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ABte!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e533aa-9127-409c-a84e-9fe80ce73044_1000x667.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ABte!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e533aa-9127-409c-a84e-9fe80ce73044_1000x667.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ABte!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e533aa-9127-409c-a84e-9fe80ce73044_1000x667.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ABte!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e533aa-9127-409c-a84e-9fe80ce73044_1000x667.jpeg" width="1000" height="667" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b0e533aa-9127-409c-a84e-9fe80ce73044_1000x667.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:667,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:489298,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/174664391?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e533aa-9127-409c-a84e-9fe80ce73044_1000x667.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ABte!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e533aa-9127-409c-a84e-9fe80ce73044_1000x667.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ABte!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e533aa-9127-409c-a84e-9fe80ce73044_1000x667.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ABte!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e533aa-9127-409c-a84e-9fe80ce73044_1000x667.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ABte!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e533aa-9127-409c-a84e-9fe80ce73044_1000x667.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Fraud keeps changing shape. One week<strong>,</strong> it is fake invoices, the next it is insider misuse or account takeover. <strong>Digital forensics</strong> gives you a steady way to trace actions, recover hidden <strong>digital evidence</strong>, and build cases that hold up in Australia. This guide stays practical so your team can act with confidence and keep customers protected.</p><ul><li><p><strong>Fraud keeps changing shape.</strong> Digital forensics helps you trace actions, recover hidden data, and build defensible cases across devices, cloud apps, and networks.</p></li><li><p><strong>What you will learn.</strong> Core <strong>fraud detection techniques</strong>, go-to tools, a real case walk-through, and a readiness checklist that fits a modern program covering <strong>chain of custody</strong>, <strong>network forensics</strong>, <strong>mobile forensics</strong>, and DFIR.</p></li></ul><h2>What is digital forensics?</h2><p>Digital forensics is a disciplined way to uncover the truth inside devices, cloud apps, and networks. Think of it as carefully rewinding the tape: we capture, preserve, and analyse <strong>digital evidence</strong> so investigators can reconstruct who did what, when, and how.</p><ul><li><p><strong>Plain definition:</strong> recover, preserve, and analyse data from devices, cloud apps, and networks to reconstruct events.</p></li><li><p><strong>Chain of custody:</strong> document every step, from acquisition to reporting, so evidence remains authentic and admissible.</p></li><li><p><strong>Where it fits:</strong> fraud investigations, insider misuse, account takeover, and supplier scams.</p></li></ul><h2>Why fraud detection needs digital forensics now</h2><p>Fraud does not stand still. One week it is phishing, the next it is credential stuffing or quiet insider abuse. Attackers run small tests, switch tools, and spread activity across devices and cloud apps so each move looks harmless on its own. That is why investigations need <strong>digital forensics</strong> rather than guesswork.</p><p>Older, process-heavy approaches struggle here. Manual checks and basic logs miss the soft signals that join the dots, like reused devices, staged access, or deleted artefacts. Cases stall, and genuine customers wear the friction while the real problem hides in plain sight.</p><p>Digital forensics closes the gap by showing the who, what, when, where and how. Imaging preserves evidence with a clean <strong>chain of custody</strong>. Log correlation rebuilds the timeline. Artefact analysis confirms actions on endpoints, in SaaS audit trails, and across the network. The result is clear <strong>digital evidence</strong> that supports fast decisions and holds up in Australia.</p><h2>Core techniques investigators rely on</h2><h3>Data acquisition and recovery</h3><p>Everything starts with a clean acquisition. Investigators take a forensic image of the device, capture memory where live artefacts live, and then recover deleted items with file carving. Clocks are synced and hashes are recorded at each step, so integrity is protected and the chain of custody stays intact.</p><h3>Malware and endpoint analysis</h3><p>Once the image is safe, the focus shifts to the endpoint. Analysts identify payloads, persistence methods and any data theft paths, then line these up against execution artefacts such as prefetch, registry changes and recent files. User actions are mapped against policy and access rights to separate mistakes from misuse.</p><h3>Network forensics</h3><p>Network traces tell the &#8220;between&#8221; story. Packet captures, NetFlow, and proxy logs reveal movement across hosts, unusual destinations and time-based patterns. Correlating IPs, devices, accounts and windows of activity turns scattered events into a clear sequence that supports decisions.</p><h3>Cloud, mobile and social sources</h3><p>Evidence rarely sits in one box. SaaS audit logs, mobile extractions and social media artefacts often show planning, coordination and off-platform communication. Combining these sources with endpoint and network data provides a more comprehensive picture and stronger digital evidence.</p><h2>Forensic readiness: set your organisation up to win</h2><p>Good forensics starts long before an incident. Get the basics right now and you will move faster, keep evidence clean, and avoid messy disputes later.</p><h3>Policy and people</h3><p>Write down who does what and when. Name the incident lead, the evidence custodian, and the person who calls legal at 2am. Lock in authorisations, legal sign-off paths, and a simple evidence handling SOP that anyone on call can follow. Run a short drill each quarter so the flow feels natural, not theatrical.</p><h3>Logging and observability</h3><p>Keep the trails you will need. Retain endpoint, network, authentication, and SaaS logs with reliable time sync and role-based access. Set sensible retention windows, centralise collection, and watch for clock drift. Good logging turns &#8220;we think&#8221; into &#8220;we can show&#8221;, which is what your counsel wants.</p><h3>Chain of custody by default</h3><p>Treat every item like it will land in court. Use prebuilt forms with unique IDs, record hashes at acquisition, seal media, and store copies in immutable storage. Add a simple peer review step for high-risk actions. These small habits cut arguments later and keep your case tight.</p><h2>Practical tips to cut fraud risk</h2><p>Start with people. Run short, regular sessions that show real scams your staff might see, then make the escalation path obvious: who to call, what to capture, and what <strong>not</strong> to touch. A five-minute refresher each month is worth more than a long course once a year.</p><p>Tighten access. Enforce MFA everywhere, require strong and unique passwords, and promptly remove dormant accounts. Patch operating systems, browsers, and plugins on a set cadence so known holes are closed before they&#8217;re used.</p><p>Watch for odd behaviour. Set anomaly alerts for payments and access: sudden spend spikes, logins from new countries, unusual device changes, or after-hours admin activity. Tune alerts so they&#8217;re precise and routed to someone who can act.</p><p>Protect the evidence while you respond. Use forensic-capable detection that snapshots key artefacts and preserves raw logs when an alert fires. Think immutable storage, reliable time sync, and hashed captures. That way, you can contain the issue and still prove what happened later.</p><h2>Trends and challenges to watch</h2><p>AI is speeding up triage. Models can group similar cases, rank alerts by risk, and surface links across devices, accounts and IPs in seconds. Used well, this cuts time to first finding and frees analysts to focus on judgement calls. The catch is drift and bias. Keep human review in the loop, version your models, and log why a suggestion was accepted or rejected so you can improve the next round.</p><p>Encryption keeps more data safe, yet it also raises hurdles for investigations. Full-disk encryption, secure enclaves and end-to-end messaging limit what you can collect from endpoints and chat apps. Pair strong acquisition methods with lawful process, and rely more on metadata, network traces and SaaS audit logs to rebuild timelines without breaking privacy rules.</p><p>Data volume is exploding. Petabytes of logs and snapshots are common, which makes &#8220;collect everything&#8221; a slow, costly habit. Shift to targeted acquisition, smarter filtering, and clear retention windows. Hash and index early, store immutably, and archive to cheaper tiers once a case closes so costs stay sane.</p><p>Privacy and legal bounds shape both collection and storage. In Australia, consent, purpose limits and retention rules matter. Align your playbooks with counsel, document lawful basis per source, and restrict access with roles and audit trails. This keeps evidence usable and protects the organisation.</p><p>Collaboration lifts the catch rate. When security ops, fraud teams and forensics share the same case view, patterns appear sooner and fixes land faster. Set a shared glossary, route alerts to the right owner, and run a short weekly review with analysts and engineers. Small rituals like these turn scattered clues into clear digital evidence.</p><h2>Metrics that matter</h2><p><strong>Time to image and time to first finding.</strong></p><p>Speed wins. Track how long it takes to acquire a clean image and how quickly analysts surface the first meaningful clue. Shorter times mean tighter triage and less business disruption.</p><p><strong>Evidence completeness rate and peer review pass rate.</strong></p><p>Quality keeps cases on track. Measure whether the right artefacts were captured across devices, cloud apps and network logs, and how often a second analyst signs off without changes.</p><p><strong>Legal acceptance and successful action rate.</strong></p><p>Outcomes matter. Count the proportion of cases where counsel accepts the package and action follows, whether that is recovery, sanction or process change.</p><p><strong>Reduction in repeat fraud patterns after fixes.</strong></p><p>Close the loop. If the same scheme keeps reappearing, the learning is not landing. Watch trend lines after each remediation to confirm the control actually worked.</p><h2>Where can I help</h2><p><strong>Forensic readiness assessment.</strong> I review policies, logging, storage, and chain of custody. You get clear roles, sensible retention, and evidence that stands up when challenged.</p><p><strong>Playbooks and tooling setup.</strong> I select and configure EnCase or FTK class tools, plus mobile and social collection. Your team gets step-by-step playbooks, templates, and reporting that legal can use.</p><p><strong>On-call investigation support.</strong> When something breaks, I help with triage, acquisition, analysis, and reporting. Fast, steady hands that keep the case moving and protect the evidence.</p><p><strong>Fraud and DFIR integration.</strong> I connect forensic findings to your fraud program so lessons feed prevention and model updates. That means fewer repeat incidents and cleaner hand-offs between teams.</p><p><em>Keen to lift your capability? Start a conversation and I&#8217;ll map the quickest path from where you are to where you need to be.</em></p><h2>Conclusion</h2><p>Digital forensics turns scattered traces into clear, defensible evidence. With the right prep, tools, and habits, your team can spot fraud earlier, respond faster, and stand strong in court. Build clean chains of custody, keep logs you can trust, and rehearse the steps so action feels natural when the pressure is on.</p><p><strong>Ready to strengthen your fraud program? Let&#8217;s talk</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-_rr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c19dcd-1477-4f75-9f6f-403b97f27dbd_241x320.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-_rr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c19dcd-1477-4f75-9f6f-403b97f27dbd_241x320.jpeg 424w, https://substackcdn.com/image/fetch/$s_!-_rr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c19dcd-1477-4f75-9f6f-403b97f27dbd_241x320.jpeg 848w, https://substackcdn.com/image/fetch/$s_!-_rr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c19dcd-1477-4f75-9f6f-403b97f27dbd_241x320.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!-_rr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c19dcd-1477-4f75-9f6f-403b97f27dbd_241x320.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-_rr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c19dcd-1477-4f75-9f6f-403b97f27dbd_241x320.jpeg" width="241" height="320" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f8c19dcd-1477-4f75-9f6f-403b97f27dbd_241x320.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:320,&quot;width&quot;:241,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:23741,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/174664391?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c19dcd-1477-4f75-9f6f-403b97f27dbd_241x320.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-_rr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c19dcd-1477-4f75-9f6f-403b97f27dbd_241x320.jpeg 424w, https://substackcdn.com/image/fetch/$s_!-_rr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c19dcd-1477-4f75-9f6f-403b97f27dbd_241x320.jpeg 848w, https://substackcdn.com/image/fetch/$s_!-_rr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c19dcd-1477-4f75-9f6f-403b97f27dbd_241x320.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!-_rr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c19dcd-1477-4f75-9f6f-403b97f27dbd_241x320.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Fraud Detection with Machine Learning: The Practical Playbook]]></title><description><![CDATA[From rules to real-time models that cut false positives and surface new scams.]]></description><link>https://newsletter.aminollahi.com/p/fraud-detection-machine-learning-practical-playbook</link><guid isPermaLink="false">https://newsletter.aminollahi.com/p/fraud-detection-machine-learning-practical-playbook</guid><dc:creator><![CDATA[Ryan Aminollahi]]></dc:creator><pubDate>Sun, 21 Sep 2025 20:33:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!QCbH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a69a4f-92bd-470b-849d-d2413a4202eb_6000x4000.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QCbH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a69a4f-92bd-470b-849d-d2413a4202eb_6000x4000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QCbH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a69a4f-92bd-470b-849d-d2413a4202eb_6000x4000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!QCbH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a69a4f-92bd-470b-849d-d2413a4202eb_6000x4000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!QCbH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a69a4f-92bd-470b-849d-d2413a4202eb_6000x4000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!QCbH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a69a4f-92bd-470b-849d-d2413a4202eb_6000x4000.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QCbH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a69a4f-92bd-470b-849d-d2413a4202eb_6000x4000.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b4a69a4f-92bd-470b-849d-d2413a4202eb_6000x4000.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6587470,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/173917711?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a69a4f-92bd-470b-849d-d2413a4202eb_6000x4000.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QCbH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a69a4f-92bd-470b-849d-d2413a4202eb_6000x4000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!QCbH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a69a4f-92bd-470b-849d-d2413a4202eb_6000x4000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!QCbH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a69a4f-92bd-470b-849d-d2413a4202eb_6000x4000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!QCbH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a69a4f-92bd-470b-849d-d2413a4202eb_6000x4000.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Fraud changes fast. One week it is tiny test payments. The next week it is device swaps and mule networks. If your controls are only rules and manual checks, you end up chasing smoke while good customers get blocked.</p><p>Machine learning gives your team a sharper toolkit. Models learn from real behaviour, spot new patterns in near real time, and cut the noise that clogs review queues. The aim is simple. Approve the right transactions quickly, stop the bad ones early, and keep customers onside.</p><p>In this guide, I break down practical ways to use machine learning for fraud detection, from data and features to model choices and live serving. You will see where to start, what to measure, and how to keep the system honest over time.</p><h2>Why fraud detection needs ML now</h2><p>Fraud is a moving target. Offenders share playbooks, test small transactions, rotate devices and mule accounts, then scale. Static rules and manual reviews struggle to keep up, which is why teams are shifting to machine learning.</p><ul><li><p><strong>Fraud tactics shift quickly, while static rules and manual reviews miss subtle signals and new patterns.</strong> Rules are fixed and need constant tuning; they&#8217;re fine for known tricks, but they underperform when tactics change or signals are faint. Research shows traditional, rule-heavy setups lag as schemes evolve.</p></li><li><p><strong>ML learns from data, adapts to fresh behaviours, and supports decisions in near real time.</strong> With streaming features and low-latency scoring, models spot unusual behaviour as it happens and update as feedback arrives. Cloud references show practical blueprints for real-time scoring at scale.</p></li><li><p><strong>Banks report big drops in false positives when moving beyond rules, which saves review costs and reduces customer friction.</strong> Case studies cite outcomes such as a 50% reduction in false positives at Danske Bank and ~40% at BGL BNP Paribas after adopting ML-driven detection. That means fewer blocked genuine payments and happier customers.</p></li></ul><p>A quick  story: your best customer taps for groceries and gets declined. They&#8217;re frustrated, support queues grow, and you lose trust. The goal isn&#8217;t to approve everything. It&#8217;s to approve the right things fast. ML helps you get there.</p><h2>What machine learning adds</h2><p>Fraud moves fast. Your checks should move faster. Here&#8217;s what ML brings to the table when you are trying to keep good customers happy and block bad actors without slowing anyone down.</p><ul><li><p><strong>Speed and scale</strong> &#8211; score every transaction with low latency, not sampled batches.</p><p>Stream data into an online feature store and serve a model in milliseconds. That means you approve the right payments in the moment and route risky ones to step-up or review without clogging queues.</p></li><li><p><strong>Continuous learning</strong> &#8211; models retrain with feedback to stay current.</p><p>Close the loop with chargebacks, reviewer outcomes and customer disputes. Run champion&#8211;challenger tests, track drift, and refresh features on a steady cadence so the system learns as tactics change.</p></li><li><p><strong>Network awareness</strong> &#8211; graph methods catch rings of linked accounts, not just single risky events.</p><p>Link customers, devices, emails, IPs and merchants into a graph. Use entity resolution to spot shared identifiers, then add graph features or a GNN score to surface mule networks early.</p></li></ul><p>A quick sanity check: if your controls still rely on nightly batches and a single rules file, you are leaving money on the table and friction in the checkout. Start small, wire in streaming features, and let the model shoulder the heavy lifting.</p><h2>Core approaches you&#8217;ll use</h2><p>Here are the main modelling paths that teams use in production. Start with one, then layer the others as your data matures.</p><h3>Supervised learning</h3><ul><li><p><strong>Use labelled history of fraud vs legitimate transactions.</strong></p><p>Think past chargebacks, confirmed fraud cases, and clean approvals. The model learns the difference.</p></li><li><p><strong>Handle class imbalance with weighting, focal loss, or targeted sampling.</strong></p><p>Fraud is rare. Rebalance so the model does not shrug off the minority class.</p></li><li><p><strong>Go-to models: gradient boosted trees, calibrated logistic regression, and, where sequence matters, LSTM or transformer variants.</strong></p><p>Trees win strong baselines with clear features. Sequences help when timing and order carry signal.</p></li></ul><h3>Unsupervised learning</h3><ul><li><p><strong>Cluster behaviours to spot odd segments.</strong></p><p>Group similar customers or devices to surface pockets that behave strangely.</p></li><li><p><strong>Use isolation forests or autoencoders for anomaly detection when labels are thin.</strong></p><p>These methods flag outliers early, then analysts confirm or reject, which feeds your labels.</p></li></ul><h3>Reinforcement learning</h3><ul><li><p><strong>Treat review queues and step-up challenges as sequential decisions to optimise approval rate and loss.</strong></p><p>Choose when to approve, decline, or step up with an OTP or document check.</p></li><li><p><strong>Start with offline policy evaluation in a sandbox before live trials.</strong></p><p>Replay historical streams, measure cost and customer friction, then move to a small slice of traffic.</p></li></ul><h3>Graph learning for fraud rings</h3><ul><li><p><strong>Represent customers, devices, cards, IPs and merchants as a graph.</strong></p><p>Link anything that should be connected. Shared phones and addresses tell a story.</p></li><li><p><strong>GNNs boost detection where collusion and mules are common, though you must watch for over-smoothing and drift.</strong></p><p>Keep a simple graph feature set as a fallback and monitor score stability over time.</p></li></ul><p>A quick take: supervised gets you wins fast, unsupervised finds the weird stuff you did not expect, reinforcement tunes your actions, and graphs pull the curtain back on networks that hide in plain sight.</p><h2>Data foundations that make or break results</h2><p>Strong models start with strong data. Here&#8217;s how to shape the plumbing so your fraud program learns fast and stays sharp.</p><h3>Feature design</h3><ul><li><p><strong>Behavioural features:</strong> spend velocity, merchant diversity, time of day habits, and geodistance from a customer&#8217;s usual location.</p></li><li><p><strong>Relationship features:</strong> shared devices, emails, addresses and cards. Add counts, recency and uniqueness to make these links useful.</p></li><li><p><strong>Real-time feature store patterns:</strong> stream events into an online feature store with Kafka or similar so the model scores with fresh signals in milliseconds. Keep training and serving features in sync to avoid skew.</p></li></ul><p><em>Quick touch:</em> think of features as the &#8220;tells&#8221; an analyst watches for. Encode those tells so the model can spot them at scale.</p><h3>Labelling and feedback</h3><ul><li><p><strong>Close the loop</strong> with chargebacks, manual decisions and customer disputes so the model sees true outcomes.</p></li><li><p><strong>Use soft labels</strong> by adding reviewer confidence scores to reduce noise from borderline cases.</p></li><li><p><strong>Short feedback cycles:</strong> ship small, measure, and feed outcomes back weekly so patterns do not go stale.</p></li></ul><p><em>Quick touch:</em> when reviewers mark a case &#8220;almost fraud&#8221;, capture that signal. Near-misses teach the model where the edges are.</p><h3>Quality and drift checks</h3><ul><li><p><strong>Track PSI and KS</strong> to detect population and score drift before catch rates slide.</p></li><li><p><strong>Watch feature null spikes</strong> and out-of-range values; they are early signs of broken pipelines.</p></li><li><p><strong>Alert on latency and feature freshness</strong> so real-time scoring stays real-time and decisions remain consistent.</p></li></ul><p><em>Quick touch:</em> if analysts start saying &#8220;these scores feel off&#8221;, trust that instinct and check the monitors first.</p><h2>Real-time architecture blueprint</h2><p>Here is a clean, production-ready shape you can tailor to your stack. It keeps latency low, features fresh, and learning loops tight.</p><ul><li><p><strong>Ingest: stream transactions through Kafka or equivalent.</strong></p><p>Use a single topic per domain with clear schemas. Add headers for request IDs and device hints. Apply schema validation at the edge so bad events never reach your core topics.</p></li><li><p><strong>Process: Spark or Flink for enrichment and rules alongside model scoring.</strong></p><p>Join in device, merchant and customer context. Run a few lightweight rules first to short-circuit obvious fraud. Then call the model for a risk score. Emit reason codes so analysts can see the &#8220;why&#8221; without opening ten tools.</p></li><li><p><strong>Model serving: low-latency API with canary deployments and shadow tests.</strong></p><p>Serve the current champion and one challenger. Shadow traffic to new models to check stability before any switch. Keep a hard timeout so checkout never stalls, and cache safe outcomes for a short window to cut repeat scoring.</p></li><li><p><strong>Storage: online feature store for hot features, offline store for training parity.</strong></p><p>Write features once, read in both places. Enforce the same transforms so training and serving match. Set feature TTLs to keep signals fresh and prevent stale values from drifting scores.</p></li><li><p><strong>Feedback: stream outcomes back to retraining.</strong></p><p>Feed manual decisions, disputes and chargebacks into a feedback topic. Build weekly jobs that refresh labels, update drift dashboards and train a challenger. Promote only after it wins on cost and customer pass rates.</p></li></ul><p><em>Quick touch:</em> when ops says &#8220;scores felt laggy this morning&#8221;, check three dials first: feature freshness, model latency, and rule hit rates. Those three explain most hiccups.</p><h2>Explainability, privacy, and trust by design</h2><p>People need to see why a payment was flagged, not just a score. Build clarity and care into the system from day one.</p><ul><li><p><strong>Use feature attributions and reason codes so risk teams understand triggers.</strong></p><p>Surface top drivers per decision, for example unusual spend velocity, new device, long geodistance. Keep labels plain English so analysts and product teams can act without a decoder ring.</p></li><li><p><strong>Provide case-level explanations for auditors and customer care.</strong></p><p>Store the score, versioned features, model ID, rules hit, and the exact reason codes that fired. This helps support staff resolve disputes quickly and gives auditors an event trail that stands up in a review.</p></li><li><p><strong>Where data sharing is constrained, consider federated learning to keep data local while sharing learned patterns.</strong></p><p>Train models at the edge, aggregate updates centrally, and never move raw customer data. Pair this with data minimisation, tokenised identifiers, and strict access controls.</p></li></ul><p><strong>Practical add-ons</strong></p><ul><li><p><strong>Adverse action messages</strong> that map reason codes to customer-friendly language.</p></li><li><p><strong>Bias and fairness checks</strong> across cohorts so the model treats similar behaviour similarly.</p></li><li><p><strong>Model cards and decision logs</strong> for every version, including known limits and the change summary.</p></li><li><p><strong>Red-team reviews</strong> where analysts try to break the system before scammers do.</p></li></ul><p><em>Quick touch:</em> if a customer calls and says, &#8220;Why was my card blocked for groceries?&#8221;, your team should be able to pull a single case view that explains the call in under 30 seconds.</p><h2>Evaluation that reflects business reality</h2><p>Scorecards look good on a slide, but fraud programs live and die by dollars, seconds, and customer trust. Measure the things your team actually feels day to day.</p><ul><li><p><strong>Go beyond ROC&#8211;AUC. Target precision&#8211;recall at fraud-relevant thresholds.</strong></p><p>Tune for the operating point you&#8217;ll use in production. Track precision, recall, F1, and false-positive rate at that threshold. Add <em>capture rate</em> on the top N% highest-risk transactions, <em>precision@k</em> for review queues, and <em>FPR per 10k</em> to keep false alarms visible.</p></li><li><p><strong>Add cost-based metrics that weigh chargebacks vs false declines.</strong></p><p>Put dollars on outcomes: expected loss for missed fraud, cost of manual review, step-up friction, and the lifetime value hit from blocking good customers. Report <strong>net benefit per 1,000 transactions</strong>, <strong>cost per fraud caught</strong>, and <strong>decline cost ratio</strong> so trade-offs are clear.</p></li><li><p><strong>Run A/B holdouts and measure ops load and customer pass rates.</strong></p><p>Use champion&#8211;challenger tests with guardrails. Compare authorisation rate, chargeback rate, review volume, average handle time, step-up completion, model latency, and dispute reopen rates. Keep a clean holdout slice to catch drift.</p></li></ul><p><em>Quick touch:</em> if analysts say &#8220;the queue felt heavier this week,&#8221; check review volume, precision in the reviewed bucket, and step-up completion. Those three numbers tell you where the pain is.</p><h2>Case study style walk-through</h2><p>Here is a simple path you can reuse. It mirrors how most teams move from rules to a live ML program without breaking checkout or drowning the review team.</p><ul><li><p><strong>Step 1: collect and clean multi-source data.</strong></p><p>Pull transactions, device signals, merchant info, chargebacks, and reviewer outcomes. Align IDs, fix time zones, and build a single customer and device view. Quick win: create a &#8220;golden label&#8221; table with confirmed fraud, genuine approvals, and time windows for grey cases.</p></li><li><p><strong>Step 2: train a supervised baseline, validate on recent months.</strong></p><p>Start with gradient boosted trees plus calibrated scores. Handle class imbalance with weighting or focal loss. Validate on the most recent 2 to 3 months, not just random splits, so you see how the model holds up against fresh tactics.</p></li><li><p><strong>Step 3: layer an unsupervised anomaly score and graph features.</strong></p><p>Add isolation forest or an autoencoder score to catch the weird cases that history cannot teach. Build simple graph features from shared phones, emails, devices and IPs to uncover linked accounts. Keep the features readable so analysts can explain outcomes.</p></li><li><p><strong>Step 4: deploy behind a risk gateway with human-in-the-loop for edge cases.</strong></p><p>Serve the model through a low latency API. Route high confidence safe to approve, high confidence risky to decline or step up, and send the grey middle to the review queue with reason codes. Run a challenger in shadow and promote only when it wins on cost and customer pass rate.</p></li><li><p><strong>Outcome: fewer false positives, sharper catch rate, and faster reviews.</strong></p><p>Targets to aim for: a visible drop in false positives, higher fraud capture at the same review volume, shorter handle time for analysts, and fewer customer complaints about blocked payments.</p></li></ul><p><em>Quick touch:</em> sit a modeller next to a reviewer for an hour each week. The notes you get from those sessions will improve features and reason codes faster than any dashboard.</p><h2>Roadmap you can follow</h2><p>A clear plan keeps momentum. Here&#8217;s a 90-day path you can tailor to your stack and team.</p><h3>0&#8211;30 days</h3><ul><li><p><strong>Stand up streaming pipeline, baseline model, and dashboards.</strong></p><ul><li><p>Ingest transactions with clean schemas and a schema registry.</p></li><li><p>Spin up an online feature store for key signals like spend velocity and device risk.</p></li><li><p>Train a baseline (calibrated logistic regression or gradient boosted trees).</p></li><li><p>Set latency budgets, fail-open rules, and a basic risk gateway.</p></li><li><p>Ship dashboards for precision, recall, false-positive rate, feature freshness, and API latency.</p></li><li><p>Add reason codes so analysts see the &#8220;why&#8221; on day one.</p><p><em>Human touch:</em> sit with reviewers to confirm reason codes read like plain English.</p></li></ul></li></ul><h3>30&#8211;60 days</h3><ul><li><p><strong>Add online features, explainability, and reviewer feedback capture.</strong></p><ul><li><p>Expand real-time features: merchant diversity, geodistance, session patterns.</p></li><li><p>Wire in feature attributions and a reason-code catalogue that customer care can use.</p></li><li><p>Capture reviewer decisions and confidence as feedback; feed chargebacks weekly.</p></li><li><p>Add drift monitors (PSI, KS), data quality alerts, and canary deploys for challengers.</p></li><li><p>Stand up a small label service so cases move from &#8220;suspected&#8221; to &#8220;confirmed&#8221; quickly.</p></li><li><p>Bake in fairness checks across cohorts and a simple audit trail.</p><p><em>Human touch:</em> review three tricky cases as a team each week and turn the lessons into features.</p></li></ul></li></ul><h3>60&#8211;90 days</h3><ul><li><p><strong>Pilot graph features and reinforcement policies in shadow mode, then roll out to a percentage of traffic.</strong></p><ul><li><p>Build entity resolution for customers, devices, IPs, emails, and cards.</p></li><li><p>Add graph features (degree, shared identifiers, community score) and run a GNN or graph-aware model in shadow.</p></li><li><p>Test a reinforcement policy for step-ups and queue routing with offline replays first.</p></li><li><p>Roll out gradually: 1%, 5%, 10%, watching authorisation rate, chargebacks, ops load, and complaints.</p></li><li><p>Create model cards, runbooks, and a monthly retraining cadence with champion&#8211;challenger governance.</p><p><em>Quick touch:</em> after each rollout step, call a sample of affected customers to sanity-check friction.</p></li></ul></li></ul><h2>Where can I help</h2><p>I plug in where it matters and get you moving without breaking checkout or compliance.</p><ul><li><p><strong>Rapid assessment of data and fraud workflows.</strong></p><p>Map signals, rules, queues and chargeback loops. Identify quick wins, data gaps and the safest order to fix them.</p></li><li><p><strong>Reference architecture for real-time scoring and feature stores.</strong></p><p>Provide a proven pattern for streaming ingest, online features, risk gateway, and low-latency model APIs. Hand over IaC templates and runbooks your team can own.</p></li><li><p><strong>Model ops with explainability, audit, and retraining playbooks.</strong></p><p>Set up champion&#8211;challenger, versioned features, reason codes, case logs, and weekly feedback jobs. Add dashboards for drift, latency, and false-positive rate.</p></li><li><p><strong>Migration and quality services so your data is trustworthy before you scale models.</strong></p><p>Cleanse and reconcile sources, align schemas and IDs, and stand up automated quality checks so features stay fresh and scores stay stable.</p></li></ul><p><em>Human touch:</em> I pair an engineer with a fraud analyst so fixes reflect real cases, not just diagrams.</p><h2>Conclusion</h2><p>Fraud shifts fast. Rules alone will not keep up. A modern program blends real-time machine learning, clear features, tight feedback loops, and human review where it counts. When you measure what the business feels, you cut loss without choking good customers.</p><ul><li><p>Use streaming features and low latency scoring to act in the moment.</p></li><li><p>Keep learning with frequent label refreshes and clean feedback loops.</p></li><li><p>Add graph context to expose rings and mule activity early.</p></li><li><p>Build trust with reason codes, case-level logs, and simple, fair explanations.</p></li><li><p>Judge success with cost-based metrics, precision&#8211;recall at your live threshold, and customer pass rates.</p></li></ul><h3>Quick next steps checklist</h3><ul><li><p>Stand up a baseline model with a risk gateway and reason codes.</p></li><li><p>Wire in an online feature store for behaviour and relationship signals.</p></li><li><p>Add drift monitors, soft labels, and a weekly retraining cadence.</p></li><li><p>Shadow test graph features, then roll out in small slices.</p></li><li><p>Review three tricky cases with analysts each week and turn lessons into features.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dYgQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444c552e-4f58-485f-bc0a-a0baab7bab61_241x320.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dYgQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444c552e-4f58-485f-bc0a-a0baab7bab61_241x320.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dYgQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444c552e-4f58-485f-bc0a-a0baab7bab61_241x320.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dYgQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444c552e-4f58-485f-bc0a-a0baab7bab61_241x320.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dYgQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444c552e-4f58-485f-bc0a-a0baab7bab61_241x320.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dYgQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444c552e-4f58-485f-bc0a-a0baab7bab61_241x320.jpeg" width="241" height="320" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/444c552e-4f58-485f-bc0a-a0baab7bab61_241x320.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:320,&quot;width&quot;:241,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:23741,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/173917711?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444c552e-4f58-485f-bc0a-a0baab7bab61_241x320.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dYgQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444c552e-4f58-485f-bc0a-a0baab7bab61_241x320.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dYgQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444c552e-4f58-485f-bc0a-a0baab7bab61_241x320.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dYgQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444c552e-4f58-485f-bc0a-a0baab7bab61_241x320.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dYgQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444c552e-4f58-485f-bc0a-a0baab7bab61_241x320.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3>Ready to move?</h3><p>If you want a hand, I can run a rapid assessment, give you a reference blueprint, and set up model ops with explainability and audit so you get safer approvals without extra friction.</p>]]></content:encoded></item><item><title><![CDATA[Anonymised Production Data for Safer, Faster Testing]]></title><description><![CDATA[A practical, risk-based playbook for building realistic non-prod datasets that respect privacy and speed up delivery]]></description><link>https://newsletter.aminollahi.com/p/anonymised-production-test-data-fast</link><guid isPermaLink="false">https://newsletter.aminollahi.com/p/anonymised-production-test-data-fast</guid><dc:creator><![CDATA[Ryan Aminollahi]]></dc:creator><pubDate>Sun, 31 Aug 2025 21:25:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wYZF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe826710-f970-4ae8-a184-ca987756bd5d_1000x667.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wYZF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe826710-f970-4ae8-a184-ca987756bd5d_1000x667.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wYZF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe826710-f970-4ae8-a184-ca987756bd5d_1000x667.jpeg 424w, https://substackcdn.com/image/fetch/$s_!wYZF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe826710-f970-4ae8-a184-ca987756bd5d_1000x667.jpeg 848w, https://substackcdn.com/image/fetch/$s_!wYZF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe826710-f970-4ae8-a184-ca987756bd5d_1000x667.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!wYZF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe826710-f970-4ae8-a184-ca987756bd5d_1000x667.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wYZF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe826710-f970-4ae8-a184-ca987756bd5d_1000x667.jpeg" width="1000" height="667" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/be826710-f970-4ae8-a184-ca987756bd5d_1000x667.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:667,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:345096,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/172072028?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe826710-f970-4ae8-a184-ca987756bd5d_1000x667.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wYZF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe826710-f970-4ae8-a184-ca987756bd5d_1000x667.jpeg 424w, https://substackcdn.com/image/fetch/$s_!wYZF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe826710-f970-4ae8-a184-ca987756bd5d_1000x667.jpeg 848w, https://substackcdn.com/image/fetch/$s_!wYZF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe826710-f970-4ae8-a184-ca987756bd5d_1000x667.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!wYZF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe826710-f970-4ae8-a184-ca987756bd5d_1000x667.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Why teams still reach for production data in test</h2><p>Let&#8217;s be honest: most test data feels fake. It looks tidy, misses edge cases, and slows releases. That&#8217;s why teams keep pulling from production. The trick is to get the realism without the risk by using anonymised production data and smart data masking for testing.</p><ul><li><p><strong>Releases stall when sample data is too clean or too small</strong><br>Tiny, hand-made samples don&#8217;t exercise real code paths. UAT stalls when integrations expect messy joins, referential integrity, and genuine volumes. An anonymised production subset gives you realistic masked data while staying inside Privacy Act and OAIC de-identification guidance. Result: fewer blockers, faster feedback, and simpler test data management.</p></li><li><p><strong>Test failures hide in messy, long-tail values you only see in prod</strong><br>Bugs love weird inputs. Think free-text typos, odd encodings, ancient dates, emoji in names, multi-byte characters, international addresses, and outlier transaction amounts. These long-tail behaviours surface only in production-shaped data. Keeping distributions and formats through masking helps you catch the sneaky stuff before go-live.</p></li><li><p><strong>Goal: keep realism, remove risk, move faster with confidence</strong><br>Use a risk-based approach: suppress direct identifiers, generalise high-risk quasi-identifiers, tokenise keys, and add light perturbation where needed. Preserve formats and relationships so tests still work. With a repeatable pipeline, you speed up regression testing, lower rework, and protect PII in non-production.</p></li></ul><h2>Anonymisation 101 you can use today</h2><p>Here&#8217;s a quick, working set of definitions you can share with your team. Keep it practical and keep it grounded in how your test data will be used.</p><h3>Anonymisation vs de-identification vs pseudonymisation</h3><ul><li><p><strong>De-identification</strong> removes direct identifiers such as names, addresses, Medicare numbers and licence plates. It stops easy recognition from the data itself.</p></li><li><p><strong>Anonymisation</strong> manages re-identification risk from <strong>indirect</strong> identifiers in context. Think postcodes, dates, rare job titles, or combinations that can point back to a person when linked with other sources. This is the focus in the UK Anonymisation Network (UKAN/UKANON) guidance and the ADF mindset of &#8220;data situations&#8221;.</p></li><li><p><strong>Pseudonymisation</strong> swaps identifiers for tokens. Helpful for testing joins and workflows, but the dataset can still be <strong>personal</strong> if someone can link it back to a person. Under the Privacy Act and OAIC guidance, pseudonymised data is not automatically anonymous.</p></li></ul><p></p><h3>What &#8220;negligible risk&#8221; means in Australia</h3><p>OAIC sets a practical bar. You&#8217;re aiming for a residual risk that a <strong>reasonable person would ignore</strong>, not zero. That means:</p><ul><li><p><strong>Risk is reduced to a negligible level</strong>, then kept under review as data environments and linkable sources change.</p></li><li><p><strong>Controls fit the risk</strong>. Suppress or generalise where needed, tokenise keys, keep formats for testing, and limit who can access what, where, and for how long.</p></li><li><p><strong>Evidence lives with the data</strong>. Keep a short record of your scenario analysis, chosen controls, and results from checks or penetration tests.</p></li><li><p><strong>Re-assess on change</strong>. New feeds, vendor sandboxes, or fresh open data can shift the balance. Book periodic reviews.</p></li></ul><p></p><h2>Think in &#8220;data situations,&#8221; not just datasets</h2><p>Data is only as safe as the place you put it. Risk sits in the relationship between a dataset and its environment, including who can touch it, what other data live nearby, and what leaves the zone as outputs.</p><ul><li><p><strong>Risk lives in the relationship between data and the environment it enters</strong><br>Look at people, processes, tech, and adjacent data. Linkage risk often comes from outside your dataset. Outputs matter too. A harmless-looking export can become risky when combined with open data or another internal feed.</p></li><li><p><strong>Test, UAT, vendor labs, and shared sandboxes have different exposure profiles</strong></p><ul><li><p><strong>Dev and team sandboxes:</strong> fast and flexible, but sprawl, weak access control, and long retention raise risk.</p></li><li><p><strong>System test:</strong> more users, richer logs, and more integrations increase linkage paths.</p></li><li><p><strong>UAT:</strong> business users and wider hours, plus screenshots and shared channels, create extra output risk.</p></li><li><p><strong>Vendor labs:</strong> external access, shared infrastructure, and support tickets can leak context.</p></li><li><p><strong>Shared analytics sandboxes:</strong> mixing data from multiple sources turns quasi-identifiers into clear join keys.<br><strong>Cut risk fast:</strong> least privilege, short retention, masked refresh from prod, controlled egress, and output checks.</p></li></ul></li><li><p><strong>Use the UK Anonymisation Decision-Making Framework (ADF) to map this context</strong></p><ul><li><p><strong>Draw the flow:</strong> source systems to target envs to outputs.</p></li><li><p><strong>Name the environment:</strong> users, other datasets, security controls, and where results go.</p></li><li><p><strong>Run scenario analysis:</strong> who could re-identify, using what joins, and to what end.</p></li><li><p><strong>Pick controls that match the scenario:</strong> suppression, generalisation, tokenisation, format-preserving masking, sampling, and access limits.</p></li><li><p><strong>Use a thermostat release:</strong> start conservative, monitor use, then enrich safely.</p></li></ul></li></ul><h2>A 60-minute scoping workshop to set guardrails</h2><p>Run a fast, focused session so everyone leaves with the same picture and clear guardrails for anonymised test data. Keep it on a single whiteboard and capture actions as you go.</p><p><strong>0 to 10 min; Clarify the use case and the minimum data specification</strong></p><ul><li><p>What must this test prove: flows, reports, edge cases, performance, or all of the above</p></li><li><p>Minimum variables, date range, and record counts to keep behaviour realistic</p></li><li><p>Success criteria and what &#8220;good enough&#8221; looks like for this sprint</p></li><li><p>Where masked data will run: unit, system test, UAT, vendor lab</p></li></ul><p><strong>10 to 20 min; List direct identifiers, quasi-identifiers, and sensitive fields</strong></p><ul><li><p><strong>Direct identifiers:</strong> names, emails, phone numbers, licence numbers, addresses, Medicare numbers</p></li><li><p><strong>Quasi-identifiers:</strong> postcodes, birth dates, rare job titles, small-branch codes, device IDs</p></li><li><p><strong>Sensitive fields:</strong> health, biometrics, payment tokens, notes fields with free text</p></li><li><p>Call out tricky spots: CSV exports, attachments, audit tables, message queues</p></li></ul><p><strong>20 to 30 min; Mark who will access data, where it sits, and how outputs leave the zone</strong></p><ul><li><p>People and roles: engineers, analysts, vendors, business testers, support</p></li><li><p>Environments: Dev, SIT, UAT, vendor sandboxes, analytics workspaces</p></li><li><p>Controls in place: network, IAM, secrets, logging, retention, backups</p></li><li><p>Output paths: screenshots, CSV exports, BI extracts, ticket attachments, Slack or email shares</p></li></ul><p><strong>30 to 45 min; Capture legal hooks and policy anchors</strong></p><ul><li><p>Privacy Act and OAIC de-identification guidance that applies to your use case</p></li><li><p>Contract and sector rules: APS, health, finance, education, PCI where relevant</p></li><li><p>Decide evidence to keep: field classification, risk scenarios, chosen controls, test results</p></li><li><p>Agree review cadence when environments or data sources change</p></li></ul><p><strong>45 to 55 min; Convert to masking rules and guardrails</strong></p><ul><li><p>Field-level decisions: suppress, generalise, tokenise, format-preserving mask, sample, perturb</p></li><li><p>Keep referential integrity across systems and tables</p></li><li><p>Access and retention limits for each environment</p></li><li><p>Monitoring plan for usage and outputs</p></li></ul><p><strong>55 to 60 min; Decisions and owners</strong></p><ul><li><p>Approve the minimum spec and release scope</p></li><li><p>Name owners for pipeline build, risk checks, and sign-off</p></li><li><p>Book the first refresh and the next review</p></li></ul><h2>The fast, safe build in 8 practical steps</h2><h3>1) Define the minimum viable test set</h3><ul><li><p>Lock the <strong>sample size</strong>, <strong>subject areas</strong>, and <strong>time windows</strong> that prove the use case.</p></li><li><p>Keep <strong>must-keep behaviours</strong> like peak hours, chargebacks, special characters, and rare edge cases.</p></li><li><p>Write the acceptance checks so everyone knows when the dataset is &#8220;good enough&#8221; for this sprint.</p></li></ul><h3>2) Map the data situation</h3><ul><li><p>Sketch <strong>source systems</strong>, <strong>target environments</strong>, <strong>users</strong>, <strong>outputs</strong>, and the <strong>release path</strong>.</p></li><li><p>Use the <strong>UK Anonymisation Decision-Making Framework (ADF)</strong> to frame risks and controls.</p></li><li><p>Pull from <strong>UKANON</strong> guidance so your map reflects people, process, tech, and nearby data.</p></li></ul><h3>3) Classify fields</h3><ul><li><p>Tag <strong>direct IDs</strong>, <strong>quasi-IDs</strong>, <strong>sensitive attributes</strong>, <strong>join keys</strong>, and <strong>constraints</strong>.</p></li><li><p>Note <strong>referential links across tables</strong> so masking won&#8217;t break tests or reports.</p></li><li><p>Tools like <strong>Redgate Software</strong> and <strong>Oracle</strong> data masking packs can help keep formats and relationships consistent.</p></li></ul><h3>4) Choose controls per field</h3><ul><li><p><strong>Suppress or generalise</strong> high-risk attributes where identity can leak.</p></li><li><p>Use <strong>deterministic masking</strong> for emails, phones, and IDs to keep formats and joins stable.</p></li><li><p><strong>Tokenise</strong> customer keys; <strong>hash</strong> low-cardinality codes with salts to stop guessing.</p></li><li><p>Add <strong>low-noise perturbation</strong> when the <strong>distribution shape</strong> matters for test behaviour.</p></li><li><p><strong>Sample</strong> to cut surface area and shorten exposure windows.</p></li><li><p><strong>Preserve referential integrity</strong> across databases and services. Redgate and Oracle patterns are handy for this.</p></li></ul><h3>5) Build the pipeline</h3><ul><li><p><strong>Extract</strong> from production on a schedule, <strong>mask in transit</strong>, <strong>load</strong> to non-prod.</p></li><li><p>Store <strong>field rules</strong> and <strong>data-quality checks</strong> as code with version control.</p></li><li><p>Log <strong>lineage</strong> and <strong>approvals</strong>. Give vendors <strong>isolated workspaces</strong> with least-privilege access.</p></li></ul><h3>6) Assess disclosure risk</h3><ul><li><p>Run <strong>scenario analysis</strong>: who could re-identify, using which joins, and why.</p></li><li><p>Measure <strong>identification</strong> and <strong>attribution</strong> risk using <strong>Statistical Disclosure Control (SDC)</strong> concepts from <strong>NCRM</strong> and <strong>UNECE</strong>.</p></li><li><p>Record results next to the dataset so reviewers can trace your reasoning.</p></li></ul><h3>7) Try to break it</h3><ul><li><p>Attempt <strong>linkage</strong>, run <strong>pen-tests</strong> on the dataset, and check <strong>outputs</strong> for leaks.</p></li><li><p>Patch weak spots and re-run checks before any wider release.</p></li><li><p>If residual risk stays high, <strong>switch that slice to synthetic data</strong> for now.</p></li></ul><h3>8) Release with a &#8220;thermostat&#8221; approach</h3><ul><li><p>Start conservative, <strong>monitor usage and demand</strong>, then <strong>enrich in controlled steps</strong>.</p></li><li><p><strong>Re-assess</strong> when new external data appears, when teams add joins, or when access patterns change.</p></li></ul><h2>Pick the right tool for the job</h2><p>Choose tools that keep data useful for testing while cutting re-identification risk. Aim for automation you can trust and controls you can prove.</p><ul><li><p><strong>Masking platforms that keep formats and relational links for realistic behaviour in tests</strong><br>Look for:</p><ul><li><p>Format-preserving and deterministic masking so emails, phones and IDs still pass validation</p></li><li><p>Referential integrity across tables and databases</p></li><li><p>Rule libraries for common data types, plus custom scripts</p></li><li><p>Reversible tokens only inside a secure vault, never in non-prod<br>Options teams often use: <strong>Redgate Software</strong> (Data Masker) and <strong>Oracle</strong> Data Masking and Subsetting Pack.</p></li></ul></li><li><p><strong>Discovery scanners to find PII before you miss a column</strong><br>Must-haves:</p><ul><li><p>Scans across schemas, files and logs, including free-text fields</p></li><li><p>Built-in classifiers for names, addresses, licence numbers and health terms</p></li><li><p>Confidence scores and human review queues</p></li><li><p>CI checks that fail a build when new PII appears</p></li><li><p>Simple exports to seed your masking rules</p></li></ul></li><li><p><strong>Governance hooks aligned to ISO/IEC 27559 across the lifecycle</strong><br>Bake governance into the pipeline:</p><ul><li><p>Policy-as-code for field rules, risk scenarios and approvals</p></li><li><p>Clear labels for shared vs released datasets, aligned to ISO/IEC 27559 terms</p></li><li><p>Audit trails for who accessed what, where the data sits, and what left the zone</p></li><li><p>Output checks for reports, extracts and screenshots</p></li><li><p>Scheduled re-assessment when sources, environments or user access change</p></li></ul></li></ul><h2>When synthetic data beats anonymised subsets</h2><p>Sometimes the safest way to keep momentum is to switch parts of your test pack to synthetic data. You still keep schema, constraints and realistic distributions, but you avoid the re-identification risk that comes with certain slices of production.</p><ul><li><p><strong>Rare events, small cohorts, or highly linkable attributes</strong><br>Use synthetic data when:</p><ul><li><p>You are testing <strong>edge cases</strong> that appear only a handful of times in prod</p></li><li><p>Cohorts are <strong>tiny</strong> (for example, a remote branch, a rare diagnosis, VIP accounts)</p></li><li><p>Attributes are <strong>highly linkable</strong> on their own or in combination, such as exact birth dates plus postcode, unique device IDs, or uncommon job titles</p></li><li><p>Fewer than five records share a key combination and masking still looks risky<br>Tips: mirror formats and ranges, keep referential integrity, and shape the synthetic distribution to match production so tests still behave like the real world.</p></li></ul></li><li><p><strong>Safety valves for high-risk joins or outputs to shared environments</strong><br>Switch to synthetic for:</p><ul><li><p>Tables or fields that leave your zone for <strong>vendor labs</strong> or <strong>shared sandboxes</strong></p></li><li><p><strong>Join paths</strong> that could reveal identities when linked with open data or another internal feed</p></li><li><p><strong>Outputs</strong> that travel widely, such as BI extracts, CSV drops, or screenshot-heavy UAT<br>Keep a clear map: which columns are masked, which are synthetic, and where each dataset can be used. Review this map whenever teams add new joins or outputs.</p></li></ul></li></ul><h2>Legal and policy anchors to reference in your runbook</h2><p>Keep your runbook practical. Point each control back to a policy line so auditors, vendors, and new team members can trace the &#8220;why&#8221; in seconds.</p><ul><li><p><strong>OAIC de-identification guidance and decision-making framework</strong></p><ul><li><p>Use OAIC terms when you define <strong>personal</strong>, <strong>de-identified</strong>, <strong>pseudonymised</strong>, and <strong>anonymised</strong> data.</p></li><li><p>State your bar for <strong>negligible risk</strong> and how you&#8217;ll review it as environments change.</p></li><li><p>Record the <strong>decision trail</strong>: scenario analysis, chosen controls, test results, approvals.</p></li><li><p>Link your release process to OAIC guidance on disclosure management and breach response.</p></li></ul></li><li><p><strong>ISO/IEC 27559 definitions for shared vs released datasets</strong></p><ul><li><p>Label each dataset as <strong>shared</strong> (controlled access) or <strong>released</strong> (wide or public access).</p></li><li><p>Tie controls to that label: stronger access limits, shorter retention, and output checks for released data.</p></li><li><p>Reuse ISO wording for lifecycle stages: discovery, preparation, sharing/release, monitoring, retirement.</p></li></ul></li><li><p><strong>State guidance examples for clarity with teams and vendors</strong></p><ul><li><p>Add the relevant state privacy or health guidance where you operate (for example, finance or health rules that sit on top of federal law).</p></li><li><p>Map <strong>sector rules</strong> to your controls: retention, audit logging, export limits, and third-party access.</p></li><li><p>Include a one-page &#8220;what vendors must do&#8221; checklist: least-privilege access, isolated workspaces, no screenshots in tickets, output approvals.</p></li></ul></li><li><p><strong>Make it easy to use</strong></p><ul><li><p>Put policy excerpts <strong>next to</strong> masking rules and pipeline steps.</p></li><li><p>Keep a plain-English glossary so everyone uses the same terms.</p></li><li><p>Schedule reviews: trigger a check when sources change, when datasets move to a new environment, or when new open data appears.</p></li></ul></li></ul><h2>Tie-in to migration and data quality services</h2><p>Connect your anonymised test data work to the jobs that move the needle: cleaner migrations and fewer go-live surprises.</p><h3>Pre-migration dry-runs</h3><ul><li><p><strong>Use anonymised samples to validate mapping rules, constraints, and transformations</strong><br>Build a production-shaped subset, then prove your rules: data types, lengths, enums, date windows, and derived fields. Keep formats and relationships so joins, reports, and workflows behave like the real thing.</p></li><li><p><strong>Detect schema drift and broken joins early</strong><br>Run automated checks for missing columns, renamed fields, and changed code sets. Confirm foreign keys, uniqueness, and duplication rules. Where re-identification risk stays high, swap that slice for synthetic data and keep testing moving.</p></li></ul><p></p><h3>Post-migration assurance</h3><ul><li><p><strong>Side-by-side checks for counts, referential integrity, and key business metrics</strong><br>Reconcile row counts, sums, min&#8211;max ranges, and distincts. Spot-check record pairs, verify joins and constraints, and compare headline metrics that matter to the business.</p></li><li><p><strong>Re-use the pipeline for regression test packs</strong><br>Refresh masked data on a schedule, rerun your checks, and version the results. Keep a small, always-ready pack for hotfixes and a fuller pack for release testing.</p></li></ul><h2>Quick checklist (print and stick on your wall)</h2><ul><li><p>Use case and minimum spec agreed<br>Purpose, fields, record counts, time window, success checks.</p></li><li><p>Data situation mapped<br>Sources, environments, users, outputs, release path.</p></li><li><p>Field classification done<br>Direct IDs, quasi-IDs, sensitive fields, join keys, constraints.</p></li><li><p>Controls selected and scripted<br>Suppress, generalise, tokenise, deterministic masks, sampling, perturbation. Keep referential integrity.</p></li><li><p>Risk assessed and pen tested<br>Scenario analysis, SDC-style checks, linkage attempts, fixes captured.</p></li><li><p>Release scope approved, audit trails on<br>Access limits, retention set, logging enabled, owners named.</p></li><li><p>Monitoring and re-assessment booked<br>Usage reviews scheduled, source and environment changes tracked, outputs checked.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!p6Fr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F241f75bf-4ba0-4de4-b439-84278b4025ec_241x320.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!p6Fr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F241f75bf-4ba0-4de4-b439-84278b4025ec_241x320.jpeg 424w, https://substackcdn.com/image/fetch/$s_!p6Fr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F241f75bf-4ba0-4de4-b439-84278b4025ec_241x320.jpeg 848w, https://substackcdn.com/image/fetch/$s_!p6Fr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F241f75bf-4ba0-4de4-b439-84278b4025ec_241x320.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!p6Fr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F241f75bf-4ba0-4de4-b439-84278b4025ec_241x320.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!p6Fr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F241f75bf-4ba0-4de4-b439-84278b4025ec_241x320.jpeg" width="241" height="320" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/241f75bf-4ba0-4de4-b439-84278b4025ec_241x320.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:320,&quot;width&quot;:241,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:23741,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aminollahi.com/i/172072028?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F241f75bf-4ba0-4de4-b439-84278b4025ec_241x320.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!p6Fr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F241f75bf-4ba0-4de4-b439-84278b4025ec_241x320.jpeg 424w, https://substackcdn.com/image/fetch/$s_!p6Fr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F241f75bf-4ba0-4de4-b439-84278b4025ec_241x320.jpeg 848w, https://substackcdn.com/image/fetch/$s_!p6Fr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F241f75bf-4ba0-4de4-b439-84278b4025ec_241x320.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!p6Fr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F241f75bf-4ba0-4de4-b439-84278b4025ec_241x320.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You can have safe, realistic test data on tap without the headaches.</p><p>Want help building this once and re-using it sprint after sprint? Let&#8217;s talk about a pilot.</p><p></p>]]></content:encoded></item></channel></rss>