Prakash Poudel Sharma

Programmer, Founder, Product Owner.

Engineering Manager at Varicon, leading the Onboarding squad as Product Owner. Eleven years of building software โ€” first as a programmer, then as a founder, now sharpening the product craft from the inside of a focused team.

Find me at
Prakash Poudel Sharma
11+ years shipping EM @ Varicon

The journey

From Programmer to Founder, now Product Owner.

Eleven years of building. Each chapter sharpened a different muscle.

  1. Software Engineer

    Leapfrog Technology ยท 2014 โ€” 2017

    Three years across Rails, React, and React Native. Intern โ†’ tech lead.

  2. Founder

    Truemark ยท 2017 โ€” 2025

    Founded and ran a product engineering studio for eight years. Wound it down to focus on a single product team.

  3. CTO

    Intelliante ยท 2022 โ€” 2024

    Built and led the engineering team that took an HR-tech platform from zero to production.

  4. Engineering Manager ยท Product Owner

    Now

    Varicon ยท Onboarding squad ยท Nov 2025 โ€”

    Leading the Onboarding squad โ€” sharpening product judgement from the inside of a focused team.

Now

What I'm focused on this season.

Updated regularly ยท inspired by nownownow

Shipping at Varicon

Leading the Onboarding squad as Engineering Manager + Product Owner. Roadmap, rituals, recruiting.

Updated May 2026

Exploring agent UX

Claude Code hooks, design.md as the agent's memory, task-prompts as muscle memory. Building the toolkit I wish I had.

Updated May 2026

Listen

Latest essay, in your ears.

Audio companions to selected essays. Generated, then loudness-normalized and published as a GitHub release.

Podcast 58:45 Read the essay โ†’

Not on Claude? The Cross-Tool Configuration Guide

The concepts in this series aren't Claude-specific. Every major AI coding tool has a configuration layer. Here's how they map โ€” and what Windows and Linux users need to know.

