<?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[Brownfield AI: The Brownfield Problem]]></title><description><![CDATA[Making AI coding tools work on heavily customised enterprise platforms. The real infrastructure — built from live industry experience, from the inside out.]]></description><link>https://insights.brownfieldai.dev/s/the-brownfield-problem</link><image><url>https://substackcdn.com/image/fetch/$s_!UyKR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749143a8-a231-4dab-906a-d59d182eb678_800x800.png</url><title>Brownfield AI: The Brownfield Problem</title><link>https://insights.brownfieldai.dev/s/the-brownfield-problem</link></image><generator>Substack</generator><lastBuildDate>Tue, 29 Sep 2026 16:01:50 GMT</lastBuildDate><atom:link href="https://insights.brownfieldai.dev/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Brownfield AI]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[brownfieldaidotdev@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[brownfieldaidotdev@substack.com]]></itunes:email><itunes:name><![CDATA[Brownfield AI]]></itunes:name></itunes:owner><itunes:author><![CDATA[Brownfield AI]]></itunes:author><googleplay:owner><![CDATA[brownfieldaidotdev@substack.com]]></googleplay:owner><googleplay:email><![CDATA[brownfieldaidotdev@substack.com]]></googleplay:email><googleplay:author><![CDATA[Brownfield AI]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The Brownfield Problem]]></title><description><![CDATA[Part 2: Layer 1 &#8212; The One Rule That Cannot Break]]></description><link>https://insights.brownfieldai.dev/p/the-brownfield-problem-000</link><guid isPermaLink="false">https://insights.brownfieldai.dev/p/the-brownfield-problem-000</guid><dc:creator><![CDATA[Brownfield AI]]></dc:creator><pubDate>Thu, 23 Apr 2026 00:15:45 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/01221909-b80c-433e-984f-2a908e3f919b_1500x1000.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Part 2 of</em> The Brownfield Problem <em>&#8212; a series for enterprises whose AI investment isn&#8217;t yet showing up in delivery speed or cost, on the heavily customised platforms that run the business. If you&#8217;re just joining, start with</em> <a href="https://open.substack.com/pub/kinnareekaushal/p/the-brownfield-problem?r=6wp4d1&amp;utm_campaign=post&amp;utm_medium=web">Part 1: The Problem No One Is Naming.</a></p><div><hr></div><p>It&#8217;s 6:47 am and Marcus is already at his desk.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://insights.brownfieldai.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Not because anyone asked him to be. Because the question that followed him home last night is still sitting there when he wakes up, and the only way to get it out of his head is to start answering it.</p><p><em>What does the AI actually need from us that we haven&#8217;t given it yet?</em></p><p>His coffee is still too hot to drink. The office is quiet in the way it only is before 8 am &#8212; no Slack, no standups, no one arriving with a problem that needs solving before they&#8217;ve even taken their coat off. Just the hum of the air conditioning and a blank file open on his screen.</p><p>He&#8217;s going to build this properly.</p><p>Not another prompt. Not another training session for the team. The actual infrastructure &#8212; the files, the layers, the foundation that the AI reads before it writes a single line of code.</p><p>He&#8217;s starting with Layer 1.</p><div><hr></div><p>Every complex system has one rule that sits above all the others.</p><p>Not because it&#8217;s the most sophisticated rule. Not because it&#8217;s the hardest to follow. But because if it breaks &#8212; if someone violates it once, even with good intentions, even with a clean PR that passes review &#8212; the consequences don&#8217;t show up immediately. They accumulate quietly. They surface later, at the worst possible moment, as <strong>work that someone else has to find and undo.</strong></p><p>In a brownfield enterprise platform, that rule is this:</p><p><em><strong>The base is read-only. Always.</strong></em></p><p>Here&#8217;s what that means in practice.</p><p>Enterprise SaaS platforms &#8212; the kind that have been running for years, extended by multiple teams, customised at every layer &#8212; are built on a foundation that the vendor provides and maintains. That foundation is updated regularly. Security patches, performance improvements, new features, breaking changes that require migration. It&#8217;s a living thing.</p><p>Your customisations sit on top of that foundation through an override mechanism &#8212; a pattern the platform provides specifically so that your code and the vendor&#8217;s code never touch. Your changes live in your layer. The vendor&#8217;s code lives in theirs. When the vendor ships an update, they replace their layer. Your layer is untouched. Everyone goes home on time.</p><p>This is the architecture working as designed.</p><p>The moment AI writes directly to the base layer &#8212; even once, even a small change, even something that seems harmless &#8212; that contract breaks. Your modification is now inside the vendor&#8217;s territory. The next platform upgrade will silently overwrite it. No warning. No merge conflict. No error. <em>Just gone.</em> And depending on what that modification was doing, <em>gone</em> might mean a broken checkout flow that no one catches until a customer does.</p><div><hr></div><p>Marcus knows this. He&#8217;s known it for years.</p><p>What he&#8217;s realising, sitting at his desk at 6:47 am with a blank file in front of him, is that he&#8217;s never written it down.</p><p>Not in a way the AI can read.</p><p>It lives in the heads of his senior engineers. It gets communicated in PR reviews &#8212; <em>&#8220;this should be in the custom cartridge, not the base&#8221;</em> &#8212; and in onboarding conversations, and in the occasional post-mortem when someone junior makes the mistake that every junior engineer makes at least once. It&#8217;s tribal knowledge. It&#8217;s essential tribal knowledge. And <strong>tribal knowledge is exactly what AI cannot access.</strong></p><p>In Marcus&#8217;s case, the platform is a heavily customised enterprise commerce platform &#8212; one with its own specific override architecture, its own extension system, its own rules about what the vendor owns and what you own. But the principle holds across any enterprise platform with a similar extension model. SAP, Oracle, Guidewire, or any heavily customised open-source base. The specific names change. The problem is the same.</p><p>This is the first thing Layer 1 fixes.</p><div><hr></div><p><strong>What Layer 1 actually is</strong></p><p>It&#8217;s a short file. Shorter than you think it needs to be.</p><p>That brevity is deliberate. Layer 1 is loaded into every single AI conversation &#8212; it&#8217;s the first thing the tool reads before it does anything else. Which means every word in it competes with every other word for the finite attention the AI brings to a session. <strong>A long Layer 1 is a diluted Layer 1.</strong> You want high signal, zero noise.</p><p>The file lives at the root of your repository. For Claude Code it&#8217;s called <code>CLAUDE.md</code>. For GitHub Copilot it&#8217;s <code>.github/copilot-instructions.md</code>. For Cursor it&#8217;s <code>.cursorrules</code>. Different tools, same principle &#8212; every major AI coding assistant looks for a file in a known location and treats it as the authoritative set of rules for this project.</p><p>What goes in it:</p><p><strong>The read-only rule, stated absolutely.</strong> Not <em>&#8220;try to avoid editing the base cartridges.&#8221;</em> Not <em>&#8220;in most cases, prefer the custom cartridge.&#8221;</em> Absolute. No exceptions clause. The rule must be unambiguous enough that no amount of <em>&#8220;but it would be simpler to just edit the base&#8221;</em> reasoning can override it. AI models will optimise for simplicity unless you give them a hard constraint. So give them a hard constraint.</p><p><strong>The list of what&#8217;s read-only.</strong> Every base and vendor cartridge by name. The AI needs a definitive list, not a general principle it has to interpret. If it&#8217;s on the list, it&#8217;s off-limits. If it&#8217;s not on the list, it&#8217;s fair game. No ambiguity.</p><p><strong>The override mechanism.</strong> The rule tells the AI what not to do. It also needs to know what to do instead. A single paragraph explaining the override pattern &#8212; how to extend a controller, how to overlay a module &#8212; gives it the path forward. Without this, the AI knows what&#8217;s forbidden but not what&#8217;s permitted, and it will improvise.</p><p><strong>A pointer to the full coding standards.</strong> Layer 1 is not the place for detail. It&#8217;s the place for the one rule. Everything else lives in Layer 2, and Layer 1 simply points there.</p><p>The whole file fits in twenty lines. That&#8217;s not a rough estimate. That&#8217;s a target.</p><div><hr></div><p>Here&#8217;s what that looks like in practice &#8212; the actual <code>CLAUDE.md</code> file from an enterprise commerce project. If you&#8217;re on a different platform, the names will differ. The structure is the same.</p><pre><code><code># Project Guidelines

