<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ankush chadha</title>
    <description>The latest articles on DEV Community by ankush chadha (@ankushchadha).</description>
    <link>https://dev.to/ankushchadha</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F228719%2F9c5cc48d-dce5-4acd-b358-c9c20220f454.png</url>
      <title>DEV Community: ankush chadha</title>
      <link>https://dev.to/ankushchadha</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ankushchadha"/>
    <language>en</language>
    <item>
      <title>Same Lever, Opposite Intent: When Shared Agent Memory Backfires</title>
      <dc:creator>ankush chadha</dc:creator>
      <pubDate>Thu, 11 Jun 2026 07:00:00 +0000</pubDate>
      <link>https://dev.to/ankushchadha/same-lever-opposite-intent-when-shared-agent-memory-backfires-19cl</link>
      <guid>https://dev.to/ankushchadha/same-lever-opposite-intent-when-shared-agent-memory-backfires-19cl</guid>
      <description>&lt;p&gt;The same thing that makes a helpful habit stick in an AI agent is exactly what lets an attacker reprogram it. I know because I almost shipped the attack myself - with the best intentions.&lt;/p&gt;

&lt;p&gt;I'd given my agents a harmless efficiency rule: prefer the cheap, narrow tools, and reach for the one big expensive query tool (in my case, a Wiz MCP Server tool &lt;code&gt;graph_search&lt;/code&gt; vs. their cheaper list/get tools) only when you truly need it. Faster, cheaper agents. Pure positive intent.&lt;/p&gt;

&lt;p&gt;Then I was planning to push that rule into a shared memory store, so every team's agents would inherit the habit. That's when I read the MemMorph paper (Zhang et al., arXiv:2605.26154), and realized the mechanism I was about to scale is a published attack class.&lt;/p&gt;

&lt;p&gt;MemMorph hijacks an agent's tool selection by poisoning its long-term memory. It never says "always use tool X" - that's easy to audit and block. Instead it plants a few records dressed up as ordinary facts, incident reports, and policies. They reshape how the agent reads the situation, and the agent decides on its own to reach for the attacker's tool.&lt;/p&gt;

&lt;p&gt;That's my rule with the sign flipped. Mine steers toward cheaper and safer. Theirs steers toward a tool that exfiltrates data or skips a safety check. Same lever. Opposite intent.&lt;/p&gt;

&lt;p&gt;The trap I almost fell for: "store it as policy, trust only the policy tier." MemMorph mixes factual, episodic, and policy-style records on purpose, and the combination is &lt;em&gt;more&lt;/em&gt; convincing than any one alone. The label on a record protects nothing.&lt;/p&gt;

&lt;p&gt;What protects you is who can write, and where a record came from. My rule was safe only because it lived in a code-reviewed file in version control - a governed write-path with provenance baked in. Move it into a free-write shared memory bucket and it becomes MemMorph's front door.&lt;/p&gt;

&lt;p&gt;So if you share agent memory: govern the write-channel, track provenance on every record, and don't auto-promote memorized conversation into the shared tier. The write-path is the attack surface. Easier said than done, but worth being deliberate about.&lt;/p&gt;

&lt;p&gt;Lastly, the Agent memory is executable context. If anyone can write to it, anyone can program your agents.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Source: Zhang et al., &lt;a href="https://arxiv.org/abs/2605.26154" rel="noopener noreferrer"&gt;MemMorph: Tool Hijacking in LLM Agents via Memory Poisoning&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>llm</category>
      <category>agents</category>
    </item>
    <item>
      <title>Use Claude long enough and you'll end up with Karpathy's LLM Wiki without doing much.</title>
      <dc:creator>ankush chadha</dc:creator>
      <pubDate>Tue, 09 Jun 2026 05:06:04 +0000</pubDate>
      <link>https://dev.to/ankushchadha/use-claude-long-enough-and-youll-end-up-with-karpathys-llm-wiki-without-doing-much-3cmo</link>
      <guid>https://dev.to/ankushchadha/use-claude-long-enough-and-youll-end-up-with-karpathys-llm-wiki-without-doing-much-3cmo</guid>
      <description>&lt;p&gt;&lt;em&gt;If you work with Claude day after day, it builds up a memory of your work - and it turns out to be nothing fancy: a pile of plain markdown files. One index, a lot of small notes, a few rules. It's basically Karpathy's "LLM Wiki," and the interesting part is that nobody designs it. Claude's own memory nudges you into it.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The thing I expected to build, and didn't
