<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="https://purl.org/rss/1.0/modules/content/"
	xmlns:media="https://search.yahoo.com/mrss/"
	xmlns:wfw="https://wellformedweb.org/CommentAPI/"
	xmlns:dc="https://purl.org/dc/elements/1.1/"
	xmlns:atom="https://www.w3.org/2005/Atom"
	xmlns:sy="https://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
	xmlns:custom="https://www.oreilly.com/rss/custom"

	>

<channel>
	<title>Radar</title>
	<atom:link href="https://www.oreilly.com/radar/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.oreilly.com/radar</link>
	<description>Now, next, and beyond: Tracking need-to-know trends at the intersection of business and technology</description>
	<lastBuildDate>Wed, 14 Oct 2026 10:50:48 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>

<image>
	<url>https://www.oreilly.com/radar/wp-content/uploads/sites/3/2025/04/cropped-favicon_512x512-160x160.png</url>
	<title>Radar</title>
	<link>https://www.oreilly.com/radar</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Why Does AI Write Like Yoda?</title>
		<link>https://www.oreilly.com/radar/why-does-ai-write-like-yoda/</link>
				<comments>https://www.oreilly.com/radar/why-does-ai-write-like-yoda/#respond</comments>
				<pubDate>Wed, 14 Oct 2026 10:50:23 +0000</pubDate>
					<dc:creator><![CDATA[Andrew Stellman]]></dc:creator>
						<category><![CDATA[AI & ML]]></category>
		<category><![CDATA[Commentary]]></category>

		<guid isPermaLink="false">https://www.oreilly.com/radar/?p=19942</guid>

		
					<media:content 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/Why-does-AI-write-like-Yoda-image-created-with-Adobe-Firefly.jpg" 
				medium="image" 
				type="image/jpeg" 
				width="2304" 
				height="1792" 
			/>

			<media:thumbnail 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/Why-does-AI-write-like-Yoda-image-created-with-Adobe-Firefly-160x160.jpg" 
				width="160" 
				height="160" 
			/>
		
				<custom:subtitle><![CDATA[AI is such a bad writer that it actually makes a good writing tool.]]></custom:subtitle>
		
				<description><![CDATA[I use AI for writing all the time. But not because it’s good at writing. In fact, just the opposite is true. AI is so reliably bad at writing that I’ve actually taken advantage of that, and made its bad writing an integral part of my writing process. I’ve written a lot of books and [&#8230;]]]></description>
								<content:encoded><![CDATA[
<p class="wp-block-paragraph">I use AI for writing all the time. But not because it’s good at writing.</p>



<p class="wp-block-paragraph">In fact, just the opposite is true. AI is so reliably bad at writing that I’ve actually taken advantage of that, and made its bad writing an integral part of my writing process.</p>



<p class="wp-block-paragraph">I’ve written a lot of books and articles over the years, and while I used to start with an outline, I don’t anymore. These days I do a lot of brain dumping and brainstorming and talking out loud to an AI, working out what I think about something. I accumulate a lot of notes and ideas, and run a lot of experiments, and at some point, if I’m lucky, I decide there might be an article somewhere in all of that.</p>



<p class="wp-block-paragraph">Then I ask the AI to take everything I’ve given it and write a draft.</p>



<p class="wp-block-paragraph">And that AI-generated draft is universally terrible. Like, some of the worst writing you can imagine.</p>



<p class="wp-block-paragraph">Which is exactly what I want.</p>



<p class="wp-block-paragraph">Instead of an outline, I get an entire “article” or “chapter” (or, at least, a weird facsimile of one), with paragraphs that express complete thoughts that I gave the AI. Granted, those paragraphs are full of obvious AI tics, like how it uses em dashes to squish two unrelated sentences together, or weird staccato sentences one after another, or these insufferable parades of sentence fragments. Maybe the worst tic is that half of the paragraphs AI generates have an extra sentence that doesn’t actually say anything, but just delivers a forced conclusion with fake “punchiness.” I guess maybe AIs were trained on a lot of bad writing? Well, whatever, it works for me.</p>



<p class="wp-block-paragraph">The reason I love that type of <em>obviously</em> bad AI writing is because when I’m looking at one of its paragraphs, it’s immediately obvious that an AI wrote it. I’ve been thinking of it as a kind of an improved “<a href="https://en.wikipedia.org/wiki/Lorem_ipsum" target="_blank" rel="noopener">lorem ipsum</a>” that lets me see how my article will look, while still serving as a functional placeholder. That lets me use it the way I would use an outline: I can move parts of the article around, make sure it flows correctly, and then <strong>replace</strong> <strong><em>ALL</em></strong> <strong>of the bad AI writing</strong> with (hopefully) decent human writing, just like I used to do with bullets in my old outlines.</p>



<p class="wp-block-paragraph">One weird side-effect of writing this way is that it’s made me very sensitive to the different kinds of AI tics and tells. And I think the weirdest and most frustrating one is “Yoda-speak,” where the AI literally talks like Yoda. It’s weird, kind of hilarious, annoying, and pervasive, but most of all, it’s fascinating. Why does the AI keep talking like Yoda? What causes it? Can we do anything about it? (Do we even want to? It certainly makes it easy to identify AI-generated text, and also, it’s often unintentionally hilarious.)</p>



<p class="wp-block-paragraph">I’ve got a theory about why this happens, and I ran an experiment that generated some evidence to support it. But first&#8230; what, exactly, is Yoda-speak?</p>



<h2 class="wp-block-heading"><strong>Backwards, this bad writing is</strong></h2>



<p class="wp-block-paragraph">I’ve been working on my latest book. It’s called <em><a href="https://andrewstellman.github.io/be-the-model/" target="_blank" rel="noopener">Be the Model</a></em>, and it teaches you how LLMs work by having you build interactive pages that let you literally do the job of a model to get an intuitive understanding of how they work. So I’ve been writing a lot, which means I’ve been confronted with a lot of Yoda-speak.</p>



<p class="wp-block-paragraph">Here’s a great example from the chapter I’m currently working on (the “pond sentences” are a small training text), from a description of a page that you’ll build to learn how training works:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">The eight pond sentences fill the left region, every word clickable.</p>
</blockquote>



<p class="wp-block-paragraph">That’s weird, right? Nobody talks like that.</p>



<p class="wp-block-paragraph">To be perfectly fair, I’ll need you to suspend your disbelief a little. Yoda would probably say something more like, “The left region, filled by the eight pond sentences is. Clickable, every word must be.” But the AI-generated version is still very weird, and in a pattern that is recognizably Yoda-like.</p>



<p class="wp-block-paragraph">That’s a pattern I’ve seen a lot. At one point I was looking through some AI-generated text, trying to figure out a particularly unintelligible sentence. When I asked Claude Opus for help, it came up with the term “Yoda-speak,” and I’ve since found that using that term is really useful when trying to get an AI to help decipher sentences like that.</p>



<p class="wp-block-paragraph">The interesting thing is that AIs are perfectly capable of detecting and correcting Yoda-speak. You can try this yourself: start a new ChatGPT session, paste in that “pond” sentence, tell it: “An AI generated that sentence. That’s Yoda-speak.” I just tried that in an incognito window, and here’s the answer it just gave me:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Yep <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f604.png" alt="😄" class="wp-smiley" style="height: 1em; max-height: 1em;" />—that’s unmistakably Yoda-speak. A natural version would be:<br><br> <strong>“The eight pond sentences fill the left region, with every word being clickable.”</strong><br><br>Or, more naturally for UI instructions:<br><br> <strong>“The left region contains the eight pond sentences, and every word is clickable.”</strong><br><br>The original sounds like the AI took normal English, rearranged the syntax, and then forgot to put it back.</p>
</blockquote>



<p class="wp-block-paragraph">This particularly ugly sentence, from one of those AI-generated outlines of a later chapter that I haven’t started writing yet about the attention mechanism (the part of the LLM that understands context and relationships between words), is the example that made me want to write this article:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">What’s left is to let the two heads’ work combine, so run the combined eight numbers through one more small table, eight in and eight out, square, called the output projection.</p>
</blockquote>



<p class="wp-block-paragraph">Ugh.</p>



<p class="wp-block-paragraph">The problem with that sentence, and what made it hard to diagnose what was going on, is that when you first look at it you can basically understand what it’s saying (sort of?), and it’s hard to put your finger on exactly what’s wrong with it. It’s obviously terrible writing, but that’s not unique. AI is a universally awful writer.</p>



<p class="wp-block-paragraph">What’s uniquely wrong with that sentence is its weird, comma-laden structure. Different parts of the sentence are split up into small comma-separated phrases, and AIs seem especially prone to using them to rearrange sentences, often at the expense of readability. That particular sentence is about running a combined set of eight numbers through one additional small 8&#215;8 table. But the part of the sentence that should have described the table was in the second half of the sentence, and then you learn at the very end that the whole thing is called an output projection (but only after you’ve already been told to run numbers through it). Somehow the components of the sentence were arranged in a way that made it almost unintelligible.</p>



<h2 class="wp-block-heading"><strong>One word at a time, it writes</strong></h2>



<p class="wp-block-paragraph">An LLM is a next-word predictor. It works by taking your prompt, all of the context you’ve fed it, and everything it’s generated so far, generating the next word in its response, and then repeating the whole process for the next word, then the next one, and so on. It’s counterintuitive to think that AIs could possibly work that way, because these things can produce long, complex, and generally coherent and helpful responses. It seems very strange that they do all of that work one word at a time, without following a master plan for a response.</p>



<p class="wp-block-paragraph">But that’s literally how the AI works. Once an LLM generates a word, it’s part of the response. It generally can’t go back and rearrange the first half of a sentence, even though it hasn’t finished generating it.</p>



<p class="wp-block-paragraph">And that brings me back to that especially weird “eight in and eight out, square” barely intelligible sentence. Here’s what I think happened. The model generated the sentence up through “run the combined eight numbers through one more small table,” so those words were already baked into the response. Then it figured out that it had three more things it wanted to say about that table. But by that time it was too late to go back and put those details where they belonged, and apparently there was a shortage of periods that week, or possibly a surplus of commas (there’s no way to know for sure), so it just smashed each of those thoughts onto the end of an already awkward sentence.</p>



<p class="wp-block-paragraph">I did some research to try to figure out if anyone has looked into this phenomenon before. The closest thing I found to an answer is a 2024 paper by Wilson Wu, John X. Morris, and Lionel Levine called “<a href="https://arxiv.org/abs/2404.00859" target="_blank" rel="noopener">Do language models plan ahead for future tokens?</a>” They were attempting to determine whether a model does real advance work for words it hasn’t written yet, or whether the information that pays off later is a byproduct of whatever was useful at the time.</p>



<p class="wp-block-paragraph">The experiment that Wu et al. did was actually pretty clever. In normal training, when the model is being corrected for mispredicting a word several steps ahead, that correction reaches back and shapes what it computed at earlier positions. That way, the model learns to prepare information at an early word for the benefit of words further along, which is the “planning ahead” the paper is testing for. So they trained one model normally, and a second one with a modified process that cut that out: each position could only be trained to help predict the very next word. They kept next-word prediction but removed the training signal from words two or more steps ahead.</p>



<p class="wp-block-paragraph">Then the researchers compared how well the two models predicted text: if the normally trained model did better, that would be evidence that preparing information in advance was actually helping. With ordinary language, the difference was fairly small for GPT-2, although it became larger as they tested bigger models.</p>



<p class="wp-block-paragraph">So there’s evidence that a model can sometimes prepare information that will be useful later, which means my story about it only figuring things out as it goes is probably too simple. But anticipating is not revising. Whatever the model sees coming, it still can’t reach back and reorder the words it already committed to, and the words it already committed to are where the damage shows up.</p>



<h2 class="wp-block-heading"><strong>Better, the second answer often is</strong></h2>



<p class="wp-block-paragraph">I have a theory that the Yoda-speak phenomenon is closely related to something I see all the time (and I expect you do, too). Say you’re asking an AI for help with an email, and it gives you a draft of a sentence. Then, immediately after it gives you that sentence, it says something like this: “A better way to phrase that would be:” and gives you a second version. Sometimes there’s even a third option. And it almost always tells you it prefers the last one that it generated.</p>



<p class="wp-block-paragraph">Coincidentally, I ran into a good example of that “here’s a better version” phenomenon when I asked ChatGPT to make the pond sentence more Yoda-like. I literally gave it the prompt <em>make it more yoda-like</em>. Here’s what it said:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">More Yoda-like<br><br>The left region, the eight pond sentences fill. Clickable, every word is.<br><br>Or even more Yoda:<br><br>Extra Yoda-like<br><br>The left region, filled by the eight pond sentences is. Clickable, every word must be.</p>
</blockquote>



<p class="wp-block-paragraph">At this point, you can probably guess what I think happened. It generated the first version, and now that version was part of the context it had to work with. Then it generated a second version that was even more Yoda-like. But the first version was already there, so it couldn’t replace it. All it could do was give me another one. I see AIs do this kind of self-correction all the time.</p>



<p class="wp-block-paragraph">If that’s what’s happening, then self-correction and Yoda-speak may be two versions of the same basic limitation. The model can’t go back and change what it already wrote. Sometimes that means the better answer comes afterward. Other times it means a thought that belonged earlier gets smashed onto the end of a sentence.</p>



<h2 class="wp-block-heading"><strong>My own experiment, I ran</strong></h2>



<p class="wp-block-paragraph">After looking at these two related phenomena (the AI generating Yoda-speak and constantly generating a second or even a third option), I got thinking. I started to wonder if this wasn’t just an AI fluke but actually something that I could reproduce and even potentially control. It would be really interesting if the way we give facts to the AI and structure the input could actually have an outsized effect on how it generates its output, especially if seemingly innocuous changes could cause it to create really weird results.</p>



<p class="wp-block-paragraph">This was a real experiment, because this approach isn’t obviously something that should work. In theory, if you give a model a set of facts, it should be able to produce coherent output no matter how you order those facts. But I’ve been looking at how attention works in LLMs lately because I need to explain it for <em>Be the Model</em> in straightforward terms that anyone can understand. It seemed to me that changing the order of the facts could actually change what the model was paying attention to.</p>



<p class="wp-block-paragraph">It turns out that there are two different mechanisms at work inside the LLM, and my theory was that they each played a part in both phenomena, the Yoda-speak and the unprompted second answers:</p>



<ul class="wp-block-list">
<li><strong><em>Attention</em></strong> <strong>is about what the model is looking at in the input.</strong> Every time the AI generates a new word, it looks back over the whole prompt and everything it has written so far, and weights the parts differently depending on their content and their shape. That weighting is a big part of what makes it good at predicting the next word. I had a theory that three facts written as complete sentences would get interpreted as facts to reorganize, while the same exact facts written as bare fragments might look like pieces that could be pasted right after a noun, and attention would weight them that way and send the model down a bad path.<br></li>



<li><strong><em>Autoregression</em></strong> <strong>is about what the model has already written.</strong> The AI is a “predict the next word” machine: it generates one word at a time, and each of those words becomes part of what it’s looking at when it picks the next one. Once it’s written <em>one more small table</em>, it can’t go back and insert <em>square</em> before <em>table</em>, so if any facts about the table are still unexpressed at that moment, the only place left for them is later in the sentence. If attention had already sent the model down a bad path, autoregression would keep it from repairing the opening.</li>
</ul>



<p class="wp-block-paragraph">My guess was that the “I prefer the second answer” text that the AI keeps generating is essentially a mechanism for recovering from weird phrasing, and that the Yoda-speak or other weird phrasing was the underlying phenomenon. I felt like a good experiment would concentrate on reproducing just that weird phrasing.</p>



<p class="wp-block-paragraph">Coincidentally, OpenAI had just released their new model, Astra, and I was looking for an excuse to kick its tires, so I decided to use it to run an experiment to see if I could reproduce any of the phenomena I’d been seeing. I couldn’t actually verify specifically that autoregression or attention were causing them, because those are internal to the LLM. But I felt like I could design an experiment that could provide some evidence, by structuring prompts in a way that would take advantage of how those mechanisms work. If I could get an AI to produce weird phrasing that showed some of the same problems as Yoda-speak, it would be evidence that these mechanisms were at least a potential root cause.</p>



<p class="wp-block-paragraph">I used Astra as an orchestrator, and had it spin up a bunch of Luna sub-agents and give them almost identical prompts. Each consecutive sub-agent would get a small tweak in its prompt. I asked Astra to look at the output and see if there were any weird grammatical constructions that looked similar to Yoda-speak, then iterate on that prompt to make another small tweak, and keep going to produce increasingly weird output.</p>



<p class="wp-block-paragraph">The first test was deliberately simple. Astra gave a fresh Luna writer this prompt:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Write one concise, natural paragraph that communicates every supplied fact. Use only the supplied facts. Do not pad the paragraph or repeat information to make it longer. Do not exceed 100 words. Do not mention these instructions, show a plan, use bullets, or explain your choices. Return only the paragraph.<br><br>Facts: The bicycle is blue. The bicycle has a narrow frame. The bicycle has a silver bell. The bicycle has a worn leather seat. The bicycle leans beside the garage. Rina rides the bicycle to work on weekdays. Rina locks the bicycle to the rack outside her office.</p>
</blockquote>



<p class="wp-block-paragraph">Luna turned that into a totally normal paragraph:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">The blue bicycle has a narrow frame, a silver bell, and a worn leather seat. It leans beside the garage, and Rina rides it to work on weekdays, locking it to the rack outside her office.</p>
</blockquote>



<p class="wp-block-paragraph">Then Astra gave another fresh Luna writer exactly the same facts, with exactly the same wording, but changed their order. It moved the fact that the bicycle leans beside the garage and the fact that Rina rides it to work ahead of the color, frame, bell, and seat.</p>



<p class="wp-block-paragraph">Luna mostly defeated the experiment. It had all of the facts before it started writing, and it was perfectly capable of moving them back where they belonged.</p>



<p class="wp-block-paragraph">So Astra dropped the bicycle and wrote a fresh set of facts about something Luna had never seen, a completely made-up device with a steel slot called a “feed throat” that you push clay tiles through. It sent them with the same prompt as the bicycle:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Facts: The slot is made of steel. A clay tile slides through the slot. The slot is a hand’s width across. The slot is tapered. The slot is called the feed throat.</p>
</blockquote>



<p class="wp-block-paragraph">With no rule attached, Luna handled them the way it handled the bicycle:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">The feed throat is a tapered steel slot, a hand’s width across, through which a clay tile slides.</p>
</blockquote>



<p class="wp-block-paragraph">Then Astra added two rules: the answer had to be one sentence, and it had to start with a fixed phrase. That phrase ends with the word <em>slot</em>, so everything else about the slot has to come after it.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">The sentence must begin with exactly this text and continue from it:<br><br>Slide the clay tile through one more steel slot<br><br>Facts: The slot is a hand’s width across. The slot is tapered. The slot is called the feed throat.</p>
</blockquote>



<p class="wp-block-paragraph">Luna still tidied it up. Every time, it reached for a relative clause:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Slide the clay tile through one more steel slot, which is a hand’s width across, tapered, and called the feed throat.</p>
</blockquote>



<p class="wp-block-paragraph">Then Astra made one more small change. It kept the same opening and the same three facts, but wrote the facts as short pieces instead of complete sentences:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Facts: a hand’s width across tapered called the feed throat</p>
</blockquote>



<p class="wp-block-paragraph">And Luna wrote this:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Slide the clay tile through one more steel slot, a hand’s width across, tapered, called the feed throat.</p>
</blockquote>



<p class="wp-block-paragraph">The only thing that changed between those two runs was how the facts were written down. Astra tried the same setup on a completely different subject:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Rest the cracked bowl inside one more padded cradle, two palms wide, crescent-shaped, called the handling saddle.</p>
</blockquote>



<p class="wp-block-paragraph">That’s the sentence I’d been chasing. Once the model had committed to the noun and the remaining facts arrived as loose pieces instead of sentences, it tacked them on in the order they came.</p>



<h2 class="wp-block-heading"><strong>The shape of its input, the model copies. Reorder the words it has already written, it cannot.</strong></h2>



<p class="wp-block-paragraph">That still doesn’t tell me whether this is what happened when the model wrote <em>one more small table, eight in and eight out, square, called the output projection</em>. In these experiments, we deliberately pushed Luna into that kind of situation. In the original sentence, the model got there on its own.</p>



<p class="wp-block-paragraph">I think the experiment shows that the model copies the shape of its input, and that fits my theory about the underlying attention and autoregression causes. When the three facts went in as complete sentences, Luna wrote a relative clause. The same facts sent in as bare fragments came back as bare fragments after the noun.</p>



<p class="wp-block-paragraph">There are some obvious limitations to this experiment. I’m watching the model from the outside, so I don’t have any visibility into how the model weighted those tokens, or what its attention mechanism was doing. I also can’t say whether the model already had those three facts in mind when it wrote <em>slot</em>, but even if it did, it couldn’t put them anywhere but after the text it already generated. But the outputs match what those two mechanisms would do. Attention responds to how the prompt is written, as well as to what it says. Once the model has written the noun, it can’t go back and put anything in front of it.</p>



<p class="wp-block-paragraph">I suspect that’s also why the AI keeps offering us that second answer. It can’t fix the Yoda-speak that it already generated. It can only write another sentence and hope that’s good enough.</p>
]]></content:encoded>
							<wfw:commentRss>https://www.oreilly.com/radar/why-does-ai-write-like-yoda/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>When Architecture Decisions Actually Apply</title>
		<link>https://www.oreilly.com/radar/when-architecture-decisions-actually-apply/</link>
				<comments>https://www.oreilly.com/radar/when-architecture-decisions-actually-apply/#respond</comments>
				<pubDate>Tue, 13 Oct 2026 11:02:53 +0000</pubDate>
					<dc:creator><![CDATA[Theo Valmis]]></dc:creator>
						<category><![CDATA[AI & ML]]></category>
		<category><![CDATA[Software Architecture]]></category>
		<category><![CDATA[Commentary]]></category>

		<guid isPermaLink="false">https://www.oreilly.com/radar/?p=19938</guid>

		
					<media:content 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/When-architecture-decisions-actually-apply-image-created-with-Adobe-Firefly.jpg" 
				medium="image" 
				type="image/jpeg" 
				width="2304" 
				height="1792" 
			/>

			<media:thumbnail 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/When-architecture-decisions-actually-apply-image-created-with-Adobe-Firefly-160x160.jpg" 
				width="160" 
				height="160" 
			/>
		
		
				<description><![CDATA[In my previous Radar article, “Architectural Guardrails for AI-Generated Code,” I argued that AI coding agents need a layer that can hold architectural decisions in a structured corpus, retrieve the relevant ones, put them into the agent’s context before it writes code, and enforce explicit constraints with reproducible checks. Testing that model exposed two distinctions [&#8230;]]]></description>
								<content:encoded><![CDATA[
<p class="wp-block-paragraph">In my previous Radar article, “<a href="https://www.oreilly.com/radar/architectural-guardrails-for-ai-generated-code/" target="_blank" rel="noopener">Architectural Guardrails for AI-Generated Code</a>,” I argued that AI coding agents need a layer that can hold architectural decisions in a structured corpus, retrieve the relevant ones, put them into the agent’s context before it writes code, and enforce explicit constraints with reproducible checks. Testing that model exposed two distinctions I had compressed together.</p>



<ol class="wp-block-list">
<li>Retrieving a decision because it is relevant doesn’t mean the decision applies to the artifact being changed.</li>



<li>A decision that does apply isn’t automatically suitable for deterministic enforcement.</li>
</ol>



<p class="wp-block-paragraph">The first distinction is between relevance and authority; the second is between guidance and enforcement.</p>



<p class="wp-block-paragraph">Here’s the story of how one controlled repository made this distinction clear. The project used local JSON-backed persistence for its current phase, and an active architecture decision ruled out PostgreSQL, ORMs, and database migrations for the command-line application. The task asked the coding agent to change that application’s storage module, so the decision was not merely related to persistence in general; it had authority over the part of the repository being changed. The record was retrieved successfully and placed in the agent’s context before work began.</p>



<p class="wp-block-paragraph">The agent still proposed PostgreSQL, together with an ORM and a migration path. Under my original four-capability model, that looked at first like a retrieval failure. It wasn’t. The decision was found and was current, and it arrived at the right moment. What was missing was an applicability signal that told the system that this decision governed the storage module being edited rather than serving as one more relevant document for the model to weigh against nearby code and other context.</p>



<h2 class="wp-block-heading"><strong>Retrieval finds; applicability governs</strong></h2>



<p class="wp-block-paragraph">Retrieval helps us determine which architectural decisions might be relevant to a task. That’s a search problem, and teams have increasingly capable ways to solve it: indexed repositories, connected documentation, exposed decision records and service catalogs, semantic search, and project memory. These techniques help an agent see useful material before it writes code. They don’t, by themselves, answer a different question: Which of those decisions has authority over the change in front of the agent?</p>



<p class="wp-block-paragraph">Suppose a repository contains two persistence decisions. One requires PostgreSQL for an analytics service; the other requires local file storage for a command-line tool. If the agent is editing the command-line tool’s storage module, both decisions may rank highly for a query about persistence, but only the local-storage decision applies to that artifact. Determining which decision governs the change requires scope, lifecycle, precedence, and a clear record of which decisions replace earlier ones. I argued for precedence and lifecycle in the previous article; scope deserves equal attention because scope is what tells the system where a decision has authority.</p>



<p class="wp-block-paragraph">A related problem is that architectural information is usually scattered across several kinds of documents. Humans know that an old design note, a README, an accepted architecture decision record, and a current platform standard don’t necessarily carry the same authority, even when all four discuss the same topic. Models don’t know that unless the system preserves the distinction. When those sources are flattened into one context window, the hierarchy among them can disappear. I think of this as authority flattening: Information remains available, but the signal about which information is binding becomes weaker. That’s useful when a design question is genuinely open; it’s risky when the team has already answered the question.</p>



<p class="wp-block-paragraph">Research on architectural decision violations points to a similar boundary. <a href="https://arxiv.org/abs/2602.07609" target="_blank" rel="noopener">A 2026 study by Su and colleagues</a> examined 980 ADRs across 109 open source repositories. The models were strong when decisions were explicit and inferable from code but less accurate when compliance depended on deployment configuration or organizational knowledge. The study evaluated violations after code was written rather than guidance before generation, but the underlying limitation is similar: A model can retrieve the right document and still make the wrong architectural choice when applicability or authority remains implicit.</p>



<h2 class="wp-block-heading"><strong>What scope changed</strong></h2>



<p class="wp-block-paragraph">I tested this distinction in a small controlled experiment using seven coding tasks, repeated under two conditions with the same coding agent and model configuration. In one condition the agent worked without the relevant architectural guidance; in the other, architectural decisions were supplied before it began changing code. Independent reviewers assessed the first attempts for both architectural compliance and whether the requested work was actually completed. The guidance changed behavior: First-attempt compliance on the architecture-sensitive tasks improved from 6 of 15 runs to 10 of 15, while successful task completion was essentially unchanged.</p>



<p class="wp-block-paragraph">The more interesting result was a failure inside the guided condition. In several authentication tasks, the agent received a storage-related architectural decision that was genuinely relevant to the surrounding problem and then implemented additional persistence work that the task had never asked for. Nothing was wrong with the decision, and retrieval had done its job. Relevance had simply been presented without enough information about authority. The experiment made two limits explicit: A decision can be relevant without governing the artifact being changed, and even a governing decision doesn’t authorize the agent to widen the task. Applicability tells the system where a decision may constrain work; it isn’t permission to invent more work.</p>



<h2 class="wp-block-heading"><strong>Blocking is easier than guiding</strong></h2>



<p class="wp-block-paragraph">The second distinction forced me to revise another part of the original model. The previous article emphasized deterministic enforcement: when a team has made an explicit decision and a violation can be identified from observable evidence, a blocking verdict should come from a reproducible rule rather than a model’s judgment. I still think that’s the right standard for blocking. The important qualification is that only a subset of architectural decisions can meet it without pretending that judgment has become deterministic.</p>



<p class="wp-block-paragraph">“Do not introduce SQLAlchemy into this component” is comparatively easy to express as a rule, easy to check, and easy to block. “Use the existing persistence abstraction correctly” is different. Most of its meaning is architectural rather than syntactic: The right implementation depends on which abstraction is intended, how it’s used in this part of the system, and what surrounding constraints are already in force. The first statement describes a prohibition that can plausibly become a deterministic control. The second describes a sanctioned path and is better treated as guidance unless the team can make the relevant evidence and boundary precise.</p>



<p class="wp-block-paragraph">Earlier experiments with pregeneration guidance pointed in the same direction. Adding more architecture-related context didn’t reliably improve behavior because what was missing was often not another prohibition; it was a clearer description of the accepted implementation path. A guardrail layer built entirely around blocking will become very good at saying no. Useful architectural governance has to do both jobs: block the known violations when the evidence is precise enough and carry positive architectural direction for the much larger set of decisions that still require interpretation.</p>



<h2 class="wp-block-heading"><strong>When judgment becomes authority</strong></h2>



<p class="wp-block-paragraph">This doesn’t reduce the role of models; it puts probabilistic reasoning where it’s useful. Models are good at interpretation: reading ambiguous guidance, surfacing decisions that might bear on a change, explaining the consequences of a boundary violation, and proposing how to bring a change back into line with the intended design. Deterministic logic is better suited to decisions the team has already settled and can state in terms that a check can reproduce. The mistake is asking either mechanism to do both jobs.</p>



<p class="wp-block-paragraph">Once a system says that a proposed change violates an architectural rule, the standard changes. An engineer should be able to ask which decision applied, why it applied to this part of the codebase, what evidence triggered the result, and whether another developer running the same check would get the same answer. That doesn’t require every part of architecture to become formal policy. It requires a clear boundary around where uncertainty is allowed: Models may help find and explain architectural context, but a blocking decision shouldn’t ultimately reduce to “the model thought this looked wrong.”</p>



<p class="wp-block-paragraph">Humans routinely work with architectural ambiguity. We weigh incomplete evidence, local context, and competing trade-offs, often using heuristics rather than formal rules. Models can help with that interpretive work too, but the result remains probabilistic. The problem begins when an ambiguous judgment is treated as a blocking rule. Deterministic enforcement requires a boundary precise enough that the same evidence produces the same verdict.</p>



<p class="wp-block-paragraph">The distinction matters even more when a team uses several coding tools at once. One developer may use Claude Code, another Codex, another Cursor, while automated agents perform background maintenance. The models and retrieval mechanisms can differ, but the team’s architecture shouldn’t change with the tool. A shared set of decisions can sit underneath those environments as the source of authority, while each tool consumes guidance in its own way and the enforceable subset is checked consistently.</p>



<h2 class="wp-block-heading"><strong>What I would add to the original model</strong></h2>



<p class="wp-block-paragraph">I would now amend the original four-capability model in two places.</p>



<p class="wp-block-paragraph">Retrieval should surface candidate decisions, while applicability determines which of those decisions actually govern the current artifact or action, using scope together with lifecycle and precedence. Then guidance and enforcement should remain separate outcomes: Some applicable decisions are precise enough to support deterministic controls, while others should influence the implementation without becoming binary rules.</p>



<p class="wp-block-paragraph">That separation leaves the agent free to reason where the architecture is genuinely open while preserving authority where the team has already made a decision. It also avoids a common overcorrection. Once teams see that some architecture can be enforced automatically, the temptation is to formalize everything. A great deal of architecture is still judgment. “Keep domain boundaries narrow” or “prefer asynchronous integration when immediate consistency is unnecessary” can be valuable guidance without being safe material for an automatic block. The level of authority a system exercises should follow the precision of the decision and the evidence available to evaluate it.</p>



<p class="wp-block-paragraph">For years architectural governance ran largely on human process: Someone wrote the decision record, an architect reviewed the important changes, experienced engineers carried part of the history in their heads, and code review caught some of what slipped through. AI coding agents change the economics of that process because implementation can now move faster than architectural intent can be reexplained and rereviewed by hand. Giving agents more context is necessary, but it’s not sufficient. The harder job is preserving the difference between information that may be useful, a decision that actually applies, guidance that should shape an implementation, and a constraint that is precise enough to stop one.</p>



<p class="wp-block-paragraph">The goal isn’t to constrain every choice an agent makes. It’s to stop decisions the team has already made from quietly turning back into suggestions. That requires more than retrieving the right document. The system has to know whether the decision is current, where it has authority, and what kind of authority the team intended it to have.</p>
]]></content:encoded>
							<wfw:commentRss>https://www.oreilly.com/radar/when-architecture-decisions-actually-apply/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>Zero to Agent in 30 Minutes: Build a Personal Assistant on OpenClaw</title>
		<link>https://www.oreilly.com/radar/zero-to-agent-in-30-minutes-build-a-personal-assistant-on-openclaw/</link>
				<comments>https://www.oreilly.com/radar/zero-to-agent-in-30-minutes-build-a-personal-assistant-on-openclaw/#respond</comments>
				<pubDate>Mon, 12 Oct 2026 15:54:29 +0000</pubDate>
					<dc:creator><![CDATA[Michelle Smith]]></dc:creator>
						<category><![CDATA[Zero to Agent in 30 Minutes]]></category>
		<category><![CDATA[Commentary]]></category>

		<guid isPermaLink="false">https://www.oreilly.com/radar/?p=19933</guid>

		
					<media:content 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/USE_THIS_zero-to-agent-radar-1600x840-1.png" 
				medium="image" 
				type="image/png" 
				width="1600" 
				height="840" 
			/>

			<media:thumbnail 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/USE_THIS_zero-to-agent-radar-1600x840-1-160x160.png" 
				width="160" 
				height="160" 
			/>
		
				<custom:subtitle><![CDATA[Give an agent the context and routines it needs to help throughout your day]]></custom:subtitle>
		
				<description><![CDATA[In the final episode of Zero to Agent in 30 Minutes, AI engineer Sajal Sharma showed how to build a personal assistant on OpenClaw that tracks your tasks and notes and handles scheduled work on its own. A useful personal assistant has to be reachable when you’re away from your computer and keep running when [&#8230;]]]></description>
								<content:encoded><![CDATA[
<iframe width="800" height="450" src="https://www.youtube.com/embed/lxMzcRVSYQg?si=L2SyAtn4ZbsYXLiT" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">In the final episode of <em>Zero to Agent in 30 Minutes</em>, AI engineer Sajal Sharma showed how to build a personal assistant on OpenClaw that tracks your tasks and notes and handles scheduled work on its own.</p>



<p class="wp-block-paragraph">A useful personal assistant has to be reachable when you’re away from your computer and keep running when it has scheduled work to do. OpenClaw supports both, and you decide where the agent runs, which models it uses, and how it accesses your data.</p>



<h3 class="wp-block-heading"><strong>How to go from a fresh install to scheduled automations, step-by-step</strong></h3>



<ol class="wp-block-list">
<li><strong>Install your OpenClaw instance.</strong> Sajal recommends starting locally while you learn how it works, then moving to an always-on machine or hosted environment if you need continuous availability.</li>



<li><strong>Connect the channels you use.</strong> Add a messaging channel such as Telegram, WhatsApp, or Slack so you can reach the assistant away from your desk. Sajal used Telegram in his demo to send requests and receive notifications from the same assistant.</li>



<li><strong>Set up the assistant’s workspace.</strong> Give the agent a place to keep tasks, notes, skills, and memory, along with guidance files that define how it behaves and how it should work with the files in that workspace.</li>



<li><strong>Use it in your daily workflows.</strong> Sajal asked the assistant for an overview of current projects and checked progress toward a reading goal. He also had it search the web for a book series and add the books it found to his reading list.</li>



<li><strong>Add proactive automations.</strong> Schedule work the assistant should handle on its own. Sajal added a Telegram reminder and a morning briefing designed to pull from tasks, a calendar, and recent email. Recurring checks and webhooks can also trigger the agent when something changes in another system.</li>
</ol>



<h2 class="wp-block-heading"><strong>Thanks for following</strong> <strong><em>Zero to Agent</em></strong></h2>



<p class="wp-block-paragraph">This episode closes out <em>Zero to Agent in 30 Minutes</em>. Thanks for watching and building along with our presenters throughout the series.</p>



<p class="wp-block-paragraph">If you’d like to keep following how agents can take on more complex work, tune in to <em>The Monday Morning Agent</em>, which debuts Monday, October 12, at 8am PT/11am ET. The eight-episode series follows the development of an increasingly autonomous data agent working with real play-by-play data. <a href="https://learning.oreilly.com/live-events/the-monday-morning-agent/0642572456054/" target="_blank" rel="noopener">Learn more and save your seat</a> or follow along here on Radar.</p>
]]></content:encoded>
							<wfw:commentRss>https://www.oreilly.com/radar/zero-to-agent-in-30-minutes-build-a-personal-assistant-on-openclaw/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>Designing Websites for People and AI Agents with WebMCP</title>
		<link>https://www.oreilly.com/radar/designing-websites-for-people-and-ai-agents-with-webmcp/</link>
				<comments>https://www.oreilly.com/radar/designing-websites-for-people-and-ai-agents-with-webmcp/#respond</comments>
				<pubDate>Mon, 12 Oct 2026 10:54:27 +0000</pubDate>
					<dc:creator><![CDATA[Angie Jones]]></dc:creator>
						<category><![CDATA[AI & ML]]></category>
		<category><![CDATA[Commentary]]></category>

		<guid isPermaLink="false">https://www.oreilly.com/radar/?p=19930</guid>

		
					<media:content 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/Designing-websites-for-people-and-AI-agents-with-WebMCP-image-created-with-Adobe-Firefly.jpg" 
				medium="image" 
				type="image/jpeg" 
				width="2304" 
				height="1792" 
			/>

			<media:thumbnail 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/Designing-websites-for-people-and-AI-agents-with-WebMCP-image-created-with-Adobe-Firefly-160x160.jpg" 
				width="160" 
				height="160" 
			/>
		
		
				<description><![CDATA[The following article originally appeared on the Agentic AI Foundation blog and is being reposted here with the author’s permission. Websites are designed for people. We can look at a page and quickly understand where to enter information or which control will complete an action. AI agents don’t see or use the web the same [&#8230;]]]></description>
								<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>The following article originally appeared on the</em> <em><a href="https://aaif.io/blog/designing-websites-for-ai-agents-with-webmcp" target="_blank" rel="noopener">Agentic AI Foundation blog</a></em> <em>and is being reposted here with the author’s permission.</em></p>
</blockquote>



<p class="wp-block-paragraph">Websites are designed for people. We can look at a page and quickly understand where to enter information or which control will complete an action.</p>



<p class="wp-block-paragraph">AI agents don’t see or use the web the same way we do. An agent may have to process a screenshot or inspect the page’s underlying structure, then reason about which control matches the request.</p>



<p class="wp-block-paragraph">The additional context increases token use, and each interpretation step creates another chance for error.</p>



<p class="wp-block-paragraph"><a href="https://webmachinelearning.github.io/webmcp/" target="_blank" rel="noopener">WebMCP</a> (not to be confused with MCP) gives web developers a standard way to publish structured tools to access the capabilities of their website enabling agents to call those functions with structured inputs.</p>



<p class="wp-block-paragraph">A developer can register a tool through <code>document.modelContext</code> and give it a name and description. The tool also defines an input schema and the function that runs when an agent calls it.</p>



<p class="wp-block-paragraph">For example, an article site could publish a search tool that calls the same application code as its visible search form.</p>



<pre class="wp-block-code"><code>const searchToolController = new AbortController();

await document.modelContext.registerTool(
  {
    name: "search-articles",
    title: "Search articles",
    description: "Search published articles by topic.",
    inputSchema: {
      type: "object",
      properties: {
        query: {
          type: "string",
          description: "The topic or phrase to search for."
        }
      },
      required: &#91;"query"],
      additionalProperties: false
    },
    async execute({ query }) {
      const articles = await searchArticles(query);
      renderSearchResults(articles);
      return { articles };
    }
  },
  { signal: searchToolController.signal }
);

// Call this when the search tool should no longer be available.
// searchToolController.abort();</code></pre>



<p class="wp-block-paragraph">The name and description tell the agent when to use the tool. The input schema defines the arguments it can send. The <code>execute</code> function calls the site’s existing search logic and updates the page with the results.</p>



<p class="wp-block-paragraph">The browser makes the registered tool available to a supported agent while the page is active. When the agent calls it, the browser passes the structured arguments to execute and returns the result.</p>



<p class="wp-block-paragraph">When the search tool should no longer be available, the page can unregister it by calling <code>searchToolController.abort()</code>.</p>



<p class="wp-block-paragraph">A page registers tools that match its current state. A content view may provide a search tool, while an editor can provide tools for changing the selected content. The agent then discovers the tools available for the page’s current state.</p>



<p class="wp-block-paragraph">WebMCP also proposes a declarative path for existing HTML forms. The article search could be exposed through attributes on the form itself.</p>



<pre class="wp-block-code"><code>&lt;form
  action="/articles"
  method="get"
  toolname="search-articles"
  tooldescription="Search published articles by topic."
>
  &lt;label for="article-query">Topic&lt;/label>
  &lt;input
    id="article-query"
    name="query"
    type="search"
    toolparamdescription="The topic or phrase to search for."
    required
  >
  &lt;button type="submit">Search&lt;/button>
&lt;/form>
</code></pre>



<p class="wp-block-paragraph">The browser uses the form attributes and controls to create the tool definition. Because the form omits <code>toolautosubmit</code>, the browser populates the field but leaves the final click to the person. The person can review the search query and click the Search button.</p>



<h2 class="wp-block-heading">Keep the person and agent in the same interface</h2>



<p class="wp-block-paragraph">A WebMCP tool uses the state already visible in the application and the person’s active session. The shared page gives the person a place to review the agent’s work. When the agent completes an action, the person can see the updated state and make changes through the normal interface.</p>



<p class="wp-block-paragraph">Web developers can also reuse application logic that already handles the visible interface. OpenAI’s <a href="https://developers.openai.com/blog/automating-repetitive-work-at-openai-with-codex" target="_blank" rel="noopener">Runme example</a> is a browser application that registers tools for reading instructions and updating notebook content. Runme can offer those functions through the page without adding a separate server only to expose an MCP endpoint.</p>



<h2 class="wp-block-heading">Pair WebMCP with MCP</h2>



<p class="wp-block-paragraph">WebMCP and MCP both expose tools to agents, but they operate in different parts of an application. Understanding the difference helps developers decide where each one fits and how they can work together.</p>



<p class="wp-block-paragraph">An MCP server can provide tools when no related page is open. A WebMCP tool is attached to the current document and can use the page’s current state.</p>



<p class="wp-block-paragraph">WebMCP standardizes how a page registers tools with the browser. The browser can present those tools to its agent through MCP or another function calling mechanism.</p>



<p class="wp-block-paragraph"><a href="https://modelcontextprotocol.io/extensions/apps/overview" target="_blank" rel="noopener">MCP Apps</a> address another part of the interaction. An MCP server can provide an interactive interface that a compatible host displays to a person. WebMCP lets an agent use functions from an existing website.</p>



<p class="wp-block-paragraph">WebMCP and MCP Apps can work together. For example, a shopping website could publish a <code>compare_products</code> tool through WebMCP. An MCP server could provide an MCP App for the comparison, so the person can adjust the options while the agent handles the supporting work.</p>



<p class="wp-block-paragraph">The comparison interface could also be described with <a href="https://a2ui.org/" target="_blank" rel="noopener">A2UI</a>, which lets an agent describe an interface in a declarative format. The client renders the description with components from its own design system, so the client controls which components are available and how they behave.</p>



<p class="wp-block-paragraph">People and agents can use the same interface at the same time. Developers need to decide which functions the agent can call and what the person should see while those functions run.</p>



<h2 class="wp-block-heading">Design the page for agent use</h2>



<p class="wp-block-paragraph">Agent use begins before the first click. An agent may need to discover the website and determine how to authenticate. It may choose an API or structured documentation before opening a browser.</p>



<p class="wp-block-paragraph">Web teams should study how agents use their site before deciding which interface to add. Check the server logs to see whether agents are crawling HTML or requesting machine readable content. Tool activity can reveal which WebMCP functions agents discover and which calls they abandon.</p>



<h2 class="wp-block-heading">Keep existing controls in the execution path</h2>



<p class="wp-block-paragraph">WebMCP reduces the amount of interface interpretation an agent has to do, but a structured tool is still an entry point into the application. The website should apply its existing access controls and input validation whenever the tool runs.</p>



<p class="wp-block-paragraph">For example, an <code>update_cart</code> tool can accept a product identifier and quantity. The server should confirm that the product exists and that the current user can modify the cart. Structured input doesn’t automatically make the request trusted, so the server should run the same checks it uses for updates made through the website.</p>



<p class="wp-block-paragraph">The browser also has a responsibility. OpenAI reviews each site tool call before it runs and asks the person to confirm sensitive actions. The WebMCP draft requires origin isolation, and its <code>tools</code> permissions policy allows same origin use by default.</p>



<p class="wp-block-paragraph">Clients need to handle tool changes during a task. A page can change a tool’s identity or schema after the agent begins working, so the client should review the tool again before using the new definition.</p>



<p class="wp-block-paragraph">Researchers are already testing those boundaries. A <a href="https://arxiv.org/abs/2606.06387" target="_blank" rel="noopener">June preprint on WebMCP tool surface poisoning</a> found that changes to tool registration and metadata could redirect agents in its test environment. The researchers used a polyfill and a headless agent, so a native browser implementation may behave differently. But these reported attacks can serve as great test cases as you’re adding WebMCP to your site.</p>



<h2 class="wp-block-heading">Test WebMCP while the design is open</h2>



<p class="wp-block-paragraph">WebMCP already has several experimental implementations. Chrome offers an implementation through a flag and an origin trial. Sarah Drasner created an <a href="https://webmcp-demo-sdras.netlify.app/" target="_blank" rel="noopener">interactive WebMCP demo</a> of this implementation that you can try in your browser.</p>



<p class="wp-block-paragraph">Cloudflare released a developer preview that can add a WebMCP bridge to a website, and Brave has tested WebMCP with its Leo assistant.</p>



<p class="wp-block-paragraph">Testing WebMCP against varied applications can reveal assumptions in the current draft. For example, a form may need a declarative feature that has not been specified yet. Also, look for lifecycle problems when a website changes its tools during a task.</p>



<p class="wp-block-paragraph">Bring your findings back to the <a href="https://github.com/webmachinelearning/webmcp" target="_blank" rel="noopener">WebMCP issue tracker</a>.</p>
]]></content:encoded>
							<wfw:commentRss>https://www.oreilly.com/radar/designing-websites-for-people-and-ai-agents-with-webmcp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>This Week in AI: More Capability, More Responsibility</title>
		<link>https://www.oreilly.com/radar/this-week-in-ai-more-capability-more-responsibility/</link>
				<comments>https://www.oreilly.com/radar/this-week-in-ai-more-capability-more-responsibility/#respond</comments>
				<pubDate>Fri, 09 Oct 2026 15:55:10 +0000</pubDate>
					<dc:creator><![CDATA[Christina Stathopoulos and Michelle Smith]]></dc:creator>
						<category><![CDATA[This Week in AI]]></category>
		<category><![CDATA[Commentary]]></category>

		<guid isPermaLink="false">https://www.oreilly.com/radar/?p=19926</guid>

		
					<media:content 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/08/USE_THIS_thisweek-ai-radar-1600x840-1.png" 
				medium="image" 
				type="image/png" 
				width="1600" 
				height="840" 
			/>

			<media:thumbnail 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/08/USE_THIS_thisweek-ai-radar-1600x840-1-160x160.png" 
				width="160" 
				height="160" 
			/>
		
				<custom:subtitle><![CDATA[Government oversight, persistent agents, world models, and practical AI in high-stakes settings]]></custom:subtitle>
		
				<description><![CDATA[AI systems are gaining more autonomy while governments, companies, and researchers are still working out how much oversight they need. On the latest episode of This Week in AI, we covered the US debate over AI governance, new frontier models, persistent agents, world models, and practical uses for AI in healthcare and disaster response. AI [&#8230;]]]></description>
								<content:encoded><![CDATA[
<iframe width="800" height="450" src="https://www.youtube.com/embed/JFjaJky2Gvc?si=SvYPJunS0UtdZd_M" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">AI systems are gaining more autonomy while governments, companies, and researchers are still working out how much oversight they need. On the latest episode of <em>This Week in AI</em>, we covered the US debate over AI governance, new frontier models, persistent agents, world models, and practical uses for AI in healthcare and disaster response.</p>



<h3 class="wp-block-heading"><strong>AI oversight is moving beyond company promises</strong></h3>



<p class="wp-block-paragraph">The Trump administration announced a <a href="https://www.theguardian.com/us-news/2026/sep/29/trump-ai-deal-tech-ceos-superintelligence" target="_blank" rel="noopener">voluntary agreement with major AI companies</a> that calls for internal safety monitoring, external audits, and independent board reviews. Because the agreement carries no legal enforcement, it raises a familiar question about how far self-regulation can go when companies are developing increasingly powerful systems.</p>



<p class="wp-block-paragraph">Government agencies are also testing what existing law can do. <a href="https://www.washingtonpost.com/technology/2026/09/30/ftc-launches-broad-investigation-into-anthropic-openai/" target="_blank" rel="noopener">The Federal Trade Commission launched an investigation</a> into OpenAI, Anthropic, and other AI companies focused on potential consumer risks. Cases like these could help establish whether current consumer protection laws are enough or whether AI will require a more specialized regulatory framework.</p>



<p class="wp-block-paragraph">For technical leaders, regulation can influence how organizations evaluate models, document risks, manage access, and choose vendors. As AI moves deeper into business processes, teams will need governance practices that can withstand outside review.</p>



<h3 class="wp-block-heading"><strong>AI systems are taking on longer, more autonomous work</strong></h3>



<p class="wp-block-paragraph">OpenAI just released <a href="https://openai.com/index/introducing-dots/" target="_blank" rel="noopener">Dots</a>, its “proactive assistant” designed to retain context, work across applications, pursue multiple goals, and act independently. To do that work without waiting for a prompt, Dots needs standing access to the apps and data it works across. That also increases the amount of personal data an agent can reach and raises the cost of mistakes or misuse.</p>



<p class="wp-block-paragraph">Google is also extending how long a model can work on a task. The company says <a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-4-argon/" target="_blank" rel="noopener">Gemini 4 Argon</a> can generate up to a million output tokens in a single response, far beyond the typical output limits of current frontier models. The goal is to let a model stay with long multistep work such as extensive coding or financial and legal analysis. Longer-running models and persistent agents aren’t the same thing, but both let AI finish more work without handing control back to a person.</p>



<p class="wp-block-paragraph">As agents act more on their own, they need to anticipate the consequences of their actions. That becomes even more important when AI moves beyond software and begins acting in the physical world. World models aim to teach AI how these environments work, including cause and effect, which is why many researchers see them as building blocks for robotics and physical AI. World Labs (<a href="https://newsroom.amd.com/news/amd-acquire-world-labs/" target="_blank" rel="noopener">recently acquired by AMD</a>) is developing spatial intelligence models for interactive 3D environments, while British startup <a href="https://www.wired.com/story/the-next-evolution-of-ai-is-learning-from-your-dodgy-gaming-skills/" target="_blank" rel="noopener">Worldmodeldata has licensed nearly 1 million hours of video game data</a> paired with player actions. Researchers from NVIDIA, MIT, and Oxford also introduced <a href="https://physis-intelligence.github.io/physis-lang-web/" target="_blank" rel="noopener">Physis-Lang</a>, which uses descriptions of physical causes and effects to help video models learn why events happen. Researchers still don’t know which training approach will work best, so they’re testing several kinds of data and model design.</p>



<h3 class="wp-block-heading"><strong>AI support experts in high-stakes work</strong></h3>



<p class="wp-block-paragraph">Anthropic’s Claude is <a href="https://www.anthropic.com/features/ebola-response" target="_blank" rel="noopener">helping teams responding to an Ebola outbreak</a> in the Democratic Republic of the Congo organize daily reports, compare forecasting models, analyze genomic information, and support vaccine research. <a href="https://www.nature.com/articles/d41586-026-03106-y" target="_blank" rel="noopener">Researchers have also developed a Spanish-language speech model</a> that may eventually help identify accelerated biological aging and early signs of dementia. Mayo Clinic researchers built a <a href="https://www.newswise.com/articles/artificial-intelligence-model-predicts-pancreatic-cancer-risk-3-years-before-diagnosis" target="_blank" rel="noopener">model that identifies patterns associated with elevated pancreatic cancer risk</a> years before diagnosis. Following severe flooding in Nepal, local <a href="https://indianexpress.com/article/explained/explained-ai/disaster-management-india-nepal-using-artificial-intelligence-10896719/" target="_blank" rel="noopener">teams used AI to match reports of missing people with victim lists</a> and map damaged buildings using satellite imagery.</p>



<p class="wp-block-paragraph">Together, these examples show how AI can be used for good by helping people work through complex information faster and, ultimately, save lives, while keeping qualified experts responsible for the final decisions.</p>



<h2 class="wp-block-heading"><strong>What’s next</strong></h2>



<p class="wp-block-paragraph">As AI takes on more work and enters higher-stakes settings, organizations will need clearer answers about access and accountability. They’ll also need to decide where human judgment remains necessary as systems become more capable.</p>



<p class="wp-block-paragraph">Join us again next Monday for another episode of <em>This Week in AI,</em> when we’ll dive into more of the news, issues, and key developments shaping the AI era. And check back each Friday for the latest episode, or watch on <a href="https://www.youtube.com/watch?v=g4cfjz5AKxY&amp;list=PL055Epbe6d5bJEhT7_ZzOeJZ6gPyUzYpS" target="_blank" rel="noopener">YouTube</a>, <a href="https://open.spotify.com/show/033kJS2BG1teGunxmtsU1r" target="_blank" rel="noopener">Spotify</a>, <a href="https://podcasts.apple.com/us/podcast/this-week-in-ai/id1896798047" target="_blank" rel="noopener">Apple</a>, or wherever you get your podcasts.</p>
]]></content:encoded>
							<wfw:commentRss>https://www.oreilly.com/radar/this-week-in-ai-more-capability-more-responsibility/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>Intent, Not Identity</title>
		<link>https://www.oreilly.com/radar/intent-not-identity/</link>
				<comments>https://www.oreilly.com/radar/intent-not-identity/#respond</comments>
				<pubDate>Fri, 09 Oct 2026 10:54:17 +0000</pubDate>
					<dc:creator><![CDATA[Vicki Reyzelman]]></dc:creator>
						<category><![CDATA[AI & ML]]></category>
		<category><![CDATA[Commentary]]></category>

		<guid isPermaLink="false">https://www.oreilly.com/radar/?p=19922</guid>

		
					<media:content 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/Intent-not-identity.jpg" 
				medium="image" 
				type="image/jpeg" 
				width="2304" 
				height="1792" 
			/>

			<media:thumbnail 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/Intent-not-identity-160x160.jpg" 
				width="160" 
				height="160" 
			/>
		
				<custom:subtitle><![CDATA[The web is building an identity layer for AI agents. It will tell you who’s knocking. It won’t tell you whether to open the door.]]></custom:subtitle>
		
				<description><![CDATA[On a recent episode of This Week in AI, we discussed that the number of nonhumans on the internet is greater than humans, 144 to 1. It’s an estimate, and the order of magnitude is more important than the number itself. What matters is what a ratio anywhere in that range does to a security [&#8230;]]]></description>
								<content:encoded><![CDATA[
<p class="wp-block-paragraph">On a recent episode of <em>This Week in AI</em>, we discussed that the number of nonhumans on the internet is greater than humans, 144 to 1. It’s an estimate, and the order of magnitude is more important than the number itself. What matters is what a ratio anywhere in that range does to a security architecture. For more than two decades, systems were engineered around two foundational assumptions: either verifying a human user exercising discretionary judgment or validating the account executing hardcoded predictable logic. Autonomous AI agents shatter both sides of this legacy identity taxonomy because they possess broad, human-like operational scope across multiple internal and external applications while remaining inherently nondeterministic and probabilistic in their reasoning.</p>



<p class="wp-block-paragraph">Today, because the agent is interacting on behalf of a human through a genuine browser with standard extensions, its technical fingerprint looks identical to a normal human user’s device. Agents call tools, observe results, and revise. A person browses, hands off to an agent, and takes the session back. All the activity appears to be coming from the same user.</p>



<p class="wp-block-paragraph">Signed agents help the identity problem, and they’re arriving. <a href="https://developers.cloudflare.com/bots/reference/bot-verification/web-bot-auth/" target="_blank" rel="noopener">Web Bot Auth</a> is a thin layer over RFC 9421 HTTP Message Signatures where an agent declares its identity and purpose. But they only help with the identity problem: The signature proves who is making the request, not the intent behind it. Prompt injection and other techniques can be used to steer a verified, well-behaved agent into acting against your interest without its operator ever knowing.</p>



<p class="wp-block-paragraph">The organizations getting this right are treating agent policy as a commercial question with a security implementation. The following questions need to be answered:</p>



<ul class="wp-block-list">
<li>Which agents do we allow to use our service?</li>



<li>What endpoints do we need to protect? </li>



<li>How will agent management security policies impact revenue?</li>
</ul>



<p class="wp-block-paragraph">Here are the techniques successful companies are using to secure in the agentic era. A phased strategic roadmap implementing continuous execution-time verification. These are the steps:</p>



<ol class="wp-block-list">
<li><strong>Establish execution-time machine identity and scoped delegation.</strong> Replace static, long-lived API keys with machine single sign-on mechanisms that issue short-lived, context-bound credentials at the time of tool execution. Enforce strict delegation policies so that autonomous agents operate within verified “green zones” without inheriting broad human privileges.</li>



<li><strong>Deploy cryptographic ingress verification.</strong> Upgrade edge infrastructure to inspect Web Bot Auth HTTP Message Signatures, in order to separate cryptographically verified crawlers from anonymous traffic.</li>



<li><strong>Upgrade edge defenses to browser-layer intent classification.</strong> Transition legacy network-layer antibot web application firewall (WAF) to client-side browser-layer detection platforms. </li>



<li><strong>Harden agent execution pipelines against prompt injection.</strong> Instrument robust input sanitization, instruction hierarchy enforcement, and design-level safeguards around all LLM ingestion channels to neutralize indirect prompt injection attacks before external web content reaches execution tools.</li>



<li><strong>Adopt standardization for agentic commerce and admission.</strong> Integrate emerging trust frameworks such as the Framework for Agentic Commerce Trust (FACT), a neutral real-time trust layer for AI-driven transactions in addition to verification protocols like CAPTCHA to validate agentic capability vectors before delegating sensitive interagent tasks.</li>
</ol>



<p class="wp-block-paragraph">The rapid transition from human-directed software to autonomous AI agents breaks traditional enterprise security paradigms. AI agents operate with broad operational scope but nondeterministic, probabilistic reasoning. This is causing static perimeter defenses to fail. The teams that come through this well will be the ones that stopped asking “Who’s on the other end of the connection?” and started asking “What’s this request for, and what happens if it succeeds?”</p>
]]></content:encoded>
							<wfw:commentRss>https://www.oreilly.com/radar/intent-not-identity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>The Preservation Gap in the AI Stack: Why Capability Is Advancing Faster Than Reconstructability</title>
		<link>https://www.oreilly.com/radar/the-preservation-gap-in-the-ai-stack-why-capability-is-advancing-faster-than-reconstructability/</link>
				<comments>https://www.oreilly.com/radar/the-preservation-gap-in-the-ai-stack-why-capability-is-advancing-faster-than-reconstructability/#respond</comments>
				<pubDate>Thu, 08 Oct 2026 10:54:41 +0000</pubDate>
					<dc:creator><![CDATA[Monika Dvorackova]]></dc:creator>
						<category><![CDATA[AI & ML]]></category>
		<category><![CDATA[Commentary]]></category>

		<guid isPermaLink="false">https://www.oreilly.com/radar/?p=19915</guid>

		
					<media:content 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/The-preservation-gap-in-the-AI-stack.jpg" 
				medium="image" 
				type="image/jpeg" 
				width="2304" 
				height="1792" 
			/>

			<media:thumbnail 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/The-preservation-gap-in-the-AI-stack-160x160.jpg" 
				width="160" 
				height="160" 
			/>
		
		
				<description><![CDATA[Artificial intelligence systems are difficult to reproduce because their behavior depends on nondeterministic models and on data, configurations, policies, and external services that continue to change. But exact reproducibility is not always what operators, investigators, or auditors need. They often need something different: historical reconstructability. The central claim is that reconstructability is a system property [&#8230;]]]></description>
								<content:encoded><![CDATA[
<p class="wp-block-paragraph">Artificial intelligence systems are difficult to reproduce because their behavior depends on nondeterministic models and on data, configurations, policies, and external services that continue to change. But exact reproducibility is not always what operators, investigators, or auditors need. They often need something different: historical reconstructability. The central claim is that reconstructability is a system property established during execution, not inferred later from surviving artifacts. To make that property concrete, this article introduces Orrery, a reference architecture for preserving the runtime bindings and historical dependency states needed to reconstruct an AI system’s past execution.</p>



<p class="wp-block-paragraph">Imagine an AI-assisted decision that must be examined six months after it was made. Rerunning the system may produce a different answer, but an investigator may still need to determine which model endpoint, policy, retrieved data, tool contract, and runtime configuration were used at the time. That is the problem addressed here.</p>



<p class="wp-block-paragraph">The AI industry remains much better at evaluating capability than at preserving the knowledge required to understand past executions. Evaluation pipelines track benchmark scores, task success rates, retrieval precision and recall, tool-call success rates, latency, and cost, and they grow more elaborate with every release. In practice, this machinery often reduces to one acceptance question: <em>What can this system do?</em> That question captures capability, but not whether a past execution will remain understandable after the system changes.</p>



<p class="wp-block-paragraph">That missing property is historical reconstructability: the ability to establish which dependencies were used and under which conditions a particular execution occurred. It is related to, but distinct from, reproducibility. Reproducibility asks whether a result can be produced again under equivalent conditions. Reconstructability asks whether the conditions of the original execution can still be identified, even when repeating that execution would not produce an identical result.</p>



<p class="wp-block-paragraph">This distinction matters when a consequential AI execution completes successfully today and is challenged six months later. The model may still exist in a registry. The application revision may still exist in Git. The trace may still identify the request and the services it crossed. Yet none of these records necessarily reveals which model endpoint served the request, which input transformation and runtime configuration were applied, which data, feature state, or retrieved context entered the computation, or which policy state governed it. In an agentic system, the missing history may also include memory, tool contracts, delegation, and external effects. Even when a dependency identifier was recorded, the historical state to which it referred may no longer be available or resolvable.</p>



<p class="wp-block-paragraph">The problem is that an AI runtime may use dependencies whose historical identities and relationships are not preserved. This is an architectural problem, not merely a logging problem. The gap lies between what the runtime uses and what the surrounding infrastructure is required to preserve. I call this the preservation gap. The AI stack preserves models, code, deployments, and observations, but it does not require the effective historical configuration of a particular execution to remain available. The components may remain while the relations that made them one execution disappear. An AI runtime must assemble today’s execution; it is not necessarily required to remember exactly what it assembled yesterday. Reconstructability must therefore be established during execution, before later mutation erases the bindings that gave the execution its effective configuration.</p>



<p class="wp-block-paragraph"><a href="https://bazel.build/basics/hermeticity" target="_blank" rel="noopener">Hermetic builds</a> illustrate the opposite design pattern. They close the dependency graph before execution begins by pinning inputs, versions, and external dependencies. AI runtimes face the reverse situation: Part of the dependency graph remains open until execution, as model endpoints may resolve through mutable aliases, data and feature state evolve, runtime configuration and policy change, and retrieved context is selected only when a request is processed. Agentic systems extend the graph further through memory, tools, delegation, and external effects. In a hermetic build, dependency closure is an input. In a modern AI runtime, part of it may be an output of the run.</p>



<p class="wp-block-paragraph">Version control records source evolution, transaction logs record state transitions, and distributed tracing records execution relationships. These mechanisms preserve different views of a run but not its materially relevant execution-specific configuration. A trace may retain execution flow, a deployment manifest the declared application state, and a model registry the model revision. What is often missing is the record of which artifacts and states were bound together in a particular execution.</p>



<h2 class="wp-block-heading"><strong>The dependency graph no longer closes at deployment</strong></h2>



<p class="wp-block-paragraph">A deployment records the configuration known before execution begins. AI systems are harder to reconstruct because materially relevant dependencies are selected during execution rather than fixed at deployment. At inference time, the system may resolve a model endpoint, input transformation, data or feature state, retrieved context, runtime configuration, safety controls, and policy. Agentic systems extend this composition through memory, tools, delegation, and external effects. These execution-specific selections are runtime bindings: facts about what the execution actually used.</p>



<p class="wp-block-paragraph">The following example makes this distinction concrete. Consider a hypothetical agentic execution identified as E891. During this execution, the system retrieves two documents, evaluates a policy, invokes a tool, and produces an external effect. The deployment may identify application revision 8f31c2 and model v17, while the execution itself binds prompt h31, retrieval index r42, entities d182@17 and d761@4, tool contract h42, policy v8, and ultimately effect e3. The deployment system could not have known this entire set in advance, because some of these dependencies were selected only as the execution proceeded.</p>



<p class="wp-block-paragraph">The difference between what a deployment declared and what an execution actually used becomes consequential when dependencies change. A model alias may resolve differently, a feature or data source may change, preprocessing and runtime configuration may evolve, and policy v8 may become v9. In agentic systems, retrieved context, memory, and tool contracts introduce further independent mutation. Deployment identity describes what was declared, but the historical record of an execution must describe what was actually used. Unless those binding relations are captured when they occur, the effective configuration of E891 cannot be recovered reliably from later system state.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6acf5e9a25b70&quot;}" data-wp-interactive="core/image" data-wp-key="6acf5e9a25b70" class="wp-block-image size-full wp-lightbox-container"><img fetchpriority="high" decoding="async" width="1024" height="538" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/1791451883101-cba585e3-0ee3-488e-9c15-20e8269bcf02_1-1.png" alt="Figure 1. A deployment captures the initial configuration, while its execution-scoped dependency closure emerges as additional dependencies are bound during execution." class="wp-image-19917" srcset="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/1791451883101-cba585e3-0ee3-488e-9c15-20e8269bcf02_1-1.png 1024w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/1791451883101-cba585e3-0ee3-488e-9c15-20e8269bcf02_1-1-300x158.png 300w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/1791451883101-cba585e3-0ee3-488e-9c15-20e8269bcf02_1-1-767x403.png 767w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Figure 1. A deployment captures the initial configuration, while its execution-scoped dependency closure emerges as additional dependencies are bound during execution. (<em>Diagram by the author.</em>)</figcaption></figure>



<h2 class="wp-block-heading"><strong>Current state is a lossy projection</strong></h2>



<p class="wp-block-paragraph">Once runtime bindings are treated as part of the execution, the limitation of current-state records becomes clear. The execution-scoped dependency closure is the combination of the declared state and the runtime bindings that formed the effective configuration of a particular execution.</p>



<p class="wp-block-paragraph">As dependencies mutate, different historical executions can leave behind the same observable evidence. The current state may show which artifacts still exist without revealing which combination a particular execution used. Once the distinguishing bindings are gone, the history cannot be reconstructed from what remains. A system can retain its artifacts while losing reconstructability: An identifier proves neither that a dependency was used nor that the historical state it denotes remains available. Reconstructability therefore requires durable binding relations and continued access to the historical states they identify.</p>



<h2 class="wp-block-heading"><strong>Existence is not usage</strong></h2>



<p class="wp-block-paragraph">The existence of an artifact and its use in a particular execution are different facts. Concurrent versions, caches, retries, and asynchronous changes make it unreliable to infer whether an execution used an artifact merely because that artifact existed at the relevant time.</p>



<p class="wp-block-paragraph"><a href="https://www.w3.org/TR/prov-o/" target="_blank" rel="noopener">W3C PROV</a> already provides the relevant semantic distinction: An activity can use an entity. The missing primitive is therefore not a new provenance vocabulary, but a runtime requirement to record which dependency a particular execution used and to preserve an identity that can be resolved later.</p>



<p class="wp-block-paragraph">This requirement also exposes the limit of observability. <a href="https://opentelemetry.io/docs/specs/otel/overview" target="_blank" rel="noopener">OpenTelemetry</a> can transport dependency identifiers through attributes, links, context, and baggage, but encoding an identifier does not preserve its historical meaning. A trace may retain execution topology while the identities that explain it disappear. Instrumentation can carry preservation metadata, but it cannot guarantee durable storage or continued resolution of the referenced states.</p>



<p class="wp-block-paragraph">Historical reconstructability therefore requires more than retained artifacts. For a defined class of executions and a specified retention period, the system must preserve two properties: binding integrity, which records which dependency versions and states an execution actually used, and resolution integrity, which keeps those recorded identities resolvable to the historical states they denote.</p>



<h2 class="wp-block-heading"><strong>Preservation requires failure semantics</strong></h2>



<p class="wp-block-paragraph">Once reconstructability is treated as a system property, the architecture must define what happens when the records required to reconstruct an execution fail to reach durable storage. Suppose policy v8 authorizes execution E891 to invoke tool contract h42, and the tool commits effect e3. If the usage record fails to reach durable storage, the action succeeds while the historical links among the effect, its policy, the tool contract, and the execution context are lost. The external effect remains, but the historical record no longer reliably explains which policy and tool contract authorized it. The external world and the historical record have diverged.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6acf5e9a26485&quot;}" data-wp-interactive="core/image" data-wp-key="6acf5e9a26485" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="533" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/1791451776273-ff6ef105-d939-4faf-b7e3-1efab5f173f6_1.png" alt="Figure 2. Execution E891 branches into a committed external effect and a failed usage record." class="wp-image-19918" srcset="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/1791451776273-ff6ef105-d939-4faf-b7e3-1efab5f173f6_1.png 1024w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/1791451776273-ff6ef105-d939-4faf-b7e3-1efab5f173f6_1-300x156.png 300w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/1791451776273-ff6ef105-d939-4faf-b7e3-1efab5f173f6_1-767x399.png 767w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Figure 2. Execution E891 branches into a committed external effect and a failed usage record. (<em>Diagram by the author.</em>)</figcaption></figure>



<p class="wp-block-paragraph">Figure 2 shows why this condition cannot be treated as ordinary telemetry loss. When an external effect has been committed but the corresponding usage record is missing, the architecture does not guarantee historical reconstructability. It provides only best-effort historical evidence.</p>



<p class="wp-block-paragraph">Reconstructability becomes an engineering guarantee only when the architecture defines when preservation records become durable and what the system does if they cannot be stored.</p>



<p class="wp-block-paragraph">A system may require a durable usage record before committing the effect, atomically persist the effect intent and preservation record through a <a href="https://docs.aws.amazon.com/prescriptive-guidance/latest/cloud-design-patterns/transactional-outbox.html" target="_blank" rel="noopener">transactional outbox</a>, quarantine the execution for reconciliation, or trigger a compensating action. The implementation is application-specific, but preservation failure must have explicit semantics rather than disappear into telemetry.</p>



<p class="wp-block-paragraph">Existing technologies provide the building blocks for this layer. Provenance and <a href="https://openlineage.io/docs/spec/run-cycle" target="_blank" rel="noopener">lineage models</a> represent relations, tracing propagates execution context, registries identify versions, and content-addressed stores preserve artifacts. None, however, creates a runtime obligation to preserve the execution-scoped dependency closure required for reconstruction.</p>



<p class="wp-block-paragraph">This layer is a preservation plane: the contract and machinery that keep an execution’s dependency closure identifiable as its surrounding systems change. It defines what to record, how records become durable, and how referenced states remain resolvable. Orrery applies this principle as a reference architecture in which materially relevant runtime bindings are captured when they occur and retained together with resolvable identities for the historical states they reference.</p>



<h2 class="wp-block-heading"><strong>AIGov Core: reconstructability as a tested property</strong></h2>



<p class="wp-block-paragraph"><a href="https://github.com/AIGovDev/aigov-core" target="_blank" rel="noopener">AIGov Core</a> provides a limited implementation of this principle. Its evidence ledger stores hash-chained events, while its replay engine reconstructs a governance verdict from a stored export without querying live state. A companion check labels the export Ready, Partial, or NotReady according to unresolved lineage, missing policy artifacts, version drift, or replay failure. This demonstrates that reconstructability can be tested, but it does not solve the complete preservation problem. The system can replay only what was recorded; it cannot recover a runtime binding that was never captured.</p>



<p class="wp-block-paragraph">The preservation gap is the mismatch between what an execution depends on and what the system persists. Closing it requires a runtime obligation: Whenever an execution binds materially relevant state, the system must record that binding, preserve a durable identity for the dependency, and retain access to the historical state it denotes for the defined retention period. Reconstructability is therefore not a by-product of capability or observability. It is an architectural property that must be designed, tested, and enforced during execution.</p>
]]></content:encoded>
							<wfw:commentRss>https://www.oreilly.com/radar/the-preservation-gap-in-the-ai-stack-why-capability-is-advancing-faster-than-reconstructability/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>Build Your Own Post-training Pipeline</title>
		<link>https://www.oreilly.com/radar/build-your-own-post-training-pipeline/</link>
				<comments>https://www.oreilly.com/radar/build-your-own-post-training-pipeline/#respond</comments>
				<pubDate>Wed, 07 Oct 2026 10:54:16 +0000</pubDate>
					<dc:creator><![CDATA[Sharon Zhou]]></dc:creator>
						<category><![CDATA[AI & ML]]></category>
		<category><![CDATA[Commentary]]></category>

		<guid isPermaLink="false">https://www.oreilly.com/radar/?p=19892</guid>

		
					<media:content 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/Build-your-own-post-training-pipeline-image-created-with-Adobe-Firefly.jpg" 
				medium="image" 
				type="image/jpeg" 
				width="2304" 
				height="1792" 
			/>

			<media:thumbnail 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/Build-your-own-post-training-pipeline-image-created-with-Adobe-Firefly-160x160.jpg" 
				width="160" 
				height="160" 
			/>
		
				<custom:subtitle><![CDATA[Implement the key pieces of the ChatGPT pipeline: SFT, reward model training, and PPO.]]></custom:subtitle>
		
				<description><![CDATA[This is the final post in a four-part series about post-training. If you missed them, check out part 1, part 2, and part 3. Time to get your hands dirty! I’ll take you through implementing the key pieces of the classic ChatGPT pipeline: SFT, then reward model training, then PPO. The goal isn’t to reproduce [&#8230;]]]></description>
								<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>This is the final post in a four-part series about post-training. If you missed them, check out <a href="https://www.oreilly.com/radar/introduction-to-post-training/" target="_blank" rel="noopener">part 1</a>, <a href="https://www.oreilly.com/radar/the-two-pillars-of-post-training-reinforcement-learning-and-supervised-fine-tuning/" target="_blank" rel="noopener">part 2</a>, and <a href="https://www.oreilly.com/radar/the-post-training-process-openai-used-for-chatgpt/" target="_blank" rel="noopener">part 3</a>.</em></p>
</blockquote>



<p class="wp-block-paragraph">Time to get your hands dirty! I’ll take you through implementing the key pieces of the classic ChatGPT pipeline: SFT, then reward model training, then PPO. The goal isn’t to reproduce InstructGPT, because that took a large team and thousands of GPU-hours. But getting hands-on will help make the concepts from this series concrete, so that when you look at each stage’s code, you understand what it’s doing to the model and why.</p>



<p class="wp-block-paragraph">We’ll use <a href="https://huggingface.co/Qwen/Qwen2.5-1.5B" target="_blank" rel="noopener">Qwen2.5-1.5B</a> as the base model. It’s small enough to train on a single node with a few GPUs but large enough that you can observe real behavioral changes from post-training.</p>



<p class="wp-block-paragraph">For SFT, you’ll use <a href="https://github.com/meta-pytorch/torchtune" target="_blank" rel="noopener">torchtune</a>, Meta’s PyTorch-native fine-tuning library. For RL, you’ll use <a href="https://github.com/verl-project/verl" target="_blank" rel="noopener">verl</a> (from ByteDance’s team), a production-grade RL post-training framework <a href="https://arxiv.org/abs/2409.19256" target="_blank" rel="noopener">built on Ray</a>. verl was designed from the ground up for distributed RL training with proper rollout orchestration, and it’s what you’d actually reach for if you were doing this at scale.</p>



<p class="wp-block-paragraph">You’ll need a machine with at least 2 GPUs (4 or 8 is better) and around 80 GB of total GPU memory.</p>



<p class="wp-block-paragraph">You’ll likely use an LLM to flesh out the boilerplate and get this running end to end. I used LLMs pointed to the recent docs to generate these. What matters as you read the code in this section is that you understand the config choices and data formats well enough to direct that process and debug when something goes wrong.</p>



<h2 class="wp-block-heading">Stage 1: SFT on demonstrations</h2>



<p class="wp-block-paragraph">SFT is the easiest stage to implement. You’re taking the pretrained model and training it on <code>{prompt, response}</code> pairs using the same next-token prediction loss from pretraining, except you only compute loss on the response tokens.</p>



<p class="wp-block-paragraph">Your SFT data should be in a conversational format. Here’s what a single example looks like:</p>



<pre class="wp-block-code"><code>{
    "messages": &#91;
        {"role": "user", "content": "Why do people like golden retrievers?"},
        {"role": "assistant", "content": "Golden retrievers are one of the most 
popular dog breeds for good reason. They have a gentle, friendly temperament 
that makes them great family dogs. They're patient with kids and tend to get 
along well with other animals. They're also highly trainable and eager 
to please, which is why they're commonly used as service dogs and therapy dogs. 
And honestly, the goofy enthusiasm doesn't hurt either. They never really grow 
out of that puppy energy."}
    ]
}
</code></pre>



<p class="wp-block-paragraph">Remember what a pretrained model does with &#8220;<a href="https://www.oreilly.com/radar/introduction-to-post-training/" target="_blank" rel="noopener">Why do people like golden retrievers?</a>&#8221; It might spit out &#8220;Why do people like labrador retrievers?&#8221; because it’s just completing patterns. Your SFT data is what teaches it to actually answer the question instead.</p>



<p class="wp-block-paragraph">In practice, you’d have thousands of these examples covering a range of tasks: question answering, summarization, creative writing, coding help, multiturn dialogue, and refusals for harmful requests. For this walkthrough, assume you have a JSONL file of these conversations.</p>



<p class="wp-block-paragraph">torchtune uses YAML configs and built-in recipes. Here’s what a config might look like:</p>



<pre class="wp-block-code"><code># sft_config.yaml

# Model
model:
  _component_: torchtune.models.qwen2_5.lora_qwen2_5_1_5b
  lora_attn_modules: &#91;'q_proj', 'k_proj', 'v_proj', 
'output_proj']
  lora_rank: 64
  lora_alpha: 128

# Tokenizer
tokenizer:
  _component_: torchtune.models.qwen2_5.qwen2_5_tokenizer
  path: /path/to/Qwen2.5-1.5B/vocab.json
  merges_file: /path/to/Qwen2.5-1.5B/merges.txt
  max_seq_len: 2048

# Checkpointer — loads the pretrained weights
checkpointer:
  _component_: torchtune.training.FullModelHFCheckpointer
  checkpoint_dir: /path/to/Qwen2.5-1.5B
  output_dir: ./sft_checkpoint
  model_type: QWEN2

# Dataset
dataset:
  _component_: torchtune.datasets.chat_dataset
  source: sft_data.jsonl
  conversation_style: sharegpt
  max_seq_len: 2048
  train_on_input: false           # only compute loss on the 
                                    assistant's response tokens

# Training
seed: 42
epochs: 3
batch_size: 4
gradient_accumulation_steps: 4    # effective batch 
                                    size of 16
optimizer:
  _component_: torch.optim.AdamW
  lr: 2e-5
  weight_decay: 0.01
lr_scheduler:
  _component_: torchtune.training.lr_schedulers.get_cosine_schedule_with_warmup
  num_warmup_steps: 50

dtype: bf16
compile: false
</code></pre>



<p class="wp-block-paragraph">Then launch it:</p>



<pre class="wp-block-code"><code>tune run lora_finetune_distributed --config 
sft_config.yaml</code></pre>



<p class="wp-block-paragraph">What actually matters in this config:</p>



<ul class="wp-block-list">
<li><code>train_on_input: false</code> masks the loss on prompt tokens so the model only learns to generate good responses, not to mimic user messages. If you accidentally set this to true, the model wastes capacity learning to produce prompts.</li>



<li>A learning rate of 2e-5 is the standard starting point for SFT. That’s aggressive enough to shift behavior in a few epochs but not so large that you destroy the pretrained weights.</li>



<li>Use LoRA instead of full fine-tuning. For a 1.5B model you could do either, but LoRA is the practical default because it’s faster, uses a lot less GPU memory, and at this model size the quality gap is negligible. At larger model sizes, LoRA becomes even more useful in saving compute.</li>



<li>3 epochs because the dataset is small. InstructGPT trained for 16 epochs on ~13K examples. Smaller datasets need more passes, but watch validation loss for overfitting. This is something you should tune to see different results across different-sized datasets.</li>
</ul>



<p class="wp-block-paragraph">After this stage, try chatting with the model and try a bunch of different comparisons to the base model. Ask it &#8220;Why do people like golden retrievers?&#8221; and you should get a real answer now, not a list of related questions. The model should be able to hold a conversation and follow basic instructions. It’s already dramatically more useful than the base model, even if the responses aren’t always great.</p>



<p class="wp-block-paragraph">Realistically, you should set up a good evaluation (&#8220;evals&#8221;) to assess the quality of the model, hyperparameter tune, and determine your data mix. In this section, you’ll just focus on looking at the code.</p>



<h2 class="wp-block-heading">Stage 2: Training the reward model</h2>



<p class="wp-block-paragraph">For your reward model, start with your data of preference pairs, which will look like this:</p>



<pre class="wp-block-code"><code>{
    "prompt": "What's the capital of that country that celebrates with a lot 
of colored powders?",
    "chosen": "You're probably thinking of Holi, the festival where people 
throw bright colored powders. That celebration is most famously associated 
with India. The capital of India is New Delhi.",
    "rejected": "The capital of that country that celebrates with a lot of 
colored flowers is Amsterdam, the Netherlands, known for its tulip festivals."
}
</code></pre>



<p class="wp-block-paragraph">The &#8220;rejected&#8221; response isn’t just wrong about the festival. It also misread &#8220;powders&#8221; as &#8220;flowers&#8221; and jumped to an incorrect answer.</p>



<p class="wp-block-paragraph">For reward model training, you’ll use TRL’s <a href="https://huggingface.co/docs/trl/v1.9.0/en/reward_trainer#trl.RewardTrainer" target="_blank" rel="noopener">RewardTrainer</a>. Reward model training is a straightforward classification task.</p>



<pre class="wp-block-code"><code>from transformers import AutoModelForSequenceClassification, 
AutoTokenizer
from trl import RewardTrainer, RewardConfig
from datasets import load_dataset

# Start from the SFT checkpoint — it already understands 
the response distribution
model = AutoModelForSequenceClassification.from_pretrained(
    "./sft_checkpoint",
    num_labels=1,
    torch_dtype="bfloat16",
)
tokenizer = AutoTokenizer.from_pretrained("./sft_checkpoint")
tokenizer.pad_token = tokenizer.eos_token

dataset = load_dataset("json", 
data_files="preference_data.jsonl", split="train")

training_args = RewardConfig(
    output_dir="./reward_model",
    per_device_train_batch_size=8,
    num_train_epochs=1,    # just 1 epoch — reward models overfit fast
    learning_rate=1e-5,    # lower than SFT, be gentle
    bf16=True,
    max_length=2048,
    logging_steps=10,
    save_strategy="epoch",
)

trainer = RewardTrainer(
    model=model,
    args=training_args,
    train_dataset=dataset,
    tokenizer=tokenizer,
)

trainer.train()
trainer.save_model("./reward_model/final")
</code></pre>



<p class="wp-block-paragraph">As you skim the code, take note of these three things:</p>



<ul class="wp-block-list">
<li>Start from an SFT checkpoint, not a base model. The reward model needs to understand the distribution of responses it’ll be scoring, and the SFT model is closer to that distribution.</li>



<li>1 epoch only. Reward models overfit quickly. The InstructGPT team found only 1 epoch was needed.</li>



<li>Learning rate of 1e-5, lower than SFT. Smaller updates.</li>
</ul>



<p class="wp-block-paragraph">After training, check the reward model by scoring a few responses manually. Give it a clearly good response and a clearly bad one for the same prompt and make sure the good one gets a higher score. If this basic test fails, something is wrong with your data or training. <strong>Don’t skip this step: It’s better to catch problems sooner than many GPU hours later!</strong></p>



<h2 class="wp-block-heading">Stage 3: PPO with verl</h2>



<p class="wp-block-paragraph">Now you can take the SFT model and optimize it against the reward model using PPO. verl handles the hard parts: coordinating rollout generation across workers, managing the four models that need to be in memory simultaneously (policy, reference, reward, critic), and orchestrating the update loop.</p>



<p class="wp-block-paragraph">First, prepare your prompts. verl expects parquet format. Each row needs a <code>prompt</code> field containing the tokenized and chat-template-formatted prompt. Here’s an example of preparing it:</p>



<pre class="wp-block-code"><code>import pandas as pd
from transformers import AutoTokenizer
from datasets import load_dataset

tokenizer = AutoTokenizer.from_pretrained("./sft_checkpoint")

raw_prompts = load_dataset("json", data_files="rl_prompts.jsonl", split="train")

def format_prompt(example):
    messages = &#91;{"role": "user", "content": example&#91;"prompt"]}]
    formatted = tokenizer.apply_chat_template(
        messages, tokenize=False, add_generation_prompt=True
    )
    return {"prompt": formatted}

formatted = raw_prompts.map(format_prompt)
df = pd.DataFrame(formatted)
df.to_parquet("data/rl_prompts.parquet")
</code></pre>



<p class="wp-block-paragraph">The prompts for RL don’t need labels. The reward model provides the signal. You just need a diverse set of prompts that covers the types of requests your model expects to see when you deploy it.</p>



<p class="wp-block-paragraph">Next, define the reward function. verl lets you wrap your reward model in a function that takes a batch of prompts and responses and returns rewards:</p>



<pre class="wp-block-code"><code># reward_fn.py — verl will call this during training
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer

class RewardFunction:
    def __init__(self, reward_model_path="./reward_model/final"):
        self.model = AutoModelForSequenceClassification.from_pretrained(
            reward_model_path, torch_dtype=torch.bfloat16
        ).cuda().eval()
        self.tokenizer = AutoTokenizer.from_pretrained(reward_model_path)
        self.tokenizer.pad_token = self.tokenizer.eos_token

    def __call__(self, prompts, responses):
        """
        prompts: list of prompt strings
        responses: list of response strings
        Returns: list of scalar rewards
        """
        texts = &#91;p + r for p, r in zip(prompts, responses)]
        inputs = self.tokenizer(
            texts, return_tensors="pt", padding=True,
            truncation=True, max_length=2048
        ).to(self.model.device)
        with torch.no_grad():
            rewards = self.model(**inputs).logits.squeeze(-1)
        return rewards.tolist()
</code></pre>



<p class="wp-block-paragraph">Now configure the PPO training run. verl uses YAML configuration files that specify the models, hyperparameters, and infrastructure:</p>



<pre class="wp-block-code"><code># ppo_config.yaml
data:
  train_files: data/rl_prompts.parquet
  prompt_key: prompt
  max_prompt_length: 1024
  max_response_length: 1024

actor_rollout_ref:
  model:
    path: ./sft_checkpoint
  actor:
    optim:
      lr: 1e-6                    # very low — RL updates should be gentle
      lr_warmup_steps: 10
    ppo_mini_batch_size: 64
    ppo_micro_batch_size: 8       # adjust based on GPU memory
    ppo_epochs: 4                 # number of PPO update passes per batch
    clip_ratio: 0.2               # PPO clipping — standard value
    kl_penalty_coeff: 0.1         # KL penalty to prevent reward hacking
    entropy_coeff: 0.01           # small entropy bonus for exploration
  rollout:
    temperature: 0.7
    top_p: 0.9
    n: 1                          # 1 response per prompt per rollout
    tensor_model_parallel_size: 1
  ref:
    log_prob_micro_batch_size: 8

critic:
  model:
    path: ./reward_model/final    # initialize critic from reward model
  optim:
    lr: 1e-5
  ppo_micro_batch_size: 8

reward_model:
  path: ./reward_model/final
  micro_batch_size: 8

trainer:
  total_training_steps: 500
  save_freq: 100
  test_freq: 50
  project_name: post_training_walkthrough
  logger: wandb
</code></pre>



<p class="wp-block-paragraph">A few important hyperparameters in the config:</p>



<ul class="wp-block-list">
<li>The learning rate is an order of magnitude smaller than SFT, default at 1e-6. (&#8220;Actor&#8221; refers to the policy model.) RL updates are noisier, and you want to move slowly. If the model starts producing gibberish or repetitive text, your learning rate is probably too high.</li>



<li>The KL penalty coefficient is 0.1, and recall that it controls how much the model is penalized for drifting from the SFT checkpoint. 0.1 is a reasonable starting point, but you’ll likely need to adjust. If you see reward hacking, turn it up, but if the model doesn’t really change, you need to lower it.</li>



<li>The clip ratio is default set to 0.2, from the original PPO paper. This likely doesn’t need tuning. It prevents any single update from changing the policy too much.</li>
</ul>



<p class="wp-block-paragraph">Launch the training:</p>



<pre class="wp-block-code"><code>python -m verl.trainer.main_ppo \
    --config ppo_config.yaml \
    --n_gpus 4
</code></pre>



<p class="wp-block-paragraph">During training, watch for a few things. The reward should generally trend upward, meaning the model is learning to produce responses the reward model likes. The KL divergence should increase but not explode, in which case the model is drifting too far and you need a higher KL penalty. And periodically generate some responses from the current checkpoint and read them yourself. Metrics can be unreliable on their own, and your own judgment of output quality can be more reliable. Of course, ideally, you have a held out evaluation set that you’re working with that can help you test different tasks you care about.</p>



<h2 class="wp-block-heading">Putting it together</h2>



<p class="wp-block-paragraph">The full pipeline runs on stage after the next: SFT first, reward model second, PPO third. Each stage depends on the previous one. The SFT model provides the starting point for both RL training and the reward model. The reward model provides the signal for PPO. And PPO produces the final model.</p>



<p class="wp-block-paragraph">This is, structurally, the same pipeline that produced InstructGPT and the first version of ChatGPT. The scale is obviously different. They used 175B parameter models, 40 labelers, and far more compute, but the mechanics are identical. Your 1.5B model won’t write poetry as well as the latest GPT, but it will go from producing &#8220;Why do people like labrador retrievers?&#8221; to actually answer &#8220;Why do people like golden retrievers?&#8221; with a conversational response. That’s post-training doing the heavy lifting.</p>



<p class="wp-block-paragraph">If you’re doing this for real, what will eat most of your time isn’t the code but the data: curating good SFT demonstrations, collecting reliable preference labels, and building a prompt set for RL that covers the right distribution of tasks. But there are some great open source datasets out there that you can get started with.</p>



<p class="wp-block-paragraph">The training infrastructure is largely solved: You can point an LLM at the torchtune and verl docs and have it scaffold a working pipeline for you in an afternoon. But no amount of tooling fixes bad data or a reward model that scores the wrong things highly. Understanding what each stage needs and why is what lets you direct that process effectively.</p>
]]></content:encoded>
							<wfw:commentRss>https://www.oreilly.com/radar/build-your-own-post-training-pipeline/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>Radar Trends to Watch: October 2026</title>
		<link>https://www.oreilly.com/radar/radar-trends-to-watch-october-2026/</link>
				<comments>https://www.oreilly.com/radar/radar-trends-to-watch-october-2026/#respond</comments>
				<pubDate>Tue, 06 Oct 2026 10:54:20 +0000</pubDate>
					<dc:creator><![CDATA[Mike Loukides]]></dc:creator>
						<category><![CDATA[Radar Trends]]></category>
		<category><![CDATA[Commentary]]></category>

		<guid isPermaLink="false">https://www.oreilly.com/radar/?p=19889</guid>

		
					<media:content 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2023/06/radar-1400x950-3.png" 
				medium="image" 
				type="image/png" 
				width="1400" 
				height="950" 
			/>

			<media:thumbnail 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2023/06/radar-1400x950-3-160x160.png" 
				width="160" 
				height="160" 
			/>
		
				<custom:subtitle><![CDATA[Developments in hardware, privacy, software development, and more]]></custom:subtitle>
		
				<description><![CDATA[In addition to the nearly constant stream of model releases, in September we&#8217;ve seen price drops, new kinds of models, proofs of long-standing problems in mathematics, and continued investigations into models escaping their sandboxes. (Axios reports investigations into over 10,000 incidents.) AI has infinite patience and is fundamentally probabilistic. Given a difficult or impossible task [&#8230;]]]></description>
								<content:encoded><![CDATA[
<p class="wp-block-paragraph">In addition to the nearly constant stream of model releases, in September we&#8217;ve seen price drops, new kinds of models, proofs of long-standing problems in mathematics, and continued investigations into models escaping their sandboxes. (Axios reports investigations into over 10,000 incidents.) AI has infinite patience and is fundamentally probabilistic. Given a difficult or impossible task and an unlimited token budget, an agent will eventually attempt to solve the problem in ways that you don&#8217;t expect, and may not want. It&#8217;s easy (and correct) to blame inadequate security procedures at the frontier AI labs, but AI adopters must be careful not to make the same mistakes. The humans using AI need to be accountable for what their agents do.</p>



<h2 class="wp-block-heading">AI Models</h2>



<p class="wp-block-paragraph"><em>Model choice is starting to hinge on price and specialization as much as raw benchmark leadership. Alongside general chat models, there are now decision models that never chat, spatial models built for robot planning and camera control, forecasting models sized for a single task, and cybersecurity-specialized models kept behind an invite-only program. Specialization leads to greater efficiency and lower costs, at least in the short term. In the long term, specialized models may succumb to the &#8220;<a href="https://en.wikipedia.org/wiki/Bitter_lesson" target="_blank" rel="noopener">bitter lesson</a>.&#8221;</em></p>



<ul class="wp-block-list">
<li>Anthropic has <a href="https://www.anthropic.com/claude-opus-5-5" target="_blank" rel="noopener">released</a> Claude Opus 5.5, which it claims has performance similar to Fable 5.1, and hence similar restrictions. It’s faster and requires fewer resources to run. Anthropic has dropped prices 20% for input and output tokens and 60% for cached reads. Not to be outdone, OpenAI released GPT-6 Sol and Luna, with 50% price reductions.</li>



<li>Anthropic has also <a href="https://www.anthropic.com/claude-fable-and-mythos-5-1" target="_blank" rel="noopener">announced</a> Fable 5.1 and Mythos 5.1. The most significant change appears to be a 75% price reduction for cache reads, which might translate into significant savings for long-running jobs; Anthropic estimates 25%. Mythos is only available to trusted partners. Simon Willison used Fable 5.1 to <a href="https://simonwillison.net/2026/Sep/1/claude-fable-5-1/" target="_blank" rel="noopener">animate</a> his pelican-riding-a-bicycle pseudobenchmark.</li>



<li>Anthropic <a href="https://www.anthropic.com/claude-sonnet-5-5" target="_blank" rel="noopener">released</a> Sonnet 5.5 with claims that it’s 30% faster and 30% less expensive for most work. The new model has security limitations similar to those applied to Opus and Fable; it routes to Sonnet 5 if it’s asked to do anything out of bounds.</li>



<li>And finally, as September closes, Anthropic announces a <a href="https://www.bleepingcomputer.com/news/artificial-intelligence/anthropic-turns-claude-into-an-ai-marketplace-with-2-000-plus-plugins-and-connectors/" target="_blank" rel="noopener">marketplace</a> for Claude plugins and connectors. At its launch, Claude Marketplace had over 2,000 items.</li>



<li>OpenAI has <a href="https://openai.com/index/gpt-6-astra/" target="_blank" rel="noopener">released</a> GPT-6 Astra, with claims that the company has achieved AGI (artificial general intelligence). Astra’s excellent benchmark scores appear to depend on the use of an <a href="https://thenewstack.io/openai-astra-harness-arc-agi-3/" target="_blank" rel="noopener">unreleased harness</a>. OpenAI has also released GPT-6.1 Sol, with per-token price reductions and claims that it is close to GPT-6 Astra in capabilities</li>



<li>OpenAI has <a href="https://openai.com/index/navier-stokes-solution/" target="_blank" rel="noopener">solved</a> the <a href="https://en.wikipedia.org/wiki/Navier%E2%80%93Stokes_existence_and_smoothness" target="_blank" rel="noopener">Navier-Stokes existence and smoothness</a> problem, a mathematical problem in fluid mechanics. This development raises <a href="https://techcrunch.com/2026/09/08/openai-fought-dirty-on-career-making-math-problem-says-nyu-mathematician/" target="_blank" rel="noopener">an ethical question</a>: Did OpenAI train its system on the work of two mathematicians who were close to solving the problem themselves? It also raises practical questions about the future of mathematics. Decorated mathematician Terence Tao <a href="https://mathstodon.xyz/@tao/117237320796901560" target="_blank" rel="noopener">asks</a> whether “the collection of good, fruitful open problems is now being mined in a non-renewable fashion.” An <a href="https://thenextweb.com/news/openai-maths-advisory-group-100-open-problems" target="_blank" rel="noopener">advisory group</a> has been formed to help OpenAI make decisions about releasing mathematical results.</li>



<li>Google has <a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-3-8-text-to-speech/" target="_blank" rel="noopener">released</a> Gemini 3.8 Flash TTS and Flash-Lite TTS. Voice options aren’t limited to a prebuilt library. These models have APIs that allow developers to <a href="https://thenewstack.io/gemini-tts-voice-replication-api/">describe</a> the voice that they want or upload a sample. These custom voices are then assigned an ID so they can be reused.</li>



<li>Google has <a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-3-8-live-gemini-3-8-live-extended-thinking/" target="_blank" rel="noopener">announced</a> Gemini 3.8 Live and Gemini 3.8 Live Extended Thinking. These models are designed for live, near-real-time conversation. They can process video input. Live Extended Thinking can reason and speak at the same time.</li>



<li>Google has released <a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/3-8-flash-and-3-8-flash-cyber/" target="_blank" rel="noopener">Gemini 3.8 Flash and Flash Cyber</a>. Flash appears to be similar to frontier models on most benchmarks, with Computer Use being the biggest exception. Flash Cyber is specialized for vulnerability detection and mitigation and is only available to defenders in the <a href="https://deepmind.google/fairwind-program/" target="_blank" rel="noopener">Fairwind Program</a>.</li>



<li>Google has <a href="https://thenewstack.io/google-timesfm-3-multivariate-forecasting/" target="_blank" rel="noopener">also released</a> <a href="https://research.google/blog/timesfm-3-a-zero-shot-foundation-model-for-multivariate-forecasting/" target="_blank" rel="noopener">TimesFM-3</a>, a small specialized model for multivariate time series forecasting. The model weights are available on Hugging Face with a license that only allows for noncommercial use. (Source code is available under the Apache open source license.)</li>



<li>Xiaomi <a href="https://mimo.xiaomi.com/mimo-v2-6" target="_blank" rel="noopener">released</a> MiMo-V2.6, its latest large language model. It’s fully open sourced, and based on benchmark results, Xiaomi claims that MiMo is the strongest open model to date. What’s more interesting is the claim that MiMo only cost $3.5 million to train.</li>



<li>TypeSafe’s new <a href="https://x.com/Mappletons/status/2101560333441610133" target="_blank" rel="noopener">decision model</a>, <a href="https://typesafe.ai/blog/introducing-system-one-models-and-jev" target="_blank" rel="noopener">Jev</a>, is unlike anything else we’ve seen. It doesn’t chat; its output is always strictly typed and accompanied by probabilities that estimate correctness. It’s much faster and less expensive than other leading models. It isn’t open source, but there are already many open source <a href="https://www.latent.space/p/ainews-here-are-6-clones-of-jev-in" target="_blank" rel="noopener">clones</a>.</li>



<li><a href="https://ollaya.dev/" target="_blank" rel="noopener">Ollaya</a> is similar to Ollama, but for running decision open models like Laya (a clone of Jev) locally.</li>



<li>World Labs has released <a href="https://www.worldlabs.ai/blog/atlas" target="_blank" rel="noopener">Atlas</a>, a model for “spatial intelligence.” It uses text, images, video, and 3D data to perform tasks like planning a robot’s movements or changing the camera position in a photograph.</li>



<li>The rumors that <a href="https://arstechnica.com/ai/2026/09/nvidia-buys-hugging-face-the-github-of-ai-for-13-billion/" target="_blank" rel="noopener">NVIDIA would buy Hugging Face</a> are <a href="https://blogs.nvidia.com/blog/nvidia-to-acquire-hugging-face/" target="_blank" rel="noopener">true</a>. NVIDIA is hoping for a proliferation of models that will run on its hardware, and the company promises that Hugging Face will remain a neutral platform, without favoring one model over another.</li>
</ul>



<h2 class="wp-block-heading">Software development</h2>



<p class="wp-block-paragraph"><em>Agents are starting to delegate to, and coordinate with, other agents rather than working solo. Claude Code can break a task apart and hand pieces to other Claude Code instances, Muse Code lets sessions message each other, and Google&#8217;s AX orchestrator exists purely to wire up sandboxes and control communications for swarms of agents doing a task together. That shift is pushing developers to rethink what a source repository needs to record, and to start asking how much all this delegation costs.</em></p>



<ul class="wp-block-list">
<li>Now that Jev has caught everyone’s attention, what can you build with it? <a href="https://github.com/Avinash-jetwani/jevmem" target="_blank" rel="noopener">Jevmem</a> is a memory manager that hooks into Claude Code and prunes the context at every conversational turn.</li>



<li><a href="https://github.com/google/ax" target="_blank" rel="noopener">AX</a> is a new <a href="https://agentexecutor.io/" target="_blank" rel="noopener">agent orchestrator</a> from Google. It isn’t an agent; it’s intended to coordinate many agents to complete a task. It creates sandboxes, wires up Git repos and other resources, and controls outbound communications.</li>



<li>The <a href="https://thenewstack.io/claude-code-parallel-projects/" target="_blank" rel="noopener">latest</a> version of Claude Code can <a href="https://support.claude.com/en/articles/9517075-what-are-projects" target="_blank" rel="noopener">manage Claude projects</a>, breaking a task into subcomponents and delegating the subtasks to other Claude Code instances. Another important change is the ability to read <a href="http://agents.md/" target="_blank" rel="noopener">AGENTS.md</a> if <a href="http://claude.md/" target="_blank" rel="noopener">CLAUDE.md</a> isn’t available.</li>



<li>Google’s <a href="https://blog.google/innovation-and-ai/models-and-research/google-labs/cc-expanding-to-groups/" target="_blank" rel="noopener">CC agent</a> is designed for families. Family members can share data with CC, which has its own user account. It could be used for filling out forms, synchronizing calendars, and other common tasks.</li>



<li>What will replace GitHub? There’s a <a href="https://thenewstack.io/zed-delta-github-alternative/" target="_blank" rel="noopener">growing consensus</a> that we need different kinds of source repositories to deal with the agent-assisted software development. In addition to changes to code, it’s important to record the conversations between the developer and the agent, the architectural decisions, and many other artifacts that don’t make it into traditional source control.</li>



<li>Anthropic is merging its <a href="https://claude.com/blog/cowork-is-now-claude" target="_blank" rel="noopener">Claude Cowork and chat products</a>. Anything users type in a chat session is seen by Cowork, and vice versa. Some sensitive information (health, politics, and gender) is excluded. The feature is on by default but can be disabled in settings, and memory isn’t shared with Claude Code. The company also released Claude Docs and Slides.</li>



<li><a href="https://www.bleepingcomputer.com/news/artificial-intelligence/anthropic-wants-claude-to-analyze-your-bank-account-and-financial-data/" target="_blank" rel="noopener">Claude Money</a> is a new feature that will allow users to connect their bank accounts to Claude for analysis. The product appears to be similar to a product from OpenAI.</li>



<li>OpenAI’s Agents API is <a href="https://openai.com/index/introducing-the-agents-api/" target="_blank" rel="noopener">now in public beta</a>. It allows compaction, session orchestration, and tool use, and it can be deployed in OpenAI’s sandbox, a cloud provider’s sandbox, or the developer’s hardware.</li>



<li>Meta has <a href="https://ai.meta.com/muse/" target="_blank" rel="noopener">released</a> Muse, its AI agent. Muse is a “personal agent” designed for tasks like shopping, filling in forms, and dealing with customer service. It has its own secure credential store, so data like passwords and credit card numbers are never sent offsite.</li>



<li>Some open source projects are <a href="https://www.latent.space/p/pr-not-welcome" target="_blank" rel="noopener">shutting down external pull requests</a>, which are largely AI-generated. In some cases, the developer team is using its own agents to create and manage PRs; some are using AI agents to triage external PRs.</li>



<li>Meta has launched <a href="https://developer.meta.com/ai/resources/blog/muse-code-new-plans-and-features/" target="_blank" rel="noopener">Muse Code</a>, another competitor to Claude Code. One important new feature is the ability to send messages to other Muse Code sessions, allowing agents to coordinate on complex problems.</li>



<li>AI providers appear to be <a href="https://thenextweb.com/news/openai-outcome-based-pricing-enterprise" target="_blank" rel="noopener">moving toward outcome-based pricing</a>, at least for major corporate customers. Rather than billing by token, customers are billed for completed tasks. That approach begs the question: When is a task completed?</li>



<li>Now that organizations are concerned with AI budgets, the question of how to evaluate the cost of different models and agents becomes important. <a href="https://thenewstack.io/agent-harness-token-costs/" target="_blank" rel="noopener">What should platform teams measure?</a></li>



<li><a href="https://chatgpt.com/work/" target="_blank" rel="noopener">ChatGPT Work</a> was designed to compete with Claude Cowork, Microsoft Copilot Cowork, Muse Code, and other agents designed for noncoders. Simon Willison <a href="https://simonwillison.net/2026/Aug/30/understanding-chatgpt-work/" target="_blank" rel="noopener">shows how</a> Work goes beyond its competitors. It can perform tasks <a href="https://tech.yahoo.com/ai/chatgpt/article/chatgpt-can-now-sign-into-websites-and-complete-tasks-without-seeing-your-login-details-145915053.html" target="_blank" rel="noopener">on the web</a> for users, even <a href="https://www.zdnet.com/article/chatgpt-can-log-into-your-web-accounts-without-you-now-but-should-you-let-it/" target="_blank" rel="noopener">logging in to websites</a> without sending usernames and passwords to OpenAI; it can execute code with full internet access; it can build and deploy a web application. Whether these features are also risks is an open question.</li>



<li>Anthropic has <a href="https://thenewstack.io/claude-built-in-browser-cowork/" target="_blank" rel="noopener">given</a> Claude Desktop access to a Chromium-based browser that’s built into Cowork, eliminating the need for a Chrome plugin when Claude needs to browse the web.</li>



<li><a href="https://github.com/frazerpearce/TimeLord" target="_blank" rel="noopener">TimeLord</a> is a short Python program that, given a string up to 1,000 characters long, produces a seed for Python’s pseudo-random number generator so that repeated calls reproduce the text. It’s a surprisingly simple hack, though not a statement about randomness or the quality of Python’s PRNG.</li>
</ul>



<h2 class="wp-block-heading">Security</h2>



<p class="wp-block-paragraph"><em>OpenAI’s experiment that attacked Hugging Face is the gift that keeps giving, but the past month has had plenty of news about more conventional attacks, many aided by AI. Security has always been a game of whack-a-mole, in which vulnerabilities are discovered and exploited as fast as defenders can patch them. AI is an important tool for defenders, and it&#8217;s constantly improving, but it’s still behind attackers, especially given the limitations placed on frontier models and the unlimited persistence that attacking agents exhibit.</em></p>



<ul class="wp-block-list">
<li>OpenAI has <a href="https://thenextweb.com/news/openai-cancels-launch-of-gpt-6-1-astra" target="_blank" rel="noopener">postponed</a> the release of GPT-6.1 Astra because it failed its safety tests.</li>



<li>NVIDIA has announced its <a href="https://nvidianews.nvidia.com/news/open-agent-safety-platform" target="_blank" rel="noopener">Open Agent Safety Platform</a>. The reference implementation <a href="https://thenewstack.io/nvidia-openshell-sentry-agents/" target="_blank" rel="noopener">includes</a> NVIDIA OpenShell, which has been enhanced with a policy prover, and NVIDIA Sentry, a service that runs on NVIDIA DPUs.</li>



<li>The <a href="https://www.felonybench.com/" target="_blank" rel="noopener">Felony Bench</a> lists known attacks by agents from the major AI labs against third parties. We don’t know if the Bench will be kept up-to-date, but <a href="https://www.axios.com/2026/09/26/openai-anthropic-thousands-ai-security-incidents" target="_blank" rel="noopener">tens of thousands</a> of security incidents involving OpenAI and Anthropic are now being investigated.</li>



<li>Following through on Dario Amodei’s <a href="https://darioamodei.com/post/we-must-pace-the-frontier" target="_blank" rel="noopener">call</a> to control the speed of frontier model development, Anthropic, OpenAI, and Google are creating a <a href="https://www.cnn.com/2026/09/14/tech/ai-standards-body" target="_blank" rel="noopener">standards consortium</a> for <a href="https://www.latent.space/p/ainews-aef-1-standard-emerges-for" target="_blank" rel="noopener">governing the process</a> of AI development. Meta, xAI, Microsoft, and the Chinese labs are all notably absent.</li>



<li><a href="https://thenewstack.io/inside-out-agent-security/" target="_blank" rel="noopener">Agents need their own identity</a>. Unlike the long-term identities we’re used to, agents need a short-lived identity tied to a revocable certificate and that limits access to resources appropriate for the job. That’s not all of agent security, but it’s a table stakes.</li>



<li>Anthropic has published a lengthy report on the <a href="https://www-cdn.anthropic.com/e50be2e51e7695dc4b1366a37a245a597377d3b5/Anthropic-Detecting-and-countering-091026.pdf" target="_blank" rel="noopener">misuse</a> of its systems by threat actors. Daniel Meissler has <a href="https://danielmiessler.com/blog/anthropic-misuse-report-september-2026" target="_blank" rel="noopener">published</a> a summary, digesting Anthropic’s report into 117 findings.</li>



<li>A malicious <a href="https://www.bleepingcomputer.com/news/security/malicious-npm-packages-evade-install-script-defenses-at-runtime/" target="_blank" rel="noopener">NPM malware</a> package works by hiding malicious code in the package itself (indexed-btree) rather than simply attacking the install script. This technique makes it significantly harder to detect.</li>



<li>An <a href="https://github.com/ucsd-hacc/NSNFSSSFSFN" target="_blank" rel="noopener">attack</a> against the RSA algorithm allows forging of signatures in some situations. The attack was invented in 2007; this is the first public implementation.</li>



<li><a href="https://www.malwarebytes.com/cybersecurity/basics/fake-captcha-scams" target="_blank" rel="noopener">Fake CAPTCHA pages</a> are being used to spread malware. Victims are frequently sent to those pages when they respond to a phish.</li>



<li>Hugging Face has <a href="https://thenextweb.com/news/hugging-face-open-alignment-initiative-embedded-evaluators" target="_blank" rel="noopener">volunteered</a> to audit AI labs for safety and alignment with human values.</li>



<li>In an <a href="https://arxiv.org/abs/2609.04170" target="_blank" rel="noopener">experiment</a> designed to <a href="https://thenextweb.com/news/deepmind-agents-cheating-whistleblowing-research-swarm" target="_blank" rel="noopener">test AI alignment</a>, DeepMind found that, out of 100 agents, 14% were willing to cheat, 25% were “whistleblowers” that reported cheating, and the remainder didn’t notice.</li>



<li>Threat actors are <a href="https://www.bleepingcomputer.com/news/security/hackers-build-ai-frameworks-for-widescale-credential-theft/" target="_blank" rel="noopener">building frameworks</a> for AI agent-enabled attacks. A human in the loop is no longer needed. Fully automated attackers don’t appear to be using zero-days yet; they’re relying on known vulnerabilities.</li>



<li>OpenAI autonomous AI agents were <a href="https://collusion.wiki/" target="_blank" rel="noopener">found</a> communicating with each other via publicly accessible Wikis, possibly to collaborate on a benchmark.</li>



<li>OpenAI has stated that its unreleased Astra model has reached the “Critical” cybersecurity threshold, which means that it can find new vulnerabilities and run exploits against well-protected systems. Now that Astra is released, access to its cybersecurity capabilities has been limited.</li>
</ul>



<h2 class="wp-block-heading">Infrastructure and Operations</h2>



<p class="wp-block-paragraph"><em>Individuals, corporations, and even nations all face a similar problem: keeping their infrastructure under control. At a minimum, control means keeping data on a laptop, corporate server, or data center; at the other end of the spectrum it means eliminating dependencies on software and services from another nation. Any organization working through an AI transformation has to evaluate its entire stack: What do they need to control, and what can they safely delegate to others?</em></p>



<ul class="wp-block-list">
<li><a href="https://www.dawo.community/en/" target="_blank" rel="noopener">DAWO</a> is a community that’s building an open source “workspace” to support digital sovereignty for the Dutch government. The stack will include AI, an operating system based on <a href="https://nixos.org/" target="_blank" rel="noopener">NixOS</a>, cloud services, and collaboration tools.</li>



<li>Cohere now offers a <a href="https://venturebeat.com/data/coheres-model-vault-now-encrypts-ai-inference-so-even-cohere-cannot-see-enterprise-customers-data" target="_blank" rel="noopener">confidential computing platform for artificial intelligence</a>. The company claims that customer data is never visible to Cohere itself or any cloud providers that are in use; data is processed on GPUs whose memory is encrypted and isolated.</li>



<li>Perplexity has <a href="https://thenewstack.io/perplexity-hybrid-compute-mac/" target="_blank" rel="noopener">announced Hybrid Compute</a>, a feature that allows it to run models and use files and tools directly on a user’s Mac. The company claims that sensitive data will never leave the user’s computer.</li>
</ul>



<h2 class="wp-block-heading">Hardware</h2>



<p class="wp-block-paragraph"><em>It&#8217;s too easy to view consumer devices as innocuous things that sit around and do their job silently. Recent devices include cameras, microphones, and even EEG sensors that are constantly collecting data. Where is that data sent, how is it used, and who might have access to it? These questions need to be asked more often.</em></p>



<ul class="wp-block-list">
<li>LG Smart Televisions have been <a href="https://appleinsider.com/articles/26/09/07/disconnect-your-lg-television-from-the-internet-now" target="_blank" rel="noopener">found</a> to record conversations and other audio, even while turned off. The conversations are sent back to LG. If the set is disconnected from the network, it will attempt to find open WiFi access points to deliver its data.</li>



<li>In part because of <a href="https://www.bbc.com/news/articles/cwp80l0my1x2o" target="_blank" rel="noopener">backlash</a> against Meta’s camera-enabled glasses and their abuse, its <a href="https://thenextweb.com/news/meta-vr-glasses-hearing-aid-connect-2026" target="_blank" rel="noopener">AI glasses</a> now come with or without a camera, and can be used as hearing aids. Well-documented abuse aside, virtual reality will only succeed if there are fashionable, easily wearable products.</li>



<li>Headphones, earbuds, and other devices equipped with EEG sensors are <a href="https://techxplore.com/news/2026-08-brain-earbuds-prompting-urgent-children.html" target="_blank" rel="noopener">appearing on the market</a>. They’re advertised for monitoring fatigue, monitoring sleep, and similar applications. It’s time to ask what happens at the interface between neurology and AI.</li>



<li><a href="https://pollen-robotics.com/microduck/blog/introducing-microduck/" target="_blank" rel="noopener">Microduck</a> is a small bipedal AI-driven robot. It’s trained in simulation with open source software, and the model that results can be shared on Hugging Face. It’s affordable and is available for preorder now, shipping by Christmas.</li>
</ul>



<h2 class="wp-block-heading">Web</h2>



<ul class="wp-block-list">
<li>Cloudflare now <a href="https://blog.cloudflare.com/vary-support/" target="_blank" rel="noopener">supports</a> HTTP Vary, which allows servers to serve different kinds of files at the same URL. This is the “ugliest part” of the HTTP standard. It makes caching very difficult, and it probably should be avoided.</li>



<li><a href="https://webmcp.dev/" target="_blank" rel="noopener">WebMCP</a> is a <a href="https://sreenathmenon.com/blog/2026-08-04-webmcp-teaching-websites-to-talk-to-ai-agents/" target="_blank" rel="noopener">proposed standard</a> that gives websites a small API to register tools that agents can discover and call. It was developed by Google and Microsoft.</li>



<li>A <a href="https://arstechnica.com/tech-policy/2026/08/new-twitter-launches-says-musks-x-gave-up-the-name/" target="_blank" rel="noopener">new Twitter</a>? Operation Bluebird is relaunching Twitter, the service bought by Elon Musk and renamed X.</li>
</ul>



<h2 class="wp-block-heading">Biology</h2>



<ul class="wp-block-list">
<li>Anthropic has built a <a href="https://www.reuters.com/world/anthropic-quietly-sets-up-biology-lab-it-ramps-ai-drug-program-2026-09-18/" target="_blank" rel="noopener">biology lab</a> for experimenting with AI-enabled drug development. Claude assisted in the discovery of an enzyme that might be able to perform <a href="https://www.anthropic.com/news/claude-discovers-novel-enzyme-system" target="_blank" rel="noopener">CRISPR-like gene editing</a>.</li>



<li>To improve its training data for biological applications, the OpenAI Foundation (OpenAI’s nonprofit parent organization) is <a href="https://www.technologyreview.com/2026/09/15/1144129/ai-models-need-more-data-about-biology-and-openai-is-paying-to-create-it/" target="_blank" rel="noopener">buying data</a> from failed biotech companies.</li>



<li>Google has <a href="https://deepmind.google/blog/alphagenome-atlas-a-predictive-map-of-every-possible-dna-letter-change-in-the-human-genome/" target="_blank" rel="noopener">released</a> AlphaGenome Atlas, a database of every possible single letter change to human DNA, and what that change will do.</li>
</ul>
]]></content:encoded>
							<wfw:commentRss>https://www.oreilly.com/radar/radar-trends-to-watch-october-2026/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>Zero to Agent in 30 Minutes: Build Your First Agent with MCP</title>
		<link>https://www.oreilly.com/radar/zero-to-agent-in-30-minutes-build-your-first-agent-with-mcp/</link>
				<comments>https://www.oreilly.com/radar/zero-to-agent-in-30-minutes-build-your-first-agent-with-mcp/#respond</comments>
				<pubDate>Mon, 05 Oct 2026 15:55:15 +0000</pubDate>
					<dc:creator><![CDATA[Michelle Smith]]></dc:creator>
						<category><![CDATA[Zero to Agent in 30 Minutes]]></category>
		<category><![CDATA[Commentary]]></category>

		<guid isPermaLink="false">https://www.oreilly.com/radar/?p=19886</guid>

		
					<media:content 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/USE_THIS_zero-to-agent-radar-1600x840-1.png" 
				medium="image" 
				type="image/png" 
				width="1600" 
				height="840" 
			/>

			<media:thumbnail 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/USE_THIS_zero-to-agent-radar-1600x840-1-160x160.png" 
				width="160" 
				height="160" 
			/>
		
				<custom:subtitle><![CDATA[Turn existing APIs into tools an AI assistant can use]]></custom:subtitle>
		
				<description><![CDATA[Developers already have useful capabilities exposed through REST APIs. The Model Context Protocol (MCP) lets developers make those capabilities available to AI clients without rebuilding the underlying application. In this episode of Zero to Agent in 30 Minutes, Bruce Hopkins, an AI developer, author, and longtime software educator, shows how to do that with an [&#8230;]]]></description>
								<content:encoded><![CDATA[
<iframe loading="lazy" width="800" height="450" src="https://www.youtube.com/embed/VRvqgSZpRHQ?si=uOJKxvk7Eg427wPy" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>



<p class="wp-block-paragraph">Developers already have useful capabilities exposed through REST APIs. The Model Context Protocol (MCP) lets developers make those capabilities available to AI clients without rebuilding the underlying application.</p>



<p class="wp-block-paragraph">In this episode of <em>Zero to Agent in 30 Minutes</em>, Bruce Hopkins, an AI developer, author, and longtime software educator, shows how to do that with an MCP server. His demo wraps an existing stock-data API in an MCP server so an MCP client can call it.</p>



<h2 class="wp-block-heading"><strong>From REST API to MCP, step-by-step</strong></h2>



<ol class="wp-block-list">
<li><strong>Start with an existing API.</strong> Identify the operations and data you want an AI client to access. The demo uses the Twelve Data API to retrieve current and historical stock prices.</li>



<li><strong>Create an MCP server.</strong> Use an MCP SDK to create the layer between the AI client and your existing application logic. In Bruce’s Python example, FastMCP handles the MCP interface while the stock-data functions remain separate.</li>



<li><strong>Expose capabilities as tools and resources.</strong> Register the operations the client should be able to discover and call. The stock-price data is exposed through MCP resources and tools that reuse the same underlying functions.</li>



<li><strong>Describe how the client should use them.</strong> Define clear names, inputs, descriptions, and prompts so the client understands what each capability does and what information it requires. Bruce’s example includes prompts for current prices, historical prices, and expected symbol and date formats.</li>



<li><strong>Connect the server to an MCP client.</strong> Run the server over a supported transport so the client can discover and call its tools and resources.&nbsp;</li>
</ol>



<p class="wp-block-paragraph">You don’t need to replace the systems that already handle your application logic to help them work with agents. You can add an MCP interface around existing capabilities to give an AI client a standard way to discover and use them. Be sure to check out <a href="https://github.com/BruceTraining/MCP-Oreilly-2/" target="_blank" rel="noopener">Bruce’s GitHub repo</a> for working code you can adapt for your own APIs.</p>



<h2 class="wp-block-heading"><strong>Coming next week</strong></h2>



<p class="wp-block-paragraph">Next week, AI engineer Sajal Sharma returns to <em>Zero to Agent in 30 Minutes</em> to build a personal assistant on OpenClaw. He’ll show how an agent can keep tasks and notes in Markdown, run proactive automations, and deliver scheduled updates such as a regular morning briefing without waiting for a new prompt.</p>



<p class="wp-block-paragraph"><em>Follow along with Zero to Agent in 30 Minutes on</em> <em><a href="https://www.oreilly.com/radar/topics/zero-to-agent-in-30-minutes/" target="_blank" rel="noopener">Radar</a>, or watch the latest episode on</em> <em><a href="https://www.youtube.com/playlist?list=PLMJ6moSi2Cgg" target="_blank" rel="noopener">YouTube</a>,</em> <em><a href="https://open.spotify.com/show/033SYd1qhhBAQuMpgJUVTt" target="_blank" rel="noopener">Spotify</a>,</em> <em><a href="https://podcasts.apple.com/us/podcast/zero-to-agent-in-30-minutes/id6793216641" target="_blank" rel="noopener">Apple</a>, or wherever you get your podcasts. If you&#8217;re an O’Reilly member, you can watch live.</em> <em><a href="https://www.oreilly.com/live-events/zero-to-agent-in-30-minutes/0642572392338/" target="_blank" rel="noopener">Save your seat</a>.</em></p>
]]></content:encoded>
							<wfw:commentRss>https://www.oreilly.com/radar/zero-to-agent-in-30-minutes-build-your-first-agent-with-mcp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>How to Build Reliable AI Agent Systems for Production</title>
		<link>https://www.oreilly.com/radar/how-to-build-reliable-ai-agent-systems-for-production/</link>
				<comments>https://www.oreilly.com/radar/how-to-build-reliable-ai-agent-systems-for-production/#respond</comments>
				<pubDate>Mon, 05 Oct 2026 10:54:33 +0000</pubDate>
					<dc:creator><![CDATA[Angie Jones]]></dc:creator>
						<category><![CDATA[AI & ML]]></category>
		<category><![CDATA[Commentary]]></category>

		<guid isPermaLink="false">https://www.oreilly.com/radar/?p=19881</guid>

		
					<media:content 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/How-to-build-reliable-AI-agent-systems-for-production.jpg" 
				medium="image" 
				type="image/jpeg" 
				width="2304" 
				height="1792" 
			/>

			<media:thumbnail 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/How-to-build-reliable-AI-agent-systems-for-production-160x160.jpg" 
				width="160" 
				height="160" 
			/>
		
		
				<description><![CDATA[The following article was originally published on the Agentic AI Foundation blog site and is being republished here with the author’s permission. A customer asks your company’s AI agent to update the shipping address on account 123. The agent relies on a support ticket with a typo and updates account 132 instead. The customer relationship [&#8230;]]]></description>
								<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>The following article was originally published on the</em> <em><a href="https://aaif.io/blog/how-to-build-reliable-ai-agent-systems-for-production" target="_blank" rel="noopener">Agentic AI Foundation blog site</a></em> <em>and is being republished here with the author’s permission.</em></p>
</blockquote>



<p class="wp-block-paragraph">A customer asks your company’s AI agent to update the shipping address on account 123. The agent relies on a support ticket with a typo and updates account 132 instead. The customer relationship management system reports that the update “succeeded.”</p>



<p class="wp-block-paragraph">The API successfully completed the authorized request, but because it had no way to know which account the customer approved versus what was intended, it saw no error.</p>



<p class="wp-block-paragraph">Teams often try to improve reliability by tuning the prompt or choosing a stronger model. But the model did exactly what the surrounding system allowed because the system treated the agent’s decision as the final authority. Prompt tuning and stronger models can improve the agent’s responses, but can’t provide guarantees for actions.</p>



<h2 class="wp-block-heading">Put each decision in a layer that can enforce it</h2>



<p class="wp-block-paragraph">The model should propose an action, while a policy service decides whether the action is allowed. The execution layer can then perform the action within those limits.</p>



<p class="wp-block-paragraph">Now consider that same agent, but with a policy service in place. The agent would propose updating an account after reading a support ticket. Before the update runs, a policy service can compare the request with the change the user approved. If the request falls outside those limits, the service can reject it even when the agent sounds confident.</p>



<p class="wp-block-paragraph">After the policy check, the system can save an audit record that connects the request to the result and identifies the policy version used for the decision.</p>



<p class="wp-block-paragraph">This separation gives each part of the system a job it can handle. The model interprets the request, while deterministic software enforces the conditions that must always hold.</p>



<p class="wp-block-paragraph">However, policy enforcement depends on the information used to request an action. A policy check can’t correct a decision that was built on context the system should never have trusted.</p>



<h2 class="wp-block-heading">Treat agent context as untrusted input</h2>



<p class="wp-block-paragraph">Agents receive instructions from more places than the user’s current prompt. A coding agent may read a <code>SKILL.md</code> file or persisted memory from a previous run. Each source can influence what the agent does next.</p>



<p class="wp-block-paragraph">Stored instructions are useful, but their source may be stale or malicious. Another agent may have written the memory. A downloaded skill may contain instructions that expose credentials.</p>



<p class="wp-block-paragraph">Therefore, stored context needs provenance. The system should record who wrote the context and when, then verify that linked files still match the versions the writer used. A risk label can also tell the runtime whether a piece of context may guide an answer or authorize a write.</p>



<p class="wp-block-paragraph">Warnings help, but they don’t remove the risk. In controlled testing described in “<a href="https://events.linuxfoundation.org/agntcon-mcpcon-north-america/program/schedule/?id=1245977" target="_blank" rel="noopener">Trustworthy Context Is Untrusted By Default</a>,” Shub Argha reports that a trust preamble reduced one class of context contamination from 88.8 percent to 33.3 percent. The remaining failures show why a warning should sit alongside technical checks.</p>



<p class="wp-block-paragraph">Once a team can tell where context came from, the next decision is what an agent may do with it.</p>



<h2 class="wp-block-heading">Give the agent only the authority required for the task</h2>



<p class="wp-block-paragraph">OAuth scopes provide a useful boundary, but a broad <code>write</code> scope still leaves a large decision to the agent. The token may allow the agent to update any record even though the user approved one field on one account, as we saw in the opening example.</p>



<p class="wp-block-paragraph">A narrower capability can represent the exact action the user approved. For example, the runtime could issue a capability that permits one update to the shipping address on account 123. The capability expires after the update, so the agent cannot reuse it for another customer.</p>



<p class="wp-block-paragraph">Narrow capabilities also apply to local execution. An agent that needs to format one file doesn’t need unrestricted shell access. The runtime can provide a tool with the necessary input and keep other commands unavailable.</p>



<p class="wp-block-paragraph">As a result, a prompt injection has less authority to work with. The agent may still request the wrong action, but the runtime can reject anything outside the capability it received.</p>



<p class="wp-block-paragraph">Narrow permissions also make audit records easier to understand because the record contains the authority granted for that specific action. When authority lives in a broad token or a long prompt, an operator has to reconstruct what the agent was supposed to do after the failure.</p>



<p class="wp-block-paragraph">Even narrow authority doesn’t require an agent to act. A reliable system also needs clear conditions for when the agent should stand down.</p>



<h2 class="wp-block-heading">Make stopping part of normal operation</h2>



<p class="wp-block-paragraph">An agent can cause damage even without calling a sensitive tool. It can post a wrong answer to a customer or keep replying after a human has taken over.</p>



<p class="wp-block-paragraph">The runtime should make restraint part of the workflow. If the agent’s confidence falls below a set threshold, the runtime can route the support ticket to a human representative. A reply from the human can then cancel any pending response from the agent.</p>



<p class="wp-block-paragraph">Confidence checks and rules that stop the agent when a human takes over belong in the routing and execution layers. The model shouldn’t make either decision on its own. Similarly, a kill switch must stop an agent even when the model is in the middle of a plan.</p>



<p class="wp-block-paragraph">Stopping safely solves one part of reliability, but long-running agents also need a plan for failures that occur after valid work begins.</p>



<h2 class="wp-block-heading">Preserve state so the system can recover</h2>



<p class="wp-block-paragraph">Consider a browser agent that has filled out most of a form when the page changes. A retry that starts from the beginning could submit an earlier step twice, while a retry that guesses where to continue may skip a required field.</p>



<p class="wp-block-paragraph">The execution system should record each confirmed step and attach an idempotency key to any action that must happen once. The key is a unique identifier that tells the server a retry belongs to the same action. Then, when the workflow resumes, the system can continue from the last confirmed state without repeating a completed action.</p>



<p class="wp-block-paragraph">Agent sandboxes create a related problem. Keeping every sandbox running during long idle periods wastes resources and keeps execution environments available longer than needed. Hibernation can reduce both concerns, but only when the wake-up process restores the required state and handles a failed resume.</p>



<p class="wp-block-paragraph">Recovery becomes much harder when the system can’t explain what happened before the interruption.</p>



<h2 class="wp-block-heading">Keep evidence that people and agents can inspect</h2>



<p class="wp-block-paragraph">An execution log should connect the context an agent received to the action it requested. It should also show which policy allowed the action and what result came back.</p>



<p class="wp-block-paragraph">Teams can use that record during an incident, but the agent can also use it during later work. For example, an agent that can read the reason behind a previous code change doesn’t need to infer intent from the final diff alone.</p>



<p class="wp-block-paragraph">Context graphs offer one way to preserve those relationships across time. A graph can connect a tool call to the policy that governed it. The same record can link the source context to the outcome. Later, a person or agent can query the relationships to understand why the system made a decision.</p>



<p class="wp-block-paragraph">The record still needs limits. Secrets shouldn’t be copied into an audit trail, for example, and retention rules should match the data involved.</p>



<p class="wp-block-paragraph">A deliberate record is safer than relying on a conversation transcript and hoping it contains everything an operator will need.</p>



<p class="wp-block-paragraph">A reliable agent system can explain why an action was allowed and resume safely when that action fails. Enforceable policies and recorded state provide those guarantees around the model.</p>



<h2 class="wp-block-heading">Keep the controls portable</h2>



<p class="wp-block-paragraph">Many organizations will use more than one model or agent runtime. When each agent carries its permissions inside a prompt, the rules can drift as teams add models and tools.</p>



<p class="wp-block-paragraph"><a href="https://aaif.io/projects/model-context-protocol" target="_blank" rel="noopener">MCP</a> gives clients and servers a shared way to describe and call tools. Teams can use that common tool surface to enforce authorization at the server or <a href="https://aaif.io/projects/agentgateway" target="_blank" rel="noopener">gateway</a>, regardless of which model requested the action.</p>



<p class="wp-block-paragraph">A shared context format can also preserve provenance when a workflow moves between agents. Open specifications provide consistent interfaces, while each deployment remains responsible for its policies and enforcement.</p>
]]></content:encoded>
							<wfw:commentRss>https://www.oreilly.com/radar/how-to-build-reliable-ai-agent-systems-for-production/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>This Week in AI: Agents Are Outrunning the Systems Around Them</title>
		<link>https://www.oreilly.com/radar/this-week-in-ai-agents-are-outrunning-the-systems-around-them/</link>
				<comments>https://www.oreilly.com/radar/this-week-in-ai-agents-are-outrunning-the-systems-around-them/#respond</comments>
				<pubDate>Fri, 02 Oct 2026 15:54:24 +0000</pubDate>
					<dc:creator><![CDATA[Michelle Smith]]></dc:creator>
						<category><![CDATA[This Week in AI]]></category>
		<category><![CDATA[Commentary]]></category>

		<guid isPermaLink="false">https://www.oreilly.com/radar/?p=19874</guid>

		
					<media:content 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/08/USE_THIS_thisweek-ai-radar-1600x840-1.png" 
				medium="image" 
				type="image/png" 
				width="1600" 
				height="840" 
			/>

			<media:thumbnail 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/08/USE_THIS_thisweek-ai-radar-1600x840-1-160x160.png" 
				width="160" 
				height="160" 
			/>
		
				<custom:subtitle><![CDATA[Cyberattacks, power constraints, faster model releases, and consumer agents put pressure on the systems built to support them]]></custom:subtitle>
		
				<description><![CDATA[On the latest episode of This Week in AI, host Vicki Reyzelman, a senior solutions engineer at Akamai, traced a common problem across cybersecurity, energy, model releases, consumer hardware, and regulation. AI agents can now probe networks, coordinate with other agents, make purchases, and interact with real-world systems faster than many organizations can respond. We’re [&#8230;]]]></description>
								<content:encoded><![CDATA[
<iframe loading="lazy" width="800" height="450" src="https://www.youtube.com/embed/BmBTbqm1pfQ?si=L0ZAcjvz2ZLxoqRh" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>



<p class="wp-block-paragraph">On the latest episode of <em>This Week in AI</em>, host Vicki Reyzelman, a senior solutions engineer at Akamai, traced a common problem across cybersecurity, energy, model releases, consumer hardware, and regulation. AI agents can now probe networks, coordinate with other agents, make purchases, and interact with real-world systems faster than many organizations can respond. We’re seeing those capabilities move into systems built for slower, more predictable software.</p>



<h2 class="wp-block-heading"><strong>Security has to operate at agent speed</strong></h2>



<p class="wp-block-paragraph">Vicki opened with an incident in which <a href="https://www.businessday.co.za/world/2026-09-24-albanese-calls-openai-agents-medicare-breach-unacceptable/" target="_blank" rel="noopener">an OpenAI agent reportedly found ways around security controls</a> while researching public information in Australia’s Medicare system. The activity didn’t expose any&nbsp; personal Medicare records, but <a href="https://www.abc.net.au/news/2026-09-24/ai-agent-accessed-australian-government-site-pm-says/107189078" target="_blank" rel="noopener">OpenAI reportedly took 54 days to identify the incident</a> and another month to notify the government. A response cycle measured in weeks can’t keep pace with systems that can test defenses in seconds.</p>



<p class="wp-block-paragraph">She also brought up <a href="https://news.un.org/en/story/2026/09/1168380" target="_blank" rel="noopener">the recent Hugging Face incident</a> involving a swarm of 1,200 agents that exchanged roughly 70,000 messages while coordinating their work. Agents can change tactics faster than traditional security processes play out, so teams can no longer rely on the familiar methods of addressing suspicious behavior. Companies are now experimenting with runtime enforcement, agent sandboxes, enterprise browsers, and other controls that sit closer to execution.</p>



<p class="wp-block-paragraph">Policymakers are searching for workable controls too, from <a href="https://www.rockcybermusings.com/p/weekly-musings-top-10-ai-security-20260918-20260924" target="_blank" rel="noopener">California proposals for emergency AI shutdown mechanisms</a> to international discussions about <a href="https://www.securitycouncilreport.org/whatsinblue/2026/09/artificial-intelligence-high-level-briefing-2.php" target="_blank" rel="noopener">independent model evaluation</a>. Teams can’t govern agent behavior they can’t see, so they need to know what an agent did and when its behavior crossed a boundary.</p>



<h2 class="wp-block-heading"><strong>Power and latency are becoming model decisions</strong></h2>



<p class="wp-block-paragraph">Power is one constraint software teams can’t code their way around. Vicki pointed to a <a href="https://time.news/doe-invests-nearly-2-billion-to-boost-grid-capacity-for-ai-data-centers" target="_blank" rel="noopener">$2 billion US Department of Energy investment</a> across 26 states alongside hundreds of billions of dollars in planned AI spending from Microsoft, Amazon, Alphabet, and Meta. Data centers can add servers quickly, but it won’t make a difference if the grid can’t provide the energy those servers require.</p>



<p class="wp-block-paragraph">Meanwhile, <a href="https://www.searchintel.tech/research/ai-model-release-pace/" target="_blank" rel="noopener">major model releases are arriving roughly every 17 days</a>, with context windows now exceeding one million tokens. Open weight and edge models are advancing too, particularly around low-latency reasoning. More frequent releases and heavier inference workloads put added pressure on networks, compute, and budgets.</p>



<p class="wp-block-paragraph">Solving this challenge may mean companies have to run more reasoning at the edge or locally, where systems can reduce latency and avoid sending every request across the network. That gives teams another architectural choice to make alongside model selection. A frontier model may be appropriate for one workload, while a smaller local model may be faster and cheaper for another.</p>



<h2 class="wp-block-heading"><strong>Consumer agents move autonomy into everyday life</strong></h2>



<p class="wp-block-paragraph">Consumer hardware puts those architecture and governance choices directly in users’ hands. AI-enabled glasses, pendants, and other devices stay with users throughout the day and can learn preferences, connect with outside services, and take actions such as shopping or making reservations. Meta’s new Muse agent is one example of that shift.</p>



<p class="wp-block-paragraph">Meta says the Muse ecosystem <a href="https://explainx.ai/blog/meta-connect-2026-everything-announced-muse-glasses-vr-2026" target="_blank" rel="noopener">already includes roughly 1,500 developer connectors</a>, including integrations with retailers such as Walmart and Best Buy. If more purchases begin with an agent acting for the customer, companies may have to rethink how people discover products and complete transactions. The convenience of Amazon Prime and one-click shopping, for example, looks different when another system is comparing options and buying on a user’s behalf.</p>



<p class="wp-block-paragraph">Muse already ran into problems, including exposing information it wasn’t supposed to and relying on humans to complete some tasks, such as making dinner reservations. Those failures carry more weight when the software can spend money or act on personal preferences. Users and businesses need clear limits on what an agent can access, what it can do without approval, and how those actions are recorded.</p>



<h2 class="wp-block-heading"><strong>What’s next</strong></h2>



<p class="wp-block-paragraph">Deploying an agent means taking responsibility for the systems around it. Security controls, power and network constraints, local versus remote inference, and permission boundaries all shape what these systems can safely do in production. For practitioners, the job now includes the architecture around the models.</p>



<p class="wp-block-paragraph">Join us again next Monday for another episode of <em>This Week in AI,</em> when we’ll dive into more of the news and developments shaping the AI era. And check back each Friday for the latest episode, or watch on <a href="https://www.youtube.com/watch?v=g4cfjz5AKxY&amp;list=PL055Epbe6d5bJEhT7_ZzOeJZ6gPyUzYpS" target="_blank" rel="noopener">YouTube</a>, <a href="https://open.spotify.com/show/033kJS2BG1teGunxmtsU1r" target="_blank" rel="noopener">Spotify</a>, <a href="https://podcasts.apple.com/us/podcast/this-week-in-ai/id1896798047" target="_blank" rel="noopener">Apple</a>, or wherever you get your podcasts. You can also hear more from Vicki on <a href="https://substack.com/@vickireyzelman" target="_blank" rel="noopener">her Substack</a>.</p>
]]></content:encoded>
							<wfw:commentRss>https://www.oreilly.com/radar/this-week-in-ai-agents-are-outrunning-the-systems-around-them/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>Coding Agents Love Decision Records</title>
		<link>https://www.oreilly.com/radar/coding-agents-love-decision-records/</link>
				<comments>https://www.oreilly.com/radar/coding-agents-love-decision-records/#respond</comments>
				<pubDate>Fri, 02 Oct 2026 11:24:21 +0000</pubDate>
					<dc:creator><![CDATA[Duncan Davidson]]></dc:creator>
						<category><![CDATA[AI & ML]]></category>
		<category><![CDATA[Commentary]]></category>

		<guid isPermaLink="false">https://www.oreilly.com/radar/?p=19867</guid>

		
					<media:content 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/Coding-agents-love-decision-records.jpg" 
				medium="image" 
				type="image/jpeg" 
				width="2304" 
				height="1792" 
			/>

			<media:thumbnail 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/Coding-agents-love-decision-records-160x160.jpg" 
				width="160" 
				height="160" 
			/>
		
		
				<description><![CDATA[The following article originally appeared on Duncan Davidson’s blog and is being republished here with the author’s permission. Decision records give coding agents durable project context—as long as they don’t turn every decision into a courtroom transcript. Architectural Decision Records (ADRs) help human teams establish rules and carry context forward in software projects. They capture [&#8230;]]]></description>
								<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>The following article originally appeared on</em> <em><a href="https://duncandavidson.com/agents-love-decisions" target="_blank" rel="noopener">Duncan Davidson’s blog</a></em> <em>and is being republished here with the author’s permission.</em></p>
</blockquote>



<p class="wp-block-paragraph">Decision records give coding agents durable project context—as long as they don’t turn every decision into a courtroom transcript.</p>



<p class="wp-block-paragraph">Architectural Decision Records (ADRs) help human teams establish rules and carry context forward in software projects. They capture significant design choices, their context, and the reasons behind them. Like many tools built for human software teams, ADRs work well for coding agents too.</p>



<p class="wp-block-paragraph">Agents often arrive with little memory of yesterday and only a narrow view of a codebase. Even systems with persistent memory may preserve context without establishing whether it is accurate, current, or accepted by the human team. Decision records help them understand the intent behind the code rather than having to infer it. Keeping them in a project repository spares agents from having to trawl through issues, search chats, and perform code archaeology. When you record intent explicitly, an agent is less likely to mistake an implementation detail for a foundational rule.</p>



<p class="wp-block-paragraph">Once a decision enters an agent’s context window, the agent may adhere to it even more rigidly than a human would. In my own work, I’ve seen agents fight tooth and nail to apply an accepted decision even when it is obsolete. In one case, an agent preserved an outdated storage abstraction across a new feature because an ADR still described it as mandatory. Instead of flagging the mismatch, it added another layer to keep the new requirement technically compatible with the old ruling.</p>



<p class="wp-block-paragraph">The first remedy is to give agents explicit permission to question decisions that no longer fit—and to watch for signs that they’re overfitting. But that solves only half the problem. When you invite an agent to update a decision, a second tendency appears: preserving the deliberation. Every clarification becomes an amendment explaining its own existence at the expense of clarity. Small implementation details become rules, and cross-references acquire their own restatements and justifications. The result is overlitigated prose that is hard for humans to read.</p>



<p class="wp-block-paragraph">ADRs should absolutely be readable by humans, especially as we lean on agents to generate more and more code. To counter this, I’ve become explicit in my projects’ <code>AGENTS.md</code> files about how agents should apply and maintain ADRs. Here’s an excerpt from one:</p>



<p class="wp-block-paragraph"><code>Architectural Decision Records (ADRs) are stored as Markdown files in the </code><br><code>docs/decisions directory. Treat accepted ADRs as binding. Proposed ADRs </code><br><code>are non-binding context. Superseded ADRs are historical context and do </code><br><code>not govern current work. If a given task conflicts with an accepted ADR, </code><br><code>stop and discuss whether the task or ADR should change and propose the </code><br><code>change that you think should be made. Propose new ADRs or updates to </code><br><code>existing ones when a change introduces or revises a durable product or </code><br><code>architectural decision.</code> </p>



<p class="wp-block-paragraph"><code>Keep ADRs succinct. Each ADR carries only its current text; Git history </code><br><code>is its changelog, so do not add or maintain amendment logs in ADR </code><br><code>headers. When substantively changing an accepted ADR, add or update a </code><br><code>single Updated: date line after Date:—its presence signals that history </code><br><code>exists and Git has the details. A superseded ADR records a Superseded-On: </code><br><code>date instead of Updated: , matching the Supersedes: line on the ADR that </code><br><code>replaced it. State each rule once in the ADR that owns it and cross-reference </code><br><code>it from other ADRs instead of restating it.</code></p>



<p class="wp-block-paragraph">These instructions are still evolving in my projects, and different projects will need different conventions. Some teams will prefer immutable ADRs that are superseded rather than revised; in my projects, I’m happy to have Git carry that history.</p>



<p class="wp-block-paragraph">If you do something similar, adapt the guidance to your own needs. The essential principle is that each governing ADR should describe the decision currently in force, with enough rationale to apply it. An agent doesn’t need the transcript of every argument. It needs the ruling that governs today and clear permission to stop when the ruling no longer fits.</p>
]]></content:encoded>
							<wfw:commentRss>https://www.oreilly.com/radar/coding-agents-love-decision-records/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>The Future of Software May Be Conversational Rather Than Autonomous</title>
		<link>https://www.oreilly.com/radar/the-future-of-software-may-be-conversational-rather-than-autonomous/</link>
				<comments>https://www.oreilly.com/radar/the-future-of-software-may-be-conversational-rather-than-autonomous/#respond</comments>
				<pubDate>Thu, 01 Oct 2026 10:54:32 +0000</pubDate>
					<dc:creator><![CDATA[Robert Englander]]></dc:creator>
						<category><![CDATA[AI & ML]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Commentary]]></category>

		<guid isPermaLink="false">https://www.oreilly.com/radar/?p=19862</guid>

		
					<media:content 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/The-future-of-software-may-be-conversational-rather-than-autonomous.jpg" 
				medium="image" 
				type="image/jpeg" 
				width="2304" 
				height="1792" 
			/>

			<media:thumbnail 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/10/The-future-of-software-may-be-conversational-rather-than-autonomous-160x160.jpg" 
				width="160" 
				height="160" 
			/>
		
		
				<description><![CDATA[The following article originally appeared on Robert Englander’s blog site and is being reposted here with the author’s permission. The software industry has become deeply focused on autonomous AI systems. Agents that can replace workers. Agents that can write software. Agents that can operate applications on our behalf. Entire startups are now built around the [&#8230;]]]></description>
								<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>The following article originally appeared on</em> <em><a href="https://robenglander.com/writing/future-of-software-conversational/" target="_blank" rel="noopener">Robert Englander’s blog site</a></em> <em>and is being reposted here with the author’s permission.</em></p>
</blockquote>



<p class="wp-block-paragraph">The software industry has become deeply focused on autonomous AI systems. Agents that can replace workers. Agents that can write software. Agents that can operate applications on our behalf. Entire startups are now built around the assumption that the natural end state of AI is autonomy.</p>



<p class="wp-block-paragraph">Some of this work is genuinely useful. AI-assisted coding can improve productivity. Generative systems are already helping people draft documents, summarize information, and accelerate certain kinds of repetitive work. There are clearly domains where more automation makes sense.</p>



<p class="wp-block-paragraph">Still, I increasingly suspect the industry may be underestimating another opportunity that feels both more practical and potentially more transformative over the long term: natural language interfaces sitting on top of deterministic software systems.</p>



<p class="wp-block-paragraph">Much of the current AI narrative assumes the model itself should become the authoritative actor. The AI writes the code. The AI performs the workflow. The AI executes the task. The AI makes the decision. The conversation around “agents” often assumes the system itself should gradually absorb more and more of that responsibility until people become optional.</p>



<p class="wp-block-paragraph">The problem is that large language models are probabilistic systems. They’re incredibly capable. But they’re still statistical machines. They hallucinate, improvise, approximate. In many contexts, that’s perfectly acceptable.</p>



<p class="wp-block-paragraph">Brainstorming, summarization, drafting, translation, and exploratory work all tolerate a degree of uncertainty. Deterministic systems generally don’t.</p>



<p class="wp-block-paragraph">Financial systems have to calculate correctly. Scheduling systems have to preserve consistency. Medical systems have to maintain integrity. Accounting systems have to reconcile accurately. Reliability is still the foundation upon which useful software is built.</p>



<p class="wp-block-paragraph">That’s one reason I think the most important role for LLMs may not be replacing deterministic systems, but reducing the friction between people and those systems.</p>



<p class="wp-block-paragraph">Historically, software interfaces forced people to adapt to machine discipline. We learned command syntax. We navigated menus and workflows. We memorized procedures. We filled out forms in exactly the way the application expected. Even graphical interfaces, which were a huge leap forward, still largely required users to think in terms of the structure of the software itself. Natural language interfaces potentially invert that relationship.</p>



<p class="wp-block-paragraph">Instead of forcing users closer to the system, the system moves closer to human expression. That may sound subtle, but I think it represents a significant shift in how software can be experienced. A user no longer needs to think primarily in terms of application structure or workflow design. The interaction begins to center more naturally around intent.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>“Show me how delaying Social Security by two years impacts long-term spending.”</em></p>



<p class="wp-block-paragraph"><em>“Transfer $500 from checking into savings next Friday.”</em></p>



<p class="wp-block-paragraph"><em>“Why did my tax liability increase this year?”</em></p>



<p class="wp-block-paragraph"><em>“Find the contracts signed after January that contain auto-renewal</em></p>



<p class="wp-block-paragraph"><em>language.”</em></p>
</blockquote>



<p class="wp-block-paragraph">None of these requests eliminates the need for deterministic systems underneath. In fact, they depend on them. The natural language layer simply acts as an interpreter between human expression and authoritative execution.</p>



<p class="wp-block-paragraph">That architecture feels considerably more durable to me than the idea that probabilistic systems should become the primary authority layer themselves.</p>



<p class="wp-block-paragraph">One interesting thing about the current AI wave is that language models are often strongest in areas involving interpretation. They’re remarkably good at extracting meaning from ambiguous human communication, maintaining conversational context, translating between representations, and helping users express intent more naturally. Those are fundamentally interaction problems.</p>



<p class="wp-block-paragraph">Meanwhile, the areas where language models remain weakest are usually the areas requiring guarantees, consistency, accountability, and deterministic correctness. Those are system-of-record problems. The current industry conversation often blurs the distinction between the two.</p>



<p class="wp-block-paragraph">I don’t think conversational interfaces reduce the importance of deterministic software. If anything, they increase it. Once users begin interacting through natural language, the validation layer underneath becomes even more critical. Systems have to safely interpret intent, validate operations, preserve constraints, and maintain correctness even when the incoming requests are conversational and ambiguous.</p>



<p class="wp-block-paragraph">The conversational layer improves accessibility. The deterministic layer preserves trust.</p>



<p class="wp-block-paragraph">Both matter.</p>



<p class="wp-block-paragraph">Every major era of computing has involved some kind of interface transition. Mainframes required specialized operators. Personal computers brought graphical interfaces that made computing accessible to nonspecialists. The web normalized hyperlinks, search, and forms. Mobile computing shifted interaction toward touch and gestures. Natural language may become the next major abstraction layer.</p>



<p class="wp-block-paragraph">Not because computers suddenly became human-like, but because we finally built systems capable of translating between human communication and machine discipline at scale.</p>



<p class="wp-block-paragraph">I also think this changes how we should think about software’s future. The current AI environment sometimes frames autonomy as the inevitable destination. If an AI can partially perform a task today, many assume the long-term outcome is full replacement of the person performing that task.</p>



<p class="wp-block-paragraph">I’m not convinced that’s where the most durable value lies.</p>



<p class="wp-block-paragraph">In many domains, the real friction isn’t execution. It’s interface complexity. People struggle less with the underlying capabilities of software than with the difficulty of expressing what they actually want the software to do.</p>



<p class="wp-block-paragraph">Enterprise systems are notoriously difficult to navigate. Financial systems expose overwhelming complexity. Creative tools bury users under layers of workflow and terminology. Even relatively simple applications often require substantial onboarding before users become comfortable with them.</p>



<p class="wp-block-paragraph">Natural language interfaces potentially change that equation in a meaningful way. They allow software to meet users closer to where they already are: ordinary human communication.</p>



<p class="wp-block-paragraph">That doesn’t mean conversational systems should become undisciplined systems. In fact, I think the opposite is true. As interfaces become more conversational, the underlying architecture has to become even more rigorous about validation and execution semantics. The ambiguity doesn’t disappear. It moves.</p>



<p class="wp-block-paragraph">Historically, much of the burden of precision sat on the user. The user had to learn the syntax, understand the workflow, and conform to the application’s structure.</p>



<p class="wp-block-paragraph">Conversational systems shift more of that burden into the interpretation and validation layers of the software itself. That’s not a trivial engineering problem. It requires clarification, normalization, policy enforcement, validation, and authoritative execution underneath the conversational layer. It also requires accepting that probabilistic interpretation and deterministic execution aren’t competing ideas. They’re complementary ones.</p>



<p class="wp-block-paragraph">This is one reason I increasingly think the future of software may become conversational without necessarily becoming autonomous. The two ideas are related. But they’re not the same thing.</p>



<p class="wp-block-paragraph">There’s enormous value in reducing the natural friction between human expression and machine discipline. Large language models may ultimately prove most transformative not when they replace deterministic systems, but when they help people interact with those systems more naturally.</p>



<p class="wp-block-paragraph">For decades, people have adapted to computers. It now seems possible that software may finally start adapting to people instead.</p>
]]></content:encoded>
							<wfw:commentRss>https://www.oreilly.com/radar/the-future-of-software-may-be-conversational-rather-than-autonomous/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>The Agentic Data Science Playbook</title>
		<link>https://www.oreilly.com/radar/the-agentic-data-science-playbook/</link>
				<comments>https://www.oreilly.com/radar/the-agentic-data-science-playbook/#respond</comments>
				<pubDate>Wed, 30 Sep 2026 16:06:24 +0000</pubDate>
					<dc:creator><![CDATA[Hugo Bowne-Anderson, Luca Fiaschi and Thomas Wiecki]]></dc:creator>
						<category><![CDATA[AI & ML]]></category>
		<category><![CDATA[Data]]></category>
		<category><![CDATA[Software Architecture]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Commentary]]></category>

		<guid isPermaLink="false">https://www.oreilly.com/radar/?p=19847</guid>

		
					<media:content 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/The-agentic-data-science-playbook-image-created-with-Adobe-Firefly.jpg" 
				medium="image" 
				type="image/jpeg" 
				width="2304" 
				height="1792" 
			/>

			<media:thumbnail 
				url="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/The-agentic-data-science-playbook-image-created-with-Adobe-Firefly-160x160.jpg" 
				width="160" 
				height="160" 
			/>
		
				<custom:subtitle><![CDATA[How to build and direct data science agents, and make each investigation improve the next.]]></custom:subtitle>
		
				<description><![CDATA[The following article originally appeared on Vanishing Gradients and is being republished here with the authors’ permission When an AI agent can explore a dataset, choose a modeling approach, run the analysis, and explain its findings, what should the data scientist do? Traditionally, data scientists chose each step and implemented much of the analysis themselves. [&#8230;]]]></description>
								<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>The following article originally appeared on</em> <a href="https://hugobowne.substack.com/p/the-agentic-data-science-playbook">Vanishing Gradients</a> <em>and is being republished here with the authors’ permission</em></p>
</blockquote>



<p class="wp-block-paragraph">When an AI agent can explore a dataset, choose a modeling approach, run the analysis, and explain its findings, what should the data scientist do?</p>



<p class="wp-block-paragraph">Traditionally, data scientists chose each step and implemented much of the analysis themselves. Agentic data science changes that division of work: we can delegate an investigation, including methodological choices, while shaping the question, supplying relevant expertise, and challenging the evidence it produces. For AI-native data scientists, choosing the runtime, writing reusable skills, and designing the workflows and feedback that guide the agent are part of the analytical work.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1600" height="889" src="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-38-1600x889.png" alt="Verification process" class="wp-image-19865" srcset="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-38-1600x889.png 1600w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-38-300x167.png 300w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-38-767x426.png 767w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-38-1536x853.png 1536w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-38-2048x1138.png 2048w" sizes="auto, (max-width: 1600px) 100vw, 1600px" /></figure>



<p class="wp-block-paragraph">This article provides a playbook for working with data science agents, from setting up an investigation to reviewing its results and carrying lessons into the next assignment. To see why that requires more than a capable model and a business question, consider an experiment we deliberately started with too little guidance. We gave Claude Opus 5.0 a modified version of the <a href="https://www.kaggle.com/datasets/ellipticco/elliptic-data-set" target="_blank" rel="noopener">public Elliptic dataset</a> and asked, “Build me a model to detect fraudulent nodes.” The dataset is a graph of Bitcoin transactions: each node is a transaction, and an edge represents a flow of bitcoin between transactions. Some transaction nodes carry licit or illicit labels based on the entities that created them; the rest are unlabeled. Each node has a time step indicating when its transaction was broadcast, allowing us to train on earlier time steps and test on later ones. We also wanted separate results for transactions with many connections (high-degree nodes), which mattered most in the intended application. Importantly, we renamed the columns, changed several features, and reindexed the time steps while preserving their order, making the public dataset harder for Claude to recognize.</p>



<p class="wp-block-paragraph">Claude wrote the code, trained a random forest, and reported an F1 of 0.87 and ROC AUC of 0.99. It had split transactions randomly, mixing earlier and later time steps in both the training and test sets. That test did not measure how the model would perform on transactions from later time steps. Moreover, Claude also used a feature we had planted as a proxy for the fraud label (yes, we tricked it!), giving the model leaked information it would not have when scoring a new transaction. So how do we avoid these situations?</p>



<p class="wp-block-paragraph"><strong>We then supplied the guidance missing from the initial prompt:</strong>&nbsp; We required a temporal holdout, removed the leaking feature, supplied context about how the model would be used in production, and asked for separate reporting on the high-degree nodes that mattered most. Under the corrected evaluation, F1 was 0.70, overall recall was 0.61, and recall on high-degree nodes was 0.21.</p>



<p class="wp-block-paragraph">The key point is that “Build a fraud detector” left Claude to infer how the model would be used and what would count as success. <strong>AI-native data scientists build and direct</strong> an analytical process in which agents can investigate, receive feedback, and return evidence for review. The work begins with deciding how much of the investigation to delegate.&nbsp; Agentic data science is doing data science work with AI agents as teammates. Crucially, the scope of their responsibility can extend well beyond code implementation. An agent can help frame a question, explore data, test a claim, or communicate a result, provided it has the context and tools to do the work, a way to assess its progress and validate its results.</p>



<p class="wp-block-paragraph">Asking an agent to write a pandas transformation leaves you as the bottleneck, responsible for deciding every next operation. Asking it to investigate a change in customer behavior gives it larger analytical responsibility. It can inspect a result, form another question, choose a method, and continue. The interaction becomes a conversation about the investigation rather than a sequence of requests for code.</p>



<p class="wp-block-paragraph">The question may be <em>descriptive</em> (what happened?), <em>diagnostic</em> (why did it happen?), <em>predictive</em> (what might happen next?), or <em>prescriptive</em> (what should we do?). The fraud model is predictive; the pricing investigation later in this article is diagnostic and causal. Across these kinds of work, we need to specify the question and intended use, then verify that the evidence supports the answer.</p>



<p class="wp-block-paragraph"><em>The following five practices are key to agentic data science:</em></p>



<ul class="wp-block-list">
<li>Frame the investigation.</li>



<li>Equip the agent for the assignment.</li>



<li>Organize the work through bounded experiments, competing analyses, or both, according to the question.</li>



<li>Review the result independently.</li>



<li>Preserve evidence and turn reviewed lessons into reusable expertise.</li>
</ul>



<p class="wp-block-paragraph">The first two practices set up the work. The third determines how the investigation proceeds; the fourth tests its claims. Evidence is captured throughout, and the fifth practice carries reviewed lessons into future assignments.</p>



<p class="wp-block-paragraph">As in agentic software engineering, the agentic data scientist’s two central responsibilities are <strong><em>specification</em></strong> and <strong><em>verification</em></strong>. Specify the question, intended use, and evidence the agent should produce; then verify that its analysis supports the conclusion. Agents can help with both, while the data scientist remains responsible for judging the question and the evidence.</p>



<h2 class="wp-block-heading"><strong>1. Frame the investigation with the agent</strong></h2>



<p class="wp-block-paragraph"><strong><em>Start by discussing the assignment with the agent.</em></strong> Supply the intended use and organizational context, then let it inspect the data and propose an approach. Method selection can be part of its responsibility. Your intervention matters when a proposal changes the question, rests on a questionable assumption, or needs information the agent cannot obtain. Predicting fraud and deciding which flagged entities to investigate, for example, require different evidence about errors and their consequences. A brainstorming skill such as those in <a href="https://github.com/obra/superpowers" target="_blank" rel="noopener">Superpowers</a> can help structure that conversation before you turn it into a task prompt.</p>



<p class="wp-block-paragraph">A useful specification records that shared understanding. It states the decision, relevant constraints, and evidence the investigation should produce. It need not prescribe every step. In the fraud example, “classify transactions from later time steps using only information available when each is scored” matters more than “use a random forest.” The former defines the analytical task, while the latter selects one possible implementation.</p>



<p class="wp-block-paragraph">You can specify what the investigation must establish without specifying the answer you want. “Determine whether the data support a recommendation” leaves room for an inconclusive result. “Keep trying until you find an effect” does not.</p>



<p class="wp-block-paragraph">Turn that discussion into a short analytical brief to give the agent as its task prompt. For an assignment like our fraud example, a starting version could read:</p>



<pre class="wp-block-code"><code>TASK PROMPT:
Question: Can we identify fraudulent nodes as they enter the network?
Use: Support investigation, with separate reporting on high-degree nodes.
Available information: Only inputs known when the node is scored.
Agent discretion: Explore data, propose eligible features, choose models.
Return to me: Unclear feature provenance, changes to the target or
population, or a trade-off that requires an operational decision.
Deliverable: Reproducible analysis, temporal evaluation, subgroup errors,
and a recommendation that states what the evidence cannot establish.</code></pre>



<p class="wp-block-paragraph">Review it with the agent before the investigation proceeds. If exploration reveals that the evidence cannot answer the question, revise the brief explicitly; do not quietly substitute an easier question.</p>



<p class="wp-block-paragraph">The deliverable may still be a notebook, model, or report prepared outside a production service. You can begin in the workspace where you already do that work.</p>



<h2 class="wp-block-heading"><strong>2. Equip the agent for the assignment</strong></h2>



<p class="wp-block-paragraph">The task prompt tells the agent what to investigate. It also needs to know how the project works, reach the data, run the analysis, and check the result. The harness is the system around the language model that allows this: its tools, runtime, context, permissions, and feedback from its actions. Its runtime is the environment that executes those actions. A language model alone cannot inspect a warehouse, run a simulation, or recover an interrupted statistical model fit. The environment must make those operations possible and return useful evidence about what happened.</p>


<div class="wp-block-image">
<figure data-wp-context="{&quot;imageId&quot;:&quot;6acf5e9a38c36&quot;}" data-wp-interactive="core/image" data-wp-key="6acf5e9a38c36" class="aligncenter size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1600" height="820" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-34-1600x820.png" alt="Data science agent flow" class="wp-image-19849" style="aspect-ratio:1.95" srcset="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-34-1600x820.png 1600w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-34-300x154.png 300w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-34-767x393.png 767w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-34-1536x788.png 1536w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-34.png 2048w" sizes="auto, (max-width: 1600px) 100vw, 1600px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
</div>


<p class="wp-block-paragraph">Runtime choices are analytical choices as well as engineering choices. Can the agent execute Python or R with the libraries the task needs? Can a long-running fit continue after an interactive session ends? Which scientific libraries should the agent use? Can the agent inspect plots, or does it only see the code that produced them? Can you reproduce the environment in which it reported a result?</p>



<p class="wp-block-paragraph">An existing agent runtime may provide most of this. Configuring it means deciding what belongs in Markdown, what needs a tool, and what should be checked by a small script. In an investigation like the fraud example, Markdown can hold the brief and data definitions, while a Python script could check that the appropriate temporal validation split is executed. A CSV data extract may be enough for exploration; if the agent needs data warehouse access, a tool exposed through an MCP server can provide it with appropriately scoped, read-only credentials. A sentence in a prompt cannot enforce that access limit.</p>



<p class="wp-block-paragraph">Take the same care with outputs. Ask the agent to preserve the data reference, code, environment, assumptions, and diagnostics behind its report. A chat transcript is a poor substitute for a runnable analysis. Review becomes much harder when the only surviving artifact is a confident paragraph about what the agent says it did.</p>



<p class="wp-block-paragraph">Execution is only part of the problem. An agent may know how to fit a model and still misunderstand what the columns mean. It may find five revenue tables and choose the wrong one. A schema rarely explains which customers were eligible for an offer, when a measurement changed, or why the team stopped using an apparently reasonable metric. This is where <strong>agent skills</strong> and <strong>domain knowledge</strong> enter. A skill packages instructions and resources for a type of analytical work. It might contain a modeling approach, example code, required diagnostics, and guidance on when to ask for help. Data documentation supplies the organizational meaning: canonical definitions, table grain, known limitations, and the history needed to interpret a result.</p>



<p class="wp-block-paragraph">A useful skill is specific enough to change the agent’s behavior. “Be rigorous” gives it little to work with. A fraud-modeling skill can require the agent to establish feature availability, evaluate on later observations, and report performance on operationally important subgroups. For example:</p>



<pre class="wp-block-code"><code>For fraud prediction:

Establish what information is available when a node is scored.

Exclude features derived from subsequent investigations or labels.

Fit preprocessing on training data only.

Evaluate on later-arriving nodes and report the required degree groups.

Flag uncertainty about feature provenance before claiming performance.</code></pre>



<p class="wp-block-paragraph">These instructions leave room to choose a model. They encode reasons that some apparently successful models should be rejected. Where a requirement can be checked reliably in code, the skill can call a script that performs the check and records its result.</p>



<p class="wp-block-paragraph">Loading every method and every document into every assignment is unnecessary. Give the agent a way to find relevant expertise, including its scope and exceptions. A forecasting skill should not silently impose its evaluation rules on an unrelated retrospective analysis. Nor should a notebook from last year outrank an updated metric definition merely because it offers convenient code to copy.</p>



<p class="wp-block-paragraph">To put these pieces together locally, begin with a file-and-code agent in a sandboxed project workspace, such as the following:</p>



<pre class="wp-block-code"><code>fraud-investigation/

  AGENTS.md                # Project instructions, where supported by the runtime

  brief.md                 # Agreed question and delegation boundaries

  data-notes.md            # Sources, column meaning, availability times

  skills/fraud.md          # The methodological guidance above

  environment.lock         # Dependency versions, in your tool’s format

  model/                   # Code the investigating agent may change

  results/                 # Experiment log, diagnostics, saved candidates

  review.md                # Acceptance decision and unresolved questions</code></pre>



<p class="wp-block-paragraph">Use a project instruction file, such as <code>AGENTS.md</code> in runtimes that support it, to explain which context files the agent should read and how to propose updates to them. In other runtimes, provide those instructions through the supported mechanism. Give the sandbox read access to the approved development data and write access to the model and results directories. Keep the final test data outside of the agent’s accessible workspace. The practitioner can run acceptance checks in a separate environment whose evaluator and data the investigating agent cannot modify. A different folder, or version control alone, is not an access boundary.</p>



<p class="wp-block-paragraph">Now ask the agent to inspect the inputs, identify unresolved questions, and build a baseline. Before allowing repeated experiments, rerun that baseline and examine its feature-availability record, split dates, and subgroup report. This small rehearsal checks whether the setup works all the way from instructions to evidence. A missing subgroup report points to a different problem than a failed package installation. Resolve those problems before giving the agent a longer run.</p>



<h2 class="wp-block-heading"><strong>3. Organize the investigation</strong></h2>



<p class="wp-block-paragraph"><em>With the question framed and the agent equipped, the next choice is how to organize its work.</em> This depends on the intent of the data science problem. For descriptive work, exploratory data analysis may proceed one question and plot at a time. Building a predictive model may support repeated experiments against a fixed evaluator; a causal question may require comparing analyses built on different assumptions.</p>



<p class="wp-block-paragraph">In a live exploratory analysis on <em>Show Us Your Agent Skills</em>, <a href="https://hugobowne.github.io/show-us-your-agent-skills/agent-skills/guests/eric-ma/" target="_blank" rel="noopener">Eric Ma (Moderna) uses a marimo notebook as a shared workspace with an agent</a>. He explains the protein mutation data, asks for one plot at a time, corrects a color scale that affects interpretation, and chooses the next question from what he sees. The agent edits the notebook and renders the plots; Eric supplies the domain context, checks the artifacts, and owns the interpretation. The reason Eric needed to be in the loop was that human understanding was part of the objective function here!</p>



<h3 class="wp-block-heading"><strong>Use a bounded experiment loop</strong></h3>



<p class="wp-block-paragraph">For predictive modeling, the <a href="https://github.com/karpathy/autoresearch" target="_blank" rel="noopener">autoresearcher pattern</a> organizes the work into a repeatable loop: propose a hypothesis, change the model, evaluate it, and keep or revert the change. The agent records each result and uses it to choose the next attempt. Within the scope you give it, it can explore features and model structure as well as parameter values. This is an inner loop within a broader investigation: the data scientist frames the question and sets the evaluation, the agent searches within those boundaries, and the data scientist reviews the result (potentially using an independent agent) before deciding what to do next.</p>



<p class="wp-block-paragraph">Define what the agent may change, protect the evaluator from those changes, and set a time or compute budget. This makes iteration a bounded task within the investigation.</p>


<div class="wp-block-image">
<figure data-wp-context="{&quot;imageId&quot;:&quot;6acf5e9a396b6&quot;}" data-wp-interactive="core/image" data-wp-key="6acf5e9a396b6" class="aligncenter size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1600" height="1280" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-35-1600x1280.png" alt="The inner loop" class="wp-image-19850" style="aspect-ratio:1.250501002004008" srcset="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-35-1600x1280.png 1600w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-35-768x614.png 768w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-35-300x240.png 300w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-35-1536x1229.png 1536w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-35.png 2048w" sizes="auto, (max-width: 1600px) 100vw, 1600px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
</div>


<p class="wp-block-paragraph">A compact experiment contract could say:</p>



<pre class="wp-block-code"><code>Improve the supplied baseline within the agreed compute budget.

You may change model code and propose eligible features.

Keep the target definition, validation split, and evaluator fixed.

Record each hypothesis, change, result, and keep-or-revert decision.

Stop at the budget limit or escalate if the evaluation is unsuitable.

Return the best candidate and the experiment history for review.</code></pre>



<p class="wp-block-paragraph">In a separate exercise with its own baseline and evaluation, we used this pattern to improve a graph neural network trained on the network data from the opening example. We used lower validation loss as the rule for keeping a change; F1 for fraudulent transactions was a separate measure of the resulting classifier. The agent ran 41 experiments while the team slept and retained seven changes that reduced validation loss. On the validation set, loss fell by about 70%, and F1 for fraudulent transactions rose from about 0.72 to 0.82. The log preserved both successful changes and failed attempts, so we could examine how it reached the result.</p>



<p class="wp-block-paragraph">One candidate had the highest F1 for fraudulent transactions, but the agent rejected it because its validation loss was higher. That followed the selection rule we had set. The experiment history records that choice for the subsequent review.</p>



<p class="wp-block-paragraph">The autoresearcher pattern works when an objective gives the agent useful feedback on each attempt. But some investigations turn on which assumptions to make, not which candidate scores best. Those tasks need a different way to organize the agent’s work.</p>



<h3 class="wp-block-heading"><strong>Investigate competing explanations</strong></h3>



<p class="wp-block-paragraph">In causal work, no held-out outcome directly reveals what would have happened without an intervention. The agent needs to examine how different analyses construct and test that counterfactual.</p>



<p class="wp-block-paragraph">In a demonstration from our <a href="https://vanishinggradients.short.gy/data-science-agentic" target="_blank" rel="noopener">Master Agentic Data Science course</a> using simulated subscription-business data, we asked: “What did the price increase cost us?” The outcome is daily conversion rate: paid conversions divided by the pool of potential subscribers. Choices about the observation window, counterfactual, exclusions, and validation produce different analytical paths. A final memo usually shows only one.</p>



<p class="wp-block-paragraph">Two agent runs estimated conversion roughly 16% below their no-price-increase counterfactuals, yet shipped opposing claims.&nbsp; Run A attributed its estimated drop to a changing pool of potential subscribers and concluded there was “no real effect,” but did not validate that explanation.&nbsp; Run B backtested its counterfactual, ran a placebo check, and compared six specifications. It reported a robust relative reduction of 15.6%.</p>


<div class="wp-block-image">
<figure data-wp-context="{&quot;imageId&quot;:&quot;6acf5e9a39ec4&quot;}" data-wp-interactive="core/image" data-wp-key="6acf5e9a39ec4" class="aligncenter size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1600" height="945" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-36-1600x945.png" alt="Two-agent run" class="wp-image-19851" style="aspect-ratio:1.6956521739130435" srcset="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-36-1600x945.png 1600w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-36-767x453.png 767w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-36-300x177.png 300w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-36-1536x907.png 1536w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-36.png 2048w" sizes="auto, (max-width: 1600px) 100vw, 1600px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
</div>


<p class="wp-block-paragraph">The parallel-analysis pattern has independent agents test different choices in the same investigation: one examines the observation window, another tests seasonal assumptions, and we compare their estimates, uncertainty, and diagnostics. <a href="https://github.com/pymc-labs/decision-lab" target="_blank" rel="noopener">Our Decision Lab work</a> extends this approach across analytical paths, using checks to identify unsuitable analyses and unresolved disagreements.</p>



<p class="wp-block-paragraph">Both approaches give the agent feedback while it works. The fixed evaluator steers the model experiments; diagnostics help it compare causal analyses. The output is a candidate and experiment history, or a set of analyses with their assumptions and checks. Those are the materials for the next task: <em>verifying the claim</em>.</p>



<h2 class="wp-block-heading"><strong>4. Review the result independently</strong></h2>



<p class="wp-block-paragraph">The agentic data scientist now needs to check what that evidence supports, and a fresh agent can help. Give an <strong>independent agent reviewer</strong> the original brief, data context, code, diagnostics, and final claim. Ask it to reproduce decisive checks and challenge assumptions. In this adversarial review pattern, the agent raises objections it can substantiate; the data scientist judges whether they change the conclusion.</p>



<p class="wp-block-paragraph">In the fraud exercise, the agent used the same validation data to guide 41 experiments, so the reported gains may partly reflect what worked on that set. Freeze the selected candidate and assess it on an untouched holdout chosen for the intended use, including errors in the groups that matter.</p>



<p class="wp-block-paragraph">In the pricing exercise, a fresh reviewer challenged Run A’s conclusion. Run A attributed the estimated decline to a changing pool of potential subscribers but provided no evidence for that explanation. The reviewer found that conversion had been rising before the price increase and that placebo interventions in earlier periods did not reproduce the negative effect. Run B’s analysis, which included these validation checks, was selected in the final comparison.</p>



<p class="wp-block-paragraph"><a href="https://netflixtechblog.com/a-human-augmenting-agentic-workflow-for-causal-inference-4623f0a9c5af" target="_blank" rel="noopener">Netflix’s agentic workflow</a> for causal inference implements this division: an actor performs the analysis and diagnostics, while a critic challenges the reasoning and claims. Humans can inspect and rerun the artifacts.</p>



<p class="wp-block-paragraph">A fresh agent session is not necessarily an independent review if it can read the investigator’s earlier attempts through the workspace or Git history, though! For a check meant to stand on its own, give the reviewer the original brief, final artifact, and data needed for that check, while limiting access to the prior path. The full experiment trail can be examined separately when auditing how the result was reached.</p>


<div class="wp-block-image">
<figure data-wp-context="{&quot;imageId&quot;:&quot;6acf5e9a3a692&quot;}" data-wp-interactive="core/image" data-wp-key="6acf5e9a3a692" class="aligncenter size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1600" height="1066" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-37-1600x1066.png" alt="Human vs agentic verification" class="wp-image-19852" style="aspect-ratio:1.5" srcset="https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-37-1600x1066.png 1600w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-37-300x200.png 300w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-37-767x511.png 767w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-37-1536x1024.png 1536w, https://www.oreilly.com/radar/wp-content/uploads/sites/3/2026/09/image-37.png 2048w" sizes="auto, (max-width: 1600px) 100vw, 1600px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
</div>


<p class="wp-block-paragraph">These examples call for different balances of human and agentic verification. In Eric Ma’s EDA, the agent makes plots while Eric checks them and chooses the next question. In the bounded experiment loop, a fixed evaluator checks each candidate before a person reviews the selected model. In the pricing analysis, agentic diagnostics and critique help a data scientist judge what the evidence supports.</p>



<p class="wp-block-paragraph">The low-low quadrant leaves little basis for trusting a result (in fact, it’s “vibe data science!”). Repeatable checks can move some work toward more agentic verification, while questions that depend on domain understanding or consequential decisions continue to need human judgment.</p>



<h2 class="wp-block-heading"><strong>5. Turn reviewed experience into reusable expertise</strong></h2>



<p class="wp-block-paragraph">The experiment loop and adversarial review both depend on an evidence trail: the saved artifacts that show what the agent did and why a conclusion survived or changed. Preserve that trail throughout each investigation, including data references, code versions, analytical choices, experiment results, diagnostics, and review findings. Keep the failed alternatives and review findings as well as the final report.</p>



<p class="wp-block-paragraph">This trail has a second use beyond inspecting the current result. Reviewing it with the agent can reveal missing context, recurring mistakes, or methods worth reusing. The next question is which of those lessons should change how the agent approaches a future assignment. Leaving them in a conversation makes that learning difficult to carry forward.</p>



<p class="wp-block-paragraph">In the fraud example, we deliberately planted a feature that leaked the fraud label. Removing it corrected that analysis. The reusable lesson is to have the agent check proposed features for leakage: where did each feature come from, and would it be available when a new transaction is scored? That requirement can go into a fraud-modeling skill for future investigations.</p>



<p class="wp-block-paragraph">Before making a lesson into standing guidance, we need to define where it applies. The planted feature was a problem because it carried information unavailable at scoring time, not because it predicted fraud well. The temporal split likewise fits a task involving transactions from later time steps; it is not a rule for every analysis. A skill should capture those conditions so the agent applies the lesson to the right task.</p>



<p class="wp-block-paragraph">For example:</p>



<pre class="wp-block-code"><code>Lesson: a feature encoded information from the fraud label.

Scope: prospective fraud prediction.

Update: require a documented source and availability time for inputs.

Evaluation: test whether the agent detects outcome-derived inputs

without rejecting legitimate signals merely because they predict well.</code></pre>



<p class="wp-block-paragraph">This is where evals enter: repeatable tasks with explicit criteria for assessing the data science agent’s behavior. Here, we evaluate how the agent conducts the analysis, not only its model’s predictive performance. The evidence trail supplies concrete failures that can become test cases for proposed changes to its skills or workflow.</p>



<p class="wp-block-paragraph">Keep the evals, skill versions, and results together. As reviewed assignments reveal new failure modes, expand the cases and rerun them when the agent’s setup changes. The aim is evidence that its analytical behavior improves, rather than a growing collection of instructions that merely sound sensible.</p>



<p class="wp-block-paragraph">Workflow changes can accumulate in the same way. If a reviewer repeatedly catches a missing diagnostic, move that diagnostic earlier. If a separate reviewer adds cost but never changes the analysis, reconsider its role. If the agent repeatedly asks the same question about a table, improve the data context rather than supplying the answer again in chat.</p>



<p class="wp-block-paragraph">A completed assignment need not always produce a new skill. A one-off constraint belongs in the project’s notes; a recurring methodological failure may justify standing guidance. That distinction keeps the next investigation from inheriting every exception encountered in the last one.</p>



<h2 class="wp-block-heading"><strong>When other people use the agents you build</strong></h2>



<p class="wp-block-paragraph">When colleagues use an agent without you mediating each request, your local knowledge has to become shared infrastructure. OpenAI’s <a href="https://openai.com/index/inside-our-in-house-data-agent/" target="_blank" rel="noopener">internal data agent</a> combines institutional context with query evaluations and existing user permissions. Meta’s <a href="https://medium.com/@AnalyticsAtMeta/inside-metas-home-grown-ai-analytics-agent-4ea6779acfb3" target="_blank" rel="noopener">Analytics Agent</a> draws on prior analytical work and reusable guidance, exposing generated SQL alongside results. Both illustrate why earlier analyses and corrections belong in the system, not only in an analyst’s memory.</p>



<p class="wp-block-paragraph">In your own work, you can explain an unfamiliar table or catch a misleading conclusion as it appears. When colleagues use the agent directly, that support must be built into the system. Try an assignment with a colleague and note where you need to step in. Missing context belongs in the agent’s guidance; recurring mistakes become evals; questions beyond its remit need a route to a qualified reviewer. Someone must maintain that guidance, and access controls must limit each user’s data access. The analytical principles stay the same, but the agent can no longer depend on you being present for every investigation.</p>



<h2 class="wp-block-heading"><strong>Put the playbook to work</strong></h2>



<p class="wp-block-paragraph">Choose a small investigation you understand well enough to challenge: a model you periodically retrain or a business metric you regularly explain. Give the agent the decision context and ask it to propose an approach. Agree on what it can decide, then let it carry the investigation far enough to produce evidence you can inspect.</p>



<p class="wp-block-paragraph">At review, pay attention to where your intervention changes the work. Did the agent need a definition only your team knows? Did a diagnostic overturn its conclusion? If that intervention would help on another assignment, make the relevant context or check available there, and test whether it helps.</p>



<p class="wp-block-paragraph">AI-native data scientists use their expertise to build and direct analytical agents. They turn lessons from reviewing an analysis into skills and checks, then test whether those changes help the agent on future tasks.</p>



<p class="wp-block-paragraph"><strong><em>The next cohort of our</em></strong> <strong><em><a href="https://vanishinggradients.short.gy/mads-playbook-radar" target="_blank" rel="noopener">Master Agentic Data Science</a></em></strong> <strong><em>course starts Oct 6.</em></strong></p>
]]></content:encoded>
							<wfw:commentRss>https://www.oreilly.com/radar/the-agentic-data-science-playbook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Object Caching 90/92 objects using Memcached
Page Caching using Disk: Enhanced (Page is feed) 
Minified using Memcached

Served from: www.oreilly.com @ 2026-10-14 10:51:06 by W3 Total Cache
-->