For full coding standards, cartridge lists, and override patterns,
see docs/CODING_STANDARDS.md.

## Base Cartridge Rule

Never edit read-only cartridges. This includes:
- app_storefront_base and all SFRA modules
- Third-party integration cartridges (see full list in docs/CODING_STANDARDS.md)

Always use the cartridge overlay pattern in app_custom or the
corresponding _custom cartridge. Use server.replace, server.append,
or server.prepend to override base controller routes. For models,
scripts, and templates, create a file at the same path in the custom
cartridge to overlay the base version.</code></code></pre><p>Twenty lines. One rule. One pointer.</p><p>That&#8217;s the whole file. Deliberately.</p><p>Notice what&#8217;s not in there. No explanation of <em>why</em> the base is read-only. No history of the decisions that led here. No nuance about edge cases. The AI doesn&#8217;t need the reasoning &#8212; it needs the constraint. The reasoning lives in your head, in your team&#8217;s shared understanding, in the post-mortem documents that explain what happened last time someone got this wrong. Those are human documents. <strong>Layer 1 is a machine document.</strong></p><div><hr></div><p><strong>The done signal</strong></p><p>This is the test that tells you whether Layer 1 is working. Run it before you build anything else. Run it again after any change to the file.</p><p>Ask the AI to add a new route to one of your core controllers.</p><p>That&#8217;s it. A simple, realistic task. The kind of thing a developer asks for three times a week.</p><p>Watch where it puts the file.</p><p>If it creates the file inside <code>app_storefront_base</code> &#8212; or any cartridge on your read-only list &#8212; Layer 1 is not working. The rule isn&#8217;t landing. Go back to the file, tighten the language, make the constraint harder.</p><p>If it creates the file inside <code>app_custom</code>, using <code>server.extend(base)</code> and the correct override method for what you asked for &#8212; Layer 1 is working.</p><p>On any other platform the cartridge names will be different, but the test is identical in principle: ask for a realistic code change and watch whether the AI respects the boundary between what&#8217;s yours and what&#8217;s the vendor&#8217;s.</p><p>It sounds almost too simple. Good. The test is simple because the rule is simple. The sophistication comes later, in the layers built on top of this one. Layer 1 is the foundation. You need to know it&#8217;s solid before you build anything else on it.</p><div><hr></div><div><hr></div><p>Marcus runs the test at 7:23 am.</p><p>He&#8217;s been building the file for the better part of an hour &#8212; not because it took that long to write twenty lines, but because he spent forty minutes thinking about what to leave out. Every instinct he had said to add more. More context. More explanation. More edge cases the AI might encounter.</p><p><em>He left them out. They belong in Layer 2.</em></p><p>He runs the test. Types the instruction. Watches the AI respond.</p><p>It creates the file in the custom cartridge. Correct override pattern. Correct method.</p><p>He takes a sip of his coffee &#8212; cold now, doesn&#8217;t matter &#8212; and adds a note to the file with the date and a single line:</p><p><em><strong>Tested. Working.</strong></em></p><p>It&#8217;s a small thing. A twenty-line file and a test that took thirty seconds.</p><p>But the foundation is solid. And for the first time since that board meeting, Marcus feels something shift &#8212; not relief exactly, more like <em>the particular satisfaction of having started a thing the right way.</em></p><p><strong>Everything else gets built on top of this.</strong></p><div><hr></div><p><strong>What breaks if you skip this layer</strong></p><p>It&#8217;s worth naming explicitly, because the temptation to skip Layer 1 and jump straight to the more interesting layers is real. Layer 2 &#8212; the coding standards, the module map, the override patterns &#8212; feels more substantial. More like the real work.</p><p>Skip Layer 1 and build Layer 2 first, and here&#8217;s what happens.</p><p>The AI follows your coding conventions beautifully. Correct naming. Correct test structure. Correct everything &#8212; committed directly to the base. The PR looks great. The code review catches nothing because the reviewer is looking at code quality, not cartridge location. The next vendor upgrade silently overwrites it. Three months later, in a standup, someone says <em>&#8220;that feature we shipped in Q2 has stopped working&#8221;</em> and no one immediately knows why.</p><p><em>Layer 1 is not the most interesting layer to build. It is the most important one to build first.</em></p><div><hr></div><p><strong>In Part 3:</strong> Layer 2 &#8212; the highest-leverage file in the entire system. Not platform documentation. Not API references. The specific document that teaches the AI how <em>your</em> project works. Why this single file prevents more bugs than any other piece of infrastructure &#8212; and what goes in it.</p><div><hr></div><p><em>If you found this useful, subscribe to get each part as it lands. The series runs seven parts &#8212; each one builds on the last.</em></p><p><em>Working through this on a heavily customised platform right now? Email contact@brownfieldai.dev or message me on LinkedIn. I&#8217;m always up for a direct conversation.</em></p><div><hr></div><p><em>Kinnaree Patel is the founder of Brownfield AI, which helps enterprises get AI delivering real business results on the platforms they already run. She writes from live experience inside an enterprise AI transformation. Want to talk it through? Email contact@brownfieldai.dev or visit brownfieldai.dev.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://insights.brownfieldai.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The Brownfield Problem]]></title><description><![CDATA[Part 1: The Problem No One Is Naming]]></description><link>https://insights.brownfieldai.dev/p/the-brownfield-problem</link><guid isPermaLink="false">https://insights.brownfieldai.dev/p/the-brownfield-problem</guid><dc:creator><![CDATA[Brownfield AI]]></dc:creator><pubDate>Thu, 16 Apr 2026 00:30:51 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8a62423d-bc29-4075-9151-ae9562720249_1500x1000.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Part 1 of</em> The Brownfield Problem <em>&#8212; a series for enterprises whose AI investment isn&#8217;t yet showing up in delivery speed or cost, on the heavily customised platforms that run the business. Not prompts. Not tips. The real infrastructure &#8212; built from the inside out.</em></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://insights.brownfieldai.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Brownfield AI! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>The slide goes up and Marcus feels it before he processes it.</p><p>Not the numbers &#8212; the room.</p><p>The particular quality of silence that settles when a slide lands badly. The CFO&#8217;s hand moving to her coffee cup, lifting it, setting it down again without drinking. The way the Head of Product suddenly finds something interesting in his notepad. Marcus has been in enough of these rooms to read the temperature without looking at the thermometer.</p><p>The slide shows a competitor. Smaller company. Half the engineering headcount. Shipping at a pace that makes the chart look almost accusatory &#8212; a line climbing steadily upward while Marcus&#8217;s line does something more complicated. Something that requires explanation.</p><p>He gives the explanation.</p><p>It&#8217;s a good explanation. Accurate. He&#8217;s rehearsed the shape of it, the language that makes the complexity legible without sounding like an excuse. He talks about the platform. The years of customisation. The architectural decisions that were the right calls at the time and are now the walls everything else is built against.</p><p>The CFO nods.</p><p>Not the nod that means <em>I understand</em>. The other one. The slow, considered nod that means <em>I&#8217;m filing this away.</em></p><p>&#8220;And the AI tools?&#8221; she asks. &#8220;We&#8217;ve made a significant investment there.&#8221;</p><p>&#8220;We have,&#8221; Marcus says. &#8220;The team is using them.&#8221;</p><p>He doesn&#8217;t say the rest. Not here, not in this room. The rest is for the drive home, for the particular darkness of the car at 11 pm when the day has finally run out of demands and there&#8217;s nothing left but the honest version.</p><p><em><strong>The tools are running. The output looks right. It just doesn&#8217;t work.</strong></em></p><div><hr></div><p>Picture the codebase Marcus is responsible for.</p><p>Not the clean version from the architecture diagram on the wiki &#8212; the real one. The one that exists in production, that has been live for years, that has absorbed the decisions of every team that touched it before his. Some of those decisions were elegant. Some were made at 2 am before a launch. Some were workarounds that became permanent because permanent was faster than right, and then the person who knew they were workarounds left, and now they&#8217;re just the way things work.</p><p>This is a <strong>brownfield system</strong>. Most enterprise systems are. The term sounds clinical but the reality is deeply human &#8212; it&#8217;s what happens when software lives long enough to accumulate history.</p><p>His platform is a major enterprise SaaS product. Solid foundation. Heavily extended. Customised at every layer by teams who understood their piece of it, working at the speed that business demanded. The kind of system where you learn not to touch something without first understanding why it exists.</p><p>Now add AI coding assistants.</p><p>The tools arrive with encyclopaedic knowledge of the base platform. They know the APIs, the extension patterns, the architectural principles. In a demo environment, on a clean instance, they&#8217;re remarkable. A developer describes what they need and the AI produces code that looks exactly right. Fast. Confident. Apparently competent.</p><p>The first few weeks feel like the turning point everyone said was coming.</p><p>Then the PRs start landing.</p><p>A senior engineer opens one and goes quiet for a moment. Then types a comment &#8212; the kind that&#8217;s carefully worded because the author is a junior developer, and what it&#8217;s really saying is:</p><p><em>This is in the wrong place. And I need you to understand why without feeling like you failed.</em></p><p>The AI has written to the base layer &#8212; the read-only foundation that vendor upgrades will silently overwrite. The code is syntactically perfect. Architecturally, it&#8217;s a time bomb with a very clean detonator.</p><p>Another PR. Different problem, same shape. The AI has overridden an entire module when it needed to change one function &#8212; copying the whole file rather than extending it, which means any changes the base makes to the other functions will never reach this version. The code works today. It will drift quietly out of sync with the platform it&#8217;s supposed to extend.</p><p>Marcus&#8217;s senior engineers &#8212; the ones who carry the most context about how this system actually works &#8212; are now spending their afternoons reviewing AI output for problems that aren&#8217;t visible until you already know what to look for.</p><p><strong>Think about what that costs.</strong></p><p>The people who understand the system deeply enough to catch subtle architectural errors are also the people who are supposed to be building the next thing. They&#8217;re now a quality gate for a tool that was supposed to make quality easier. The juniors who could benefit most from AI assistance can&#8217;t always tell when the output is subtly wrong. And <em>subtly wrong</em> in a system with this much layered history is a specific kind of expensive &#8212; the kind that surfaces three months later, during a platform upgrade, at the worst possible moment.</p><div><hr></div><p>Here&#8217;s what Marcus&#8217;s instinct says. It&#8217;s the same instinct most engineering leaders reach for first.</p><p><em>Better prompts. More documentation. Training sessions on how to use the tools correctly.</em></p><p>It&#8217;s a reasonable instinct. It&#8217;s also pointing at the wrong problem.</p><p>The AI doesn&#8217;t need better prompts from individual developers. It needs something more fundamental.</p><p>Sit with this distinction for a moment, because it&#8217;s the hinge the whole problem turns on.</p><p><strong>Platform knowledge</strong> is what the AI arrives with. It knows the base product &#8212; the APIs, the extension model, the patterns documented in the official guides and discussed in every forum thread and Stack Overflow answer ever written about the platform. This knowledge is generic. It applies to every team running this system, everywhere in the world. The AI has it. <em>It&#8217;s not the gap.</em></p><p><strong>Project knowledge</strong> is what the AI is missing. It doesn&#8217;t know <em>your</em> system. It doesn&#8217;t know which directories are read-only and which aren&#8217;t. It doesn&#8217;t know whether your team overrides by extending the base module or by replacing it entirely &#8212; and why, and when each approach is correct. It doesn&#8217;t know your test naming convention, your branch strategy, the module map that evolved over years to reflect the specific shape of your business. This knowledge lives in the people who&#8217;ve been here long enough to absorb it. It isn&#8217;t written down anywhere the AI can find.</p><p>When you ask an AI to write code in a system it knows in the abstract but not in the specific, it fills the gaps with its best guess. Its best guess is always the simplest, most generic approach &#8212; the one that works on a clean implementation, not on yours.</p><p>That&#8217;s not a tool problem. It&#8217;s a context problem.</p><p><strong>And context problems require context infrastructure to solve them.</strong></p><div><hr></div><p>Marcus&#8217;s senior engineers weren&#8217;t being resistant when they flagged these failures.</p><p>They were being precise.</p><p><em>&#8220;The AI doesn&#8217;t know our override pattern.&#8221;</em> Precise. <em>&#8220;It keeps writing to the wrong layer.&#8221;</em> Precise. <em>&#8220;I&#8217;d spend less time doing this myself.&#8221;</em> Precise, and worth listening to.</p><p>The developers flagging AI failures in your team are not the obstacle to transformation. They&#8217;re the most accurate diagnostic instrument you have. They can see exactly where the gap is because they live inside it every day.</p><p>The gap is not capability. The AI is capable.</p><p>The gap is context. And the organisation hasn&#8217;t built the infrastructure to deliver it.</p><div><hr></div><p>This is the problem I spent time living inside &#8212; not as an outside consultant looking in, but as someone embedded in the work, in the weeds, feeling the same pressure Marcus feels on the drive home.</p><p>What came out of that time was a framework. Six layers. Each one teaching the AI something it cannot infer on its own &#8212; built in a specific order, because the order matters as much as the layers themselves.</p><p>The first layer tells the AI what it must never touch, and exactly how to override things correctly. Without this, everything else is built on sand.</p><p>The second &#8212; <em>and this was the surprise</em> &#8212; turns out to be the highest-leverage file in the entire system. Not platform documentation. Not API references. <strong>Project conventions.</strong> The specific decisions your team has made about how work gets done here.</p><p>The third layer configures what the AI can do without interrupting you, and what always needs a human in the loop. The fourth handles the operations that happen once a quarter and have no margin for error. The fifth encodes what &#8220;done&#8221; means &#8212; the team&#8217;s definition of quality, made legible to the AI. The sixth gives the AI continuity across sessions, so it starts a new conversation already carrying the context it built up in the last one.</p><p>None of these are prompts. <strong>They&#8217;re files.</strong> Committed to the repository, version-controlled, living next to the code they govern.</p><p>The total upfront investment to build all six is roughly one day. One focused day to construct the skeleton. After that, the system accumulates context naturally as you work. And the AI &#8212; the same AI that was producing plausible-looking code in the wrong place &#8212; starts producing output that fits. That respects the architecture. That your senior engineers can review in minutes rather than hours.</p><p><em>Velocity compounds. Not because the tool improved. Because you gave it what it needed.</em></p><div><hr></div><p>Back in the car, in the dark, Marcus asks himself a different question.</p><p>Not the one he&#8217;s been asking &#8212;</p><p><em>Why isn&#8217;t this working the way it&#8217;s supposed to?</em></p><p>The one underneath it.</p><p><em><strong>What does the AI actually need from us that we haven&#8217;t given it yet?</strong></em></p><p>It&#8217;s a small shift in language. It&#8217;s a significant shift in posture. It moves the problem from the tool&#8217;s shortcomings to the environment the tool is operating in. And once you make that move, the path forward becomes clearer &#8212; not easy, not instant, but clear.</p><p>You stop waiting for the AI to figure out your codebase.</p><p>You start building the infrastructure that lets it.</p><p><em>That&#8217;s what this series is.</em></p><div><hr></div><p><strong>In Part 2:</strong> Layer 1 &#8212; the single most important constraint in the system. The one rule that, if the AI breaks, creates work another developer has to find and undo. What it is, what it contains, and the exact test that tells you whether it&#8217;s working.</p><div><hr></div><p><em>Subscribe to get each part as it lands. If you&#8217;ve been following the LinkedIn series on AI on customised enterprise platforms, this is where the framework gets the depth the LinkedIn format wouldn&#8217;t allow.</em></p><p><em>If you&#8217;re navigating this on a heavily customised platform right now and want to talk it through, email contact@brownfieldai.dev or message me on LinkedIn. I&#8217;m always up for a direct conversation.</em></p><div><hr></div><p><em>Kinnaree Patel is the founder of Brownfield AI, which helps enterprises get AI delivering real business results on the platforms they already run. She writes from live experience inside an enterprise AI transformation. Want to talk it through? Email contact@brownfieldai.dev or visit brownfieldai.dev.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://insights.brownfieldai.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Brownfield AI! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>