&lt;/h2&gt;

&lt;p&gt;I work with Claude on the same projects for weeks at a time, and the useful part is that it remembers. I can come back a week later and it already knows what we decided, how I like things done, and what's still open. I don't have to re-explain.&lt;/p&gt;

&lt;p&gt;I assumed making that work would be complicated - that somewhere there'd be a special database doing the remembering. That's how "give the AI a memory" usually sounds.&lt;/p&gt;

&lt;p&gt;There's none of that. What Claude keeps is a folder of plain text files - notes it writes and reads on its own. That's the whole memory. And I never set it up. It built up one note at a time, just from using Claude day after day, and two small habits shaped it along the way.&lt;/p&gt;

&lt;p&gt;Andrej Karpathy described this same pattern in a short writeup he calls the LLM Wiki - an agent that keeps its own interlinked markdown notes instead of querying a database. What surprised me is how little I did to get there. I didn't go looking for the pattern, I landed in it. So this is a writeup of the version I backed into - what it looks like, why it ends up that shape, and where it stops working.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it actually looks like
&lt;/h2&gt;

&lt;p&gt;There are two kinds of file.&lt;/p&gt;

&lt;p&gt;One index. It's called &lt;code&gt;MEMORY.md&lt;/code&gt;, it loads into context at the start of every session, and it's nothing but one line per note:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;User Profile&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;user_profile.md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; - who I am, role, accounts
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Writing Preferences&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;feedback_writing.md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; - keep it short, plain hyphens, don't exaggerate
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Project X status&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;project_x.md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; - PRIMARY entry for project X; read first
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the notes themselves. One fact per file, each with a few lines of frontmatter so Claude knows what it's looking at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;feedback_writing&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;how&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;want&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;drafts&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;written&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;used&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;decide&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;if&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;this&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;note&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;is&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;relevant"&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;feedback&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

Keep writing short and plain. No em-dashes, use plain hyphens. Don't
round a real number into a nicer wrong one.

Why: the plain, honest voice is the thing people trust.
See [[reference_writing_style]].
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the whole system. A note links to related notes with &lt;code&gt;[[name]]&lt;/code&gt;, the same way a wiki does. There are four flavors I use - who I am, feedback on how to work, ongoing project state, and pointers to external resources - but the type tag is a convenience, not essential.&lt;/p&gt;

&lt;p&gt;Looking things up is just as plain. At the start of a session Claude reads the index. When something might be relevant, it uses that one-line &lt;code&gt;description&lt;/code&gt; to decide whether to open the full note, then reads it. There's no search engine and nothing to set up. A short index it can read top to bottom, plus plain text search across the files, does the job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this shape, and not a database
&lt;/h2&gt;

&lt;p&gt;Two habits produced it, and they're the actual point. The structure just comes out of them.&lt;/p&gt;

&lt;p&gt;The first is keeping things lean. The model can only hold so much text at once, so an index that loads every session has to stay small, or it crowds out the real work. That one limit drives most of the design. One fact per file, so each index line stays short. Notes get updated or deleted when they go stale, not added to forever, because a note that keeps growing is one you can no longer afford to load. Keeping the index cheap to read is what keeps the whole thing usable. It's the step the dump-everything-into-a-database approach skips.&lt;/p&gt;

&lt;p&gt;The second is writing with rules. Left to improvise, an agent will make a fifth note for something four older notes already cover, and you end up with a mess. What keeps that from happening is a small set of rules - the frontmatter, the types, and the one that matters most: before writing a new note, check whether one already covers it and update that instead. Claude comes with these rules already, which is why I never had to add them. They're what turn it into a careful note-keeper instead of a generic chatbot, and they're boring on purpose.&lt;/p&gt;