Read transcript
# Transcript โ€” ai-coding-setup ep 05 _Auto-generated with mlx-whisper (mlx-community/whisper-base.en-mlx). Lightly readable; not edited._ You know, there is this incredibly visceral, frustrating moment that I think, um, basically every working software developer is intimately familiar with right now. Oh, absolutely. The context switch. Yes, exactly. You spend three or four months working with one AI coding assistant, let's say you're deep in the cloud ecosystem, or, you know, you're a heavy cursor user, right? And you've got it perfectly meticulously tuned. It knows your Monorepo architecture. It knows your formatting quirks. It knows exactly how you, like your unit tests, mocked out. Exactly. It basically has a tailored persistent brain for your specific project. But then inevitably you switch contexts. Yeah, you join an enterprise project that strictly mandates GitHub co-pilot, you know, for compliance and data residency reasons. Right. Or maybe you just spin up a weekend side project and decide you want to try out Windsor for Aider. And suddenly you are completely back to square one. That's painful. It is. You have this incredibly powerful large language model at your fingertips, but it's acting like an amnesia junior developer. Making beginner mistakes, hallucinating legacy patterns. And you find yourself staring at your monitor thinking, I just spent an entire quarter teaching my other tool how to navigate this code base. Why on earth do I have to rebuild this AI's brain from scratch? It is the absolute definition of redundant friction in modern development. Yeah. I mean, you're effectively taking all the hard one highly contextual metadata about your software architecture and just throwing it in the trash because the logo on the chat window changed. Yeah. And the irony is the underlying models are often exactly the same. You're just hitting a different API endpoint through a different user interface. Yeah. But because that configuration layer didn't transfer, the model's behavior regresses entirely. Exactly. And that is the core architectural problem we are tackling today. Our mission for this deep dive is to map out the universal tool agnostic configuration layer that exists across all the major AI coding assistants in the current landscape. We are going to look under the hood at how rules, permissions, system prompts, and lifecycle hooks actually translate across these disparate environments. Specifically analyzing plot code, cursor, GitHub co-pilot, WinSurf, and Adre. And because we know the development world doesn't run exclusively on macOS. Hopefully. We're also going to get deep into the weeds on the specific edge cases, pathing issues, and silent failures for Windows and Linux developers. Which is a crucial layer to understand because the reality of modern software engineering is that teams are heterogeneous. Yeah. You might be the lead architect on a Mac running one specific tool. But your senior backend engineer is on a Windows machine running WSL2 with a completely different assistant. Right. And your DevOps lead is on native Linux. Exactly. If the repository's AI configuration doesn't translate seamlessly across those operating systems and tool sets, the team's velocity just fragments. You end up with one developer whose AI writes perfect code and another whose AI is actively introducing technical debt. It's a nightmare. It really is. And to set the tone for you listening, we are keeping things conversational today. But admittedly, we are getting a little dry and highly technical. No hype today. No hype at all. We are stripping away all the AI hype. There will be no philosophical debates about artificial general intelligence taking our jobs. We are focusing purely on the practical day to day working developer realities of configuring these systems. We are looking at the foundational mechanics, treating the code base realities as our absolute ground truth for how this ecosystem operates right now. Because at the end of the day, the underlying mechanics of context, injection, and prompt construction are what actually dictate whether these tools save you three hours a week or cost you three hours a week and debugging. Okay. Let's unpack this. If we look at the architecture underlying all of these tools, there is something fundamental that you have to realize before you write a single line of configuration. Yeah, despite the fact that the file names are completely different. Right. One tool uses a dot rules extension. Another uses a dot MDC extension. And the JSON keys to trigger them are completely different. Exactly. But the foundational configuration architecture is actually identical across the board. It is a unified design pattern that always breaks down into three core layers of specificity. So first, you have the global layer. Right. This is for your personal system wide preferences across every project you touch on your machine. Second, you have the project layer. This lives alongside the code base, usually in version control, and dictates how the entire team operates within that specific repository. And finally, you have the local override layer, which is strictly for personal secrets, API keys, and local environment specifics that should absolutely never be committed to get. Please do not commit those to get. Never. And understanding that specific three layer hierarchy is the prerequisite for everything else we are going to discuss regarding file structures. Because once you realize that every single tool is just implementing some variation of that global project and local override stack, you stop seeing five different confusing configuration language. Yeah. You start seeing one universal inheritance pattern. The tool might call it a different name or store it in a nested hidden directory versus the project root, but the intent of the layer. How it overrates the layer above it in the configuration object memory. Exactly. That remains exactly the same. So let's establish the high level mapping of these concepts. When you look at the matrix of Claude Code, cursor, GitHub co-pilot, WinSurf, and Ador, and you evaluate how they handle project rules, global rules, team permissions, personal overrides, and lifecycle hooks. You immediately see a mass of divergence. Yeah. You see exactly where the industry has standardized and where it is still wildly fragmented. The standardization is almost entirely concentrated in the rules layer. Every single one of those tools has a robust concept of project level rules and global level rules. They all fundamentally understand that the language model needs to be instructed on how to behave within a specific repository structure. And how to accommodate a specific user's stylistic preferences. Right. But when you move across the matrix to team permissions, local overrides, and especially execution hooks, meaning session start hooks or post-write compilation hooks. Yeah. That is where the unified front completely falls apart. Yeah. Right now, robust execution hooks and highly granular team permissions are almost entirely Claude Code specific. If you look at cursor, co-pilot, and WinSurf, their capabilities for defining granular team permissions, like, you know, what specific shell commands the AI is allowed to execute without prompting the user. Or their ability to run an initialization script the moment the AI boots up. Right. Those basically don't exist in the configuration files. They are missing surfaces. Which naturally brings up a critical question about safety, isolation, and context orientation. Yeah. If Claude uses a dedicated version controlled settings file to manage granular team permissions. Defining exactly which NPM scripts or Docker commands, the AI is allowed to run autonomously. How on earth are the other tools operating safely without that? The reality is that they handle safety through completely different architectural paradigms. Okay. Like what? Well, instead of relying on a granular permission file, they rely on heavily sandbox environments. Or they maintain internal, opaque trust scores based on previous interactions. Or they simply default to a strict human in the loop chat interface, where the language server intercepts every single tool call payload, the LLM generates. Forcing the user to manually click approve in the UI for every single file, right, or terminal command. Exactly. I have to push back on that though from a purely developer experience standpoint. Okay. Go ahead. If these tools are missing lifecycle hooks and they are completely missing granular configuration for file system permissions, aren't they fundamentally broken as autonomous agents? Broken is a strong word, but I hear what you're saying. I mean, is it like having a self-driving car without a destination programmed in, where the user has to constantly grab the steering wheel every time there's an intersection? Right. If I have to manually approve every single file edit, or if I have to manually orient the AI to my current Git branch every single time I open my laptop, what is the actual point of the automation? At that point, the AI is just a really fast typist that I have to babysit. If we connect this to the bigger picture, we have to remember that these gaps in the configuration matrix aren't permanent architectural flaws. Okay. They simply reflect the current highly volatile state of the configuration surfaces for each tool. I mean, the industry is moving at a breakneck pace. That's true. 18 months ago, the idea of a universal cross-team project rules file barely existed. Mm-hmm. Everyone was just copy-pasting text into the chat window. Oh, man, I remember those days. Right. Today, project rules are the baseline standard. The lack of lifecycle hooks in a tool like Copilot or WinSurf doesn't mean the engineers building those tools. I think initialization hooks are a bad idea. It just means their specific configuration layer hasn't matured enough to expose that sub-process functionality to the end user yet. Exactly. Safety and context orientation are just being handled via UI friction right now, rather than configuration files. But that will inevitably converge. That makes sense. It's an evolutionary stepping stone. And to really understand how these tools apply these configuration layers in their current, most mature state, we need to look at the tools that have moved past single monolithic files. Right. And adopted a folder-based rule system. Because programmatically, that is the most advanced iteration of context management right now. And the prime example of that architecture is cursor. Yes. cursor's configuration system is deeply natively integrated into the file system structure. It explicitly rejects the idea of a single massive configuration file. Instead, its rule system lives in a dedicated hidden directory. Specifically, it looks for a directory named dot cursor slash rules situated perfectly at your project route. And the files you put inside that directory aren't just your standard run-of-the-mill markdown files, right? They use a very specific extension and syntax pattern. Correct. These are dot MDC extension. That stands for markdown for cursor. Structurally, these are essentially just markdown files. But they are parsed differently by the IDE. They have the ability to include yaml front matter at the very top of the file separated by triple dashes. And that yaml front matter is the absolute secret sauce for cursor's context engine, isn't it? Oh, absolutely. Because it contains a globs array that controls exactly when a specific rule is injected into the language models prompt. This is the globscoping feature. Let's really dig into the mechanics of this. Because this is a massive differentiator for how context is managed. What exactly is happening under the hood when you scope a rule to a glob in this context? Well, as we know, a glob is standard pattern matching syntax used constantly in build tools and pipelines to specify a set of files using wildcards. Right. So in your dot MDC file, instead of writing a blanket rule for the whole project, you write a glob pattern in that yaml front matter that says, for example, apply this only to files matching a specific path pattern. Like pointing it only at your backend services folder. Exactly. What happens next is crucial. When you are chatting with the AI, the IDE's internal file watcher is constantly tracking your active editor tabs and the files you mentioned in your prompt. If and only if the AI's attention is directed toward a file that matches that specific glob pattern, the IDE dynamically reads that dot MDC file from the disk. And appends its contents to the system prompt hidden behind the scenes. Yes. So the rule only wakes up programmatically speaking, when the AI is explicitly looking at a relevant file. Exactly. It operates on conditional context injection. If the AI is refactoring your frontend react components, the rule file detailing how to handle database connection pooling in your backend services is completely ignored. It is never loaded into memory. Never. Glob scoping ensures that the AI doesn't even see the database rules while it's working on the UI layer. This is fundamentally identical to how Claude code utilizes topic specific markdown rules. It relies on a retrieval based layering principle where instructions only load when semantically relevant to the active execution context. Exactly. But what if you don't include that YAML front matter? What if you just drop a plain standard dot MDC file into that folder without any globes defined? If the parser doesn't find a globes array, it falls back to a global scope for that project. The rule is injected into the system prompt for every single interaction, regardless of what file you are editing. It becomes a ubiquitous, inescapable constraint across the entire repository. Which is incredibly useful for high level foundational architectural conventions. Like always use strict typing or never use relative imports. Right. But it is incredibly dangerous if overused. Very dangerous. And that danger brings us directly to the concept of the rule budget, which is heavily emphasized in best practices for these folder based systems. The documentation notes that individual dot MDC rule files function best if they're ruthlessly edited down to under 80 lines. But more importantly, the total rule budget, the aggregate amount of text that cursor will dynamically load into a single session via these globes is finite. Ollie finite. Once you exceed roughly 10,000 tokens of active rules, the model's actual coding quality degrades significantly. We need to explain why that happens. Okay. What is actually going on inside the LLM architecture that makes 10,000 tokens the breaking point for behavioral fidelity? It comes down to the mechanics of context limit saturation. And how the attention mechanism inside a transformer model actually works. Right. Every large language model operates within a context window. You can think of it as the model's active short term working memory for the current execution threat. Okay. So it's like a buffer. Basically. Every piece of code you highlight, every message in the chat history, and crucially, all the background system rules and project files injected by the IDE have to be tokenized and held in that memory space. Specifically within what's called the KV cache or key value cache. Right. And the token is roughly three quarters of an average English word or semantic chunk of code. So 10,000 tokens of just rules is a massive amount of baseline text to hold in working memory. We're talking about maybe 30 or 40 pages of dense technical documentation injected before the user even says hello. Precisely. And when you dump 40 pages of complex conditional instructions into the KV cache before the AI is even given its primary task, you overwhelm the attention matrix. Because it's trying to process all of it at once. Exactly. The model has to calculate the relevance of every single token against every other token. As the context window fills up, the mathematical distribution of that attention flattens out. It becomes harder for the model to distinguish the core critical instruction from the background noise. Right. It suffers from a well documented architectural flaw called lost in the middle syndrome. I've seen this happen. It remembers the very first instruction in the system prompt. And it remembers the very last thing you typed in the chat. But it completely ignores the three paragraphs of routing logic in the middle of the rule file. Exactly. It's like giving a newly hired junior developer a 500 page operational manual on their very first morning. Oh, wow. And saying, I need you to memorize this perfectly. Hold all of these conflicting edge cases in your head simultaneously and apply them flawlessly while fixing this highly specific off by one error. The human will panic, forget things, misinterpret constraints, and ultimately lose focus on the actual bug. In the AI behaves the exact same way. The fidelity of its reasoning degrades. The more rules you load into the prompt, the less intelligent and capable the underlying model appears to be. That is such a vital counterintuitive concept for you listening to internalize. More configuration does not equal better AI performance. In fact, beyond a certain threshold, adding more rules actively destroys the model's cognitive capability. So that glob scoping feature and cursor isn't just a neat way to organize your files. It is a critical load balancing mechanism for preserving the AI's compute budget. You use glob specifically to ensure that only the strictly necessary rules are consuming space in the KV cache at any given time. Precisely. You are managing the model's attention span. And just to round out the architectural view of cursor, while those conditional project specific rules live in the dot cursor slash rules directory, cursor handles the top layer, the global rules completely differently. Right. Global rules, which are the behavioral constraints that apply across every single project you open in the IDE, are managed via the cursor settings UI under the rules for AI section. There is no global dot MDC file equivalent sitting in your local user directory. No, there isn't. Here's where it gets really interesting to me regarding the actual formatting of these files. We're talking about YAML and globs and KV caches. But if you strip that away, the documentation explicitly highlights that you don't have to overthink the syntax of the rules themselves. If you aren't using the conditional glob scoping, plain Markdown works perfectly. You don't need to write your behavioral constraints in some arcane, heavily nested JSON structure or strict pseudocode. Right. The model natively understands Markdown headers. It parses bulleted lists perfectly. It can read tables. You literally just write plain English instructions, which is a beautiful paradigm shift. It lowers the barrier to entry significantly. You don't have to learn new configuration language. You're essentially just writing standard high quality developer documentation that happens to be parsed and executed by a machine instead of read by a human. But as we mentioned earlier, when looking at the matrix, not every tool supports this granular, multi file folder based layering that cursor has. Kershaw lets you break your architectural guidelines into dozens of tiny bite sized conditionally loaded files. But how do developers manage this context budget when they are strictly restricted to a single monolithic file? Because that is the harsh reality for teams heavily invested in GitHub, co-pilot and WinSurf. It is a fundamentally different engineering challenge. Let's examine GitHub co-pilot's architecture first. Okay. Co-pilot relies almost entirely on a project level instruction file located within the dot GitHub folder. It is a single flat Markdown file period, right? And it is parsed and read universally across the entire co-pilot ecosystem, whether you are using the co-pilot chat panel in VS code, interacting with the inline agent in the editor, or even prompting co-pilot directly on the GitHub web interface. And WinSurf is operating in the exact same architectural boat, right? Yes. It looks for a specific file called dot WinSurf roles sitting at the absolute root of the repository, also just a single flat Markdown document. Exactly. And for both of these tools, just like Kershaw, the highest layer the global instructions are handled via their respective application UI settings, rather than a localized file on your hard drive. Yes. And because neither co-pilot nor WinSurf currently supports feature level topics blitting or dynamic glob scoping based on file focus, the architectural discipline required from the developer is an order of magnitude higher. Oh, absolutely. When you only have one file to work with, the natural developer temptation is to treat it like a junk drawer. Yeah, just dump everything in there. Right. Every single coding convention, every legacy quirk, and every API key format. But we just walk through the mechanics of the token budget and context limit saturation. If you dump your entire team's wiki into one flat file, that entire file gets loaded into the prompt on every single interaction. And you will instantly permanently degrade the model's reasoning capabilities for that session. So how do you practically handle it? If I can't scope rules conditionally based on what file I'm editing, how on earth do I communicate complex multi service architectural guidelines to co-pilot without completely blowing out the KV cache? You have to adopt a very specific minimalist configuration discipline. First, keep the instructions aggressively short. Second, ensure you provide exactly one canonical answer per architectural question. And third, and this is by far the most crucial design pattern for managing flat file configurations. You must utilize the reference don't include pattern. Reference don't include you point to external documentation. You absolutely do not paste the contents of that documentation in line. Okay, I want to visualize that. What does that pattern actually look like in a dot one Let's say you have a complex authentication flow, right? Instead of writing out a 50 line step by step rule detailing how your JWT middleware works, how tokens are refreshed, and how cookies are signed, your flat rules file should simply state something like for all authentication patterns, read the external architecture document and provide the path to that document. Exactly. Ah, I see. So you give the AI a map, not the actual territory. That's a great way to put it. You are telling it where the deep context lives in the file system, and you are relying on the AI agent's own internal tool calling capabilities to fetch and read that specific file only when the user's prompt explicitly triggers the need for it. Exactly. It operates as a semantic pointer. This pattern completely preserves your baseline token budget, keeping your system prompt lean and fast while still providing the agent a defined pathway to retrieve the deep context when the execution flow requires it. It leverages the AI's ability to utilize retrieval augmented generation or Raja dynamically. Yes, precisely. But there is a massive glaring pain point with co-pilot specifically when it comes to context orientation that we need to address. Ah, yes. The life cycle hooks. We talked earlier about how these tools lack the life cycle execution hooks that Claude Code possesses. Co-pilot specifically has absolutely zero life cycle hooks. Zero. It cannot run a script when it moods up. And because of that architectural limitation, orientation context, meaning vital metadata like what Git branch you were currently on or what specific Jira ticket you were trying to resolve has to be fed into the AI's context window entirely manually. Yeah. You either have to type it out into your chat prompt at the start of every single session, or you have to manually open that flat markdown file and physically update a current focus section at the top of the document, which is undeniably a massive source of developer friction. I mean, doesn't maintaining a current focus section manually, completely defeat the fundamental premise of having an autonomous coding assistant? It feels like it. Yes. Yeah. If I have to context switch, open a markdown file, type out, I am currently working on resolving the race condition in the user logging component, save the file, close the file, and then finally ask the AI for help. I've just done the exact administrative state management work that the AI is supposed to be doing for me. Why would any senior developer accept that workflow? Your skepticism is entirely valid. The friction is very real and it breaks flow state. But until pre session life cycle hooks are universally adopted across all language servers and IDE integrations, it is literally the only reliable deterministic way to establish session orientation without severely polluting the chat prompt every single time you hit enter. Think about the alternative. If you don't put that state information into the instructions file, you have to prepend every single message in the chat panel with given that I am on this specific brand and I am working on this specific task. Exactly. By putting it in the flat file once, you establish a persistent baseline context for that entire working session. Yes, you pay a context switching tax to update it manually when you move to a new task, but it saves you from having to repeat yourself 50 times during the actual coding implementation. So it's the lesser of two evils. You pay a small manual tax upfront to avoid a continuous compounding manual tax during the intense focus of the session. Precisely. It is a necessary, albeit clunky, workaround for a missing configuration surface. Okay, so if flat files like co-pilot and Windsor feel a bit rigid and manual and cursor feels deeply tied to its specific proprietary ID ecosystem, what about the developers who live entirely in the terminal? The purists. The CLI purists, exactly. Because there is one tool that fundamentally embraces the configuration file mentality above all others catering specifically to them. And that is Ader. Yes, Ader operates on a completely different architectural philosophy. Because it is a native command line tool, not an IDE extension. Its configuration hierarchy heavily reflects the realities of terminal based workflows. It doesn't rely on hidden IDE folders. No, it reads its configuration from multiple sources across the system in a very strict deterministic priority order. I've used Ader and honestly, the way it resolves configuration feels a lot like CSS specificity to me. Oh, that's a good comparison. In web development, you have global style sheets. But if you apply an inline style directly to an HTML element, it overrides the global rule because it is physically closer to the element being rendered. It seems like Ader uses that exact same proximity based logic. But how exactly does it resolve those conflicts? If my project configuration contradicts my global configuration, that CSS specificity analogy is absolutely perfect for understanding Ader's execution flow. When Ader initializes a session, it builds a configuration object in memory. According to its architecture, it looks first at the global layer, which is in the user directory. Right, it parses that global yaml file and loads it into the object. Next, it looks for a project scoped yaml file located in the specific project root where the terminal is currently executing. If it finds one, any keys in this project scope configuration will overwrite the corresponding keys from the global file. And finally, the highest priority layer. It purses the command line flags you pass when you executed the tool. Those flags act as session scoped ephemeral overrides. So the closer the command is to the actual execution session, like a CLI flag, you literally type right before hitting the return key, the more weight it carries in the final configuration object. Exactly. A CLI flag will always mathematically win out over a project config, which will always win out over a global config. Makes sense. But there is a very important structural distinction to make here regarding the actual file formats Ader uses. We've spent this entire time talking about markdown files for cursor, co-pilot, and windsurf. Right. Ader uses strict yaml for its tool configuration file. Right, the yaml config file. That's where you define things like which model to use or what your API keys are. Yes. However, for actual behavioral rules, the architectural conventions, the coding styles, the things you want the AI to follow when generating code data doesn't want you stuffing paragraphs of text into a nesting yaml string. Oh, that would be horrible. That would be a nightmare to read and maintain. Instead, it expects a separation of concerns. It looks for a standard markdown file to serve as the system prompt context. By community convention, this is often named conventions.md. Or frankly, it can be any markdown file you explicitly tell the agent to read by passing a specific read flag in the CLI upon startup. Exactly. So Ader rigorously separates the tool configuration, the machine readable yaml from the coding conventions, the human readable markdown. Exactly. This separation is architecturally closest to how Claude code utilizes a dedicated markdown file for conventions. It provides a plain text document that the agent ingests strictly as reference material, completely decoupled from the operational settings of the tool itself. Now, I have a question about hooks within Ader because I know it has a very specific feature here. The documentation mentioned the specific pre commit flag. Yes. But if Ader operates from the terminal alongside standard git workflows, doesn't that pre commit flag bypass standard Husky git hooks? Is that Ader's version of a session start hook? Or does that not cause a massive race condition with the repository's native git hooks? That is a phenomenal question. And it highlights a crucial architectural distinction. The pre commit flag in Ader is absolutely not a session start hook. Okay. It does not run when you boot up the tool. Instead, it functions as an internal commit gate. It runs a specified shell command immediately before Ader itself attempts to execute a git commit on the code it just generated. Oh, I see. And to answer your question about race conditions, it runs prior to the standard get lifecycle. So Ader writes the files, Ader executes its own pre commit command. And if that passes, Ader triggers git commit, which then triggers any Husky hooks defined in the repo. Ah, okay. So you could use Ader's pre commit flag to run a fast linter or a specific unit test suite, automatically verifying the code before Ader is even allowed to hand the payload off to the version control system. Exactly. It's a post right safety mechanism. It's an automated quality gate, not an orientation mechanism. Right. If you want context orientation in Ader, like we discussed with copilot's current focus problem, you still face the exact same manual friction. You have to manually update that conventions markdown file, or you have to pass a dedicated context file via the command line every single time you spin up a new session. So we have mapped out quite a disparate, heavily fragmented landscape here. We've got cursor relying on hidden IDE folders and globscope.mdc files, forced dynamically by file watchers. We've got copilot and windsurf anchored to massive monolithic single flat file markdown documents utilizing Rago. Exactly. And we've got Ader acting like a terminal purist splitting the difference with strict yaml configurations and separate markdown convention files driven by CLI flags. It's a lot. For you listening, if you are a platform engineer managing a massive open source project, or if you're trying to standardize an enterprise code base with 200 developers using completely different workflows, this sounds like an absolute logistical nightmare. Oh, it really can be. Is there any unified overarching standard emerging so we don't have to maintain five different file types and duplicate our architectural rules just to ensure everyone's AI agent behaves the exact same way? Yes, there is. And it's emerging entirely organically, which is quite fascinating from an industry perspective. There is a convention rapidly gaining intense traction across the ecosystem. Agents.md. Agents.md sitting right at the repository root. Where exactly did the standard come from? Because no single company owns that format. No, it wasn't handed down by a standards committee was initially popularized by OpenAI's codecs projects. And it is increasingly being recognized and parsed natively by advanced agent runtimes like Hermes and various autonomous dev agents. It acts as the emerging neutral ground. Exactly. If a contributor specific tool doesn't have a rigidly named config file requirement like cursors.mdc or if you simply want to provide a robust universal set of architectural instructions for random AI tools, you can't predict. Agents.md is becoming the definitive fallback standard. And what actually goes into an agents.md file? Is it just a free for all tech stump or is there a schema? It is highly structured. It follows a very specific convention designed to optimize token usage and context parsing. The format is practically identical to a well structured cloud specific markdown file. Okay. It relies on a standardized five section architectural structure. Let's break those five sections down technically because if this is the emerging universal standard, developers need to know exactly how to author it. So the LLM parses it correctly. The five sections are designed to build context sequentially. First, a stack overview. Right. This is a brief high level summary of the core technologies. You know, this is a next JS 14 project using app router, tailwind and super base. Keep it high level. Yeah. Second, where things live. This is a semantic map of the project's directory structure. I want to pause on that one. Why does the AI need a map of where things live? Can't just look at the file system. That's a common misconception. LLMs don't possess an innate intuitive index of a file system tree. They cannot see your folders. Oh, yeah. Unless they are actively executing shell commands to list the directory contents, which takes time and consumes tool call tokens. They are blind. Oh, that makes so much sense. By explicitly providing a semantic map in the agents.md file, you are pre caching the routing logic. You are telling the AI exactly where the database models are versus the front 10 components, saving it from having to blindly guess or waste compute cycles, searching the directory tree. That is huge. Okay. What's the third section? Third is conventions. These are the specific coding styles, naming conventions and architectural rules like always use it really returns or all interfaces must be pre fixed with a capital I. And fourth, fourth is what we call the before you touch read this table. I absolutely love that section. That is where you bury the traps. The weird legacy workarounds that have been in the code base for three years that will completely break the production environment if the AI tries to helpfully refactor them without understanding the historical context. Precisely. It is high priority operational intelligence. It's defensive programming against the AI's tendency to over optimize. Right. And finally, the fifth section, explicit anti patterns. What not to do? Oh, the anti patterns. Yeah. These are things the AI might naturally try to implement because they are statistically very common in its massive internet training data. But which are strictly forbidden in your specific code base environment. But wait, let's look at the practical implementation of this. If I have a team where half the developers are heavily invested in cloud code, which specifically aggressively looks for a cloud specific markdown file. Yeah. And the other half are using open source tools that look for agents.md. Don't I still end up having to maintain two physically separate files? Won't they inevitably drift out of sync the moment someone updates a convention? Not if you utilize some links. This strategy is explicitly highlighted as the elegant solution for cross tool compatibility. Platform teams can maintain both a tool specific file and a universal agents.md file by creating a symbolic link at the operating system level. So you write the actual markdown content exactly once, save it to disk as agents.md. And then you execute a command to create a sim link named whatever the specific tool requires. That points directly to the exact same inode on the disk. It entirely fundamentally avoids data duplication. I have to play devil's advocate here, though, because I've dealt with sim links and cross platform teams. How does that interact with it? Oh, it can be tricky. Because if a developer on a Mac commits a sim link and a developer on Windows clones that repo, Windows historically handles sim links very poorly unless developer mode is enabled. Doesn't committing a sim link potentially break the configuration for a team member on a different OS? That's a very astute, highly technical edge case and you are correct. Oh, okay. If you were operating in a mixed Mac OS and Windows environment, committing sim links can cause checkout failures or result in plain text files contained the sim link path rather than the actual link. That's a mess. In those specific cross platform enterprise environments, the fallback strategy is to rely on the reference don't include pattern we discussed instead of a sim link, your tool specific file simply contains one line. Read agents.md for all instructions. The AI pourses the pointer fetches the target file and you achieve the exact same deduplication without fighting the operating system's file system limitations. So what does this all mean? It means if you're building an open source project and you have absolutely no idea what tools your contributors are installing on their local machines, agents.md is your universal adapter. Exactly. You drop that one standardized file in your root, follow those five structural sections and you guarantee a functional baseline of architectural context for almost any modern agent they point at your repository. What's truly fascinating here is how the ecosystem is naturally standardizing around a universal convention out of pure necessity. Right. No one wants to write five divergent sets of rules. The collective pain points of developers are forcing a consensus standard faster than any corporate consortium ever could. Okay. So the universal adapter handles the code base layer beautifully. That solves the project configuration. But what happens when you hit the underlying operating system environment? The OS edge cases. Because the reality of executing these tools gets incredibly messy when you move off Mac OS and dive into the specific file paths and sub process execution quirks of windows or Linux. This is exactly where elegant theory hits brutal reality because the way these AI tools actually interact with the local file system, spawn child processes and execute shell commands varies wildly depending on the OS kernel. Let's tackle windows first because frankly it presents the most volatile edge cases. Yes, it goes. There is nothing worse than spending 45 minutes debugging why Claude is completely hallucinating and ignoring your database schema only to realize that because you are on windows, the JSON configuration file used a backslash for a file path. The initialization hooks silently crashed during execution and Claude has been flying completely blind the entire session. Oh, the backslash parsing issue. Let's talk about this specific issue regarding file paths and hooks on windows. Yes, please. If you are writing a JSON configuration file for a tool like Claude code and you define an initialization hook command, you absolutely must use forward slashes for your file paths. Not backslashes, which is the native windows standard. Correct. Why does that happen? Why do partial paths fail silently in these tools? It comes down to how these AI tools are built and how they spawn sub processes. Most of these CLI tools are built in Node.js or Python. Right. When they read your JSON configuration file, a backslash inside a string is frequently interpreted by the parser as an escape character like backslash and for a new line. Oh, I say. So if you write a standard windows path, the parser might interpret a backslash U or a backslash S as an invalid control character corrupting the path string and memory. Wow. When the tool passes that corrupted string to the OS to execute a child process, the path resolves to an invalid memory location or a missing directory. And it crashes. The child process immediately exits with a non zero error code. But because the AI tools standard output pipe isn't always configured to surface underlying shell errors to the chat UI, the failure is swallowed. It fails completely silently. That sounds like an absolute debugging nightmare. Why even bother attempting to configure lifecycle hooks on windows if sub process paths are prone to silent failures? I mean, it's a valid question. You run the tool. The hook is supposed to trigger a build script to generate your Prisma client types. So AI has the database context. It silently fails. And suddenly the AI is writing code against a database schema that doesn't exist. It could absolutely be a nightmare if you aren't aware of the execution environment. Mm hmm. But the upfront friction of setting up the hook correctly once by it meticulously using forward slashes or explicitly wrapping the command to invoke PowerShell is far, far lower than the compounding friction of manually orienting the AI agent and manually running your build scripts every single session for the rest of the project's lifecycle. Exactly. You debug the string, escaping in the JSON file once. You reap the automated context benefits forever. Okay. So how do we handle the global configuration paths on windows? Where does an AI tool actually look for your personal system wide settings file? On native windows, the global configuration path maps directly to your user profile directory. Okay. If you were scripting this in PowerShell, the tilled character resolves to the environment variable representing that user profile, dropping the config in that exact location. But there is a massive, incredibly common trap here for Windows developers utilizing WSL 2, the Windows subsystem for Linux, which, let's be honest, is the standard operating environment for almost all professional web developers stuck on Windows hardware. These are absolutely yes. The trap is the boundary between the file systems. Right. If you install your AI CLI tool inside WSL 2, the Linux home directory inside that virtualized subsystem is a completely separate isolated location from your native Windows user directory. So they don't sync your global configuration files do not automatically sync across that hypervisor boundary. If you configure your API keys in the Windows GUI and then run Ader in the WSL 2 terminal, Ader will act as if it has never been configured. You have to actively ensure you maintain your global config files in whichever specific environment you actually execute the tool from. Yes. That is such a classic painful Windows development headache. And it gets even trickier when we look at the actual syntax of the hook commands themselves. It does. The tools assume a Unix-like environment by default. If you are running the tool natively in PowerShell and you write a hook command in your JSON file that uses standard bash syntax like the command to chain two commands together or using native bash file read operators, it will fail when PowerShell attempts to execute it. Exactly. Because PowerShell's internal command processor doesn't natively interpret those bash operators in the same way. And in many cases doesn't support them at all without aliases. So what are the practical programmatic solutions to bridge that gap? There are three primary solutions depending on your infrastructure. The first option and unequivocally the lowest friction path for developers is to simply run all your tools exclusively via WSL2. Just avoid native Windows execution entirely. Yeah. If you execute inside WSL2, you have a full native bash environment. All the standard hook commands, file paths, and scripts written by your team members on Mac or Linux will execute completely unmodified. It's basically a virtualized escape hatch from Windows execution quirks. Exactly. The second option, if you are strictly mandated to run native windows without WSL, is to describe the hook commands using syntax compatible with the classic command prompt. Okay. You do this by prefixing your hook commands with the explicit intent to run them via the legacy command processor, effectively telling the system how to interpret the string before executing it. Right, you pass the executable flag so it routes the command correctly. And what's the third option? The third option is to invoke PowerShell explicitly within the JSON string. You wrap your intended script inside a string parameter and pass it directly to the PowerShell executable binary. This guarantees the sub process spins up a PowerShell environment to execute your specific logic. Yeah. It's all about explicit declaration. You can't just throw a bash script over the wall at PowerShell and expect it to magically figure it out. But what about credentials? This is a massive security vector. Over sure. On macOS, developers rely heavily on the native keychain to securely store API keys or database passwords. The AI tools can tap into that encrypted vault automatically. What happens on Windows or Linux where that integrated macOS keychain doesn't exist? This is a non-negotiable security protocol. You must never ever put plain text credentials directly into your settings, JSON or YAML files. Right. Without the integrated keychain on Windows, you have to rely entirely on environment variables. You store your credentials locally in ignored environment files like a strictly getting or a dot end of file, or you utilize the Windows credential manager. Then in your configuration files or hook commands, you reference those secrets dynamically by their environment variable names, injecting the variable representing your API key at runtime. It requires a bit more manual infrastructure setup, but it keeps the secrets out of the plain text configuration files, preventing a catastrophic leak if you accidentally commit your global settings to a public dot files repository. Yes. And the operational reality for Linux is actually remarkably similar. The ecosystem on Linux has minimal differences from macOS when it comes to tool execution. The global configuration directory maps to the standard user home path. Bash hooks execute natively without any modification or escaping gymnastics because it's a native Unix bash environment. Right. The only substantial difference is the exact same one Windows faces. There is no native macOS keychain integration for the CLI tools. So you default to the exact same architectural solution, ignored environment files and dynamic environment variables injected at runtime. Yes. But there is one additional highly specific Linux detail regarding file system security file permissions. Ah, the explicit read and write permissions. Precisely. On Linux, you have to be explicitly proactive about who has read access to your configuration files. The standard protocol dictates that you must ensure your global configuration directories and files are locked down using strict Unix permissions, specifically utilizing the command to set permissions. So only the owner can read, write and execute the directories. And only the owner can read and write the files. So locking it down to just your user profile. Yes. While no actual API keys should live in those directories anyway, locking down the file permissions prevents other users operating on the same shared Linux system from reading your global AI system prompts or reverse engineering your project structures. Okay. So we have deeply mapped the operational tools. We have broken down the directory structures, the KV cache implications of glob scoping, the token budgets, the RAG mechanisms of flat files, and the YAML versus markdown debate for CLI purists. We've code a lot. We really have. We've looked at how agents.mdx is a map and universal adapter. And we've navigated the absolute minefield of Windows sub process execution, WSL two boundaries and Linux file permissions. With all of that technical infrastructure mapped out, how do we actually author effective behavioral rules for these configurations? Because having a perfectly valid JSON file that points to a perfectly valid markdown file doesn't help anyone if the architectural instructions inside that markdown file are fundamentally useless to the LLM. This is where we transition from the pure programmatic mechanics of the tools to the actual philosophy of prompt engineering and configuration logic. Okay. There are four universal principles of AI configuration that apply across the board. And the critical overarching thing to understand here is that the tool names will inevitably change. The file extensions will undoubtedly evolve. But these four foundational principles of interacting with large language models will not. Let's take them one by one. Principle number one, short rules, always beat long rules. This ties directly back to our deep dive on the cursor token budget and the attention mechanism. Every single AI tool, regardless of the underlying model possesses a finite context limit. Right. And every context limit mathematically degrades generation quality when it approaches saturation. The human with the 500 page manual analogy. Exactly. The strict architectural discipline here is completely tool agnostic. Keep your core rules files aggressively under 200 lines. 200 lines. Yes. If you are offering a 500 line markdown file detailing every conceivable historical edge case of your legacy code base, you are actively making the AI dumber. You are diluting its attention matrix. You have to ruthlessly edit your configuration rules down to the absolute high impact essentials. Precisely. Principle number two. And honestly, this might be the most profound paradigm shifting point we'll discuss today. Code must match rules. Understanding this requires a deep fundamental understanding of how these language models actually generate code. They are not deterministic compilers. Yeah, they are. They do not read your rules file like a linter checking for syntax errors. They are probabilistic prediction engines. Okay, unpack that. They ingest the entire context window, which includes your rules file. Yes. But also heavily includes the existing source code files in your repository. And they probabilistically predict the most likely next token based on vector weights. So let's play out a highly relatable, painful scenario. Let's say a developer is migrating state management libraries. They write a very clear explicit rule in their flat rules file. Yeah, we strictly use zoo stand for all state management. Never use Redux. Right. They save the file, open up a new component and ask the AI to generate a shopping cart feature. But unbeknownst to the newly written rule, the actual code base is still a legacy mess. And there are 50 existing files right next door in the directory structure that are completely saturated with Redux, boilerplates, dispatchers and action creators. Oh, yeah. What does the AI actually do when it generates the code? The agent will inevitably drift toward the legacy code. Really? Yes. If the explicit rule says zoo stand only, but the active code base context contains 50 examples of Redux, the text rule in your markdown file has absolutely zero enforcement power. The sheer gravitational poll, the probabilistic weight of those 50 existing Redux examples in the KV cache will completely overwhelm the one line of text in your system prompt. The AI's attention mechanism will look at the surrounding code, recognize the overwhelmingly dominant pattern of Redux, dispatchers, and it will probabilistically decide to copy that exact pattern, ignoring your zoo stand rule entirely. Here's where it gets really interesting. This implies that rules aren't actually for enforcement at all. That is such a counterintuitive idea for developers. We literally call them rules, but they aren't handcuffs. They don't block execution. They're just contextual reminder. Exactly. The workflow dictates a specific sequence of operations. Fix the underlying code base first. If you want the AI to write zoo stand hooks, you have to run an automated code model manually refactor the surrounding directory to actually utilize zoo stand. Once the code base reality reflects the desired architectural pattern, then you write the rule in your config file. At that point, the rule acts as a reinforcing weight. It's a gentle reminder to the probabilistic engine of what is already true in the surrounding environment. It mathematically reinforces the probability of generating the correct pattern. This raises an important question. How many thousands of hours do development teams waste every single week getting angry at the AI, correcting it over and over in the chat window, tweaking their system prompts, rewriting their markdown rules, when the actual root cause problem is that their messy code base is actively feeding the AI contradictory token examples. An immense amount of time. Teams treat the AI like it's broken when in reality the AI is accurately mirroring the broken state of their repository. Yes. And that leads directly into the third universal principle. One canonical answer per question. Ambiguity is the absolute enemy of automation. Completely. If you have two valid architectural patterns existing simultaneously in a code base, you have provided the AI with two competing token examples. If you have one feature directory that uses standard REST API calls, and another directory that uses GraphQL, and you vaguely ask the AI to fetch the user data for this new component, you have introduced catastrophic ambiguity into the prompt. And what does the probabilistic agent do when faced with that choice? The agent simply picks one. And statistically, it will usually pick the wrong one for your specific intent. Of course. When an LLM faces architectural ambiguity, it doesn't possess the intuitive human business context to know which pattern represents the future direction of the platform and which pattern is the legacy technical debt slated for deprecation. It just sees two mathematically valid patterns. You, as the developer, have to explicitly eliminate that ambiguity at the configuration source, which means proactively deprecating the old pattern. You either rewrite the legacy code, or you add it to the explicit what not to do section of your agents.md file, explicitly stating we maintain legacy REST endpoints in the V1 Appifolder. Absolutely do not use this pattern for new code, utilize the GraphQL schema. You have to resolve the conflict before the AI ever has to guess. Yes. And the fourth and final universal principle we've already touched on, but it's architectural importance bears repeating reference. Don't include. Long sprawling architectural documentation belongs in dedicated, standalone markdown files in your docs folder, not crammed into the active rules file. Point the AI at them using semantic paths. Let the agents internal RAG system load them into the context window only when strictly relevant. This is your ultimate programmatic defense against context limits saturation and attention dilution. It's entirely about managing cognitive load, both the mathematical cognitive load of the AI model and the actual cognitive load of the human developer tasked with maintaining the system, which brings us to the ultimate payoff. The actual ROI of configuration, there is a very strong measurable claim about the return on investment for undertaking all of this meticulous setup. The mantra is invest the time once, compound the benefit every single session. The reality is that a properly rigorously configured settings architecture, with the global preferences set, the granular permissions defined, the agents.md mapped, and a functional session start hook correctly escaping windows backslashes, takes a senior developer maybe one hour to set up for a repository. One single hour. But what is the compounding mathematical benefit of that upfront hour? The benefit is the absolute elimination of routine micro friction. Every single coding session from that point forward starts with an autonomous agent that is instantly perfectly oriented. It autonomously executes the hook to know exactly what get branch you are on. It parses the rule to know what jurid tasks you are resolving. It understands the core architectural boundaries. It mathematically knows not to generate the legacy code patterns because you've mapped the anti patterns. And crucially, if you've configured the execution permissions correctly, it doesn't stop to break your flow state to ask you for routine UI approvals every single time it needs to read a file or run a background lender. The investment compounds exponentially. An hour of reading CLI documentation and fighting with PowerShell stream escaping saves you five minutes of manual prompt engineering every single day. That translates directly to hours of uninterrupted deep flow state over the life cycle of a complex project. Exactly. It's the profound difference between interacting with a tool that feels like a junior developer, you have to constantly micromanage, and a tool that feels like a seamless integrated extension of your own architectural thought process. Okay, so we have covered a truly massive amount of technical ground today. We've gone from the conceptual layer cake of global project and local settings, deep into the mathematical realities of the KDCash all the way down to the syntax execution of Windows PowerShell sub process hooks. Based on the current state of the ecosystem, where should you the listener go from here? There are two logical advanced next steps once you have this foundational configuration layer completely mastered. First is a concept known as the parallel developer methodology. The premise here is that once your repository environment is perfectly configured and your AI agent isn't constantly fighting you on basic syntax or legacy patterns, you unlock the capability to run multiple feature implementations in flight simultaneously. You utilize Git work trees combined with specialized workflow tools to essentially multiply your output. But the crucial caveat is that the unified configuration we've discussed today is a strict non-negotiable prerequisite for that workflow. If your AI is Amnesiac and requires manual orientation, you simply cannot run parallel automated streams of work. The context switching will break the automation. The second advanced step is highly specific to front-end engineering, often referred to as agent ready react architectures. This dives into the actual physical code base shaping work we discussed. Remember the principle code must match rules. This next step is about how to practically execute large scale refactors of your react components so that the configuration layer actually becomes mathematically effective. It's about systematically eliminating the structural ambiguity in the code itself. Ensuring your configuration rules act as probability multipliers rather than ineffective band aids over bad architecture. Awesome. And as promised, we always like to leave you with one concrete actionable. Try this tomorrow. Take away something you can literally implement immediately. Yes. Tomorrow, before you start your next deep coding session, take five minutes to identify your team's single most annoying, frequently violated code base convention. Maybe it's junior developers constantly putting raw database queries directly into the UI components. Or maybe it's a highly specific convoluted way you are forced to format your error logs for data dog. Whatever that friction point is, write it down as a short explicit one sentence rule in a plain text file. Save that file as your tools project level rules file, whether you use a specific rules file or a specific folder for rules, or just drop it into an agents.md. Just implement one single rule and watch how it immediately programmatically stops the AI from generating that specific mistake. Experience that compounding ROI for yourself. And as a final overarching thought to mull over as you build, the tools will inevitably change. A year from now, the application names will change, the market leaders might shift entirely, and the specific file formats we discussed today will undoubtedly evolve. The strict syntax of your current yaml config might be replaced by something completely different. But the underlying architectural discipline does not change. If you master the programmatic discipline of explicitly defining your context, respecting the mathematical limitations of the token budget, and ruthlessly eliminating ambiguity at the source code level, your repository won't just be ready for whatever tool you use today. It will be architecturally prepared for whatever autonomous AI agent comes next. So the next time you find yourself staring at an AI agent that seems to have completely lost its mind, remember, you probably don't need a new tool. You just need to rebuild its brain. One explicit configuration rule at a time. Thanks for joining us on this deep dive into the cross tool configuration architecture. We'll catch you on the next one.

Working notes

What people say after shipping together.

A few field notes from clients and peers who worked with me across product, engineering, and company-building.

Prakash and the Truemark team stand above every engineering team I've worked with over the last 25 years. If you can partner with Prakash, you will not regret it.

Brent Holland
Brent Holland Client - Intelliante.com

I have seen him progress from Intern to Technical Lead. He is an excellent software developer, very enthusiastic, a quick learner, and someone with excellent problem solving skills.

Ojash Dahal
Ojash Dahal Software Engineer & Photography Enthusiast

Prakash is really easy to work with, and has a good understanding of react-native and javascript. I hope to work with him again one day.

Anton Huges
Anton Huges Owner - Price Insight

Prakash and the Truemark team stand above every engineering team I've worked with over the last 25 years. If you can partner with Prakash, you will not regret it.

Brent Holland
Brent Holland Client - Intelliante.com

I have seen him progress from Intern to Technical Lead. He is an excellent software developer, very enthusiastic, a quick learner, and someone with excellent problem solving skills.

Ojash Dahal
Ojash Dahal Software Engineer & Photography Enthusiast

Prakash is really easy to work with, and has a good understanding of react-native and javascript. I hope to work with him again one day.

Anton Huges
Anton Huges Owner - Price Insight