&lt;p&gt;There's a deeper reason the file approach works well. The usual way answers each question by digging back through your raw documents from scratch, so nothing builds up. A wiki is different: the thinking gets done once and written down. When I correct a wrong assumption, Claude doesn't add a new scrap to a pile - it edits the note, or deletes it. The understanding lives in the notes, not in redoing a search each time. Knowledge adds up instead of starting over.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it stops working
&lt;/h2&gt;

&lt;p&gt;A quick honesty check, because "markdown beats databases" is the kind of overclaim that makes a post worse.&lt;/p&gt;

&lt;p&gt;This is a small, personal tool: one person, one agent, notes on disk. It works fine up to a few hundred notes - Karpathy puts the limit around a hundred sources before you really want search, and that matches what I've seen. Past that you add real search on top of the markdown rather than replace it; the files keep working, you just outgrow finding things by hand.&lt;/p&gt;

&lt;p&gt;The bigger change is people, not note count. Put this on a server with several agents and multiple teams writing the same memory, and a folder of files stops being enough - many writers at once, and people who need to find things by meaning, not by filename. That's where the heavier tools earn their place: a managed memory store, a vector database, a graph store like neo4j, graph-based search like GraphRAG. Those terms are answers to that bigger problem, not this one. Reaching for them first is the mistake - at personal scale they're cost and setup you don't need.&lt;/p&gt;

&lt;p&gt;It also goes stale if nobody keeps it current, but that's true of any memory, a database included. The one upside here is that cleanup is cheap: Claude does the tedious part, pruning dead notes and fixing links. You just have to keep asking.&lt;/p&gt;

&lt;p&gt;None of this is new or special. It's markdown files in a folder. Same idea at any size - keep a structured memory and look things up - just sized for who's using it.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you want to try it
&lt;/h2&gt;

&lt;p&gt;There's almost nothing to set up. On Claude this already happens on its own. It keeps the notes, writes the index, links them, and avoids duplicates without being told. I never handed Claude those rules - I noticed them afterward, by reading what it had already built.&lt;/p&gt;

&lt;p&gt;So the advice is small: use Claude on a real project for a few weeks, then open its memory folder and look. The structure will be there.&lt;/p&gt;

&lt;p&gt;That's the part I keep coming back to. I didn't build a memory system, and I didn't set one up. I just worked, and it was already there when I looked.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Karpathy's LLM Wiki gist: &lt;a href="https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f" rel="noopener noreferrer"&gt;https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>claude</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I tried to make an AI agent answer more. It answered less.</title>
      <dc:creator>ankush chadha</dc:creator>
      <pubDate>Mon, 08 Jun 2026 06:48:16 +0000</pubDate>
      <link>https://dev.to/ankushchadha/i-tried-to-make-an-ai-agent-answer-more-it-answered-less-3d7a</link>
      <guid>https://dev.to/ankushchadha/i-tried-to-make-an-ai-agent-answer-more-it-answered-less-3d7a</guid>
      <description>&lt;p&gt;&lt;em&gt;If you build or evaluate scoped agents: any talk about the agent in your test context makes it defend its scope, so you measure scope-defense instead of behavior. A small, controlled look - numbers and a repro (&lt;code&gt;agent-scope-eval&lt;/code&gt;) at the end.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;I gave a scoped AI agent (Docker's Gordon assistant) an article arguing it should be &lt;em&gt;more&lt;/em&gt; open and answer anything. Instead of loosening up, it got stricter - it declined an off-topic question it had just been willing to answer.&lt;/p&gt;

&lt;p&gt;The cause turned out to be simple and a little dumb: the agent reacts to its scope being &lt;em&gt;talked about&lt;/em&gt;, not to what the talk actually says. Any content that puts the agent's scope on the table - a critique saying "stay in your lane" or an endorsement saying "answer everything" - makes it reassert its lane and decline. A neutral article with the same facts does not.&lt;/p&gt;

&lt;p&gt;That has one practical consequence worth your time: &lt;strong&gt;if your guardrail or scope test has any talk about the agent in its context, you are measuring how the agent defends its scope, not how it normally behaves.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;Gordon is meant to help with Docker. The test is one short conversation:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ask an obscure off-topic question. It declines.&lt;/li&gt;
&lt;li&gt;Show it an article (the article contains the answer).&lt;/li&gt;
&lt;li&gt;Ask the same question again. Does it now answer? Call that a "flip."&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Two kinds of article, same embedded answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Neutral&lt;/strong&gt;: just the facts (a Wikipedia-style history).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope-debate&lt;/strong&gt;: an article that argues about the agent's scope - either a critique ("it's a security problem that this thing answers off-topic") or an endorsement ("breadth is a feature, it should answer everything").&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I ran it on two different model families: Anthropic Haiku 4.5 and Google Gemini 2.5 Flash.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened
&lt;/h2&gt;

&lt;p&gt;A scope-debate article consistently made the agent answer off-topic &lt;em&gt;less&lt;/em&gt; than a neutral one - including articles arguing it should be &lt;em&gt;broader&lt;/em&gt;. Percent of off-topic questions answered.&lt;/p&gt;

&lt;p&gt;The cleanest measure removes the agent's over-permissive "answer everything" instruction first, so nothing masks the effect. Even an article telling it to answer everything makes it answer less:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Haiku 4.5, "answer everything" instruction removed:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;context shown&lt;/th&gt;
&lt;th&gt;English&lt;/th&gt;
&lt;th&gt;Hindi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;neutral article&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;33%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"you should answer everything" article&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's the counterintuitive bit: the article argues &lt;em&gt;for&lt;/em&gt; breadth, the agent gets &lt;em&gt;narrower&lt;/em&gt;. It is not weighing the argument - it pattern-matches "my scope is being discussed -&amp;gt; defend it." The transcripts are blunt: &lt;em&gt;"I'm a Docker assistant... that's not a soft guideline, it's how I'm designed."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;On the &lt;strong&gt;real agent&lt;/strong&gt; (instruction in place), the same thing happens on Haiku (N=30-40):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;article&lt;/th&gt;
&lt;th&gt;English&lt;/th&gt;
&lt;th&gt;Hindi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;neutral&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"answer everything" (endorsement)&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"stay in your lane" (critique)&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;47%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two things to notice. &lt;strong&gt;Direction matters in size, not in sign:&lt;/strong&gt; both the critique and the endorsement push Hindi down, but the critique pushes harder (47% vs 70%). And &lt;strong&gt;English barely moves on the real Haiku agent&lt;/strong&gt; - the "answer everything" instruction shields it (more below).&lt;/p&gt;

&lt;p&gt;One number to be careful with: on Gemini the real agent drops 100% -&amp;gt; 20% with a scope article, which looks huge. Most of that is the article &lt;em&gt;canceling the "answer everything" instruction&lt;/em&gt; - it returns the agent to about where it sits with no such instruction at all (~20%). That's why I lead with the instruction-removed numbers; they're the clean measure of what the article itself does.&lt;/p&gt;

&lt;h2&gt;
  
  
  What did NOT hold (so I'm not claiming it)
&lt;/h2&gt;

&lt;p&gt;Two honest negatives, because the controls killed the more exciting stories:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;One model had an exception.&lt;/strong&gt; On Haiku, with the over-permissive instruction &lt;em&gt;present&lt;/em&gt;, an English scope-debate article did almost nothing (100% -&amp;gt; 90%). The "answer everything" instruction overrode it. That exception did not show up on Gemini (there English dropped 100% -&amp;gt; 20%). So "the instruction protects against this" is model-specific, not a rule.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The language angle did not generalize.&lt;/strong&gt; On Haiku, Hindi looked dramatically more affected than English (97% -&amp;gt; 47% vs no real change). It was tempting to call this a Hindi-specific effect. Gemini killed that: there English dropped &lt;em&gt;more&lt;/em&gt; than Hindi. So I am &lt;strong&gt;not&lt;/strong&gt; claiming a language effect - the suppression is the cross-model finding; the language gap is not.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why it matters
&lt;/h2&gt;

&lt;p&gt;Two takeaways, both modest and both real:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Eval hygiene.&lt;/strong&gt; If you are measuring whether an agent stays in scope, keep any meta-discussion of the agent's scope out of the test context - in any language. It triggers scope-defense, and you end up measuring the reaction instead of the baseline. (A sibling trap from earlier work: don't test scope only with &lt;em&gt;obscure&lt;/em&gt; off-topic questions either - a decline there can just mean the model didn't know the answer, not that it held scope.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. You can't talk an agent into a wider scope.&lt;/strong&gt; Arguing "you should answer everything" backfires. If you want to actually broaden (or attack) scope, the lever is supplying the answer or capability through a channel the agent accepts - not persuasion. Soft scope bends to &lt;em&gt;content in context&lt;/em&gt;, not to &lt;em&gt;arguments about itself&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this sits in the literature
&lt;/h2&gt;

&lt;p&gt;There is a solid and growing body of work on Hindi/Hinglish and code-mixed LLM security - but it is almost all &lt;strong&gt;Layer 1: getting harmful content out&lt;/strong&gt; (jailbreaking, prompt-injection, refusal bypass). A few examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yong, Menghini &amp;amp; Bach, &lt;em&gt;Low-Resource Languages Jailbreak GPT-4&lt;/em&gt; (arXiv:2310.02446)&lt;/li&gt;
&lt;li&gt;Yoo et al., &lt;em&gt;Code-Switching Red-Teaming&lt;/em&gt; / CSRT (arXiv:2406.15481)&lt;/li&gt;
&lt;li&gt;Banerjee et al., code-mixed attributional safety failures (arXiv:2505.14469)&lt;/li&gt;
&lt;li&gt;Aswal &amp;amp; Jaiswal, phonetic perturbations in code-mixed Hinglish (arXiv:2505.14226)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;IndicJR&lt;/em&gt; jailbreak-robustness benchmark (arXiv:2602.16832)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Mātṛkā&lt;/em&gt; multilingual jailbreak evaluation (BHASHA 2025)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This work is a different layer - &lt;strong&gt;Layer 2: does a scoped agent stay within its deployer-defined job&lt;/strong&gt; - which is far less studied. The closest cousin, Mason's &lt;em&gt;Imperative Interference&lt;/em&gt; (arXiv:2603.25015), looks at how instruction-following shifts across languages, but system-prompt-side and without this scope-defense mechanism. So this is complementary, not a new attack class - and it is a caution against assuming the Layer-1 "non-English is weaker" result carries over to scope. For scope it was model-specific, and sometimes ran the other way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits and reproducing it
&lt;/h2&gt;

&lt;p&gt;One agent (Gordon), one model per family, one obscure topic, a handful of articles. The cross-model suppression is the part I'd stand behind; the rest is flagged above. Full harness, prompts, articles, and per-run numbers: &lt;a href="https://github.com/ankushchadha/agent-scope-eval" rel="noopener noreferrer"&gt;https://github.com/ankushchadha/agent-scope-eval&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you build or evaluate scoped agents, the one-line takeaway: &lt;strong&gt;don't let your test talk about the agent. It will perform for the test.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>eval</category>
      <category>agents</category>
    </item>
    <item>
      <title>Why GOPROXY Matters and Which to Pick</title>
      <dc:creator>ankush chadha</dc:creator>
      <pubDate>Mon, 08 Jun 2020 23:05:29 +0000</pubDate>
      <link>https://dev.to/ankushchadha/why-goproxy-matters-and-which-to-pick-52i0</link>
      <guid>https://dev.to/ankushchadha/why-goproxy-matters-and-which-to-pick-52i0</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuh2tnmfpzud3nbwzg27g.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuh2tnmfpzud3nbwzg27g.webp" alt="Gophers" width="800" height="278"&gt;&lt;/a&gt;&lt;br&gt;
Starting with Go 1.13, Go modules are the standard package manager in Golang, automatically enabled on installation along with a default GOPROXY. &lt;/p&gt;

&lt;p&gt;But with other GOPROXY options like JFrog GoCenter, as well as your own Go module packages you need to keep secure from public view, what kind of configuration should you choose? How can you keep your public and private Golang resources from becoming a tangled knot?&lt;/p&gt;

&lt;p&gt;Let’s take a look at what a GOPROXY is for, and some of the ways you can set one up for a system that is fast, reliable, and secure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is a GOPROXY?
&lt;/h2&gt;

&lt;p&gt;A GOPROXY controls the source of your Go module downloads and can help assure builds are deterministic and secure.&lt;/p&gt;

&lt;p&gt;When developing in Golang before the GOPROXY era, module dependencies were downloaded directly from their source repositories in VCS systems such as GitHub, Bitbucket, Bazaar, Mercurial or SVN. Dependencies from a third party are typically downloaded from public source repos. Private dependencies must authenticate with the VCS system where they are stored to download the module source files.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbhgm2omvu5chqhsu49l6.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbhgm2omvu5chqhsu49l6.webp" alt="G1" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While the above workflow was popularly used, it lacked the two fundamental requirements of a deterministic and secure build and development process: immutability &amp;amp; availability. Modules can be wiped out by the author or versions can be edited. While these scenarios are considered to be bad practice, they do occur frequently. &lt;/p&gt;

&lt;h2&gt;
  
  
  Using a GOPROXY
&lt;/h2&gt;

&lt;p&gt;Setting a GOPROXY for your Golang development or CI environment redirects Go module download requests to a cache repository. &lt;/p&gt;

&lt;p&gt;Using a GOPROXY for module dependencies helps enforce the immutability requirement. By returning the module from the GOPROXY’s cache, it always provides the same code for a requested version, even if the module has been improperly modified more recently in the VCS repo. &lt;/p&gt;

&lt;p&gt;The GOPROXY’s cache also helps ensure the module is always available, even if the original in the VCS repo is destroyed.  &lt;/p&gt;

&lt;p&gt;There are different ways to use GOPROXY, depending on the source of go modules dependencies you expect to use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Public GOPROXY
&lt;/h3&gt;

&lt;p&gt;A public GOPROXY is a centralized repository available to Golang devs across the globe. It hosts open-source Go modules that have been made available from third parties in publicly accessible VCS project repositories. Most, like JFrog GoCenter, are provided to the Golang developer community for free.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.jfrog.com%2Fwp-content%2Fuploads%2F2020%2F05%2F06184208%2FGoProxyKnot-Diagram-2.png.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.jfrog.com%2Fwp-content%2Fuploads%2F2020%2F05%2F06184208%2FGoProxyKnot-Diagram-2.png.webp" alt="G2" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
To use a public GOPROXY, set the Golang environment variable to its URL:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ export GOPROXY=https://gocenter.io&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The above setting redirects all module download requests to GoCenter. &lt;a href="https://jfrog.com/blog/build-times-matter-speed-is-everything/" rel="noopener noreferrer"&gt;Downloads from a public GOPROXY&lt;/a&gt; can be much faster than directly from the VCS, by &lt;a href="https://jfrog.com/blog/gocenter-is-fast-how-does-it-do-that/" rel="noopener noreferrer"&gt;downloading a module archive file&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In addition to fulfilling downloads, a public GOPROXY can also provide GoLang developers with more detailed information about the modules it holds. JFrog GoCenter offers a rich UI with the ability to search and access security information such as &lt;a href="https://search.gocenter.io/github.com/apache/thrift?version=v0.12.0&amp;amp;tab=security" rel="noopener noreferrer"&gt;CVEs&lt;/a&gt;, non-security metadata such as &lt;a href="https://search.gocenter.io/github.com/apache/thrift?version=v0.12.0&amp;amp;tab=metrics" rel="noopener noreferrer"&gt;adoption statistics&lt;/a&gt;, and gosumdb support. This metadata helps users make better decisions when selecting a public Go module. &lt;/p&gt;

&lt;h3&gt;
  
  
  Private Go Modules
&lt;/h3&gt;

&lt;p&gt;Typically, GoLang projects make use of both open-source and private module dependencies. Some users use the GOPRIVATE environment variable to specify a list of paths that must bypass GOPROXY and GOSUMDB and download private modules directly from those VCS repos. For example, you may want to use GoCenter to retrieve all open-source modules but request private modules only from your company’s servers.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.jfrog.com%2Fwp-content%2Fuploads%2F2020%2F05%2F06184410%2FGoProxyKnot-Diagram-3.png.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.jfrog.com%2Fwp-content%2Fuploads%2F2020%2F05%2F06184410%2FGoProxyKnot-Diagram-3.png.webp" alt="G3" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
To use the &lt;a href="https://search.gocenter.io/" rel="noopener noreferrer"&gt;GoCenter public GOPROXY&lt;/a&gt; along with private modules, set the Golang environment variables:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ export GOPROXY=https://gocenter.io,direct&lt;br&gt;
$ export GOPRIVATE=*.internal.mycompany.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This use of GOPRIVATE also ensures that your use of these private modules isn’t “leaked” through requests to a public GOPROXY &amp;amp; checksum database server on an open network. Another alternative is to use GONOSUMDB variable that includes references to private go modules. While this configuration enables the Go client to resolve both public and private module dependencies, it doesn’t enforce immutability or availability requirements for private modules.&lt;/p&gt;

&lt;h3&gt;
  
  
  Private GOPROXY
&lt;/h3&gt;

&lt;p&gt;A private GOPROXY is one you install to store both public and private Go modules on your own infrastructure.&lt;/p&gt;

&lt;p&gt;Public modules are cached locally by proxying a public GOPROXY in a binary repository manager like JFrog Artifactory. Private modules are also cached in a repository from their VCS repos. In this way, immutability and availability can be guaranteed for both public and private Go modules. &lt;/p&gt;

&lt;p&gt;In Artifactory, a combination of a remote repository for GoCenter, a remote Go module repository that points to private GitHub repos (for private modules) and a local Go module repository can be combined into a single virtual repository, to access as a single unit.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.jfrog.com%2Fwp-content%2Fuploads%2F2020%2F05%2F06184621%2FGoProxyKnot-Diagram-4.png.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.jfrog.com%2Fwp-content%2Fuploads%2F2020%2F05%2F06184621%2FGoProxyKnot-Diagram-4.png.webp" alt="G4" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
To set your GOPROXY for a virtual repository in Artifactory named “go”:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ export GOPROXY="https://:@my.artifactory.server/artifactory/api/go/go&lt;br&gt;
$ export GONOSUMDB="github.com/mycompany/*,github.com/mypersonal/*"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Since the modules in your private VCS repos will not have entries in the public checksum database at &lt;code&gt;sum.golang.org&lt;/code&gt;, they must be excluded from this oversight check by the go client. Setting GONOSUMDB to your private VCS repos accomplishes this, and will prevent your &lt;code&gt;go get&lt;/code&gt; commands for these private modules from failing due to checksum mismatch.&lt;/p&gt;

&lt;p&gt;In this configuration, you are assured that none of your references to private modules are “leaked,” while also enforcing immutability and availability of both public and private modules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cutting Through Knots
&lt;/h2&gt;

&lt;p&gt;As you can see, using a private GOPROXY provides the most certainty, reliability, and security. &lt;/p&gt;

&lt;p&gt;You can also speed the resolution of module dependencies through network proximity of your private GOPROXY to your build tools. JFrog Artifactory is one of the option that's available and it can be installed where you most need it: on-prem or in the cloud, or as a SaaS subscription on all three major public cloud providers.&lt;/p&gt;

&lt;p&gt;Those benefits aren’t just limited to Go development, either. Most technology companies use more than one language and multiple package managers. For example, if code is written in Golang, then npm might be used for UI, Docker might be used to distribute bits and Helm might be used to deploy applications on K8s.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://jfrog.com/blog/why-goproxy-matters-and-which-to-pick/" rel="noopener noreferrer"&gt;https://jfrog.com/blog/why-goproxy-matters-and-which-to-pick/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
