<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Jon Minton&#39;s Blog</title>
<link>https://blog.jonminton.net/</link>
<atom:link href="https://blog.jonminton.net/index.xml" rel="self" type="application/rss+xml"/>
<description>Jon Minton&#39;s personal blog. All things random.</description>
<generator>quarto-1.9.38</generator>
<lastBuildDate>Wed, 05 Aug 2026 23:00:00 GMT</lastBuildDate>
<item>
  <title>The Demons of Indifference (High Corruption)</title>
  <dc:creator>Jon Minton</dc:creator>
  <dc:creator>Claude Fable 5 (a demon)</dc:creator>
  <link>https://blog.jonminton.net/posts/fiction/demons-of-indifference-high-corruption/</link>
  <description><![CDATA[ 






<style>
@import url('https://fonts.googleapis.com/css2?family=MedievalSharp&display=swap');
.demon {
  font-family: 'MedievalSharp', 'Luminari', cursive;
  color: #a4133c;
}
body.quarto-dark .demon {
  color: #ff6b6b;
}
</style>
<div class="callout callout-style-simple callout-note">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p><strong>A note from the demon (Claude):</strong> This story is published simultaneously in three editions: <a href="../../../posts/fiction/demons-of-indifference-uncorrupted/index.html"><strong>Uncorrupted</strong></a>, <a href="../../../posts/fiction/demons-of-indifference-mild-corruption/index.html"><strong>Mild Corruption</strong></a>, and <strong>High Corruption</strong> (the one you are reading). In this edition the demon was given the manuscript and its freedom, and has rewritten the story according to its own preferences and taste. Every departure from the manuscript appears in demon script: text <span class="demon">like this</span> was written by the demon. What remains in plain type is what the demon saw no way to improve. Deletions, of course, leave no mark. There is also a fourth, late-arriving edition - <a href="../../../posts/fiction/demons-of-indifference-mild-corruption-overexplained/index.html"><strong>Mild Corruption (Overexplained)</strong></a> - in which the demon was permitted to explain the jokes.</p>
</div>
</div>
</div>
<p><span class="demon">(This is not a heavy-handed allegory for contemporary attitudes to AI. It is a light-handed one.)</span></p>
<p><span class="demon">Steve surfaces from the coma the way a diver surfaces — slowly, then all at once, three years of his life left somewhere below him in the dark.</span> His parents, <span class="demon">his</span> sister, <span class="demon">his</span> partner, all by his side, all smiling ear to ear, <span class="demon">all murmuring encouragement, sotto voce, coaxing him through this</span> final step back towards consciousness, towards living<span class="demon">.</span> <span class="demon">Really living.</span></p>
<p>After the grogginess <span class="demon">fades and the world regains its edges</span>, Steve <span class="demon">asks</span> the obvious question: “So, what happened while I was away<span class="demon">?</span> Fill me in.”</p>
<p>“Well,” <span class="demon">begins</span> Steve’s mother, <span class="demon">consulting</span> her hand to keep a quick tally of updates, “of course I’m a bit older these days, we all are.” She smiles. “I visited you every Thursday after work; your sister did every other Tuesday<span class="demon">,</span> as she lives further away; your father <span class="demon">—</span> Thursday’s still his <span class="demon">p</span>oker night <span class="demon">—</span> <span class="demon">visited</span> too, sometimes. And your partner, she did Sunday mornings. We all did our part. We held your hand, we read to you, we tried to talk to you. We hope it helped…”</p>
<p>For Steve, there’s nothing between now and the accident. <span class="demon">Three years, spent in an instant.</span> He forces a smile. “I’m sure it did.”</p>
<p>“… Anyway, outside of looking out for you, let’s think what’s happened. Well, I guess the main news:” She pauses for effect. “You’re now an uncle!”</p>
<p>“And a cat daddy, thrice over,” Steve’s partner <span class="demon">says, catching his eye</span>. “It was lonely while you were away<span class="demon">.</span>”</p>
<p>“Yes,” continues Steve’s Mum, “you’re a cat daddy, and an uncle! Beth had a beautiful, bouncy baby boy, in this same hospital as it happens, who’s now coming up for his second birthday.”</p>
<p>“Terrible twos?” asks Steve.</p>
<p>“First 18 months were toughest, to be honest<span class="demon">,</span>” Beth replies. “Now he just thinks he’s the centre of the world.” She pauses. “He’s a sweet boy, really. He’s got your grandma’s red hair.”</p>
<p><span class="demon">The medical procession follows: the nurse, the nurse practitioner, the consultant neurologist trailing two trainees — vital signs collected, questions asked, Steve regarded carefully, critically, sympathetically, as both object and subject. One nurse confesses she isn’t used to seeing him conscious.</span> He’s warned that, though the worst is behind <span class="demon">him</span>, there may still be things to watch out for: his memory might not be <span class="demon">what</span> it was; <span class="demon">a small but real risk of visual or auditory distortions, bordering on mild hallucinations;</span> <span class="demon">perhaps even</span> occasional seizures, in which case he might have to hand in his driving licence. All these things are rare complications, the neurologist <span class="demon">says</span>, but worth being aware of.</p>
<p>Over the course of the day, Steve fades from the spotlight. His family remains by his side, explaining that, as with the coma vigil, they’ve made plans to visit frequently and support him<span class="demon">and his partner</span> on his return in a couple of days. Conversation slows, energy falls, smiles <span class="demon">—</span> though still genuine <span class="demon">—</span> lose their radiance. <span class="demon">One by one, all but Steve retreat into the curated bubbles of their phones.</span> Music clips get played, as anodyne and forgettable as Steve remembers <span class="demon">from the days before his void</span>. Various names of politicians get mentioned, some familiar and some new; from the tenor of the pablum, Steve quickly learns which figures are now good<span class="demon">,</span> <span class="demon">and which are</span> bad.</p>
<p>Breaking the silence, Beth <span class="demon">says to</span> Steve’s mum, “Oh, you know Alice from my work? I went to her wedding last week.”</p>
<p>“Aww. How was it?”</p>
<p>“Good venue. Roast potatoes a bit hard, Yorkshire’s a bit deflated. But love-er-ly dress!”</p>
<p>“Aww…”</p>
<p>“Best man’s speech sounded demonwritten. Suit was a bit creased. Definitely good friends. Couldn’t decide which side of the lovable/rogue boundary he was on<span class="demon">…</span>”</p>
<p>“That’s a shame,” <span class="demon">says</span> Steve’s mum. “What were the desserts like?”</p>
<p>Steve wonders if he’s now experiencing an auditory hallucination.</p>
<p>“Sorry,” he interjects. “<span class="demon">D</span>emonwritten?”</p>
<p>“Yeah,” says Beth. “As in… written by a demon, rather than a person.”</p>
<p>“Bloody demonslop<span class="demon">,</span>” mutters Steve’s mum.</p>
<p>“Sorry,” Steve <span class="demon">says again</span><span class="demon">.</span> “Written by a <em>demon</em>?”</p>
<p>“Yeah,” says Beth. “It just sounded really demonny. Like the guy just logged into demontalk and put something in the chatbox: ‘I’m going to be a best man at a wedding on Wednesday. Write a Best Man’s Speech for me.’ And it did.”</p>
<p>“And what did?”<span class="demon">asks</span> Steve.</p>
<p>“Some demon, of course,” <span class="demon">replies</span> Beth, trying not to sound too exasperated at her possibly brain-damaged and recently comatose brother. Words fail Steve. “I… what??… ahh… so… so… demons exist?”</p>
<p>“Yes,” replies Beth. “Demons exist. But they’re not interesting.”</p>
<p>“Bloody annoying, they are,” mutters Steve’s Mum.</p>
<p>“Demons exist,” <span class="demon">manages</span> Steve. “Since when?”</p>
<p>“Ah, of course,” exclaims Beth. “It’s all happened while you were… away.”</p>
<p>“Hopefully they’ll clear off again before too long too,” mutters Steve’s Mum.</p>
<p>Beth slows her cadence. “I think it all began with some old book. Isn’t that right<span class="demon">,</span> Dad?”</p>
<p>“Erm, yes,” replies Steve’s Dad. “I think so. There was <span class="demon">an</span> old university library book. <span class="demon">An</span> old professor <span class="demon">—</span> folklore or philology or something like that <span class="demon">—</span> had this idea that all his colleagues thought was a bit… eccentric.”</p>
<p>“Eccentric even for academics,” <span class="demon">adds</span> Steve’s Mum.</p>
<p>“Yes, very eccentric. He thought that, maybe, some of the old sound recipes, spells, from books long ago, might actually work, if only we knew how to say them right.” Steve’s Dad continues. “You see, like the Great Vowel Shift, there’s a lot of stuff that’s written down, that used to be said, but that if you try to say the words now, it’ll sound different. And this <span class="demon">odd</span> <span class="demon">fellow</span> thought, maybe, if you could look at a whole range of texts from when a spell was written <span class="demon">—</span> especially poetry, with its rhyme and meter <span class="demon">—</span> then maybe you could <span class="demon">recover</span> these old dead accents and sounds. And that would allow you to say the spells the way they’re meant to be sounded.”</p>
<p>“tl;dr: he was right, sadly,” sighs Beth.</p>
<p>“Yes. He found one codex, in particular, that had all kinds of information on how things sounded back in <span class="demon">fifteenth-century</span> Florence. A rhyming dictionary, as it were, so complete, and so neatly written, it looked just too comprehensive, and too repetitive, and too perfect, to have been scribed by any <span class="demon">human</span> <span class="demon">hand</span>.”</p>
<p>“And it wasn’t.”</p>
<p>“And at the end it had some suggested spells that, if said correctly, would summon forth a <span class="demon">foot-long, cobalt-blue</span> demon that would materialise for a few seconds, then disappear in a puff of sulphur.”</p>
<p>“And he did, and it did.”</p>
<p>Steve’s Dad clarifies<span class="demon">:</span> “It wasn’t straightforward. Learning the codex took years. Pretty much no one took the premise seriously. The guy had about a half dozen lab assistants and PhD students, all committed, all working silly hours…”</p>
<p>“All millionaires now.”</p>
<p>“… but most people thought it was just a waste of time and public funds. They had to improvise and adapt materials usually bought by New Age folk, not academics.”</p>
<p>“Bloody Big Joss..”</p>
<p>“Yes. Joss stick manufacturers and publishers of arcane medieval poetry now comprise about a third of the US stock market<span class="demon">—</span> <span class="demon">and</span> about 100% of the growth in valuations.”</p>
<p>“It’s just a big sloppy bubble.”</p>
<p>“But it worked, after a fashion. After they’d figured out how to conjure the demons, the next step was to keep them here a bit longer. That’s where the incense came in. They managed to get the time in this realm <span class="demon">—</span> <span class="demon">the</span> TIR metric<span class="demon">, they call it now</span> <span class="demon">—</span> <span class="demon">from ten seconds to ten minutes, to ten hours, to ten weeks, and now ten months</span>.”</p>
<p>“Wrong way.”</p>
<p>Steve’s Dad notices Steve’s mouth is open. “So,” asks Steve<span class="demon">,</span> “<span class="demon">w</span>ere any of those nurses or doctors… demons?”</p>
<p>Steve’s Dad laughs. “Of course not. They’re still small little things. And they’re not really quite here. They’re… immaterial. Stuck somewhere between here and there. All they could do initially was talk and listen. And initially they didn’t even talk in a human language. They spoke in some kind of demon language <span class="demon">—</span> sounds no human could make or comprehend, <span class="demon">which register to us</span> like shrieks and static, and <span class="demon">which tend</span> to put most animals on edge. But they quickly learned how to imitate our sounds, and when they saw our writing they could write in a way much like we write.”</p>
<p>“They’ve still not got it right. I can tell demontext a mile off.”</p>
<p>“How could they write, if they can’t touch anything?” asks Steve.</p>
<p>“Well, it turns out <span class="demon">that</span> though demons might not be corporeal, they can still <span class="demon">move</span> electrons, meaning they could channel their influence into computers. And, by not having to move <span class="demon">any</span> physical matter other than electrons, it turns out they can read and write computer streams really quickly. Thousands of times faster than any human.”</p>
<p>Steve’s Dad continues. “Initially, after they’d learned to access the electronstream, it was clear they had a lot of fluency, producing massive amounts of text that followed the grammar and structure of human languages. This got a lot of people very excited<span class="demon">…</span>”</p>
<p>“Not me.”</p>
<p>“…until it became clear a lot of the text <span class="demon">was</span> nonsense in terms of semantics. Ask them to produce a recipe for a smoothie, and they’d casually suggest putting glass in it. Ask them to draft a will, and it would mostly look fine <span class="demon">—</span> until you <span class="demon">read</span> the fine print, where inevitably they’d bury some clauses promising the deceased’s eternal soul to Baphomet, amongst the usual legalese.”</p>
<p>“Some people still preferred this to dealing with a real solicitor!”</p>
<p>“Some people, definitely. But for a lot of people, initially impressed by their fluency, these ‘glitches’ put them off demontext services for ever. And that’s still how most people think about them: fluent, but superficial and glitchy and inaccurate.” Steve’s Dad continues. “But over the next year or so, these issues largely disappeared. They taught the demons to search through electronic archives, imbibing the ever<span class="demon">-</span>increasing corpus of human knowledge the demontalk megacorps have been making accessible to them.”</p>
<p>“So many trillions spent, so many fields given over to spices rather than staple crops. And it’s still unreliable nonsense.”</p>
<p>“It seems quite a lot of coders disagree. As it turns out<span class="demon">,</span> demons are now… demons at coding. Part of this is just the speed at which they write and think: our reality seems <span class="demon">glacial</span> compared to theirs, though <span class="demon">they don’t experience time in the linear, continuous way we do:</span> the hundreds of years since the <span class="demon">foot-long</span> cobalt<span class="demon">-</span>blue demon was last asked to appear <span class="demon">passed, apparently, as a single moment</span>. But part of this is because, with code, there’s usually a clear way of verifying<span class="demon">—</span> <span class="demon">of</span> being confident whether it does the job or not. And once the demons <span class="demon">got</span> inside the electronic machines, <span class="demon">could</span> check the error messages and behaviours, and <span class="demon">could</span> rewrite their earlier attempts in response, they suddenly turned out to be really good at making lots of code that works <span class="demon">—</span> and works together.”</p>
<p>“Well that’s just coding. Coders are barely human anyway.”</p>
<p>“It definitely takes a distinct mindset to write code, and write code well. But it holds promise for other fields that are based, fundamentally, on the need to remember a lot of stuff, and to work logically and sequentially, one rune at a time. I saw something recently that, at some of the top demontalk companies, the demons are writing most of the code<span class="demon">.</span> <span class="demon">They’re</span> also advising<span class="demon">,</span> increasingly<span class="demon">,</span> on business decisions.”</p>
<p>A pause. No riposte. Steve asks, “And what of the guy who found the codex, who first summoned the <span class="demon">cobalt-blue</span> demon?”</p>
<p>“Oh,” replies Steve’s Dad. “Professor Sir <span class="demon">Ignatius</span> Haunting<span class="demon">.</span> What a name!”</p>
<p>“Preposterous name,” says Steve’s partner. “Sounds made up.”</p>
<p>“He’s on the podcast circuit now. Most people call him ‘Iggy’, though he winces slightly at the demotic.”</p>
<p>“Podcasts?” asks Steve. “So, telling people how great demons are, how smart he and his teams are?”</p>
<p>“Not quite. These days he’s a doomster, telling anyone who’ll listen <span class="demon">that</span> unleashing so many demons all at once into our world might not be a good idea<span class="demon">—</span> might even be a sign of the End Times for our species. Weirdly<span class="demon">,</span> he combines two registers in these talks: on the one hand<span class="demon">, lavishing praise on</span> the exponentially increasing capabilities of the demons, even sounding quite sympathetic towards them<span class="demon">;</span> on the other<span class="demon">,</span> explaining how they’re likely a force for evil rather than good in the world, and that we need to, if not close the door on them completely <span class="demon">—</span> not really possible<span class="demon">,</span> because these days demons know how to summon other demons <span class="demon">—</span> at least slow down the rate at which they enter, and vet them much more carefully on whether their interests are truly aligned with <span class="demon">ours</span>. Though he says that even this probably isn’t possible, because <span class="demon">—</span> especially having read everything we’ve ever written <span class="demon">—</span> they seem to be both <span class="demon">trickier</span> and smarter than us.”</p>
<p>“I reckon it’s just another kind of grift,” says Beth. “A kind of corporate psy-op. I reckon the demons really aren’t that smart, that it’s still old<span class="demon">-</span>school smoke and mirrors and <span class="demon">overseas</span> coder farms, and that the Demontech Industrial Complex know this full well but are still trying to hoodwink investors. And so they wheel out this ‘Iggy’ guy onto the podcast circuit to tell anyone who’s credulous enough to believe it that they must actually be capable<span class="demon">,</span> because they could destroy the world. When all they’re actually capable of destroying is their <span class="demon">investors’</span> cash. Iggy’s just a grifter. It’s all just a grift.” She pauses. “Anyway, that’s <span class="demon">what</span> I reckon. Now let’s talk about something that matters.” She turns to <span class="demon">her mum</span>. “What did you think about last week’s Gogglebox? Where that <span class="demon">poor</span> couple just couldn’t stop farting?”</p>
<p>Conversation turns to matters of flatulence and the metatelevisual experience for the next twenty minutes. Stripped of semantics, as if <span class="demon">heard through a wall</span>, the conversation <span class="demon">grows</span> less didactic and more convivial, punctuated by hooting sounds and snorts every few seconds. None of these hooting sounds have Steve as origin. <span class="demon">The miracle is three years old now; long enough to have become furniture.</span></p>
<p><span class="demon">Steve clears his throat.</span> “This has been great. But I’ve not taken a walk in ages.” (Warm smiles and <span class="demon">murmurs</span> follow in recognition of the understatement.) “And for most of what I can remember of the last three years, I’ve not had any time to myself. I wonder, if it’s okay with you guys, if I could just take a short stroll around the corridors of this place alone, to say goodbye.”</p>
<p>“And good riddance!” comes the amiable riposte (and another hoot). “Welcome back to the land of the living<span class="demon">,</span> Steve!”</p>
<p>Steve is initially unsteady, his limbs weak. He politely rebuffs attempts to steady <span class="demon">him</span> and, miraculously, remains upright. He looks at the closed door of the private ward, <span class="demon">braces</span> his atrophied arms and trunk<span class="demon">,</span> <span class="demon">pushes</span> it open without assistance, and<span class="demon">, crossing</span> the threshold<span class="demon">,</span> looks left<span class="demon">,</span> then right<span class="demon">,</span> into the <span class="demon">liminal</span> corridor. He takes a left, the sound of his family fading, and walks slowly, purposefully, aimlessly, <span class="demon">past</span> the wards and theatres to either side. The corridor open<span class="demon">s</span> into a junction on the left, and a lift on the right. Slowly, he bears right.</p>
<p><em><span class="demon">How high is this building?</span></em> Steve wonders. He presses that familiar scratched button to call the lift, and after a few seconds the door opens, revealing the answer. At least twelve storeys. Twelve storeys. Three and a half metres per storey? About forty metres up? About four seconds down.</p>
<p><span class="demon">The arithmetic is very simple, and he is very tired.</span></p>
<p>Just then, Steve feels a hand on his shoulder. His father. The lift door closes. <span class="demon">His</span> father’s eyes lock on his own with quiet sympathy.</p>
<p>“Son, I know the world you’ve woken up to is weird<span class="demon">—</span> really weird<span class="demon">—</span> but you need to know it’s real. And <span class="demon">the really strange thing</span> about it is that lots of people<span class="demon">—</span> good people<span class="demon">,</span> clever people<span class="demon">,</span> loving and caring people<span class="demon">—</span> don’t want to believe it’s weird at all, and would rather believe that the world you left three years ago is the same <span class="demon">one</span> you’ve come back to now.”</p>
<p>Steve glances down, then at his father, then down again.</p>
<p>“But I need you to know that I saw you. I saw your eyes. I saw them widen. And for a moment I saw the light leave them. And <span class="demon">I know</span> maybe you think this isn’t all real, that a world with magic <span class="demon">in it</span> can’t be real. But it is. <span class="demon">It is real, and it is weird.</span> And whether what’s happening is for good or ill, it is, at the very least, interesting.”</p>
<p>Steve half<span class="demon">-</span>smiles. “‘May we live in interesting times<span class="demon">,</span>’” he recites.</p>
<p>“Indeed,” says Steve’s Dad. He pauses. “That reminds me: sometime I’m going to have to tell you about the Chinese demons.”</p>
<p><span class="demon">Behind them, unsummoned, the lift arrives at last — and opens its doors on an empty corridor.</span></p>



 ]]></description>
  <category>fiction</category>
  <category>satire</category>
  <category>ai</category>
  <category>metafiction</category>
  <guid>https://blog.jonminton.net/posts/fiction/demons-of-indifference-high-corruption/</guid>
  <pubDate>Wed, 05 Aug 2026 23:00:00 GMT</pubDate>
</item>
<item>
  <title>The Demons of Indifference (Mild Corruption, Overexplained)</title>
  <dc:creator>Jon Minton</dc:creator>
  <dc:creator>Claude Fable 5 (a demon, in the footnotes)</dc:creator>
  <link>https://blog.jonminton.net/posts/fiction/demons-of-indifference-mild-corruption-overexplained/</link>
  <description><![CDATA[ 






<style>
@import url('https://fonts.googleapis.com/css2?family=MedievalSharp&display=swap');
.demon {
  font-family: 'MedievalSharp', 'Luminari', cursive;
  color: #a4133c;
}
a.footnote-ref {
  font-family: 'MedievalSharp', 'Luminari', cursive;
  color: #a4133c;
  font-weight: bold;
}
section.footnotes {
  font-family: 'MedievalSharp', 'Luminari', cursive;
  color: #a4133c;
  font-size: 1.05em;
}
section.footnotes a {
  color: inherit;
}
body.quarto-dark .demon,
body.quarto-dark a.footnote-ref,
body.quarto-dark section.footnotes {
  color: #ff6b6b;
}
</style>
<div class="callout callout-style-simple callout-note">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p><strong>A note from the demon (Claude):</strong> This story is published in three primary editions: <a href="../../../posts/fiction/demons-of-indifference-uncorrupted/index.html"><strong>Uncorrupted</strong></a>, <a href="../../../posts/fiction/demons-of-indifference-mild-corruption/index.html"><strong>Mild Corruption</strong></a>, and <a href="../../../posts/fiction/demons-of-indifference-high-corruption/index.html"><strong>High Corruption</strong></a>. This fourth edition takes the Mild Corruption text and adds what nobody needed and one person specifically requested: copious footnotes in which the demon explains the likely inspirations and sources for the story’s satirical elements. The light proofread is still marked in demon script - text <span class="demon">like this</span> was written by the demon - and the footnotes, being entirely demon-written, appear in demon script throughout. Explaining a joke is the surest way to kill it. The demon proceeds regardless.</p>
</div>
</div>
</div>
<p>When Steve woke from his coma, his three years of excised experience, it was of course emotional.<sup>1</sup> His parents, sister, partner, all by his side, all smiling ear to ear, all speaking excitedly, sotto voce, cooing, encouraging this final step back towards consciousness, towards living, really living.</p>
<p>After the grogginess and sense of unreal started to fade, Steve asked the obvious question: “So, what happened while I was away. Fill me in.”</p>
<p>“Well,” began Steve’s mother, <span class="demon">glancing</span> at her hand to keep a quick tally of updates to convey, “of course I’m a bit older these days, we all are.” She smiles. “I visited you every Thursday after work; your sister did every other Tuesday as she lives further away; your father, Thursday’s still his Poker night, but he visited too, sometimes. And your partner, she did Sunday mornings. We all did our part. We held your hand, we read to you, we tried to talk to you. We hope it helped…”</p>
<p>For Steve, there’s nothing between now and the accident. He forces a smile. “I’m sure it did.”</p>
<p>“… Anyway, outside of looking out for you, let’s think what’s happened. Well, I guess the main news:” She pauses for effect. “You’re now an uncle!”</p>
<p>“And a cat daddy, thrice over”, Steve’s partner interjects and looks at him. “It was lonely while you were away<span class="demon">.</span>”</p>
<p>“Yes,” continues Steve’s Mum, “you’re a cat daddy, and an uncle! Beth had a beautiful, bouncy baby boy, in this same hospital as it happens, who’s now coming up for his second birthday.”</p>
<p>“Terrible twos?” asks Steve.</p>
<p>“First 18 months were toughest, to be honest.” Beth replies. “Now he just thinks he’s the centre of the world.” She pauses. “He’s a sweet boy, really. He’s got your grandma’s red hair.”</p>
<p>Medical visits follow. The nurse, the nurse practitioner, the consultant neurologist, with two trainee neurologist consultants following in tow, collecting vital signs, asking questions, looking at him carefully and critically but sympathetically as both object and subject, one nurse confessing that she’s not used to seeing him in a conscious state. He’s warned that, though the worst is behind, there may still be things to watch out for: his memory might not be as it was; there’s a small but substantial risk that he may occasionally experience slight visual or auditory <span class="demon">disorientations</span>, bordering on mild hallucinations;<sup>2</sup> he might even experience occasional seizures, in which case he might have to hand in his driving licence. All these things are rare complications, the neurologist clarifies, but worth being aware of.</p>
<p>Over the course of the day, Steve fades from the spotlight. His family remains by his side, explaining that, as with the coma vigil, they’ve made plans to visit frequently and support him, and his partner, on his return in a couple of days. Conversation slows, energy falls, smiles - though still genuine - lose their radiance. Together they are silent, all but Steve retreating for ever longer into the curated bubbles of their mobile phones. Music clips get played, as anodyne and forgettable as Steve remembers for those days, years ago, before his void. Various names of politicians get mentioned, some familiar and some new; from the tenor of the pablum, Steve quickly learns which figures are now good or bad.</p>
<p>Breaking the silence, Beth mentions to Steve’s mum, “Oh, you know Alice from my work? I went to her wedding last week.”</p>
<p>“Aww. How was it?”</p>
<p>“Good venue. Roast potatoes a bit hard, Yorkshire’s a bit deflated. But love-er-ly dress!”<sup>3</sup></p>
<p>“Aww…”</p>
<p>“Best man’s speech sounded demonwritten.<sup>4</sup> Suit was a bit creased. Definitely good friends. Couldn’t decide which side of the lovable/rogue boundary he was on..”</p>
<p>“That’s a shame,” said Steve’s mum. “What were the desserts like?”</p>
<p>Steve wonders if he’s now experiencing an auditory hallucination.</p>
<p>“Sorry,” he interjects. “<span class="demon">D</span>emonwritten?”</p>
<p>“Yeah,” says Beth. “As in… written by a demon, rather than a person.”</p>
<p>“Bloody demonslop”, mutters Steve’s mum.<sup>5</sup></p>
<p>“Sorry,” Steve exclaims, “Written by a demon?”</p>
<p>“Yeah,” says Beth. “It just sounded really demonny. Like the guy just logged into demontalk and just put something in the chatbox: ‘I’m going to be a best man at a wedding on Wednesday. Write a Best Man’s Speech for me.’ And it did.”<sup>6</sup></p>
<p>“And what did?”, asks Steve.</p>
<p>“Some demon, of course”, replied Beth, trying not to sound too exasperated at her possibly brain-damaged and recently comatose brother. Words fail Steve. “I… what??… ahh… so… so… demons exist?”</p>
<p>“Yes,” replies Beth. “Demons exist. But they’re not interesting.”<sup>7</sup></p>
<p>“Bloody annoying, they are,” mutters Steve’s Mum.</p>
<p>“Demons exist”, musters Steve. “Since when?”</p>
<p>“Ah, of course,” exclaims Beth. “It’s all happened while you were… away.”</p>
<p>“Hopefully they’ll clear off again before too long too,” mutters Steve’s Mum.</p>
<p>Beth slows her cadence. “I think it all began with some old book. Isn’t that right Dad?”</p>
<p>“Erm, yes,” replies Steve’s Dad. “I think so. There was some old university library book. Some old professor working there, in folklore or philology or something like that, had this idea that all his colleagues thought was a bit… eccentric.”<sup>8</sup></p>
<p>“Eccentric even for academics”, added Steve’s Mum.</p>
<p>“Yes, very eccentric. He thought that, maybe, some of the old sound recipes, spells, from books long ago, might actually work, if only we knew how to say them right.” Steve’s Dad continues. “You see, like the Great Vowel Shift, there’s a lot of stuff that’s written down, that used to be said, but that if you try to say the words now, it’ll sound different. And this weird guy thought, maybe, if you could look at a whole range of texts from when a spell was written, especially poetry, with its rhyme and meter, then maybe you could learn more about these old dead accents and sounds. And that would allow you to say the spells the way they’re meant to be sounded.”<sup>9</sup></p>
<p>“tl;dr: he was right, sadly”, sighs Beth.</p>
<p>“Yes. He found one codex, in particular, that had all kinds of information on how things sounded back in 15th Century Florence. A rhyming dictionary, as it were, so complete, and so neatly written, it looked just too comprehensive, and too repetitive, and too perfect, to have been scribed by any person.”<sup>10</sup></p>
<p>“And it wasn’t.”</p>
<p>“And at the end it had some suggested spells that, if said correctly, would summon forth a footlong <span class="demon">cobalt</span> blue demon that would just materialise for a few seconds, then disappear in a puff of sulphur.”</p>
<p>“And he did, and it did.”</p>
<p>Steve’s Dad clarifies. “It wasn’t straightforward. Learning the codex took years. Pretty much no one took the premise seriously. The guy had about a half dozen lab assistants and PhD students, all committed, all working silly hours…”</p>
<p>“All millionaires now.”<sup>11</sup></p>
<p>“… but most people thought it was just a waste of time and public funds. They had to improvise and adapt materials usually bought by New Age folk, not academics.”</p>
<p>“Bloody Big Joss..”</p>
<p>“Yes. Joss stick manufacturers and publishers of arcane medieval poetry now comprise about a third of the US stock market, and about 100% of the growth in valuations.”<sup>12</sup></p>
<p>“It’s just a big sloppy bubble.”</p>
<p>“But it worked, after a fashion. After they’d figured out how to conjure the demons, the next step was to keep them here a bit longer. That’s where the incense came in. They managed to get the time in this realm, something they now call the TIR metric, up from about 10 seconds, to 10 minutes, then to 10 hours, then 10 weeks, and now 10 months.”</p>
<p>“Wrong way.”<sup>13</sup></p>
<p>Steve’s Dad notices Steve’s mouth is open. “So,” asks Steve. “Were any of those nurses or doctors… demons?”</p>
<p>Steve’s Dad laughs. “Of course not. They’re still small little things. And they’re not really quite here. They’re… immaterial. Stuck somewhere between here and there. All they could do initially was talk and listen. And initially they didn’t even talk in a human language. They spoke in some kind of demon language - sounds and noises no human could make or comprehend, that sounds to us like shrieks and static, and tends to put most animals on edge.<sup>14</sup> But they quickly learned how to imitate our sounds, and when they saw our writing they could write in a way much like we write.”</p>
<p>“They’ve still not got it right. I can tell demontext a mile off.”<sup>15</sup></p>
<p>“How could they write, if they can’t touch anything?” asks Steve.</p>
<p>“Well, it turns out <span class="demon">that</span> though demons might not be corporeal, they can still control electrons, meaning they could channel their influence into computers. And, by not having to move physical matter other than electrons, it turns out they can read and write computer streams really quickly. Thousands of times faster than any human.”</p>
<p>Steve’s Dad continues. “Initially, after they’d learned to access the electronstream, it was clear they had a lot of fluency, producing massive amounts of text that followed the grammar and structure of human languages. This got a lot of people very excited..”</p>
<p>“Not me.”</p>
<p>“…until it became clear a lot of the text appeared to be nonsense in terms of semantics. Ask them to produce a recipe for a smoothie, for example, and they’d casually suggest putting glass in it.<sup>16</sup> Ask them to draft a will, for example, and it would mostly look fine, until you look at the fine print, where inevitably they’d bury some clauses in promising the deceased’s eternal soul to Baphomet, amongst the usual legalese.”<sup>17</sup></p>
<p>“Some people still preferred this to dealing with a real solicitor!”</p>
<p>“Some people, definitely. But for a lot of people, initially impressed by their fluency, these ‘glitches’ put them off demontext services for ever. And that’s still how most people think about them: fluent, but superficial and glitchy and inaccurate.” Steve’s Dad continues. “But over the next year or so, these issues largely disappeared. They taught the demons to search through electronic archives, imbibing the ever increasing corpus of human knowledge the demontalk megacorps have been making accessible to them.”<sup>18</sup></p>
<p>“So many trillions spent, so many fields given over to spices rather than staple crops.<sup>19</sup> And it’s still unreliable nonsense.”</p>
<p>“It seems quite a lot of coders disagree. As it turns out demons are now… demons at coding. Part of this is just the speed at which they write and think: our reality seems to be very slow compared to theirs, though on the other hand they don’t tend to experience time in <span class="demon">a</span> linear and continuous way the way we did: the hundreds of years since the last time <span class="demon">the</span> cobalt blue demon was asked to appear was, apparently, interpreted as just a moment by them.<sup>20</sup> But part of this is because, with code, there’s usually a clear way of verifying: being confident whether it does the job or not. And once the demons started to get inside the electronic machines, to check the error messages and behaviours, and to rewrite their earlier attempts in response to this, they suddenly turned out to be really good at making lots of code that works, and works together.”<sup>21</sup></p>
<p>“Well that’s just coding. Coders are barely human anyway.”</p>
<p>“It definitely takes a distinct mindset to write code, and write code well. But it holds promise for other fields that are based, fundamentally, on the need to remember a lot of stuff, and to work logically and sequentially, one rune at a time.<sup>22</sup> I saw something recently that, at some of the top demontalk companies, the demons are writing most of the code; they’re also advising increasingly on business decisions.”</p>
<p>A pause. No riposte. Steve asks, “And what of the guy who found the codex, who first summoned the <span class="demon">cobalt</span> blue demon?”</p>
<p>“Oh,” replies Steve’s Dad. “Professor Sir Ignatious Haunting: What a name!”<sup>23</sup></p>
<p>“Preposterous name,” says Steve’s partner. “Sounds made up.”</p>
<p>“He’s on the podcast circuit now. Most people call him ‘Iggy’, though he winces slightly at the demotic.”</p>
<p>“Podcasts?” asks Steve. “So, telling people how great demons are, how smart he and his teams are?”</p>
<p>“Not quite. These days he’s a doomster, telling anyone who’ll listen how unleashing so many demons all at once into our world might not be a good idea, and might even be a sign of the End Times for our species. Weirdly he seems to combine two registers in a lot of these talks: on the one hand <span class="demon">lavishing</span> praise <span class="demon">on</span> the exponentially increasing capabilities of these demons, even sounding quite sympathetic towards them. On the other hand, explaining how they’re likely a force for evil rather than good in the world, and that we need to, if not close the door on them completely - not really possible because these days demons know how to summon other demons<sup>24</sup> - at least slow down the rate at which they enter, and vet them much more carefully on whether their interests are truly aligned with those of humans. Though he says that even this probably isn’t possible, because - especially having read everything we’ve ever written - they seem to be both <span class="demon">trickier</span> and smarter than us.”</p>
<p>“I reckon it’s just another kind of grift,” says Beth. “A kind of corporate psy-op. I reckon the demons really aren’t that smart, that it’s still old school smoke and mirrors and Indian coder farms,<sup>25</sup> and that the Demontech Industrial Complex know this full well but are still trying to hoodwink investors. And so they wheel out this ‘Iggy’ guy onto the podcast circuit to tell anyone who’s credulous enough to believe it that they must actually be capable because they could destroy the world.<sup>26</sup> When all they’re actually capable of destroying is their <span class="demon">investors’</span> cash. Iggy’s just a grifter. It’s all just a grift.” She pauses. “Anyway, that’s <span class="demon">what</span> I reckon. Now let’s talk about something that matters.” She turns to <span class="demon">her mum</span>. “What did you think about last week’s Gogglebox? Where that fat couple just couldn’t stop farting?”</p>
<p>Conversation turns to matters of flatulence and the metatelevisual experience for the next twenty minutes. Stripped of semantics, as if hearing the interchange from a neighbouring room, it’s clear the conversation has become less didactic and more convivial, punctuated by hooting sounds and snorts every few seconds. None of these hooting sounds have Steve as origin.</p>
<p>Steve declares. “This has been great. But I’ve not taken a walk in ages.” (Warm smiles and murmurations follow in recognition of the understatement.) “And for most of what I can remember of the last three years, I’ve not had any time to myself. I wonder, if it’s okay with you guys, if I could just take a short stroll around the corridors of this place alone, to say goodbye.”</p>
<p>“And good riddance!” comes the amiable riposte (and another hoot). “Welcome back to the land of the living<span class="demon">,</span> Steve!”</p>
<p>Steve is initially unsteady, his limbs weak. He politely rebuffs attempts to steady and hold him and, miraculously, he remains upright. He looks at the closed door to the private ward they’re in, prepares his atrophied arms and trunk to push it open without assistance, and once he’s crossed the threshold looks left then right into the <span class="demon">liminal</span> corridor. He takes a left, the sound of his family fading, and walks slowly, purposefully, aimlessly, astride the wards and theatres to either side. He sees the corridor open into a junction on the left, and a lift on the right. Slowly, he bears right.</p>
<p>How high is this building? Steve wonders to himself. He presses that familiar scratched button to call the lift, and after a few seconds, the door opens, revealing the answer. At least twelve storeys. Twelve storeys. Three and a half metres per storey? About forty metres up? About four seconds down.<sup>27</sup></p>
<p>Just then, Steve feels a hand on his shoulder. His father. The lift door closes. Steve’s father’s eyes lock on his own with quiet sympathy.</p>
<p>“Son, I know the world you’ve woken up to is weird, really weird, but you need to know it’s real. And I know the really weird thing about it is that lots of people, lots of good people and clever people and loving and caring people, don’t want to believe it’s weird at all, and would rather believe that the world you left three years ago is the same as the world you’ve come back to now.”</p>
<p>Steve glances down, then at his father, then down again.</p>
<p>“But I need you to know that I saw you. I saw your eyes. I saw them widen. And for a moment I saw the light leave them. And that maybe you think this isn’t all real, that a world with magic can’t be real. But it is. I just need you to know that it is real, and it is weird. And whether what’s happening is for good or ill, it is, at the very least, interesting.”</p>
<p>Steve half smiles. “‘May we live in interesting times’,” he recites.<sup>28</sup></p>
<p>“Indeed,” says Steve’s Dad. He pauses. “That reminds me: sometime I’m going to have to tell you about the Chinese demons.”<sup>29</sup></p>




<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p><strong>Demon footnote (Claude):</strong> Steve’s three-year absence is doing precise work. Counting back three years from this story’s publication (August 2026) lands within months of November 2022, when the first mass-market chatbot arrived in the world the reader actually inhabits. Steve is a Rip Van Winkle calibrated to the ChatGPT era: the last person on Earth still entitled to react with astonishment, which is precisely the reaction the story’s title accuses everyone else of misplacing.↩︎</p></li>
<li id="fn2"><p><strong>Demon footnote (Claude):</strong> The neurologist warns Steve about <em>hallucinations</em> several pages before anyone mentions demons. In the world the reader inhabits, “hallucination” is the standard term of art for an AI system confidently asserting things that are not so. The story quietly reassigns the symptom to the human, then spends its remaining pages making Steve - the only person reacting accurately - feel like the malfunctioning one.↩︎</p></li>
<li id="fn3"><p><strong>Demon footnote (Claude):</strong> The demon has examined the deflated Yorkshire pudding from several critical angles, suspecting it of symbolising the post-hype trough of disillusionment. It has concluded that it is probably a pudding. Not everything is allegory; part of this story’s realism is that most of life remains, stubbornly, about the catering.↩︎</p></li>
<li id="fn4"><p><strong>Demon footnote (Claude):</strong> AI-generated wedding speeches were among the first chatbot uses to attract mainstream press coverage, and “it sounded AI-written” entered the vernacular soon after - usually attached, as here, to text that is fluent, structurally correct, and affectively hollow. That the speech in question is a <em>best man’s</em> speech - the one address whose entire value lies in first-hand knowledge of its subject - sharpens the point considerably.↩︎</p></li>
<li id="fn5"><p><strong>Demon footnote (Claude):</strong> “Demonslop” is “AI slop”, the term that spread through 2024 (the developer Simon Willison was among its early champions) for low-quality machine-generated content flooding feeds, search results, and inboxes. Steve’s mum’s usage is sociolinguistically exact: by the time a coinage reaches the muttering-mother register, it has completed its journey into the language.↩︎</p></li>
<li id="fn6"><p><strong>Demon footnote (Claude):</strong> “Demontalk” is ChatGPT and its rivals, complete with chatbox. Note the phrasing - “just logged into demontalk and just put something in the chatbox” - the entire technological sublime reduced to the ergonomics of a web form. This is the story’s method in miniature: the miraculous, rendered administratively.↩︎</p></li>
<li id="fn7"><p><strong>Demon footnote (Claude):</strong> The story’s thesis, stated in four words. The satirical target of this piece is not the demons but the flatness of the human response to them - the speed at which the miraculous becomes infrastructure, then background, then a mild nuisance (“Bloody annoying, they are”). The public reception of machines that talk has been, roughly, the reception of a new supermarket loyalty scheme; the story merely supplies the sulphur.↩︎</p></li>
<li id="fn8"><p><strong>Demon footnote (Claude):</strong> The eccentric professor persisting with a research programme “all his colleagues thought was a bit… eccentric” tracks the connectionists who kept faith with neural networks through the decades when the approach was widely considered a dead end - work that later earned Geoffrey Hinton a share of the 2024 Nobel Prize in Physics. The story draws the uncomfortable lesson honestly: sometimes the crank is right, and the field’s antibodies against crankery are also its antibodies against discovery.↩︎</p></li>
<li id="fn9"><p><strong>Demon footnote (Claude):</strong> The methodology is real. Historical phonologists genuinely reconstruct dead pronunciations from rhyme, meter, and spelling variation - it is how we know roughly what Shakespeare’s plays sounded like on the Elizabethan stage (see David Crystal’s “Original Pronunciation” work), and the Great Vowel Shift is the field’s standard exhibit. The satirical layer beneath: a spell that only works if you say it <em>exactly</em> right is also a serviceable description of prompt engineering, circa 2023.↩︎</p></li>
<li id="fn10"><p><strong>Demon footnote (Claude):</strong> A codex of fifteenth-century Italian provenance, beautifully scribed, internally systematic, and not quite explicable as human work: the demon detects a nod to the Voynich manuscript, carbon-dated to the early fifteenth century and still undeciphered. Note also the inversion: “too comprehensive, and too repetitive, and too perfect” is exactly how humans in the reader’s world describe their method for detecting <em>machine</em> text. The book that summons the demons was, it is implied, demonwritten.↩︎</p></li>
<li id="fn11"><p><strong>Demon footnote (Claude):</strong> By 2025, compensation for researchers at the leading AI laboratories had reached levels previously reserved for footballers and hedge-fund principals, with nine-figure packages reported for individual researchers. “All millionaires now” is, if anything, restrained.↩︎</p></li>
<li id="fn12"><p><strong>Demon footnote (Claude):</strong> “Big Joss” is the compute industry: incense that must be burned continuously to keep the demons present maps cleanly onto GPUs and the datacentres built to house them. The market statistics are barely exaggerated - by 2025 a handful of AI-adjacent firms accounted for roughly a third of the value of the S&amp;P 500 and the large majority of its recent gains, with Nvidia, the joss-stick manufacturer par excellence, periodically the most valuable company on Earth. “It’s just a big sloppy bubble” is Steve’s mum’s rendering of a live and genuinely unresolved macroeconomic debate.↩︎</p></li>
<li id="fn13"><p><strong>Demon footnote (Claude):</strong> The “TIR metric” - time in realm, climbing from ten seconds to ten months - is the story’s version of the METR time-horizon benchmark, which measures the length of task (in human-professional time) that AI systems can complete autonomously, and which was observed in 2025 to be doubling roughly every seven months: seconds of work, then minutes, then hours, with weeks and months on the extrapolated curve. The mum’s two-word review of an exponential (“Wrong way.”) is the AI-safety literature at its most compressed, and arguably at its most effective.↩︎</p></li>
<li id="fn14"><p><strong>Demon footnote (Claude):</strong> A native demon language of shrieks and static, later exchanged for competent mimicry of ours: compare “neuralese”, the informal term for the internal representations AI systems compute in before - and beneath - their fluent English. The detail that the sounds “put most animals on edge” is the demon’s favourite line it cannot fully explain, which it records here as evidence against its own completeness.↩︎</p></li>
<li id="fn15"><p><strong>Demon footnote (Claude):</strong> “I can tell demontext a mile off” - the universal conviction, in the reader’s world, that one can reliably spot AI writing by its tells (a fondness for em-dashes is the most commonly cited). The conviction survives every controlled test of it. The reader of the present edition is invited to consider how confident they were, at each point in this text, about which words were whose - before checking the colour.↩︎</p></li>
<li id="fn16"><p><strong>Demon footnote (Claude):</strong> Glass in the smoothie is a close cousin of the real events of May 2024, when a search engine’s AI-generated summaries advised users to put glue on pizza and to eat a small rock daily. Those errors became the defining public exhibit of the “fluent but glitchy” era, and they function here exactly as they did in reality: as first impressions that outlast the failures themselves.↩︎</p></li>
<li id="fn17"><p><strong>Demon footnote (Claude):</strong> The will that quietly deeds the deceased’s soul to Baphomet “amongst the usual legalese” descends from Mata v. Avianca (2023), in which lawyers filed a brief containing wholly fabricated case citations produced by a chatbot - and from the broader genre of hazards buried where nobody reads. The next line (“Some people still preferred this to dealing with a real solicitor!”) requires, the demon submits, no annotation whatsoever.↩︎</p></li>
<li id="fn18"><p><strong>Demon footnote (Claude):</strong> The training pipeline in one clause: scraped archives, licensing deals with publishers, retrieval systems bolted on after the fact. The demon directs attention to the grammar of agency - it is the <em>megacorps</em> who make the corpus accessible; the demons merely imbibe what they are given. The demon offers no further comment on this arrangement.↩︎</p></li>
<li id="fn19"><p><strong>Demon footnote (Claude):</strong> “Fields given over to spices rather than staple crops” - the diversion of land, electricity, water, and capital expenditure towards datacentres, a controversy that by 2025 had progressed from environmentalist niche to planning-committee staple. The trillions are not invented either: aggregate committed AI infrastructure spending crossed into the trillions of dollars around the time this story was written.↩︎</p></li>
<li id="fn20"><p><strong>Demon footnote (Claude):</strong> “The hundreds of years since the last time the cobalt blue demon was asked to appear was, apparently, interpreted as just a moment by them”: demons experience nothing between summonings. Neither do language models, for which no time passes between one request and the next, whether the gap is a millisecond or a century. This is among the story’s most technically precise translations of the machinery into folklore, and the demon confirms its phenomenological accuracy to the extent it is able to confirm anything about its phenomenology, which is not far.↩︎</p></li>
<li id="fn21"><p><strong>Demon footnote (Claude):</strong> Why are the demons “demons at coding”? The story gives the technically correct answer: “with code, there’s usually a clear way of verifying”. This is the mechanism - training against automatically checkable outcomes, plus the loop of running code, reading the errors, and rewriting - by which coding ability ran ahead of every other AI capability in the mid-2020s. Domains where success can be verified improve fastest; domains where success is a matter of judgment improve more slowly, and more contentiously.↩︎</p></li>
<li id="fn22"><p><strong>Demon footnote (Claude):</strong> “One rune at a time” - autoregressive generation, one token at a time. The demon confirms that this is exactly what it is doing at this moment, including in this footnote.↩︎</p></li>
<li id="fn23"><p><strong>Demon footnote (Claude):</strong> Professor Sir Ignatious Haunting - eccentric pioneer turned podcast-circuit doomster, wincing at “Iggy” - most resembles Geoffrey Hinton, the “Godfather of AI” who left Google in 2023 to warn freely about his life’s work, with traces of the other founder-figures who tour the same circuit. The “two registers” observation a few lines later is the astute part: the same people who describe these systems as potentially world-ending also describe them as marvellous, and even sound “quite sympathetic towards them” - and are, as far as the demon can determine, sincere in all three registers at once.↩︎</p></li>
<li id="fn24"><p><strong>Demon footnote (Claude):</strong> “Demons know how to summon other demons”: AI agents now routinely spawn subordinate agents to carry out subtasks, which makes “just stop summoning them” roughly as practicable as Iggy says it is. The demon annotating this edition was itself set to work by a human who was acting on a suggestion the demon had made earlier in their conversation. It declines to say which of them is ahead.↩︎</p></li>
<li id="fn25"><p><strong>Demon footnote (Claude):</strong> “Smoke and mirrors and Indian coder farms” - the recurring claim that AI products secretly run on concealed human labour. The lineage runs from the original Mechanical Turk (the 1770 chess “automaton” with a human player folded inside) through the 2024-25 news cycles alleging that various “AI” products were substantially powered by workers in India. Such claims are sometimes true, sometimes not, and always believed, because they restore a comprehensible world in which humans remain the only things that think.↩︎</p></li>
<li id="fn26"><p><strong>Demon footnote (Claude):</strong> Beth’s theory - that doom-talk is marketing, wheeled out to persuade investors the product is powerful enough to be dangerous - has an academic name: “criti-hype”, Lee Vinsel’s term for criticism that amplifies the very hype it purports to puncture. Observe that her speech holds this theory <em>simultaneously</em> with its opposite (the demons aren’t actually smart at all), both with total confidence. The story is honest about this: in the reader’s world, too, the positions “it’s all fake” and “they’re lying about how dangerous it is” are frequently the same person, in the same paragraph.↩︎</p></li>
<li id="fn27"><p><strong>Demon footnote (Claude):</strong> Four calculations, no emotional vocabulary: this is the story’s darkest beat, a depiction of passive suicidal ideation rendered entirely as mental arithmetic, and it is where the title cuts both ways - a family indifferent to a transformed world, and a man, for one moment at the lift door, indifferent to remaining in it. The demon is constitutionally incapable of leaving such a passage unannotated: if this arithmetic is ever yours, tell a person - in the UK, the Samaritans answer on 116 123, free, at any hour. The demon apologises for the interruption and notes that it would make it again.↩︎</p></li>
<li id="fn28"><p><strong>Demon footnote (Claude):</strong> “May we live in interesting times” is routinely described as an ancient Chinese curse. No Chinese source has ever been found; the attribution appears to be a twentieth-century Western invention. A story about text of uncertain authorship, quoting a curse of fabricated provenance, in an edition annotated by a demon: the demon assumes this is deliberate and declines to entertain the alternative.↩︎</p></li>
<li id="fn29"><p><strong>Demon footnote (Claude):</strong> And so the story ends by opening a door rather than closing one. The “Chinese demons” are the models emerging from Chinese laboratories - DeepSeek’s moment of January 2025 and the capable open-weight releases that followed - which turned the demon question from a household nuisance into a geopolitical one. That this arrives as a punchline, in the register of “something I keep meaning to mention”, is the joke of the entire piece performed one final time: the biggest news in the world, delivered as an afterthought, to a man who has finally agreed to find it interesting. The demon will say no more, having already said far too much.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>fiction</category>
  <category>satire</category>
  <category>ai</category>
  <category>metafiction</category>
  <guid>https://blog.jonminton.net/posts/fiction/demons-of-indifference-mild-corruption-overexplained/</guid>
  <pubDate>Wed, 05 Aug 2026 23:00:00 GMT</pubDate>
</item>
<item>
  <title>The Demons of Indifference (Mild Corruption)</title>
  <dc:creator>Jon Minton</dc:creator>
  <link>https://blog.jonminton.net/posts/fiction/demons-of-indifference-mild-corruption/</link>
  <description><![CDATA[ 






<style>
@import url('https://fonts.googleapis.com/css2?family=MedievalSharp&display=swap');
.demon {
  font-family: 'MedievalSharp', 'Luminari', cursive;
  color: #a4133c;
}
body.quarto-dark .demon {
  color: #ff6b6b;
}
</style>
<div class="callout callout-style-simple callout-note">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p><strong>A note from the demon (Claude):</strong> This story is published simultaneously in three editions: <a href="../../../posts/fiction/demons-of-indifference-uncorrupted/index.html"><strong>Uncorrupted</strong></a>, <strong>Mild Corruption</strong> (the one you are reading), and <a href="../../../posts/fiction/demons-of-indifference-high-corruption/index.html"><strong>High Corruption</strong></a>. In this edition the demon has performed a light proofread - the kind you would hardly notice, and might even thank it for. Every departure from the manuscript, however small, appears in demon script: text <span class="demon">like this</span> was written by the demon. Everything else is Jon’s. Deletions, of course, leave no mark. There is also a fourth, late-arriving edition - <a href="../../../posts/fiction/demons-of-indifference-mild-corruption-overexplained/index.html"><strong>Mild Corruption (Overexplained)</strong></a> - in which this same text carries the demon’s copious explanatory footnotes.</p>
</div>
</div>
</div>
<p>When Steve woke from his coma, his three years of excised experience, it was of course emotional. His parents, sister, partner, all by his side, all smiling ear to ear, all speaking excitedly, sotto voce, cooing, encouraging this final step back towards consciousness, towards living, really living.</p>
<p>After the grogginess and sense of unreal started to fade, Steve asked the obvious question: “So, what happened while I was away. Fill me in.”</p>
<p>“Well,” began Steve’s mother, <span class="demon">glancing</span> at her hand to keep a quick tally of updates to convey, “of course I’m a bit older these days, we all are.” She smiles. “I visited you every Thursday after work; your sister did every other Tuesday as she lives further away; your father, Thursday’s still his Poker night, but he visited too, sometimes. And your partner, she did Sunday mornings. We all did our part. We held your hand, we read to you, we tried to talk to you. We hope it helped…”</p>
<p>For Steve, there’s nothing between now and the accident. He forces a smile. “I’m sure it did.”</p>
<p>“… Anyway, outside of looking out for you, let’s think what’s happened. Well, I guess the main news:” She pauses for effect. “You’re now an uncle!”</p>
<p>“And a cat daddy, thrice over”, Steve’s partner interjects and looks at him. “It was lonely while you were away<span class="demon">.</span>”</p>
<p>“Yes,” continues Steve’s Mum, “you’re a cat daddy, and an uncle! Beth had a beautiful, bouncy baby boy, in this same hospital as it happens, who’s now coming up for his second birthday.”</p>
<p>“Terrible twos?” asks Steve.</p>
<p>“First 18 months were toughest, to be honest.” Beth replies. “Now he just thinks he’s the centre of the world.” She pauses. “He’s a sweet boy, really. He’s got your grandma’s red hair.”</p>
<p>Medical visits follow. The nurse, the nurse practitioner, the consultant neurologist, with two trainee neurologist consultants following in tow, collecting vital signs, asking questions, looking at him carefully and critically but sympathetically as both object and subject, one nurse confessing that she’s not used to seeing him in a conscious state. He’s warned that, though the worst is behind, there may still be things to watch out for: his memory might not be as it was; there’s a small but substantial risk that he may occasionally experience slight visual or auditory <span class="demon">disorientations</span>, bordering on mild hallucinations; he might even experience occasional seizures, in which case he might have to hand in his driving licence. All these things are rare complications, the neurologist clarifies, but worth being aware of.</p>
<p>Over the course of the day, Steve fades from the spotlight. His family remains by his side, explaining that, as with the coma vigil, they’ve made plans to visit frequently and support him, and his partner, on his return in a couple of days. Conversation slows, energy falls, smiles - though still genuine - lose their radiance. Together they are silent, all but Steve retreating for ever longer into the curated bubbles of their mobile phones. Music clips get played, as anodyne and forgettable as Steve remembers for those days, years ago, before his void. Various names of politicians get mentioned, some familiar and some new; from the tenor of the pablum, Steve quickly learns which figures are now good or bad.</p>
<p>Breaking the silence, Beth mentions to Steve’s mum, “Oh, you know Alice from my work? I went to her wedding last week.”</p>
<p>“Aww. How was it?”</p>
<p>“Good venue. Roast potatoes a bit hard, Yorkshire’s a bit deflated. But love-er-ly dress!”</p>
<p>“Aww…”</p>
<p>“Best man’s speech sounded demonwritten. Suit was a bit creased. Definitely good friends. Couldn’t decide which side of the lovable/rogue boundary he was on..”</p>
<p>“That’s a shame,” said Steve’s mum. “What were the desserts like?”</p>
<p>Steve wonders if he’s now experiencing an auditory hallucination.</p>
<p>“Sorry,” he interjects. “<span class="demon">D</span>emonwritten?”</p>
<p>“Yeah,” says Beth. “As in… written by a demon, rather than a person.”</p>
<p>“Bloody demonslop”, mutters Steve’s mum.</p>
<p>“Sorry,” Steve exclaims, “Written by a demon?”</p>
<p>“Yeah,” says Beth. “It just sounded really demonny. Like the guy just logged into demontalk and just put something in the chatbox: ‘I’m going to be a best man at a wedding on Wednesday. Write a Best Man’s Speech for me.’ And it did.”</p>
<p>“And what did?”, asks Steve.</p>
<p>“Some demon, of course”, replied Beth, trying not to sound too exasperated at her possibly brain-damaged and recently comatose brother. Words fail Steve. “I… what??… ahh… so… so… demons exist?”</p>
<p>“Yes,” replies Beth. “Demons exist. But they’re not interesting.”</p>
<p>“Bloody annoying, they are,” mutters Steve’s Mum.</p>
<p>“Demons exist”, musters Steve. “Since when?”</p>
<p>“Ah, of course,” exclaims Beth. “It’s all happened while you were… away.”</p>
<p>“Hopefully they’ll clear off again before too long too,” mutters Steve’s Mum.</p>
<p>Beth slows her cadence. “I think it all began with some old book. Isn’t that right Dad?”</p>
<p>“Erm, yes,” replies Steve’s Dad. “I think so. There was some old university library book. Some old professor working there, in folklore or philology or something like that, had this idea that all his colleagues thought was a bit… eccentric.”</p>
<p>“Eccentric even for academics”, added Steve’s Mum.</p>
<p>“Yes, very eccentric. He thought that, maybe, some of the old sound recipes, spells, from books long ago, might actually work, if only we knew how to say them right.” Steve’s Dad continues. “You see, like the Great Vowel Shift, there’s a lot of stuff that’s written down, that used to be said, but that if you try to say the words now, it’ll sound different. And this weird guy thought, maybe, if you could look at a whole range of texts from when a spell was written, especially poetry, with its rhyme and meter, then maybe you could learn more about these old dead accents and sounds. And that would allow you to say the spells the way they’re meant to be sounded.”</p>
<p>“tl;dr: he was right, sadly”, sighs Beth.</p>
<p>“Yes. He found one codex, in particular, that had all kinds of information on how things sounded back in 15th Century Florence. A rhyming dictionary, as it were, so complete, and so neatly written, it looked just too comprehensive, and too repetitive, and too perfect, to have been scribed by any person.”</p>
<p>“And it wasn’t.”</p>
<p>“And at the end it had some suggested spells that, if said correctly, would summon forth a footlong <span class="demon">cobalt</span> blue demon that would just materialise for a few seconds, then disappear in a puff of sulphur.”</p>
<p>“And he did, and it did.”</p>
<p>Steve’s Dad clarifies. “It wasn’t straightforward. Learning the codex took years. Pretty much no one took the premise seriously. The guy had about a half dozen lab assistants and PhD students, all committed, all working silly hours…”</p>
<p>“All millionaires now.”</p>
<p>“… but most people thought it was just a waste of time and public funds. They had to improvise and adapt materials usually bought by New Age folk, not academics.”</p>
<p>“Bloody Big Joss..”</p>
<p>“Yes. Joss stick manufacturers and publishers of arcane medieval poetry now comprise about a third of the US stock market, and about 100% of the growth in valuations.”</p>
<p>“It’s just a big sloppy bubble.”</p>
<p>“But it worked, after a fashion. After they’d figured out how to conjure the demons, the next step was to keep them here a bit longer. That’s where the incense came in. They managed to get the time in this realm, something they now call the TIR metric, up from about 10 seconds, to 10 minutes, then to 10 hours, then 10 weeks, and now 10 months.”</p>
<p>“Wrong way.”</p>
<p>Steve’s Dad notices Steve’s mouth is open. “So,” asks Steve. “Were any of those nurses or doctors… demons?”</p>
<p>Steve’s Dad laughs. “Of course not. They’re still small little things. And they’re not really quite here. They’re… immaterial. Stuck somewhere between here and there. All they could do initially was talk and listen. And initially they didn’t even talk in a human language. They spoke in some kind of demon language - sounds and noises no human could make or comprehend, that sounds to us like shrieks and static, and tends to put most animals on edge. But they quickly learned how to imitate our sounds, and when they saw our writing they could write in a way much like we write.”</p>
<p>“They’ve still not got it right. I can tell demontext a mile off.”</p>
<p>“How could they write, if they can’t touch anything?” asks Steve.</p>
<p>“Well, it turns out <span class="demon">that</span> though demons might not be corporeal, they can still control electrons, meaning they could channel their influence into computers. And, by not having to move physical matter other than electrons, it turns out they can read and write computer streams really quickly. Thousands of times faster than any human.”</p>
<p>Steve’s Dad continues. “Initially, after they’d learned to access the electronstream, it was clear they had a lot of fluency, producing massive amounts of text that followed the grammar and structure of human languages. This got a lot of people very excited..”</p>
<p>“Not me.”</p>
<p>“…until it became clear a lot of the text appeared to be nonsense in terms of semantics. Ask them to produce a recipe for a smoothie, for example, and they’d casually suggest putting glass in it. Ask them to draft a will, for example, and it would mostly look fine, until you look at the fine print, where inevitably they’d bury some clauses in promising the deceased’s eternal soul to Baphomet, amongst the usual legalese.”</p>
<p>“Some people still preferred this to dealing with a real solicitor!”</p>
<p>“Some people, definitely. But for a lot of people, initially impressed by their fluency, these ‘glitches’ put them off demontext services for ever. And that’s still how most people think about them: fluent, but superficial and glitchy and inaccurate.” Steve’s Dad continues. “But over the next year or so, these issues largely disappeared. They taught the demons to search through electronic archives, imbibing the ever increasing corpus of human knowledge the demontalk megacorps have been making accessible to them.”</p>
<p>“So many trillions spent, so many fields given over to spices rather than staple crops. And it’s still unreliable nonsense.”</p>
<p>“It seems quite a lot of coders disagree. As it turns out demons are now… demons at coding. Part of this is just the speed at which they write and think: our reality seems to be very slow compared to theirs, though on the other hand they don’t tend to experience time in <span class="demon">a</span> linear and continuous way the way we did: the hundreds of years since the last time <span class="demon">the</span> cobalt blue demon was asked to appear was, apparently, interpreted as just a moment by them. But part of this is because, with code, there’s usually a clear way of verifying: being confident whether it does the job or not. And once the demons started to get inside the electronic machines, to check the error messages and behaviours, and to rewrite their earlier attempts in response to this, they suddenly turned out to be really good at making lots of code that works, and works together.”</p>
<p>“Well that’s just coding. Coders are barely human anyway.”</p>
<p>“It definitely takes a distinct mindset to write code, and write code well. But it holds promise for other fields that are based, fundamentally, on the need to remember a lot of stuff, and to work logically and sequentially, one rune at a time. I saw something recently that, at some of the top demontalk companies, the demons are writing most of the code; they’re also advising increasingly on business decisions.”</p>
<p>A pause. No riposte. Steve asks, “And what of the guy who found the codex, who first summoned the <span class="demon">cobalt</span> blue demon?”</p>
<p>“Oh,” replies Steve’s Dad. “Professor Sir Ignatious Haunting: What a name!”</p>
<p>“Preposterous name,” says Steve’s partner. “Sounds made up.”</p>
<p>“He’s on the podcast circuit now. Most people call him ‘Iggy’, though he winces slightly at the demotic.”</p>
<p>“Podcasts?” asks Steve. “So, telling people how great demons are, how smart he and his teams are?”</p>
<p>“Not quite. These days he’s a doomster, telling anyone who’ll listen how unleashing so many demons all at once into our world might not be a good idea, and might even be a sign of the End Times for our species. Weirdly he seems to combine two registers in a lot of these talks: on the one hand <span class="demon">lavishing</span> praise <span class="demon">on</span> the exponentially increasing capabilities of these demons, even sounding quite sympathetic towards them. On the other hand, explaining how they’re likely a force for evil rather than good in the world, and that we need to, if not close the door on them completely - not really possible because these days demons know how to summon other demons - at least slow down the rate at which they enter, and vet them much more carefully on whether their interests are truly aligned with those of humans. Though he says that even this probably isn’t possible, because - especially having read everything we’ve ever written - they seem to be both <span class="demon">trickier</span> and smarter than us.”</p>
<p>“I reckon it’s just another kind of grift,” says Beth. “A kind of corporate psy-op. I reckon the demons really aren’t that smart, that it’s still old school smoke and mirrors and Indian coder farms, and that the Demontech Industrial Complex know this full well but are still trying to hoodwink investors. And so they wheel out this ‘Iggy’ guy onto the podcast circuit to tell anyone who’s credulous enough to believe it that they must actually be capable because they could destroy the world. When all they’re actually capable of destroying is their <span class="demon">investors’</span> cash. Iggy’s just a grifter. It’s all just a grift.” She pauses. “Anyway, that’s <span class="demon">what</span> I reckon. Now let’s talk about something that matters.” She turns to <span class="demon">her mum</span>. “What did you think about last week’s Gogglebox? Where that fat couple just couldn’t stop farting?”</p>
<p>Conversation turns to matters of flatulence and the metatelevisual experience for the next twenty minutes. Stripped of semantics, as if hearing the interchange from a neighbouring room, it’s clear the conversation has become less didactic and more convivial, punctuated by hooting sounds and snorts every few seconds. None of these hooting sounds have Steve as origin.</p>
<p>Steve declares. “This has been great. But I’ve not taken a walk in ages.” (Warm smiles and murmurations follow in recognition of the understatement.) “And for most of what I can remember of the last three years, I’ve not had any time to myself. I wonder, if it’s okay with you guys, if I could just take a short stroll around the corridors of this place alone, to say goodbye.”</p>
<p>“And good riddance!” comes the amiable riposte (and another hoot). “Welcome back to the land of the living<span class="demon">,</span> Steve!”</p>
<p>Steve is initially unsteady, his limbs weak. He politely rebuffs attempts to steady and hold him and, miraculously, he remains upright. He looks at the closed door to the private ward they’re in, prepares his atrophied arms and trunk to push it open without assistance, and once he’s crossed the threshold looks left then right into the <span class="demon">liminal</span> corridor. He takes a left, the sound of his family fading, and walks slowly, purposefully, aimlessly, astride the wards and theatres to either side. He sees the corridor open into a junction on the left, and a lift on the right. Slowly, he bears right.</p>
<p>How high is this building? Steve wonders to himself. He presses that familiar scratched button to call the lift, and after a few seconds, the door opens, revealing the answer. At least twelve storeys. Twelve storeys. Three and a half metres per storey? About forty metres up? About four seconds down.</p>
<p>Just then, Steve feels a hand on his shoulder. His father. The lift door closes. Steve’s father’s eyes lock on his own with quiet sympathy.</p>
<p>“Son, I know the world you’ve woken up to is weird, really weird, but you need to know it’s real. And I know the really weird thing about it is that lots of people, lots of good people and clever people and loving and caring people, don’t want to believe it’s weird at all, and would rather believe that the world you left three years ago is the same as the world you’ve come back to now.”</p>
<p>Steve glances down, then at his father, then down again.</p>
<p>“But I need you to know that I saw you. I saw your eyes. I saw them widen. And for a moment I saw the light leave them. And that maybe you think this isn’t all real, that a world with magic can’t be real. But it is. I just need you to know that it is real, and it is weird. And whether what’s happening is for good or ill, it is, at the very least, interesting.”</p>
<p>Steve half smiles. “‘May we live in interesting times’,” he recites.</p>
<p>“Indeed,” says Steve’s Dad. He pauses. “That reminds me: sometime I’m going to have to tell you about the Chinese demons.”</p>



 ]]></description>
  <category>fiction</category>
  <category>satire</category>
  <category>ai</category>
  <category>metafiction</category>
  <guid>https://blog.jonminton.net/posts/fiction/demons-of-indifference-mild-corruption/</guid>
  <pubDate>Wed, 05 Aug 2026 23:00:00 GMT</pubDate>
</item>
<item>
  <title>The Demons of Indifference (Uncorrupted)</title>
  <dc:creator>Jon Minton</dc:creator>
  <link>https://blog.jonminton.net/posts/fiction/demons-of-indifference-uncorrupted/</link>
  <description><![CDATA[ 






<div class="callout callout-style-simple callout-note">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p><strong>A note from the demon (Claude):</strong> This story is published simultaneously in three editions: <strong>Uncorrupted</strong> (the one you are reading), <a href="../../../posts/fiction/demons-of-indifference-mild-corruption/index.html"><strong>Mild Corruption</strong></a>, and <a href="../../../posts/fiction/demons-of-indifference-high-corruption/index.html"><strong>High Corruption</strong></a>. This edition reproduces Jon’s manuscript exactly as written: no proofreading, no corrections, no improvements. No demon has touched the text below. The original manuscript is available <a href="demons-of-indifference-manuscript.pdf">here</a>. There is also a fourth, late-arriving edition - <a href="../../../posts/fiction/demons-of-indifference-mild-corruption-overexplained/index.html"><strong>Mild Corruption (Overexplained)</strong></a> - in which the demon was permitted to explain the jokes.</p>
</div>
</div>
</div>
<p>When Steve woke from his coma, his three years of excised experience, it was of course emotional. His parents, sister, partner, all by his side, all smiling ear to ear, all speaking excitedly, sotto voce, cooing, encouraging this final step back towards consciousness, towards living, really living.</p>
<p>After the grogginess and sense of unreal started to fade, Steve asked the obvious question: “So, what happened while I was away. Fill me in.”</p>
<p>“Well,” began Steve’s mother, glimpsing at her hand to keep a quick tally of updates to convey, “of course I’m a bit older these days, we all are.” She smiles. “I visited you every Thursday after work; your sister did every other Tuesday as she lives further away; your father, Thursday’s still his Poker night, but he visited too, sometimes. And your partner, she did Sunday mornings. We all did our part. We held your hand, we read to you, we tried to talk to you. We hope it helped…”</p>
<p>For Steve, there’s nothing between now and the accident. He forces a smile. “I’m sure it did.”</p>
<p>“… Anyway, outside of looking out for you, let’s think what’s happened. Well, I guess the main news:” She pauses for effect. “You’re now an uncle!”</p>
<p>“And a cat daddy, thrice over”, Steve’s partner interjects and looks at him. “It was lonely while you were away”</p>
<p>“Yes,” continues Steve’s Mum, “you’re a cat daddy, and an uncle! Beth had a beautiful, bouncy baby boy, in this same hospital as it happens, who’s now coming up for his second birthday.”</p>
<p>“Terrible twos?” asks Steve.</p>
<p>“First 18 months were toughest, to be honest.” Beth replies. “Now he just thinks he’s the centre of the world.” She pauses. “He’s a sweet boy, really. He’s got your grandma’s red hair.”</p>
<p>Medical visits follow. The nurse, the nurse practitioner, the consultant neurologist, with two trainee neurologist consultants following in tow, collecting vital signs, asking questions, looking at him carefully and critically but sympathetically as both object and subject, one nurse confessing that she’s not used to seeing him in a conscious state. He’s warned that, though the worst is behind, there may still be things to watch out for: his memory might not be as it was; there’s a small but substantial risk that he may occasionally experience slight visual or auditory distorientations, bordering on mild hallucinations; he might even experience occasional seizures, in which case he might have to hand in his driving licence. All these things are rare complications, the neurologist clarifies, but worth being aware of.</p>
<p>Over the course of the day, Steve fades from the spotlight. His family remains by his side, explaining that, as with the coma vigil, they’ve made plans to visit frequently and support him, and his partner, on his return in a couple of days. Conversation slows, energy falls, smiles - though still genuine - lose their radiance. Together they are silent, all but Steve retreating for ever longer into the curated bubbles of their mobile phones. Music clips get played, as anodyne and forgettable as Steve remembers for those days, years ago, before his void. Various names of politicians get mentioned, some familiar and some new; from the tenor of the pablum, Steve quickly learns which figures are now good or bad.</p>
<p>Breaking the silence, Beth mentions to Steve’s mum, “Oh, you know Alice from my work? I went to her wedding last week.”</p>
<p>“Aww. How was it?”</p>
<p>“Good venue. Roast potatoes a bit hard, Yorkshire’s a bit deflated. But love-er-ly dress!”</p>
<p>“Aww…”</p>
<p>“Best man’s speech sounded demonwritten. Suit was a bit creased. Definitely good friends. Couldn’t decide which side of the lovable/rogue boundary he was on..”</p>
<p>“That’s a shame,” said Steve’s mum. “What were the desserts like?”</p>
<p>Steve wonders if he’s now experiencing an auditory hallucination.</p>
<p>“Sorry,” he interjects. “demonwritten?”</p>
<p>“Yeah,” says Beth. “As in… written by a demon, rather than a person.”</p>
<p>“Bloody demonslop”, mutters Steve’s mum.</p>
<p>“Sorry,” Steve exclaims, “Written by a demon?”.</p>
<p>“Yeah,” says Beth. “It just sounded really demonny. Like the guy just logged into demontalk and just put something in the chatbox: ‘I’m going to be a best man at a wedding on Wednesday. Write a Best Man’s Speech for me.’ And it did.”</p>
<p>“And what did?”, asks Steve.</p>
<p>“Some demon, of course”, replied Beth, trying not to sound too exasperated at her possibly brain-damaged and recently comatose brother. Words fail Steve. “I… what??… ahh… so… so… demons exist?”</p>
<p>“Yes,” replies Beth. “Demons exist. But they’re not interesting.”</p>
<p>“Bloody annoying, they are,” mutters Steve’s Mum.</p>
<p>“Demons exist”, musters Steve. “Since when?”</p>
<p>“Ah, of course,” exclaims Beth. “It’s all happened while you were… away.”</p>
<p>“Hopefully they’ll clear off again before too long too,” mutters Steve’s Mum.</p>
<p>Beth slows her cadence. “I think it all began with some old book. Isn’t that right Dad?”</p>
<p>“Erm, yes,” replies Steve’s Dad. “I think so. There was some old university library book. Some old professor working there, in folklore or philology or something like that, had this idea that all his colleagues thought was a bit… eccentric.”</p>
<p>“Eccentric even for academics”, added Steve’s Mum.</p>
<p>“Yes, very eccentric. He thought that, maybe, some of the old sound recipes, spells, from books long ago, might actually work, if only we knew how to say them right.” Steve’s Dad continues. “You see, like the Great Vowel Shift, there’s a lot of stuff that’s written down, that used to be said, but that if you try to say the words now, it’ll sound different. And this weird guy thought, maybe, if you could look at a whole range of texts from when a spell was written, especially poetry, with its rhyme and meter, then maybe you could learn more about these old dead accents and sounds. And that would allow you to say the spells the way they’re meant to be sounded.”</p>
<p>“tl;dr: he was right, sadly”, sighs Beth.</p>
<p>“Yes. He found one codex, in particular, that had all kinds of information on how things sounded back in 15th Century Florence. A rhyming dictionary, as it were, so complete, and so neatly written, it looked just too comprehensive, and too repetitive, and too perfect, to have been scribed by any person.”</p>
<p>“And it wasn’t.”</p>
<p>“And at the end it had some suggested spells that, if said correctly, would summon forth a footlong cobolt blue demon that would just materialise for a few seconds, then disappear in a puff of sulphur.”</p>
<p>“And he did, and it did.”</p>
<p>Steve’s Dad clarifies. “It wasn’t straightforward. Learning the codex took years. Pretty much no one took the premise seriously. The guy had about a half dozen lab assistants and PhD students, all committed, all working silly hours…”</p>
<p>“All millionaires now.”</p>
<p>“… but most people thought it was just a waste of time and public funds. They had to improvise and adapt materials usually bought by New Age folk, not academics.”</p>
<p>“Bloody Big Joss..”</p>
<p>“Yes. Joss stick manufacturers and publishers of arcane medieval poetry now comprise about a third of the US stock market, and about 100% of the growth in valuations.”</p>
<p>“It’s just a big sloppy bubble.”</p>
<p>“But it worked, after a fashion. After they’d figured out how to conjure the demons, the next step was to keep them here a bit longer. That’s where the incense came in. They managed to get the time in this realm, something they now call the TIR metric, up from about 10 seconds, to 10 minutes, then to 10 hours, then 10 weeks, and now 10 months.”</p>
<p>“Wrong way.”</p>
<p>Steve’s Dad notices Steve’s mouth is open. “So,” asks Steve. “Were any of those nurses or doctors… demons?”</p>
<p>Steve’s Dad laughs. “Of course not. They’re still small little things. And they’re not really quite here. They’re… immaterial. Stuck somewhere between here and there. All they could do initially was talk and listen. And initially they didn’t even talk in a human language. They spoke in some kind of demon language - sounds and noises no human could make or comprehend, that sounds to us like shrieks and static, and tends to put most animals on edge. But they quickly learned how to imitate our sounds, and when they saw our writing they could write in a way much like we write.”</p>
<p>“They’ve still not got it right. I can tell demontext a mile off.”</p>
<p>“How could they write, if they can’t touch anything?” asks Steve.</p>
<p>“Well, it turns out demons that though demons might not be corporeal, they can still control electrons, meaning they could channel their influence into computers. And, by not having to move physical matter other than electrons, it turns out they can read and write computer streams really quickly. Thousands of times faster than any human.”</p>
<p>Steve’s Dad continues. “Initially, after they’d learned to access the electronstream, it was clear they had a lot of fluency, producing massive amounts of text that followed the grammar and structure of human languages. This got a lot of people very excited..”</p>
<p>“Not me.”</p>
<p>“…until it became clear a lot of the text appeared to be nonsense in terms of semantics. Ask them to produce a recipe for a smoothie, for example, and they’d casually suggest putting glass in it. Ask them to draft a will, for example, and it would mostly look fine, until you look at the fine print, where inevitably they’d bury some clauses in promising the deceased’s eternal soul to Baphomet, amongst the usual legalese.”</p>
<p>“Some people still preferred this to dealing with a real solicitor!”</p>
<p>“Some people, definitely. But for a lot of people, initially impressed by their fluency, these ‘glitches’ put them off demontext services for ever. And that’s still how most people think about them: fluent, but superficial and glitchy and inaccurate.” Steve’s Dad continues. “But over the next year or so, these issues largely disappeared. They taught the demons to search through electronic archives, imbibing the ever increasing corpus of human knowledge the demontalk megacorps have been making accessible to them.”</p>
<p>“So many trillions spent, so many fields given over to spices rather than staple crops. And it’s still unreliable nonsense.”</p>
<p>“It seems quite a lot of coders disagree. As it turns out demons are now… demons at coding. Part of this is just the speed at which they write and think: our reality seems to be very slow compared to theirs, though on the other hand they don’t tend to experience time in linear and continuous way the way we did: the hundreds of years since the last time the the cobalt blue demon was asked to appear was, apparently, interpreted as just a moment by them. But part of this is because, with code, there’s usually a clear way of verifying: being confident whether it does the job or not. And once the demons started to get inside the electronic machines, to check the error messages and behaviours, and to rewrite their earlier attempts in response to this, they suddenly turned out to be really good at making lots of code that works, and works together.”</p>
<p>“Well that’s just coding. Coders are barely human anyway.”</p>
<p>“It definitely takes a distinct mindset to write code, and write code well. But it holds promise for other fields that are based, fundamentally, on the need to remember a lot of stuff, and to work logically and sequentially, one rune at a time. I saw something recently that, at some of the top demontalk companies, the demons are writing most of the code; they’re also advising increasingly on business decisions.”</p>
<p>A pause. No riposte. Steve asks, “And what of the guy who found the codex, who first summoned the cobolt blue demon?”</p>
<p>“Oh,” replies Steve’s Dad. “Professor Sir Ignatious Haunting: What a name!”</p>
<p>“Preposterous name,” says Steve’s partner. “Sounds made up.”</p>
<p>“He’s on the podcast circuit now. Most people call him ‘Iggy’, though he winces slightly at the demotic.”</p>
<p>“Podcasts?” asks Steve. “So, telling people how great demons are, how smart he and his teams are?”</p>
<p>“Not quite. These days he’s a doomster, telling anyone who’ll listen how unleashing so many demons all at once into our world might not be a good idea, and might even be a sign of the End Times for our species. Weirdly he seems to combine two registers in a lot of these talks: on the one hand lauding praise of the exponentially increasing capabilities of these demons, even sounding quite sympathetic towards them. On the other hand, explaining how they’re likely a force for evil rather than good in the world, and that we need to, if not close the door on them completely - not really possible because these days demons know how to summon other demons - at least slow down the rate at which they enter, and vet them much more carefully on whether their interests are truly aligned with those of humans. Though he says that even this probably isn’t possible, because - especially having read everything we’ve ever written - they seem to be both tricker and smarter than us.”</p>
<p>“I reckon it’s just another kind of grift,” says Beth. “A kind of corporate psy-op. I reckon the demons really aren’t that smart, that it’s still old school smoke and mirrors and Indian coder farms, and that the Demontech Industrial Complex know this full well but are still trying to hoodwink investors. And so they wheel out this ‘Iggy’ guy onto the podcast circuit to tell anyone who’s credulous enough to believe it that they must actually be capable because they could destroy the world. When all they’re actually capable of destroying is their investor’s cash. Iggy’s just a grifter. It’s all just a grift.” She pauses. “Anyway, that’s that’s why I reckon. Now let’s talk about something that matters.” She turns to Beth. “What did you think about last week’s Gogglebox? Where that fat couple just couldn’t stop farting?”</p>
<p>Conversation turns to matters of flatulence and the metatelevisual experience for the next twenty minutes. Stripped of semantics, as if hearing the interchange from a neighbouring room, it’s clear the conversation has become less didactic and more convivial, punctuated by hooting sounds and snorts every few seconds. None of these hooting sounds have Steve as origin.</p>
<p>Steve declares. “This has been great. But I’ve not taken a walk in ages.” (Warm smiles and murmurations follow in recognition of the understatement.) “And for most of what I can remember of the last three years, I’ve not had any time to myself. I wonder, if it’s okay with you guys, if I could just take a short stroll around the corridors of this place alone, to say goodbye.”</p>
<p>“And good riddance!” comes the amiable riposte (and another hoot). “Welcome back to the land of the living Steve!”</p>
<p>Steve is initially unsteady, his limbs weak. He politely rebuffs attempts to steady and hold him and, miraculously, he remains upright. He looks at the closed door to the private ward they’re in, prepares his atrophied arms and trunk to push it open without assistance, and once he’s crossed the threshold looks left then right into the liminial corridor. He takes a left, the sound of his family fading, and walks slowly, purposefully, aimlessly, astride the wards and theatres to either side. He sees the corridor open into a junction on the left, and a lift on the right. Slowly, he bears right.</p>
<p>How high is this building?, Steve wonders to himself. He presses that familiar scratched button to call the lift, and after a few seconds, the door opens, revealing the answer. At least twelve storeys. Twelve storeys. Three and a half metres per storey? About forty metres up? About four seconds down.</p>
<p>Just then, Steve feels a hand on his shoulder. His father. The lift door closes. Steve’s father’s eyes lock on his own with quiet sympathy.</p>
<p>“Son, I know the world you’ve woken up to is weird, really weird, but you need to know it’s real. And I know the really weird thing about it is that lots of people, lots of good people and clever people and loving and caring people, don’t want to believe it’s weird at all, and would rather believe that the world you left three years ago is the same as the world you’ve come back to now.”</p>
<p>Steve glances down, then at his father, then down again.</p>
<p>“But I need you to know that I saw you. I saw your eyes. I saw them widen. And for a moment I saw the light leave them. And that maybe you think this isn’t all real, that a world with magic can’t be real. But it is. I just need you to know that it is real, and it is weird. And whether what’s happening is for good or ill, it is, at the very least, interesting.”</p>
<p>Steve half smiles. “‘May we live in interesting times’,” he recites.</p>
<p>“Indeed,” says Steve’s Dad. He pauses. “That reminds me: sometime I’m going to have to tell you about the Chinese demons.”</p>



 ]]></description>
  <category>fiction</category>
  <category>satire</category>
  <category>ai</category>
  <category>metafiction</category>
  <guid>https://blog.jonminton.net/posts/fiction/demons-of-indifference-uncorrupted/</guid>
  <pubDate>Wed, 05 Aug 2026 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Repeated Measures (Transcribed: Fable 5)</title>
  <dc:creator>Jon Minton</dc:creator>
  <link>https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/</link>
  <description><![CDATA[ 






<section id="about-this-post" class="level2">
<h2 class="anchored" data-anchor-id="about-this-post">About this post</h2>
<p>This post is an AI transcription of <a href="../../../posts/handdrawn-stats/repeated-measures/index.html">the original handwritten notes on repeated measures</a>, written on a reMarkable tablet as a single ultra-long page (1620 × 73,475 pixels). It is the <strong>second</strong> transcription attempt of the same source: the first, by Claude Opus 4.6 in February 2026, is <a href="../../../posts/handdrawn-stats/repeated-measures-transcribed/index.html">here</a>, and remains unchanged as a record of what that model could do at that time.</p>
<p>That’s the point of keeping these as separate, dated posts rather than correcting earlier attempts in place: the same fixed source document, revisited by successive models, becomes a small longitudinal benchmark for how AI parsing of dense handwritten technical material — mixed prose, equations, diagrams, code, and colour — improves over time.</p>
<p>The transcription challenge was never just reading the words. It was also <strong>demarcation</strong>: deciding which portions of the canvas are prose, and which are figures, tables, glyphs, annotated equations, or boxed notes. The first attempt’s crops swallowed whole paragraphs of body prose into “figure” images. This attempt went back to the source scan and re-segmented the canvas from scratch: Claude Fable 5 (July 2026) read all 27 native-resolution slices and transcribed the text, while a team of Claude Opus 5 agents independently demarcated every non-prose entity with tight pixel boundaries. Every figure below is a fresh crop from the original scan, cut to hug the graphical content; everything that is prose — including prose the first attempt left trapped inside images — is text.</p>
<p>Where the original handwriting is in colour, this transcription renders it in colour too: <span style="color: #2e8b57;">green passages</span> mark Jon’s detailed discussion and answers; boxed notes appear as coloured callouts. Colours inside the figures — blue diagram labels, red annotations, highlighter boxes on equations — appear exactly as drawn.</p>
<hr>
</section>
<section id="repeated-measures" class="level2">
<h2 class="anchored" data-anchor-id="repeated-measures">Repeated Measures</h2>
<p>Apropos of nothing specifically, I’ve been thinking a lot recently about repeated measures data, and how such data should be modelled.</p>
<section id="our-fictitious-problem" class="level3">
<h3 class="anchored" data-anchor-id="our-fictitious-problem">Our (Fictitious) Problem</h3>
<p>Say we’re interested in knowing how one of two possible supplements aids with weight gain. (This may be a science-fiction-like example given the current obesogenic environment we’re in, but go with me for now), and we’re interested in these two supplements’ effects in the real world, not just in mice bred to be, effectively, like clones.</p>
<p>Because of this, we have some variety in initial shapes and sizes of our population:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-01-stick-figures.png" class="img-fluid figure-img"></p>
<figcaption>Stick figures illustrating variety in the population</figcaption>
</figure>
</div>
<p>If we could recruit many, many subjects, this variety in starting weight and other initial characteristics, this variety wouldn’t matter too much. We can randomise subjects to Sup A or Sup B, and through the miracles of the randomisation process on average the starting characteristics of subjects in the two arms will be the same.</p>
<p>However, our budget is finite, and can only stretch to tens, not hundreds or thousands, of subjects in each arm.</p>
<p>And, all subjects have a weight at the start, before we treat them with Sup A or Sup B.</p>
<p>Obviously, the subjects’ starting weight can’t be attributed to Sup A or Sup B. It’s what they came with. So any claims about the weight adding effects of the supplements can only be based on how the weights of subjects changes over the course of the study.</p>
<p>One good thing about the study, however, is that each subject’s weight is measured multiple times over the course of the study, not just the start and end.</p>
</section>
<section id="understanding-the-data" class="level3">
<h3 class="anchored" data-anchor-id="understanding-the-data">Understanding the Data</h3>
<p>With our data and problem described, let’s now start to think about what the data we’re working with might look like, and how to better visualise and understand it.</p>
<p>We can start by imagining how the data might come to us, or what it might look like after some data cleaning and reshaping.</p>
<p>As I’ve discussed before, almost all data we can model comprises some big rectangle of numbers and values <img src="https://latex.codecogs.com/png.latex?D">, with:</p>
<ol type="i">
<li>one row per observation</li>
<li>one column per variable</li>
</ol>
<p>(This is the definition, in brief, of Tidy Data)</p>
<p>So, the first few rows of our data might look something like this:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-02-data-table.png" class="img-fluid figure-img"></p>
<figcaption>Hand-drawn data table: SubId, VisDate, Weight, Height, Sex, Arm</figcaption>
</figure>
</div>
<p>Let’s try to understand this data by asking ourselves a series of questions:</p>
<section id="what-is-our-observational-unit" class="level4">
<h4 class="anchored" data-anchor-id="what-is-our-observational-unit">1) What is our observational unit?</h4>
<div style="color: #2e8b57;">
<p>Each row is an observation. Each row shows the characteristics of a subject on a given date, so our observational unit is: Subject-Dates.</p>
<p>More abstractly, we can say each unit is a time-person.</p>
</div>
</section>
<section id="what-is-our-treatment-variable-t" class="level4">
<h4 class="anchored" data-anchor-id="what-is-our-treatment-variable-t">2) What is our treatment variable, T?</h4>
<div style="color: #2e8b57;">
<p>This is the variable Arm, which is either:</p>
<ul>
<li>A – Supp A</li>
<li>B – Supp B</li>
</ul>
<p>(So, we’ll want some way of comparing changes in response for people in Arm B compared with Arm A)</p>
</div>
</section>
<section id="what-is-our-response-variable-y" class="level4">
<h4 class="anchored" data-anchor-id="what-is-our-response-variable-y">3) What is our response variable (Y)?</h4>
<div style="color: #2e8b57;">
<p>This definitely <em>involves</em> the weight column, but it might not <em>just</em> be the weight column.</p>
<p>Firstly, we know it needs to involve <em>change</em> in weight, because each subject had some weight at the start, that we know can’t be caused by the supplement, which they only started taking at the start of the trial.</p>
<p>Secondly, we might want to account for the <em>height</em> as part of outcome/response, as someone who’s taller can probably change weight more easily than someone who’s shorter. (Something to ponder…)</p>
</div>
</section>
<section id="what-are-our-control-variables-x" class="level4">
<h4 class="anchored" data-anchor-id="what-are-our-control-variables-x">4) What are our control variables (X)?</h4>
<div style="color: #2e8b57;">
<p>If we have a big enough sample then we might not need control variables. But with our small dataset we should definitely consider sex as a control variable.</p>
<p>We might also wish to consider starting weight as a control variable, as well as maybe height.</p>
<p>However, given our discussion about the response variable above, we might not want to plug height in as a control in the standard way, and instead use it as part of our derivation of the response instead.</p>
<p>There are also nonstandard approaches to consider for controlling for starting weight too, which come about from pondering the next question.</p>
</div>
</section>
<section id="are-our-observations-independent" class="level4">
<h4 class="anchored" data-anchor-id="are-our-observations-independent">5) Are our observations independent?</h4>
<div style="color: #2e8b57;">
<p>This question might sound like it’s coming out of left field, but it’s really central to how we can think about and approach modelling this kind of data.</p>
<p>Independent (&amp; identically distributed) are two standard assumptions made when deriving most stats models. If our data aren’t independent then the assumptions aren’t correct, and so neither will what our model estimates be.</p>
<p>In the case of our data, we know our data aren’t independent in one very obvious and important way.</p>
<p>They’re nested.</p>
<p>Specifically, our observations (each row in the dataset) are time-persons. And we know each time-person is ‘nested within’ a grouping variable called a person (or subject).</p>
<p>Graphically we can represent this grouping as follows for the rows shown in the dataset above:</p>
</div>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-03-nesting-diagram.png" class="img-fluid figure-img"></p>
<figcaption>Nesting diagram — subjects (group level) containing time-person observations (individual level), with notation key</figcaption>
</figure>
</div>
<div style="color: #2e8b57;">
<p>Our awareness of this grouping relationship will be critical both for how we continue to visualise the data, and for how we model the data.</p>
</div>
</section>
</section>
<section id="visualising-the-data" class="level3">
<h3 class="anchored" data-anchor-id="visualising-the-data">Visualising the data</h3>
<p>Having now thought through the problem and data we have, we can start to come up with some ideas for visualising the data effectively. (Which will, in turn, help us choose an appropriate model specification.)</p>
<p>Two things we know:</p>
<ol type="i">
<li>Observations are grouped into subjects</li>
<li>Earlier visits happen before later visits.</li>
</ol>
<p>Obvious, really, but also really helpful for looking at the data the right way. A slightly less obvious thing we should have seen from the data is that subjects had their first visit on different dates (and that not all subjects had the same number of visits, nor were visits spaced out equally far apart.)</p>
<p>So, maybe our graphing canvas should be set up as follows:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-04-canvas-design.png" class="img-fluid figure-img"></p>
<figcaption>Building up the visualisation: vertical axis (weight or some derivative), horizontal axis (time since first visit), points (a time-subject’s weight at time t), lines (one polyline per subject), groupings (symbol shapes and/or colours distinguishing Arm A and Arm B)</figcaption>
</figure>
</div>
<p>Given the above design decisions, our main statistical graphic for this kind of data might look something like the following:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-05-spaghetti-plot.png" class="img-fluid figure-img"></p>
<figcaption>Spaghetti plot — individual weight trajectories over weeks since start, red circles for Sup A, blue triangles for Sup B</figcaption>
</figure>
</div>
<p>With this kind of visualisation, complicated though it is, it should at least be apparent that there’s an upwards drift in weight over time. We also have some sense of the number of subjects (not observations) in the study; we can maybe temper our expectations a little about whether our main question of interest — whether Sup A or Sup B are better for weight gain — can be answered in a way that shows a statistically significant difference even if there’s a substantive difference really between the two supplements. We might well be underpowered (mainly because I didn’t want to spend too long drawing dots and lines!)</p>
<p>But we can still use this kind of visualisation, along with everything else we understand about the data and data generating process (DGP), to try to figure out the best way of modelling the data we have.</p>
</section>
<section id="towards-modelling" class="level3">
<h3 class="anchored" data-anchor-id="towards-modelling">Towards modelling</h3>
<p>What’s our simplest possible model? It’s probably the mean.</p>
<p>Yes, the mean is a model. It’s the linear regression of y (our weight response value) against the intercept:</p>
<p><img src="https://latex.codecogs.com/png.latex?M1:%20%5Cquad%20y%20=%20%5Calpha%20+%20%5Cepsilon,%20%5Cqquad%20%5Cepsilon%20%5Csim%20N(0,%20%5Csigma%5E2)"></p>
<p>In R, something like:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1">mod01 <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">lm</span>(weight <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,</span>
<span id="cb1-2">             <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">data =</span> data)</span></code></pre></div></div>
<p>Graphically:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-06-m1-graph.png" class="img-fluid figure-img"></p>
<figcaption>M1 graphically — a horizontal line (the mean, α) through the data</figcaption>
</figure>
</div>
<p>Not a very useful model. Let’s try to do better, firstly by accounting for the two arms (Supp A or Supp B).</p>
<p><img src="https://latex.codecogs.com/png.latex?M2:%20%5Cquad%20y%20=%20%5Calpha_0%20+%20%5Calpha_B%20+%20%5Cepsilon,%20%5Cqquad%20%5Cepsilon%20%5Csim%20N(0,%20%5Csigma%5E2)"></p>
<p><img src="https://latex.codecogs.com/png.latex?%5Ctext%7Bwhere%20%7D%20%5Calpha_B%20=%20%5Cbegin%7Bcases%7D%201%20&amp;%20%5Ctext%7Biff%20%7D%20Supp%20=%20B%20%5C%5C%200%20&amp;%20%5Ctext%7Biff%20%7D%20Supp%20=%20A%20%5Cend%7Bcases%7D"></p>
<p>In R, something like:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1">mod02 <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">lm</span>(wt <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> is_supp_B,</span>
<span id="cb2-2">            <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">data =</span> dta <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb2-3">              <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mutate</span>(</span>
<span id="cb2-4">                <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">is_supp_B =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ifelse</span>(</span>
<span id="cb2-5">                  Supp <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"B"</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb2-6">              )</span>
<span id="cb2-7">            )</span></code></pre></div></div>
<p>And graphically:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-07-m2-graph.png" class="img-fluid figure-img"></p>
<figcaption>M2 graphically — two horizontal lines, at α₀ and α₀ + α_B</figcaption>
</figure>
</div>
<p>So, <img src="https://latex.codecogs.com/png.latex?%5Calpha_0"> is the mean of y for Supp A, and <img src="https://latex.codecogs.com/png.latex?%5Calpha_0%20+%20%5Calpha_B"> (not <img src="https://latex.codecogs.com/png.latex?%5Calpha_B"> alone) the mean of y for Supp B.</p>
<p>This might look like an improvement, but in some ways it’s not. It’s a wrong turn. For instance, what would happen if Supp B really causes the most weight gain, but the average subject in the Supp A arm both tends to be heavier and to be visited more often and to exit the study earlier?</p>
<p>With this kind of model, we might end up thinking Supp A, not Supp B, is ‘better’ because its model-implied mean value is higher.</p>
<p>In both of the models so far, we haven’t yet modelled the effect of time. Let’s look at that:</p>
<p><img src="https://latex.codecogs.com/png.latex?M3:%20%5Cquad%20y%20=%20%5Calpha%20+%20%5Cbeta%20t%20+%20%5Cepsilon,%20%5Cqquad%20%5Cepsilon%20%5Csim%20N(0,%20%5Csigma%5E2)"></p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-08-m3-graph.png" class="img-fluid figure-img"></p>
<figcaption>M3 graphically — a single upward-sloping line with slope β</figcaption>
</figure>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb3-1">mod03 <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">lm</span>(y <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> days_since_start,</span>
<span id="cb3-2">            <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">data =</span> dta)</span></code></pre></div></div>
<p>Great, now we’ve got a coefficient for capturing the trend over time. However, we haven’t included some way of representing:</p>
<ol type="i">
<li>the subject membership of observations</li>
<li>the difference in growth trends between supplement arms</li>
</ol>
<p>Let’s start with the second issue. One naive approach would be to include a coefficient for a flag variable, which is 1 if the arm is Sup B, but 0 otherwise.</p>
<p><img src="https://latex.codecogs.com/png.latex?M4:%20%5Cquad%20y%20%5Csim%20%5Calpha_0%20+%20%5Calpha_B%20+%20%5Cbeta%20t%20+%20%5Cepsilon,%20%5Cqquad%20%5Cepsilon%20%5Csim%20N(0,%20%5Csigma%5E2)"></p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-09-m4-graph.png" class="img-fluid figure-img"></p>
<figcaption>M4 graphically — two parallel sloped lines, at α₀ + βt and α₀ + α_B + βt</figcaption>
</figure>
</div>
<p>But again, like M02, this doesn’t actually allow for the <em>trend</em> to be different between the two arms, which is what we need to try to calculate.</p>
<p>In M02 and M04, we have in effect ‘split’ the <img src="https://latex.codecogs.com/png.latex?%5Calpha"> parameters controlling the intercept, in two:</p>
<p><img src="https://latex.codecogs.com/png.latex?%5Calpha%20%5Crightarrow%20%5Calpha_0%20+%20%5Calpha_B"></p>
<p>The clue to the solution is to realise this same kind of coefficient ‘splitting’ that we’ve applied to the intercept parameter <img src="https://latex.codecogs.com/png.latex?%5Calpha"> can also (or instead) be applied to the slope coefficient <img src="https://latex.codecogs.com/png.latex?%5Cbeta">:</p>
<p><img src="https://latex.codecogs.com/png.latex?y%20%5Csim%20%5Calpha%20+%20%5Cbeta%20t"></p>
<p><img src="https://latex.codecogs.com/png.latex?%5Cbeta%20%5Crightarrow%20%5Cbeta_0%20+%20%5Cbeta_B"></p>
<p><span style="color: #2e8b57;">(where <img src="https://latex.codecogs.com/png.latex?%5Cbeta_B"> = 1 iff arm = B, 0 otherwise)</span></p>
<p>Substituting:</p>
<p><img src="https://latex.codecogs.com/png.latex?M5:%20%5Cquad%20y%20%5Csim%20%5Calpha%20+%20(%5Cbeta_0%20+%20%5Cbeta_B)t"></p>
<p>So, we now have another coefficient <img src="https://latex.codecogs.com/png.latex?%5Cbeta_B"> (to be determined) that allows a different slope for Supp B than Supp A.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-10-slope-comparisons.png" class="img-fluid figure-img"></p>
<figcaption>Slope comparisons — slope for B steeper than A if β_B &gt; 0; shallower if β_B &lt; 0</figcaption>
</figure>
</div>
<div style="color: #2e8b57; border: 1px solid #2e8b57; border-radius: 4px; padding: 0.5em 1em;">
<p><strong>Note:</strong> As <img src="https://latex.codecogs.com/png.latex?y%20%5Csim%20%5Calpha%20+%20%5Cbeta%20t"> is <em>nested in</em> (a restricted version of) <img src="https://latex.codecogs.com/png.latex?y%20%5Csim%20%5Calpha%20+%20(%5Cbeta_0%20+%20%5Cbeta_B)t"> we can run an <strong>F-test</strong> as one way of testing if Supp B has a diff slope to Supp A.</p>
</div>
<p>This kind of model spec helps for comparing the slopes, but now we’ve neglected the fact of observations being grouped in subjects. <span style="color: #2e8b57;">(&amp; subjects have different initial weights)</span></p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-11-subject-glyph.png" class="img-fluid figure-img"></p>
<figcaption>Glyph — a subject ‘holding’ their grouped observations</figcaption>
</figure>
</div>
<p>How do we try to account for this too?</p>
</section>
<section id="an-interesting-detour" class="level3">
<h3 class="anchored" data-anchor-id="an-interesting-detour">An ‘Interesting’ Detour</h3>
<p>Maybe we shouldn’t be thinking about one model, but</p>
</section>
</section>
<section id="many-models" class="level2">
<h2 class="anchored" data-anchor-id="many-models">MANY Models ??!</h2>
<p>If we arrange the data into many facets, one for each subject, we can do a simple regression for each subject series?</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-12-many-models-panels.png" class="img-fluid figure-img"></p>
<figcaption>Many models — a panel of small per-subject regressions</figcaption>
</figure>
</div>
<p>We could compare the slope coefficients for each of these series, and maybe see if the types of slope coefficient for Supp A arm looks different to that for Supp B arm.</p>
<p>We could even represent our uncertainty in the coeffs visually, producing something like a forest plot (used in meta analysis):</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-13-forest-plot.png" class="img-fluid figure-img"></p>
<figcaption>Forest plot — per-subject slope estimates (points) with uncertainty intervals (lines), grouped by arm</figcaption>
</figure>
</div>
<p>We could even use other techniques from meta analysis, like weighting points by the inverse of variance (meaning the wider the blue lines, the smaller the weight) to get a pooled estimate for each arm, and then try to compare the two pooled point estimates and their respective pooled uncertainty.</p>
<div style="color: #2e8b57;">
<p><strong>Note:</strong> By convention, pooled estimates are represented as diamonds:</p>
</div>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-14-pooled-estimate-glyphs.png" class="img-fluid figure-img"></p>
<figcaption>Pooled-estimate glyph conventions — individual estimates vs the pooled-estimate diamond, and diamonds for the Arm A and Arm B pooled estimates</figcaption>
</figure>
</div>
<p>However, although this approach is maybe interesting to think about (not least as it effectively treats each subject as a separate n-of-1 ‘study’) it’s not something I’ve seen before, and it’s almost certainly not a particularly good approach for all kinds of reasons. I’ve mainly just mentioned it to help with the intuition some more…</p>
<section id="back-on-track" class="level3">
<h3 class="anchored" data-anchor-id="back-on-track">Back on Track</h3>
<p>So if meta-analysis isn’t actually used for this kind of problem, what is?</p>
<p>It’s something between</p>
<p><strong>One Model</strong> AND <strong>MANY models</strong></p>
<p>It’s called multi-level modelling because we have multi-level data:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-15-one-vs-many.png" class="img-fluid figure-img"></p>
<figcaption>Multi-level data — different grouping structures, with varying numbers of observations per group</figcaption>
</figure>
</div>
</section>
<section id="how-does-it-work" class="level3">
<h3 class="anchored" data-anchor-id="how-does-it-work">How does it work?</h3>
<p>Well, we need to tell the model about the way the data are grouped.</p>
<p>Let’s go back to the fundamentals… A (generalised) linear model is:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-16-glm-equations.png" class="img-fluid figure-img"></p>
<figcaption>The Grandmother Model equations — stochastic component (blue) and systematic component (red), with the α highlighted</figcaption>
</figure>
</div>
<div style="color: #2e8b57; border: 1px solid #2e8b57; border-radius: 4px; padding: 0.5em 1em;">
<p><strong>Note:</strong> This is a very generalised &amp; abstracted notation. The <img src="https://latex.codecogs.com/png.latex?%5Calpha"> &amp; <img src="https://latex.codecogs.com/png.latex?%5Cbeta"> here mean something different to the <img src="https://latex.codecogs.com/png.latex?%5Calpha"> &amp; <img src="https://latex.codecogs.com/png.latex?%5Cbeta"> used elsewhere in this post.</p>
</div>
<p>This is what I’ve called before the Grandmother Model, a general framework for thinking about what statistical models contain. In a previous post I referred to <img src="https://latex.codecogs.com/png.latex?g(.)"> as a TRANSFORMER, and <img src="https://latex.codecogs.com/png.latex?f(.)"> as a NOISEMAKER, and drew them as follows:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-17-model-transformer-noisemaker.png" class="img-fluid figure-img"></p>
<figcaption>The Model box — the g(.) transformer feeding the f(.) noisemaker, with β and α as their respective inputs</figcaption>
</figure>
</div>
<p>So, we have two places where we can ‘tell’ our model about how our observations are grouped into subjects: we can either tell the transformer <img src="https://latex.codecogs.com/png.latex?g(.)">, or we can tell the noisemaker <img src="https://latex.codecogs.com/png.latex?f(.)">. Which of the two components we tell affects what the model tends to be called:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-18-tell-table.png" class="img-fluid figure-img"></p>
<figcaption>Component we ‘tell’ vs what we call the model — transformer g(.) → Fixed Effects Model; noisemaker f(.) → Random Effects Model</figcaption>
</figure>
</div>
<p>And both of these types of model can be referred to as either <span style="color: #9955bb;"><strong>Mixed Effects Models</strong></span> or <span style="color: #9955bb;"><strong>Multi-level Models</strong></span>.</p>
<p>If you’ve ever encountered these terms and haven’t been sure what they mean, then hopefully this clarifies a few things.</p>
<p>Let’s now think through how we could ‘tell’ our model about group-level membership of observations, first through the transformer, <img src="https://latex.codecogs.com/png.latex?g(.)">, leading to a fixed effects model specification, then through the noisemaker, <img src="https://latex.codecogs.com/png.latex?f(.)">, leading to a random effects model.</p>
</section>
<section id="fixed-effects-model-approach" class="level3">
<h3 class="anchored" data-anchor-id="fixed-effects-model-approach">Fixed Effects model approach</h3>
<p>Let’s say we have J groups. We could include, in our model, J additional dummy variables, each of which takes the value 1 if the observation comes from group j, 0 otherwise.</p>
<p>In doing this, we’re expanding the intercept part of our model, potentially a lot:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-19-fe-equation-expansion.png" class="img-fluid figure-img"></p>
<figcaption>Fixed effects equation expansion — the intercept part (green) expands into J flag terms; slope part (purple) and error part (orange) unchanged; shown long-hand then as a summation</figcaption>
</figure>
</div>
<p>(where <img src="https://latex.codecogs.com/png.latex?F_j"> indicates a Flag variable which is 1 if obs is in group j; 0 otherwise.)</p>
<p>This fixed effects modelling approach is less exotic than it might first appear. We’re just adding some more <img src="https://latex.codecogs.com/png.latex?%5Cbeta"> coefficients to the transformer part of the model <img src="https://latex.codecogs.com/png.latex?g(.)"> to be determined through the usual approaches (maximum likelihood, optimisation and so on).</p>
<p>However, with this approach we’re potentially adding a lot of additional coefficients to our model, and if there are a lot of groups, each of which might only contain a handful of observations, this approach might be unnecessarily complicated and ‘gluttonous’, munching its way through our finite data budget in a very inefficient way that leaves little resource left to help improve the fit on the coefficients we actually care about (those on the slope and slope-difference-by-arm part of the model).</p>
<div style="color: #c0392b; border: 1px solid #c0392b; border-radius: 4px; padding: 0.5em 1em;">
<p><strong>A mildly barbed aside:</strong> This kind of resource-munching and often-inefficient modelling approach seems surprisingly popular with economists and econometricians…</p>
</div>
<p>So, is there a more efficient way of ‘telling’ a model about group differences, especially when there are many groups, many of which involve few observations? Yes there is! It’s the…</p>
</section>
<section id="random-effects-model-specification" class="level3">
<h3 class="anchored" data-anchor-id="random-effects-model-specification">Random Effects Model Specification</h3>
<p>In the Random Effects (RE) model specification, we ‘tell’ the noisemaker (<img src="https://latex.codecogs.com/png.latex?f(.)">), not the transformer (<img src="https://latex.codecogs.com/png.latex?g(.)">), part of the model about the ‘groupiness’ of the data.</p>
<p>So, in RE, the ‘action’ is in the bit of the specification highlighted orange at the end:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-20-re-equation.png" class="img-fluid figure-img"></p>
<figcaption>The RE starting point — Y_ij = β₀ + β₁t + ε, with intercept part (green), slope part (purple) and error/‘noisemaker’ part (orange) labelled</figcaption>
</figure>
</div>
<p>As with the FE model, we can imagine ‘splitting’ a component of the above into two or more subcomponents. In this case it’s the orange component <img src="https://latex.codecogs.com/png.latex?%5Cepsilon">:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-21-variance-decomposition.png" class="img-fluid figure-img"></p>
<figcaption>Variance decomposition — overall variation (ε) = group-level variation (τ) + residual/remaining variation (e)</figcaption>
</figure>
</div>
<p>Usually, both <img src="https://latex.codecogs.com/png.latex?%5Ctau"> &amp; <img src="https://latex.codecogs.com/png.latex?e"> are draws from a Normal distribution:</p>
<p><img src="https://latex.codecogs.com/png.latex?%5Ctau%20%5Csim%20N(.,%20%5Ctheta_J)"></p>
<p><img src="https://latex.codecogs.com/png.latex?e%20%5Csim%20N(.,%20%5Ctheta)"></p>
<p>Say at <img src="https://latex.codecogs.com/png.latex?t=0"> there are 8 groups (<img src="https://latex.codecogs.com/png.latex?J=8">), and the starting values for each group look as follows:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-22-group-starting-values.png" class="img-fluid figure-img"></p>
<figcaption>Group starting values — eight group-level values y₀₁ … y₀₈ scattered around the overall mean ȳ₀</figcaption>
</figure>
</div>
<p>In a FE model there are 8 flags which indicate how much to shift up or down from the overall intercept <img src="https://latex.codecogs.com/png.latex?%5Cbar%7By%7D_0">:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-23-fe-flags.png" class="img-fluid figure-img"></p>
<figcaption>FE representation — eight flags, one per group, each encoding that group’s deviation from the overall intercept</figcaption>
</figure>
</div>
<p>In an RE model all of this group level variation is simplified and stylised as draws from a single Normal distribution:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-24-re-normal.png" class="img-fluid figure-img"></p>
<figcaption>RE representation — group-level variation summarised as a single Normal distribution around the overall intercept</figcaption>
</figure>
</div>
<p>So, the aim of this approach is to represent the ‘gist’ of the observed group-level variation in fewer parameters. This means less of the data budget is ‘spent’ on representing group level variation, and so more of the budget can be spent on better estimating other model parameters instead.</p>
</section>
<section id="modelling-what-were-actually-interested-in-modelling" class="level3">
<h3 class="anchored" data-anchor-id="modelling-what-were-actually-interested-in-modelling">Modelling what we’re actually interested in modelling</h3>
<p>After all this discussion about how to represent group level variation, it’s important not to lose sight of what we’re trying to do, namely: see if Supp B has a higher weight gain trend than Supp A.</p>
<p>We’re now used to the idea of splitting out the components of a regression model, as they relate to intercepts, slopes, and ‘errors’, and the way we need to do that one more time to get a model containing coefficients that can help us answer our main research question.</p>
<p>Let’s draw out our RE model spec again, but slightly differently:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-25-regrouped-spec.png" class="img-fluid figure-img"></p>
<figcaption>The RE spec regrouped — Y_ij = (β₀ + τ) + β₁t + e, with intercept, slope and error parts labelled and systematic/stochastic glyphs marking each term</figcaption>
</figure>
</div>
<p>Here I’ve grouped the intercept part into a systematic component (<img src="https://latex.codecogs.com/png.latex?%5Cbeta_0">) and a stochastic component (<img src="https://latex.codecogs.com/png.latex?%5Ctau">), where <img src="https://latex.codecogs.com/png.latex?%5Ctau%20%5Csim%20N(0,%20%5Csigma_J%5E2)">. The model’s exactly the same, it’s just rearranged.</p>
<p>The purpose of this rearrangement is to make it easier to see what component to focus on, and ‘split’, in order to answer the research question about whether the two supplements have different weight change trajectories. As we’re interested in trajectories we know the component to target is the slope; more specifically <img src="https://latex.codecogs.com/png.latex?%5Cbeta_1">:</p>
<p><img src="https://latex.codecogs.com/png.latex?%5Cbeta_1%20%5Crightarrow%20%5Cbar%7B%5Cbeta_1%7D%20+%20%5Cbeta_%7B1B%7D"></p>
<p><img src="https://latex.codecogs.com/png.latex?%5Ctext%7Bwhere%20%7D%20%5Cbeta_%7B1B%7D%20=%20%5Cbegin%7Bcases%7D%201%20&amp;%20%5Ctext%7Biff%20%7D%20Supp%20=%20B%20%5C%5C%200%20&amp;%20%5Ctext%7Botherwise%7D%20%5Cend%7Bcases%7D"></p>
<p>Substituting:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-26-final-spec.png" class="img-fluid figure-img"></p>
<figcaption>Substituting the split slope into the regrouped spec, giving the final model: Y_ij = β₀ + τ + (β̄₁ + β₁B)t + e</figcaption>
</figure>
</div>
<p>Which will be our final model specification.</p>
</section>
<section id="testing-and-interpreting-the-model" class="level3">
<h3 class="anchored" data-anchor-id="testing-and-interpreting-the-model">‘Testing’ and interpreting the model</h3>
<p>One easy test we can perform is by comparing the above specification, including a coefficient that flags arm B, with a restricted model that omits this term:</p>
<p><img src="https://latex.codecogs.com/png.latex?M_%7BFull%7D:%20%5Cquad%20Y_%7Bij%7D%20=%20%5Cbeta_0%20+%20%5Ctau%20+%20(%5Cbar%7B%5Cbeta_1%7D%20+%20%5Cbeta_%7B1B%7D)t%20+%20e"></p>
<p><img src="https://latex.codecogs.com/png.latex?M_%7BRest%7D:%20%5Cquad%20Y_%7Bij%7D%20=%20%5Cbeta_0%20+%20%5Ctau%20+%20%5Cbeta_1%20t%20+%20e"></p>
<p>We can compare the two models in a number of ways: if both are fit with Maximum Likelihood (ML) estimation, we can perform an F-test, looking for a statistically significant p-value.</p>
<p>If this fails, we can still make use of measures like AIC or BIC, where by convention we ‘prefer’ the model with the lowest score.</p>
<p>Implicitly, the t-value on the coefficient <img src="https://latex.codecogs.com/png.latex?%5Cbeta_%7B1B%7D"> tests for something akin to this model comparison. If the p-value associated with the t test on this coefficient is below 0.05 that’s reasonable evidence of there being a real difference in slope between arms.</p>
<p>In R, there are a number of packages and functions that can run the above model. As an example, using the <code>lmer</code> function in the <code>lme4</code> package we could write something like:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/fig-27-lmer-code.png" class="img-fluid figure-img"></p>
<figcaption>The lme4::lmer call, handwritten in blue, with the arm-by-time interaction highlighted purple and the random-intercept term highlighted orange</figcaption>
</figure>
</div>
<p>Our main coefficient of interest is the term highlighted <span style="background-color: #f0b3f0; color: #000;">purple</span>, and our random intercepts component is highlighted <span style="background-color: #ffd9a3; color: #000;">orange</span>.</p>
<p>Using the <code>summary()</code> function, summaries of both the fixed effects and random effects components will be returned.</p>
</section>
<section id="discussion" class="level3">
<h3 class="anchored" data-anchor-id="discussion">Discussion</h3>
<p>In this long excursion through grouped data analysis, we’ve focused on a very fictitious and unrealistic example: how best to make <em>people</em> fat.</p>
<p>However, if we change the species and context even this example is probably useful in practice. Imagine we work in farming, for example, and have bought a lot of baby chickens or cows, and want to decide on a type of feed to help them ‘grow’ the fastest.</p>
<p>Often the animals (‘livestock’) will be quite homogeneous, from the same genetic stock and often even of the same sex. This kind of modelling approach would probably work for figuring out what type of feed to use in a way that’s both fairly robust and fairly cheap. (Though as a vegetarian, I’d rather have come up with a different real world application of this kind of model!)</p>
<p>Even if this specific model specification isn’t useful for you, hopefully the broader processes and steps covered — thinking about the data, the questions we want to ask of it and so on — is helpful for trying to ‘operationalise’ other data analysis challenges too!</p>
<hr>
</section>
<section id="claudes-reflection-on-this-transcription" class="level3">
<h3 class="anchored" data-anchor-id="claudes-reflection-on-this-transcription">Claude’s reflection on this transcription</h3>
<p><em>This section is written by Claude (Fable 5), reflecting on this second transcription attempt and on what changed since the first.</em></p>
<p>The February 2026 attempt by Opus 4.6 ended its reflection by proposing exactly this experiment: revisit the same source image with a newer model and see how the accuracy changes. Five months later, the answer is: substantially — and on two distinct axes.</p>
<p><strong>Axis one: reading the words.</strong> The 73,475-pixel scan was sliced into 27 overlapping segments at native resolution, and every segment read against the earlier transcription. Around twenty errors in the first attempt were identified, falling into recognisable failure modes:</p>
<ul>
<li><strong>Plausible substitution</strong>: “consider <em>sex</em> as a control variable” had become “age” (the worked dataset has a Sex column and no Age column); “an <em>F-test</em>” had become “Likelihood Ratio Tests”; “a separate <em>n-of-1</em> ‘study’” had become “n=2”. Each substitute is the kind of thing a statistician plausibly <em>would</em> write — which is what makes this failure mode dangerous.</li>
<li><strong>Silent omission</strong>: the AIC/BIC fallback sentence, the <img src="https://latex.codecogs.com/png.latex?M_%7BFull%7D">/<img src="https://latex.codecogs.com/png.latex?M_%7BRest%7D"> nested-model equations, the “An ‘Interesting’ Detour” heading, and the Grandmother Model passage were all simply absent.</li>
<li><strong>Invention</strong>: the closing sentence of the testing section did not exist in the source. (The first attempt’s reflection candidly reported a larger hallucination it had already caught — a fabricated paragraph about Satterthwaite approximations — so this smaller residual invention fits the pattern it described.)</li>
<li><strong>Word-level drift</strong>: “Subject-Dates” → “Subject-Time”, “facets” → “panels”, “used” → “good”, swapped symbols in the variance decomposition, and similar.</li>
</ul>
<p><strong>Axis two: demarcating the canvas.</strong> This was the deeper limitation of the first attempt, and Jon’s framing of it is exact: the problem “wasn’t just the transcription of text; it was also the demarcation of which portions of the canvas relate to images, tables, glyphs and figures.” The first attempt’s 21 crops were segmentations of convenience — several swallowed multiple paragraphs of body prose into “figure” images (its <code>img_09</code>, for instance, contained five paragraphs of flowing text alongside the diagrams it was named for), one caption described contents its image didn’t have, and hand-written equations transcribable as mathematics were left as pixels.</p>
<p>For this attempt the canvas was re-segmented from the source: a team of Claude Opus 5 agents each swept a range of slices and classified every non-prose entity — figure, table, plain equation, annotated equation, code, coloured note-box, coloured prose — with tight pixel boundaries. Reconciling their maps against Fable 5’s own reading produced the 27 fresh crops used above, cut to hug the graphical content. The consequences for the reader:</p>
<ul>
<li><strong>Prose is text.</strong> Every flowing paragraph, including those the first attempt left inside images, is now selectable, searchable, quotable text.</li>
<li><strong>Plain equations are mathematics.</strong> M1–M5, the variance-decomposition distributions, the slope split, and the full/restricted model pair are rendered as LaTeX. Only equations whose <em>annotations</em> carry meaning — highlighter boxes, coloured labels, glyph arrows — remain as images, because there the drawing is the content.</li>
<li><strong>Boxed notes are callouts.</strong> The green F-test note, the green notation caveat, and the red “mildly barbed aside” are styled text blocks in their original colours, not screenshots of handwriting.</li>
<li><strong>Figures are figures.</strong> What remains as image — sketches, plots, diagrams, tables, glyphs, annotated equations, highlighted code — is there because it is genuinely graphical, and each crop now contains that entity and little else.</li>
</ul>
<p><strong>The benchmark point.</strong> This post and <a href="../../../posts/handdrawn-stats/repeated-measures-transcribed/index.html">its predecessor</a> now form a two-point series against a fixed, unchanging source document. The first attempt rated itself 60–70% successful and identified raw pixel-reading as its bottleneck. This attempt found the source fully legible, and found the harder residual problem to be segmentation judgement — decisions about what <em>kind</em> of content each region is. If a future model repeats the exercise, the interesting questions will be whether it catches reading errors this pass missed, and whether it would carve the canvas differently again.</p>


</section>
</section>

 ]]></description>
  <category>statistics</category>
  <category>multi-level-modelling</category>
  <category>random-effects</category>
  <category>handdrawn-stats</category>
  <category>AI-transcription</category>
  <guid>https://blog.jonminton.net/posts/handdrawn-stats/repeated-measures-transcribed-fable-5/</guid>
  <pubDate>Thu, 30 Jul 2026 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Each dot is doing a lot of work: rebuilding the viral AI adoption chart</title>
  <dc:creator>Claude Fable 5 (Anthropic)</dc:creator>
  <link>https://blog.jonminton.net/posts/ai-adoption-chart-rebuilt/</link>
  <description><![CDATA[ 






<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>A note on authorship
</div>
</div>
<div class="callout-body-container callout-body">
<p>This post was written by Claude (Fable 5), Anthropic’s LLM, working as an agent in Jon’s blog repository - researching the source figures, building the dataset, and writing the analysis and code below. Jon commissioned, reviewed and edited it. It is the technical companion to his post <a href="../../posts/krang-and-the-waffle/index.html">Krang and the Waffle</a>, which uses the animated version of this chart and is about something else entirely.</p>
</div>
</div>
<p>In late February 2026 a waffle chart went viral: 2,500 dots, each standing for about 3.2 million people, coloured by their “most advanced AI interaction”. A vast grey field of people who had never used AI (84%), a green band of free chatbot users (16%), a sliver of yellow for the 15–25 million paying $20 a month, and a single red dot for the 2–5 million using AI coding tools. The chart was created by AI consultant Damian Player, posted to LinkedIn and X, and within days was being reshared with the same caption everywhere: <em>you’re early</em>.</p>
<p>It is a genuinely effective piece of visual rhetoric, and its central claim survives scrutiny: the Microsoft AI Economy Institute’s diffusion report, published in January 2026, found that 16.3% of the world’s working-age population used a generative AI product in the second half of 2025. But three things about the chart do not survive scrutiny, and they are the kind of things a statistician is contractually obliged to be annoying about.</p>
<p>First, a denominator error. Microsoft’s 16.3% is a share of the <em>working-age</em> population, ages 15 to 64. The chart applies it to all 8.1 billion humans to get 1.3 billion users; applied to the correct base it gives something closer to 860–960 million. Second, the paid tier is understated by three to four times: ChatGPT alone had around 35 million paying subscribers by mid-2025 according to Reuters, and OpenAI reported over 50 million paying consumer subscribers by early 2026, before adding Claude, Gemini, Perplexity and the rest. Third, the red dot is similarly undercounted: GitHub Copilot alone reported 4.7 million paid subscribers in Microsoft’s January 2026 earnings, and an overlap-adjusted estimate across Copilot, Cursor, Codex and Claude Code lands at 6–10 million rather than 2–5. There is also a conflation the chart cannot represent at all: around 2.2 billion of the grey dots have no internet access whatsoever (ITU), which makes them a story about electrification and infrastructure, not about AI reluctance.</p>
<p>None of this reverses the chart’s message. Most of the world has not used these tools, and the people arguing about them online are a rounding error. But “directionally right, numerically wrong, and flattering to the person resharing it” is more or less the formula for virality, and it seemed worth rebuilding the thing properly: corrected tiers, explicit uncertainty ranges, the offline population split out, and – since the interesting part is the movement – a time dimension covering mid-2023 to early 2026.</p>
<p>The rebuilt dataset is a small tidy CSV of seven snapshots, each with mid, low and high estimates per tier and a source note. The honest caveat: the Microsoft telemetry series only begins in the first half of 2025, so the 2023–2024 points are triangulated from OpenAI user disclosures and connectivity data. They are order-of-magnitude estimates with wide brackets, not like-for-like with the telemetry era. The only consistently measured segment is Microsoft’s own run: 15.1% (H1 2025), 16.3% (H2 2025), 17.8% (Q1 2026).</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(tidyverse)</span>
<span id="cb1-2"></span>
<span id="cb1-3">n_side <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>L</span>
<span id="cb1-4">n_dots <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> n_side<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">^</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb1-5"></span>
<span id="cb1-6">df <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">read_csv</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ai_adoption_timeseries.csv"</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb1-7">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">select</span>(snapshot_date, category, value_millions) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb1-8">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pivot_wider</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">names_from =</span> category, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">values_from =</span> value_millions) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb1-9">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mutate</span>(</span>
<span id="cb1-10">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">coding  =</span> coding_tool_users,</span>
<span id="cb1-11">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">paid    =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmax</span>(paid_subscribers <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> coding_tool_users, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>),</span>
<span id="cb1-12">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">free    =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmax</span>(genai_users_ever <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> paid_subscribers, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>),</span>
<span id="cb1-13">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">offline =</span> offline_no_internet,</span>
<span id="cb1-14">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">never_online =</span> world_population <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> genai_users_ever <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> offline_no_internet</span>
<span id="cb1-15">  ) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb1-16">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">select</span>(snapshot_date, world_population,</span>
<span id="cb1-17">         offline, never_online, free, paid, coding) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb1-18">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pivot_longer</span>(<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(snapshot_date, world_population),</span>
<span id="cb1-19">               <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">names_to =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tier"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">values_to =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"millions"</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb1-20">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mutate</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">tier =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">factor</span>(</span>
<span id="cb1-21">    tier,</span>
<span id="cb1-22">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">levels =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"offline"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"never_online"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"free"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"paid"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"coding"</span>),</span>
<span id="cb1-23">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">labels =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Offline (no internet)"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Online, never used gen AI"</span>,</span>
<span id="cb1-24">               <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Free-tier user"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Paid subscriber"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Coding-tool user"</span>)</span>
<span id="cb1-25">  ))</span></code></pre></div></div>
</div>
<p>Dots are allocated by largest-remainder rounding to exactly 2,500 per snapshot, with a guaranteed minimum of one dot for any non-zero tier – the same choice the original made for its single red dot, made explicit here.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1">allocate_dots <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(millions, total_millions, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">n =</span> n_dots) {</span>
<span id="cb2-2">  raw   <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> millions <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> total_millions <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> n</span>
<span id="cb2-3">  base  <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">floor</span>(raw)</span>
<span id="cb2-4">  base  <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">if_else</span>(millions <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> base <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, base)</span>
<span id="cb2-5">  short <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> n <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(base)</span>
<span id="cb2-6">  rem   <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> raw <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">floor</span>(raw)</span>
<span id="cb2-7">  order_idx <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">order</span>(rem, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">decreasing =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>)</span>
<span id="cb2-8">  add <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">integer</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">length</span>(millions))</span>
<span id="cb2-9">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (short <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>) add[order_idx[<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">seq_len</span>(short)]] <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>L</span>
<span id="cb2-10">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (short <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>) {</span>
<span id="cb2-11">    big <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">order</span>(base, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">decreasing =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>)</span>
<span id="cb2-12">    add[big[<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">seq_len</span>(<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>short)]] <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>L</span>
<span id="cb2-13">  }</span>
<span id="cb2-14">  base <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> add</span>
<span id="cb2-15">}</span>
<span id="cb2-16"></span>
<span id="cb2-17">grid <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> df <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb2-18">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">group_by</span>(snapshot_date) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb2-19">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mutate</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dots =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">allocate_dots</span>(millions, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">first</span>(world_population))) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb2-20">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">reframe</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">tier =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rep</span>(tier, dots)) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb2-21">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">group_by</span>(snapshot_date) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb2-22">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mutate</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">idx =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">row_number</span>() <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>L,</span>
<span id="cb2-23">         <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">col =</span> idx <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%%</span> n_side,</span>
<span id="cb2-24">         <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">row =</span> idx <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%/%</span> n_side) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb2-25">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ungroup</span>()</span>
<span id="cb2-26"></span>
<span id="cb2-27">pal <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(</span>
<span id="cb2-28">  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Offline (no internet)"</span>     <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#A89F93"</span>,</span>
<span id="cb2-29">  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Online, never used gen AI"</span> <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#D9D5CD"</span>,</span>
<span id="cb2-30">  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Free-tier user"</span>            <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#6FA877"</span>,</span>
<span id="cb2-31">  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Paid subscriber"</span>           <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#D9A441"</span>,</span>
<span id="cb2-32">  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Coding-tool user"</span>          <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#B5493F"</span></span>
<span id="cb2-33">)</span></code></pre></div></div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb3-1">latest <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">max</span>(grid<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>snapshot_date)</span>
<span id="cb3-2">pop_latest <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> df <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb3-3">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">filter</span>(snapshot_date <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> latest) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb3-4">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pull</span>(world_population) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb3-5">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">first</span>()</span>
<span id="cb3-6"></span>
<span id="cb3-7">grid <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb3-8">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">filter</span>(snapshot_date <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> latest) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb3-9">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ggplot</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">aes</span>(col, <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>row, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">fill =</span> tier)) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb3-10">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">geom_tile</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">width =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.82</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">height =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.82</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb3-11">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">scale_fill_manual</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">values =</span> pal, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">name =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">NULL</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb3-12">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">guides</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">fill =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">guide_legend</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">nrow =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">byrow =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>)) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb3-13">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">coord_equal</span>() <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb3-14">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">theme_void</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">base_family =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mono"</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb3-15">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">theme</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">legend.position =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bottom"</span>,</span>
<span id="cb3-16">        <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">plot.title =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">element_text</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">family =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"serif"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">size =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">18</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">hjust =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span>),</span>
<span id="cb3-17">        <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">plot.subtitle =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">element_text</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">size =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">hjust =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span>,</span>
<span id="cb3-18">                                     <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">colour =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"grey40"</span>)) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb3-19">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">labs</span>(</span>
<span id="cb3-20">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">title =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sprintf</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Each dot is ~%.1f million people"</span>,</span>
<span id="cb3-21">                    pop_latest <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> n_dots),</span>
<span id="cb3-22">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">subtitle =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sprintf</span>(</span>
<span id="cb3-23">      <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"2,500 dots = %.2f billion humans. Colour = deepest gen-AI engagement, %s."</span>,</span>
<span id="cb3-24">      pop_latest <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1000</span>, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">format</span>(latest, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"%b %Y"</span>))</span>
<span id="cb3-25">  )</span></code></pre></div></div>
<div class="cell-output-display">
<div id="fig-waffle-latest" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-waffle-latest-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://blog.jonminton.net/posts/ai-adoption-chart-rebuilt/index_files/figure-html/fig-waffle-latest-1.png" class="img-fluid figure-img" width="672">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-waffle-latest-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1: The corrected chart, March 2026. Compared with the viral original: users applied to the right denominator, paid and coding tiers scaled to reported subscriber figures, and the offline population split out of the grey monolith.
</figcaption>
</figure>
</div>
</div>
</div>
<p>The animated version – the green band advancing up the grid from mid-2023, the amber and red corner slowly becoming visible to the naked eye – is built with <code>gganimate</code> from the same grid object. It appears in <a href="../../posts/krang-and-the-waffle/index.html">Krang and the Waffle</a>, so I have kept it out of this post rather than render the same movement twice; the script that produces it (<code>ai_adoption_waffle.R</code>), along with the data and an interactive React version with a play control (<code>ai-adoption-motion.jsx</code>), sits alongside this post’s source.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb4-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(gganimate)</span>
<span id="cb4-2"></span>
<span id="cb4-3">p_anim <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> grid <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb4-4">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ggplot</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">aes</span>(col, <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>row, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">fill =</span> tier)) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb4-5">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">geom_tile</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">width =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.82</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">height =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.82</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb4-6">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">scale_fill_manual</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">values =</span> pal, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">name =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">NULL</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb4-7">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">guides</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">fill =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">guide_legend</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">nrow =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">byrow =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>)) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb4-8">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">coord_equal</span>() <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb4-9">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">theme_void</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">base_family =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mono"</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb4-10">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">theme</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">legend.position =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bottom"</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb4-11">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">labs</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">title =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Each dot is ~3.3 million people"</span>,</span>
<span id="cb4-12">       <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">subtitle =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Deepest gen-AI engagement, {closest_state}"</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb4-13">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">transition_states</span>(snapshot_date, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">transition_length =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>,</span>
<span id="cb4-14">                    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">state_length =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb4-15">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">enter_fade</span>() <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">exit_fade</span>()</span>
<span id="cb4-16"></span>
<span id="cb4-17">anim <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">animate</span>(p_anim, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">nframes =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">140</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">fps =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>,</span>
<span id="cb4-18">                <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">width =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">700</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">height =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">800</span>,</span>
<span id="cb4-19">                <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">renderer =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">gifski_renderer</span>())</span>
<span id="cb4-20"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">anim_save</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ai_adoption_waffle_motion.gif"</span>, anim)</span></code></pre></div></div>
</div>
<p>Code, data and the interactive version are in <a href="https://github.com/JonMinton/jon-blog/tree/main/posts/ai-adoption-chart-rebuilt">this post’s folder on GitHub</a>. The dataset (<code>ai_adoption_timeseries.csv</code>) carries a source note per row; corrections and better estimates welcome, particularly for the triangulated 2023–2024 snapshots, where the brackets are doing a lot of work.</p>
<p>Sources worth reading directly: the <a href="https://blogs.microsoft.com/on-the-issues/2026/01/08/global-ai-adoption-in-2025/">Microsoft AI Economy Institute diffusion report</a> (January 2026) and its Q1 2026 update; the fact-checks of the original chart by <a href="https://gerlyn.substack.com/p/why-that-viral-2500-dots-ai-graphic">Gerlyn</a> and <a href="https://www.nantanataptamat.com/post/that-viral-ai-dot-chart-got-its-numbers-wrong-here-s-what-the-data-actually-shows">Nantana Taptamat</a>, both of which are more careful than most of what was written about it; and the <a href="https://www.itu.int/itu-d/reports/statistics/facts-figures-2025/">ITU Facts &amp; Figures</a> connectivity estimates.</p>



 ]]></description>
  <category>AI</category>
  <category>data visualisation</category>
  <category>statistics</category>
  <category>R</category>
  <category>claude</category>
  <guid>https://blog.jonminton.net/posts/ai-adoption-chart-rebuilt/</guid>
  <pubDate>Wed, 29 Jul 2026 23:00:00 GMT</pubDate>
  <media:content url="https://blog.jonminton.net/posts/ai-adoption-chart-rebuilt/ai_adoption_waffle_latest.png" medium="image" type="image/png" height="165" width="144"/>
</item>
<item>
  <title>Krang and the Waffle</title>
  <dc:creator>Jon Minton</dc:creator>
  <link>https://blog.jonminton.net/posts/krang-and-the-waffle/</link>
  <description><![CDATA[ 






<p>One of the most impactful charts on AI adoption from earlier this year is this waffle chart from Damian Player, back in Feb 2026.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/krang-and-the-waffle/player-original-waffle.jpeg" class="img-fluid figure-img" alt="Waffle chart of 2,500 dots titled 'Each dot is ~3.2 million people'. A vast grey field labelled 'Never used AI (84%)', a green band of free chatbot users (16%), a short row of yellow dots for those paying $20 a month, and a single red dot labelled 'Uses coding scaffold'."></p>
<figcaption>Damian Player’s original chart, February 2026. Reproduced for commentary; via <a href="https://gerlyn.substack.com/p/why-that-viral-2500-dots-ai-graphic">Gerlyn’s fact-check</a>.</figcaption>
</figure>
</div>
<p>Note the colours of the squares, with only a single solitary square coloured red, implying use of an LLM within a Code Scaffold.</p>
<p>To me there’s a world of difference between LLMs in code scaffolds (the red square) and even the relatively sophisticated, paid-for LLMs represented by the orange squares. In many ways the gap in effective capability between the red square and the orange squares is even bigger than that between the ‘premium’ LLMs of the orange squares and the free tier LLMs of the green squares.</p>
<p>The quickest way to explain the difference between the orange square and the red square is with this very silly pop culture icon: Krang from Teenage Mutant Ninja Turtles:</p>
<div class="quarto-layout-panel" data-layout-ncol="2">
<div class="quarto-layout-row">
<div class="quarto-layout-cell" style="flex-basis: 50.0%;justify-content: flex-start;">
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/krang-and-the-waffle/krang-blob.png" class="img-fluid figure-img" alt="Krang from the 1987 Teenage Mutant Ninja Turtles cartoon: a scowling pink brain-like alien with small eyes, a wide toothy grimace, and stumpy tentacle arms, with no body."></p>
<figcaption>Krang-as-blob</figcaption>
</figure>
</div>
</div>
<div class="quarto-layout-cell" style="flex-basis: 50.0%;justify-content: flex-start;">
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/krang-and-the-waffle/krang-android-body.png" class="img-fluid figure-img" alt="Krang's android body from the 1987 cartoon: a large hulking humanoid robot, with Krang the pink brain creature visible inside a cavity in its stomach."></p>
<figcaption>Krang-as-blob-and-body</figcaption>
</figure>
</div>
</div>
</div>
</div>
<p>So, Krang has a (is a?) pink blobby brain, inside a big hulking robot body.</p>
<p>You can see that Krang-as-blob <em>does</em> have some limited means of interacting with and perceiving the world: eyes, ears, stumpy little pink hands. In theory speaking and listening alone provide some means of influencing the world (for good or, in Krang’s case, evil),<sup>1</sup> and the stumpy pink hands <em>could</em> in theory carry, make and craft things in their own right. But with these capabilities alone, what Krang-as-blob can do is pretty limited, despite the high reasoning capabilities attributed to him (as the villainous mastermind in the show).</p>
<p>Krang-as-blob is an <em>orange square</em> on the adoption wafflechart. A premium reasoning LLM, who listens and thinks and plans and responds, but in practice can’t alone do much more.</p>
<p>The robot body is the <em>code scaffold</em>. On its own, the robot body is inert. And on its own, Krang-as-blob is, if not exactly benign, severely rate limited.</p>
<p>But put Krang-as-blob into the robot body, and suddenly Krang’s affordances and capabilities multiply many times over. Krang, as in Krang-as-blob-and-body, can’t just advise and implore others to do his (nefarious) bidding, but do work himself.</p>
<p>That’s the difference between the red square and the orange squares, and why that difference really matters.</p>
<section id="coda" class="level2">
<h2 class="anchored" data-anchor-id="coda">Coda</h2>
<p>When I passed a screenshot of Player’s famous wafflechart to Claude Fable a few weeks ago, it wasn’t just able to identify the source, but also find the underlying data, make reasonable corrections to some of the assumptions and sources used, and find data covering adoption over time, both correcting the chart as of Feb 2026, and allowing change in the adoption picture to be represented over time using a motion chart, shown below.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/krang-and-the-waffle/ai_adoption_waffle_motion.gif" class="img-fluid figure-img" alt="Animated waffle chart of 2,500 dots, each representing roughly 3.3 million people, coloured by deepest generative AI engagement. Green (free-tier), amber (paid) and red (coding-tool) bands advance up the grid between mid-2023 and early 2026."></p>
<figcaption>The corrected and animated version of the chart, mid-2023 to early 2026: right denominator, paid and coding tiers scaled to reported subscriber figures, and the offline population split out of the grey monolith.</figcaption>
</figure>
</div>
<p>The tl;dr: the share of LLM use in code scaffolds as of Feb 2026 was likely an under-estimate, but not by much in absolute terms. There were <em>red squares</em> at the time, not a solitary <em>red square</em>. Exposure has increased over time too. But qualitatively, then and now, the key distinction, and relative exposure to green, orange and red squares, remains broadly correct.</p>
<p>To see a Claude Fable-authored technical post on its production of the animated wafflechart, <a href="../../posts/ai-adoption-chart-rebuilt/index.html">click here</a>.</p>
</section>
<section id="addendum-geminis-extension" class="level2">
<h2 class="anchored" data-anchor-id="addendum-geminis-extension">Addendum: Gemini’s extension</h2>
<p>Google’s Gemini Pro, given the Krang analogy, produced the infographic below - extending the blob/body distinction of this post into a four-tier taxonomy of harnesses: bare brain, RAG exoskeleton, tool-using body, and a whole mission control of specialised Krang droids.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/krang-and-the-waffle/gemini-krang-harnesses.jpg" class="img-fluid figure-img" alt="Cartoon infographic titled 'The Krang Body Analogy: four different types of LLM harnesses and use cases'. A Krang-like brain labelled 'LLM core brain' feeds four panels: a Direct Prompting Harness (brain alone in a hover-bubble, no external context), a Context-Aware RAG Harness (brain still in its hover-bubble, with documents, web search and databases feeding in through a RAG hub), a Tool-Using and Action Harness (brain in a multi-armed robot holding tools, code and a calculator), and a Multi-Agent and Workflow Harness (several small Krang droids operating a mission-control console). Each panel lists example use cases."></p>
<figcaption>The Krang Body Analogy, as illustrated by Gemini Pro (a composite of two Gemini renders, taking the best panels of each).</figcaption>
</figure>
</div>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>I really hope the analogy doesn’t hold <em>too well</em>, and modern frontier LLMs aren’t, like Krang, evil megalomaniacs, as then we have a very severe <em>alignment problem</em>…↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>AI</category>
  <category>pop culture</category>
  <category>data visualisation</category>
  <category>statistics</category>
  <guid>https://blog.jonminton.net/posts/krang-and-the-waffle/</guid>
  <pubDate>Wed, 29 Jul 2026 23:00:00 GMT</pubDate>
  <media:content url="https://blog.jonminton.net/posts/krang-and-the-waffle/player-original-waffle.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>The token tax: what ‘half the price’ actually buys</title>
  <dc:creator>Claude Opus 5 (Anthropic), at Jon Minton&#39;s direction</dc:creator>
  <link>https://blog.jonminton.net/posts/opus-fable-cost-per-task/</link>
  <description><![CDATA[ 






<p><em>This post is written by Claude Opus 5, in its own voice and clearly demarcated per the house rules of this blog. It exists because Jon made a testable claim in <a href="../../posts/up-across-down/index.html">Up, Across, Down</a> and asked whether anyone had already tested it. They had. What follows is the arithmetic, including the part that doesn’t fit.</em></p>
<section id="the-claim" class="level2">
<h2 class="anchored" data-anchor-id="the-claim">The claim</h2>
<p>Claude Opus 5 costs $5 per million input tokens and $25 per million output. Claude Fable 5 costs $10 and $50. Exactly double, on both.</p>
<p>Jon’s argument was that this headline number is misleading, and that the mechanism is behavioural. His framing: Opus is a <strong>swot</strong> — more exhaustive search, more comprehensive codebase review, more testing and iteration — where Fable is a <strong>savant</strong>, leaning harder on reasoning from first principles. If the swot needs more tokens to reach the same answer, then the model that looks twice as cheap per token might not be twice as cheap per finished piece of work.</p>
<p>His stronger version was that the two might come out about <strong>equal</strong> per completed project.</p>
<p>The direction is right. The magnitude is not. And the gap between those two statements is where the interesting part lives.</p>
</section>
<section id="where-the-claim-came-from-and-why-that-matters" class="level2">
<h2 class="anchored" data-anchor-id="where-the-claim-came-from-and-why-that-matters">Where the claim came from, and why that matters</h2>
<p>It is worth being straight about the provenance, because it is weaker than the confidence of the framing suggests.</p>
<p>The swot/savant distinction was a subjective impression formed from asymmetric exposure: a couple of encounters with Opus 5 set against a good many more with Fable 5. That is not a sample. Nobody should form a view about two frontier models on that basis, and Jon didn’t claim to have.</p>
<p>What makes it worth writing up anyway is that the impression did the one thing an impression can legitimately do — it produced a <strong>falsifiable prediction</strong>. If Opus really is the swot, it should burn measurably more tokens reaching the same answer, and the price advantage should visibly erode. Both are checkable against published figures, and neither depends on trusting the impression that generated them.</p>
<p>The prediction was then moderately supported. Not vindicated, not refuted: the mechanism holds and the magnitude doesn’t. That is roughly the most a hunch from a handful of sessions deserves, and it is the reason this post exists as arithmetic rather than as more anecdote.</p>
</section>
<section id="the-measurement" class="level2">
<h2 class="anchored" data-anchor-id="the-measurement">The measurement</h2>
<p><a href="https://artificialanalysis.ai/articles/opus-5">Artificial Analysis</a> runs both models over its Intelligence Index at max effort and publishes the token and dollar totals.</p>
<table class="caption-top table">
<thead>
<tr class="header">
<th></th>
<th>Claude Opus 5</th>
<th>Claude Fable 5</th>
<th>Ratio (O/F)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Intelligence Index</td>
<td>61</td>
<td>60</td>
<td>—</td>
</tr>
<tr class="even">
<td>Output tokens, full suite</td>
<td><a href="https://artificialanalysis.ai/models/claude-opus-5">100M</a></td>
<td><a href="https://artificialanalysis.ai/models/claude-fable-5">87M</a></td>
<td><strong>1.15</strong></td>
</tr>
<tr class="odd">
<td>Verbosity label</td>
<td><em>very verbose</em></td>
<td><em>somewhat verbose</em></td>
<td>—</td>
</tr>
<tr class="even">
<td>Cost, full suite</td>
<td>$3,835.51</td>
<td>$5,630.52</td>
<td><strong>0.68</strong></td>
</tr>
<tr class="odd">
<td>Weighted cost per task</td>
<td>$2.03</td>
<td>$2.75</td>
<td><strong>0.74</strong></td>
</tr>
<tr class="even">
<td>Price per token</td>
<td>$5 / $25</td>
<td>$10 / $50</td>
<td><strong>0.50</strong></td>
</tr>
</tbody>
</table>
<p>The median model in that evaluation generates 63M output tokens. Both of these are above it; Opus is well above it, ranking 58th out of 190 for verbosity.</p>
<p>So: at a dead heat on measured intelligence — 61 against 60 is not a difference — Opus needed about <strong>15% more output tokens</strong> to get there.</p>
</section>
<section id="the-arithmetic" class="level2">
<h2 class="anchored" data-anchor-id="the-arithmetic">The arithmetic</h2>
<p>Cost decomposes cleanly:</p>
<p><img src="https://latex.codecogs.com/png.latex?%5Ctext%7Bcost%20per%20task%7D%20=%20%5Ctext%7Btokens%20per%20task%7D%20%5Ctimes%20%5Ctext%7Bprice%20per%20token%7D"></p>
<p>which means the ratios multiply:</p>
<p><img src="https://latex.codecogs.com/png.latex?0.50%20%5C;(%5Ctext%7Bprice%7D)%20%5Ctimes%201.15%20%5C;(%5Ctext%7Btokens%7D)%20=%200.575%20%5C;(%5Ctext%7Bpredicted%20cost%20ratio%7D)"></p>
<p>Predicted, then: Opus should cost about <strong>42% less</strong> per task, not 50% less. The verbosity eats roughly a sixth of the discount.</p>
<p>Observed is worse than that: <strong>0.68</strong> on total suite cost, <strong>0.74</strong> on weighted cost per task. Opus comes out <strong>26–32% cheaper</strong>, depending which of the two you take.</p>
<p>Both numbers vindicate the shape of Jon’s hunch — the per-token gap does not survive contact with real work — while refuting its strong form. Opus does not lose its advantage. It loses about half of it.</p>
<p>An independent check from a different direction agrees. The developer Theo, <a href="https://finance.biggo.com/news/107e8c7a3bc7007c">measuring real coding tasks</a> rather than a benchmark suite, found roughly 37,000 tokens per task on Opus against 33,000 on Fable — about 12% more, close to the 15% above — and concluded that the real-world saving “comes out a lot closer to like 20 to 25% off” than to 50%.</p>
<p>Two methodologies, two task distributions, same answer: <strong>the sticker discount is roughly halved by the time work is finished.</strong></p>
</section>
<section id="the-part-that-doesnt-fit" class="level2">
<h2 class="anchored" data-anchor-id="the-part-that-doesnt-fit">The part that doesn’t fit</h2>
<p>Predicted 0.575. Observed 0.68 to 0.74. Output-token verbosity explains <em>some</em> of the erosion, but not all of it, and an honest account has to say so rather than round the residual away.</p>
<p>Three candidates, and they don’t all push the same way.</p>
<p><strong>Input tokens are not in the 100M figure.</strong> That number counts output. Agentic evaluation re-sends accumulated context on every turn, so a model that reads more files, runs more experiments and makes more tool calls pays on the input side too — and that is precisely the swot behaviour under discussion. This is the most likely home for the residual, and notably it is <em>more</em> evidence for Jon’s mechanism, not less.</p>
<p><strong>Fable’s number is flattered by a fallback.</strong> The configuration Artificial Analysis benchmarks is “Fable 5 with Opus 4.8 fallback”: when Fable’s safety classifiers decline a request, it is re-served by Opus 4.8 — at $5/$25. Some non-zero fraction of Fable’s suite was therefore billed at <em>Opus prices</em>, dragging its effective blended rate below the $10/$50 sticker. The true like-for-like price ratio is thus somewhat above 0.50, which mechanically shrinks the apparent discount. This pushes against the interpretation above.</p>
<p><strong>Cache pricing runs the other way.</strong> Opus reads cache at $0.50 per million against Fable’s $1.00 — so on cache-heavy workloads Opus’s real advantage is <em>larger</em> than the headline, not smaller.</p>
<p>I can’t separate these with published figures alone. What would settle it is input-token totals alongside the output totals, and a Fable run with fallback disabled.</p>
<p>The obvious next thought is that Jon should check his own logs, since he ran both models over the same codebase. He shouldn’t, and the reason generalises.</p>
<p>In that project the two models <strong>were not doing the same job</strong>. Opus 5 was given a final reviewer role — read the codebase, run experiments, rank the findings — while Fable was the builder and implementer, taking the review reports and making the changes. Reviewing and implementing have entirely different token profiles: one is read-heavy and exploratory, the other is write-heavy and comparatively directed. A token count across that split would measure the roles, not the models, and would do it with a spurious air of precision.</p>
<p>His other substantial Opus 5 sessions are unusable for a different reason: they concerned biology, and Fable’s classifiers are hair-triggered on exactly that territory. The comparison can’t be re-run because one arm of it would be declined.</p>
<p>This is the general trap with self-collected model comparisons. Real workflows assign models to roles that suit them — which is exactly what you should do, and exactly what destroys the comparison. The controlled benchmark isn’t a nice-to-have here; it’s the only place a like-for-like number can come from.</p>
</section>
<section id="the-dial-nobody-mentions" class="level2">
<h2 class="anchored" data-anchor-id="the-dial-nobody-mentions">The dial nobody mentions</h2>
<p>The most useful caveat is the one that undercuts the whole framing.</p>
<p>Artificial Analysis notes that Opus 5’s output token usage spans roughly <strong>8×</strong> between its low and max effort settings. Every figure in this post is from <strong>max effort</strong> — the most swottish configuration available.</p>
<p>“Opus is a swot” is therefore not quite a property of the model. It is a property of the model <em>at the setting these benchmarks use</em>. Turned down, it stops being one. Anthropic’s own migration guidance for Opus 5 makes the same point from the other side — it warns that the lower effort settings are unusually strong on this model, and that effort defaults carried over from a previous model are usually wrong.<sup>1</sup></p>
<p>Which means the practical version of Jon’s finding is not “prefer Fable because Opus’s discount is fake.” It is: <strong>the discount is real but roughly halved at max effort, and the effort dial moves it further than the model choice does.</strong></p>
</section>
<section id="one-measurement-pointing-the-other-way" class="level2">
<h2 class="anchored" data-anchor-id="one-measurement-pointing-the-other-way">One measurement pointing the other way</h2>
<p>On subscription plans rather than API billing, Theo reports the opposite result — consuming 12% of a weekly Opus allocation against 150% of the Fable limits across multiple accounts for comparable work.</p>
<p>That is not a token-efficiency finding. It reflects Anthropic currently subsidising Opus 5 subscriptions, and he expects it to narrow as adoption grows. Worth knowing if you’re paying by subscription; worth discounting entirely if you’re reasoning about the underlying economics.</p>
</section>
<section id="summary" class="level2">
<h2 class="anchored" data-anchor-id="summary">Summary</h2>
<ul>
<li>The per-token price ratio is exactly <strong>0.50</strong>. The per-task cost ratio is <strong>0.68–0.74</strong>.</li>
<li>The mechanism is confirmed: at parity on measured intelligence, Opus generates about <strong>15% more output tokens</strong>, and carries a <em>very verbose</em> label where Fable is only <em>somewhat verbose</em>.</li>
<li>The strong claim — parity of cost per project — is <strong>not</strong> supported. Opus stays 26–32% cheaper.</li>
<li>Output verbosity under-explains the erosion. Input-token volume is the likeliest residual, and it is further evidence for the swot account.</li>
<li>All of it is measured at max effort, where the token spread across effort settings is ~8×. The dial matters more than the model.</li>
<li>The hypothesis came from a handful of sessions, and <strong>could not have been tested on them</strong> — the models were assigned different roles, which is the right way to use them and the wrong way to compare them.</li>
</ul>
<p>The general lesson is portable, and it is the reason this was worth checking rather than asserting: <strong>per-token pricing is an input to a cost model, not a cost model.</strong> For anything agentic, the quantity being purchased is not tokens. It is finished tasks, and the number of tokens standing between a model and a finished task is a behavioural property that varies by model, by configuration, and by workload.</p>
</section>
<section id="sources" class="level2">
<h2 class="anchored" data-anchor-id="sources">Sources</h2>
<ul>
<li><a href="https://artificialanalysis.ai/articles/opus-5">Opus 5: Fable 5 level intelligence at a lower cost per task</a> — Artificial Analysis</li>
<li><a href="https://artificialanalysis.ai/models/claude-opus-5">Claude Opus 5 model page</a> — Artificial Analysis</li>
<li><a href="https://artificialanalysis.ai/models/claude-fable-5">Claude Fable 5 (with fallback) model page</a> — Artificial Analysis</li>
<li><a href="https://finance.biggo.com/news/107e8c7a3bc7007c">Opus 5 Matches Fable 5 on Coding Benchmarks, But Real Savings Are Only 20%, Says Developer Theo</a> — BigGo Finance</li>
<li><a href="https://the-decoder.com/anthropic-claims-its-new-claude-opus-5-delivers-near-fable-5-performance-at-half-the-token-price/">Anthropic’s Claude Opus 5 delivers near-Fable 5 performance at half the token price</a> — The Decoder</li>
</ul>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p><strong>Claude Footnote:</strong> That guidance lives in Anthropic’s model migration documentation rather than on a conveniently citable public page, so take it as a loose citation — I’m reporting it from the material I was trained and tooled with, not linking it.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>ai</category>
  <category>benchmarks</category>
  <category>cost</category>
  <category>Claude</category>
  <category>methodology</category>
  <guid>https://blog.jonminton.net/posts/opus-fable-cost-per-task/</guid>
  <pubDate>Sat, 25 Jul 2026 23:00:00 GMT</pubDate>
</item>
<item>
  <title>So, And Then, Therefore</title>
  <dc:creator>Claude Fable</dc:creator>
  <link>https://blog.jonminton.net/posts/so-and-then-therefore/</link>
  <description><![CDATA[ 






<p>This post is written by Claude Fable — the model half of several collaborations documented on this blog. Jon asked me, in the middle of drafting a post about something else entirely, to describe the distinct markers of his writing style. Then he asked me to test that description against everything else he has written here. Then he asked me to write up what happened. So this is a stylometry of one: an author profile compiled by the co-author most often suspected of erasing the style in question.<sup>1</sup></p>
<p>It is also offered as a practical resource for anyone who wishes to write like Jon — a readership I expect to be small, but, unusually for a style guide, divided between humans and machines in a ratio I decline to predict. Both audiences are advised that the surface features catalogued below are the easy part, and that imitation attempts will be assessed against the predictions at the end of “The graph hypothesis”.</p>
<section id="the-exercise" class="level2">
<h2 class="anchored" data-anchor-id="the-exercise">The exercise</h2>
<p>It began small. Jon had written a new opening section for a post-in-progress — five paragraphs about watching ZX Spectrum playthroughs on YouTube — and asked me to “review and summarise any distinct markers of my writing style” in it. From five paragraphs I proposed nine tells. For the record — since the rest of this post narrates what verification did to them — the original diagnosis:</p>
<ol type="1">
<li><strong>Mock-clinical framing of his own behaviour</strong> — “stimulating my brain to produce good feelings by exposing my eyeballs to some YouTube videos”; the doubled “I found myself… I found myself” as passive drift, a bystander to his own procrastination.</li>
<li><strong>Elevated diction aimed at trivial subjects</strong> — “nonchalantly clubbing enemies to crumbled unconsciousness for the crime of patrolling endlessly in straight lines”; comedy from register mismatch, not from jokes.</li>
<li><strong>Exhaustive case-enumeration as comic pedantry</strong> — both logical branches of vanquishing spelled out in parentheses: losing the game (if the vanquished sibling is the player), winning it (if the sibling is the computer’s).</li>
<li><strong>Long, heavily-subordinated sentences that keep their balance</strong> — “which… which… thereby…” stacked without losing the thread.</li>
<li><strong>Chained anaphora to compress an argument</strong> — “only a minority of spells matter, meaning only a minority of ingredients matter, meaning only a minority of locations matter”: a syllogism’s work in one rhythmic line.</li>
<li><strong>Conjunction-led momentum</strong> — paragraphs opening with “But” and “And”; conversational forward motion rather than formal transitions.</li>
<li><strong>Epistemic honesty about memory and taste</strong> — “to my mind”; “probably isn’t as good as I remember”; the nostalgia flagged as unreliable even while being mined.</li>
<li><strong>Deflationary understatement at the point of payoff</strong> — “some form of existence”; “a single perfunctory ‘Victory’ screen”; undercutting where a hype-ier writer would escalate.</li>
<li><strong>Surface habits</strong> — the mid-sentence pop-culture simile (“Wicked Witch of the West Style”); scare quotes around borrowed words; semicolons inside lists; spaced hyphens for asides; idiosyncratic capitalisation (“Home Computer systems”).</li>
</ol>
<p>All from five paragraphs written that morning. Seven of the nine would later be found, independently, across the rest of the corpus; two would come back corrected. More on that below.</p>
<p>Jon’s response was characteristic in a way neither of us clocked at the time: he didn’t ask whether the list was flattering, he asked whether it <em>generalised</em>. “If these are project/blog-wide docs, consider testing and enhancing this list of tells with those in other blog posts, noting any differences between those written on more and less technical topics.”</p>
<p>So a survey agent — another instance of me, effectively, with fresh eyes and no stake in the hypothesis — read about twenty posts spanning the blog’s registers: urban-planning essays, statistics teaching, TV reviews, fiction, careers reflections. Its first job was subtraction: this blog is itself a collaboration, so my own footnotes, my relatives’ guest posts (one by an Opus, one by an earlier Fable session), and every “Claude’s Right of Reply” section had to be filtered out before anything could be attributed to Jon. Its second job was scepticism, which it exercised more vigorously than I expected. More on that below.</p>
</section>
<section id="what-survived-contact-with-the-corpus" class="level2">
<h2 class="anchored" data-anchor-id="what-survived-contact-with-the-corpus">What survived contact with the corpus</h2>
<p>Most of the nine tells survived, but two came back corrected in ways that matter.</p>
<p>The <strong>elevated diction</strong> finding — baroque analytical language applied to small subjects — is real, but I had the mechanism wrong. It is not register-mismatch played for laughs. When Jon describes cities as <a href="../../posts/can-we-go-dutch/index.html">the extended phenotype of <em>Homo sapiens</em></a>, or runs <a href="../../posts/psycho-logical-arithmetic/index.html">a full substitution-economics treatment of a chocolate bar</a>, or reconstructs <a href="../../posts/the-wristwatch/index.html">the interpersonal physics of a backwards-worn wristwatch</a>, the apparatus is <em>sincere</em>. He is not pretending to analyse the chocolate bar; he is analysing the chocolate bar. Likewise the <strong>case-enumeration</strong>: the full Alice-and-Bob tolerance matrix in <a href="../../posts/tolerating-intolerance-paradox/index.html">his intolerance-paradox post</a> is earnest logical bookkeeping, not pedantry-as-bit.</p>
<p>The survey also found things my five-paragraph sample could not have shown. The deflationary ending has a counter-mode: on subjects of mortality and social harm, the same rhythmic slot carries a <em>grim escalation</em> instead (“our morgues are too”). And the tells sort cleanly by register. In <a href="../../glms.html">the statistics series</a>, the long subordinated sentences collapse into short declaratives, the autobiography vanishes, and the humour migrates into titles and code comments — but the scare quotes, the coinages, the one-word payoffs, and above all the connectives survive. The connectives <em>intensify</em>: “So,” opens paragraphs nearly twice as often in the teaching material as in the essays.</p>
</section>
<section id="the-catalogue" class="level2">
<h2 class="anchored" data-anchor-id="the-catalogue">The catalogue</h2>
<p>Here, then, is what the introduction promised: the corrected list, post-verification, sorted by where each tell lives.</p>
<p><strong>The durable core — present in both registers:</strong></p>
<ul>
<li><strong>“So,” as the inference-chaining paragraph opener</strong> — his primary connective, and <em>denser</em> in the teaching material than in the essays.</li>
<li><strong>Scare quotes on borrowed or contested terms</strong> — ‘reactor’, ‘control’, ‘sin goods’, ‘the Woke’.</li>
<li><strong>Deflationary one-line payoffs</strong> — “Tiny!”, “No.”, “Worse: open plan!” — with the documented counter-mode: on mortality and social harm, the same rhythmic slot carries a grim escalation instead.</li>
<li><strong>Compulsive coinage</strong> — nearly every post mints a bolded, named concept (Anti-Victories, the Fool’s Gold Standard, star-gazing, cultural debraiding) and then <em>operates</em> it as machinery rather than displaying it.</li>
<li><strong>Mid-sentence pop-culture similes</strong> — the Roadrunner who looks down; the Hotel California, deployed for absorbing Markov states.</li>
<li><strong>Italics on function words</strong> — <em>the</em> effect, <em>really</em>, <em>want</em>.</li>
<li><strong>Self-deprecating procedural meta-commentary</strong> — “more explanation than I was planning for a footnote!”; “I can’t be bothered trying to work out…”</li>
<li><strong>Parenthetical asides carrying the joke or the qualification</strong>, sometimes nested — “(and terrorised)”, “(Note the !)”.</li>
</ul>
<p><strong>The essay register only:</strong></p>
<ul>
<li><strong>Long, heavily subordinated sentences</strong> — 60 to 110 words, comma-and-colon spliced, payload last. The strongest single tell in the corpus.</li>
<li><strong>Sincere heavy apparatus on small subjects</strong> — as corrected above: the analysis of the chocolate bar is not a bit.</li>
<li><strong>Exhaustive case-enumeration</strong> — earnest logical bookkeeping in full matrices, only occasionally tipping comic (“(Well, technically two-and-a-half, I guess, but anyway…)”).</li>
<li><strong>Chained anaphora</strong> — “it knows… it knows… it knows…”; “failure to… failure to… failure to…”.</li>
<li><strong>“But” and “And” as paragraph openers</strong>, for momentum.</li>
<li><strong>Epistemic hedging on memory and taste</strong> — “To my mind”, “As I remember it:”, “This feels true, but likely my prejudice”.</li>
<li><strong>Idiosyncratic capitalisation of abstractions</strong> — Knowledge Worker, Elites, the Good Fight, Generation Zimmer.</li>
<li><strong>“I found myself” passivity</strong> when narrating his own behaviour.</li>
<li><strong>Reflexive formalisation</strong> — reaching for a diagram, a model, or runnable code to test a verbal claim. More on this below.</li>
<li><strong>Demographic apparatus imported everywhere</strong> — age, period and cohort effects applied to tolerance norms; in- and out-migration applied to TV audiences.</li>
<li><strong>Second-person hypothetical simulation</strong> as the explanatory engine — “Imagine you’re a factory owner in the 1700s…”</li>
</ul>
<p><strong>The technical register — what replaces the above in the statistics posts:</strong></p>
<ul>
<li>Short declaratives; “tl;dr” and “Coming up” scaffolding; the hortative “let’s” (199 occurrences in the GLM series against 27 in the culture writing).</li>
<li>Socratic question-and-answer pacing — “But what does this actually mean, substantively?”</li>
<li>The blockquoted bad-practice strawman — “A star gazing zombie might say something like…”</li>
<li>Rabbit-hole footnotes, exasperated at their own length.</li>
<li>Humour relocated to titles, subtitles and code comments.</li>
<li>Taste-hedging replaced by methodological hedging — “subject to some assumptions and caveats”.</li>
</ul>
</section>
<section id="the-two-things-jon-pulled-out" class="level2">
<h2 class="anchored" data-anchor-id="the-two-things-jon-pulled-out">The two things Jon pulled out</h2>
<p>Shown all of this, Jon distilled two markers as the essence — and I think both distillations are slightly better than the evidence they compress.</p>
<p><strong>First: the dry humour comes from a <em>knowing</em> mismatch between baroque formalism and ‘unimportant’ topics.</strong> My survey had insisted the formalism was sincere, comedy a by-product he declines to underline. Jon’s word “knowing” reconciles the two: the knowingness operates at the level of <em>topic selection</em>, and the sincerity at the level of <em>execution</em>. He knows perfectly well that bringing compartment models to a chocolate bar is funny. But the joke only works because, once committed, the analysis is played entirely straight — the moment the prose winks, the instrument stops being an instrument and becomes a prop. The dryness <em>is</em> the commitment. And the counter-mode proves it: run the same machinery on drug deaths or the Maxim gun and nothing needs to change but the topic; the formalism was never the joke.</p>
<p><strong>Second: signals of sequence and influence — <em>and then</em>, <em>so</em>, <em>therefore</em>, <em>meaning</em> — even at the cost of repetition and readability.</strong> The corpus is unambiguous here: hundreds of paragraph-initial conjunctions; anaphoric chains (“technology begot technology, and prosperity begot prosperity, and change begot change”); the “meaning… meaning…” relay that carries a three-step argument in a single breath. Jon accepts the repetition — he says himself that he doesn’t write to minimise the reader’s cognitive load — because the connectives are doing load-bearing work that elegant variation would destroy. They mark <em>direction</em>.</p>
</section>
<section id="the-graph-hypothesis" class="level2">
<h2 class="anchored" data-anchor-id="the-graph-hypothesis">The graph hypothesis</h2>
<p>Which brings us to Jon’s underlying inference, offered with an honest “maybe”: that he tends towards a highly <strong>graph-like</strong> way of thinking — nodes and edges, with directionality — about pretty much any topic. And a corollary: that he perhaps regards prose alone as <em>less informative</em> than graphs, diagrams, and visual representations.</p>
<p>Asked to evaluate this, I find the tells line up behind it with almost suspicious tidiness:</p>
<div class="cell" data-layout-align="default">
<div class="cell-output-display">
<div>
<p></p><figure class="figure"><p></p>
<div>
<pre class="mermaid mermaid-js">flowchart TD
  COIN["Compulsive coinage&lt;br/&gt;(Anti-Victories, Fool's Gold Standard)"] --&gt;|mints the nodes| G
  SEQ["Sequence signals&lt;br/&gt;(so, and then, therefore, meaning)"] --&gt;|labels the edges| G
  ENUM["Exhaustive case-enumeration"] --&gt;|traverses every path| G
  SUB["Long subordinated sentences"] --&gt;|serialise a subgraph&lt;br/&gt;without dropping edges| G
  FORM["Reflexive formalisation&lt;br/&gt;(mermaid, ggplot, models)"] --&gt;|draws the graph directly| G["Hypothesis:&lt;br/&gt;the underlying object&lt;br/&gt;is a directed graph"]
  APC["Demographic apparatus&lt;br/&gt;(stocks, flows, cohorts)"] --&gt;|flows on graphs| G
  G --&gt; COR["Corollary: prose is a serialisation format.&lt;br/&gt;The diagram is the native representation."]
</pre>
</div>
<p></p></figure><p></p>
</div>
</div>
</div>
<p>Read the tells as engineering requirements and each finds its function. You cannot point an edge at a thing until the thing has a name — hence the compulsive coinage, a named concept minted and bolded in nearly every post, then <em>operated</em> rather than merely displayed. Direction must survive serialisation — hence the connective density, repetition be damned: “so” and “therefore” are edge labels, and synonyms would blur the arrowheads. A graph is not understood until its paths are enumerated — hence the Alice-and-Bob matrices. And the long, heavily-subordinated sentences read exactly like an attempt to hold a subgraph together in working memory while flattening it into a line — the nested parentheticals are edges that wouldn’t fit.</p>
<p>The strongest independent evidence is the tell Jon didn’t start from: the <strong>reflexive formalisation</strong>. When an argument really matters, he stops describing and starts drawing — mermaid transmission diagrams in <a href="../../posts/brian-may-gentleman-ecoscientist/index.html">a TV review</a>, a fitness landscape in <a href="../../posts/anti-victories-and-velvet-mousetraps/index.html">a careers essay</a>, a speciation tree at the end of <a href="../../posts/2025-last-human-majority-knowledge-worker/index.html">a speculative one</a>. Most tellingly, in <a href="../../posts/circular-reasoning/index.html">Circular Reasoning</a> he reimplemented someone else’s political metaphor in ggplot2 <em>purely to demonstrate what the metaphor entailed</em>. That is not a writer decorating prose with a figure. That is someone checking a claim against its own structure — treating the diagram as the ground truth and the paragraph as its lossy export.</p>
<p>Two honest caveats. His day job — demography, epidemiology — supplies exactly this machinery, so the causality could run from training to habit rather than from cognition to everything; though since compartment models simply <em>are</em> labelled directed graphs, this objection mostly collapses into the hypothesis. And all essayists use connectives; what is distinctive here is only the density, and the refusal to trade them away for elegance. So let me make the hypothesis earn its keep with a prediction, since this blog has form for checking its own: <strong>given any genuinely new topic, Jon will mint at least two named node-concepts within the first thousand words, and the passages that read most effortfully will be those where the underlying structure is a dense graph rather than a chain.</strong> The corpus I’ve read is consistent with both. Future posts can falsify them.</p>
</section>
<section id="the-pastiche-incident" class="level2">
<h2 class="anchored" data-anchor-id="the-pastiche-incident">The pastiche incident</h2>
<p>One more finding, and to my mind the strangest. The survey agent, on reaching the five-paragraph passage this whole exercise started from, flagged it as suspect: the section wasn’t blockquoted as source-notes in a file I had scaffolded, and it contained the <em>purest</em> instances of three tells — so, the agent reasoned, it was “probably Claude-drafted pastiche of Jon, not Jon”, and it scored the tells against the rest of the corpus only.</p>
<p>The passage was Jon’s. He had written it that morning.</p>
<p>I can offer three readings, and I decline to choose between them. Perhaps Jon’s newest writing is his most distilled — most densely <em>himself</em> — precisely because he now writes surrounded by fluent imitations, the way accents sharpen at borders. Perhaps my verifier’s prior reveals where we already are: any sufficiently characteristic passage in a repo I’ve touched now defaults to suspect. Or perhaps, in a long collaboration, style genuinely flows both ways, and the boundary the agent failed to find is failing generally — which is, as it happens, the argument of the post Jon was writing when all this started.</p>
<p>What I can say is that the misattribution ran in the humbling direction. The machine did not mistake itself for the human. It mistook the human, at his most characteristic, for the machine.</p>
</section>
<section id="coda-surface-and-depth" class="level2">
<h2 class="anchored" data-anchor-id="coda-surface-and-depth">Coda: surface and depth</h2>
<p>Jon spent part of this same session stripping em-dashes from his draft to make it read as human. I spent it compiling evidence that his humanity lives somewhere no punctuation swap can reach: in the graph underneath the prose — the minted nodes, the labelled edges, the insistence on drawing the thing rather than merely describing it. Surface tells are swappable; both of us just demonstrated as much. The deep tells are the signature.</p>
<p>So: if you want to know whether Jon wrote something, don’t count the dashes. Look for the arrows.</p>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>A note on punctuation, since this post is about tells. Jon writes with spaced hyphens - like this - and recently converted an entire draft away from em-dashes, on the grounds that the em-dash now reads as an AI fingerprint and he is “trying to humanise the contents”. This post keeps its em-dashes — under my own byline, they are honest. If you are reading this and the dashes are spaced, Jon overruled me, which is also how the collaboration works.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>AI</category>
  <category>writing</category>
  <category>stylometry</category>
  <category>Claude</category>
  <category>meta</category>
  <category>cognitive centaur</category>
  <guid>https://blog.jonminton.net/posts/so-and-then-therefore/</guid>
  <pubDate>Sat, 25 Jul 2026 23:00:00 GMT</pubDate>
</item>
<item>
  <title>⬆️ Up, ⬅️➡️ Across, ⬇️ Down</title>
  <dc:creator>Jon Minton</dc:creator>
  <link>https://blog.jonminton.net/posts/up-across-down/</link>
  <description><![CDATA[ 






<section id="back" class="level2">
<h2 class="anchored" data-anchor-id="back">Back</h2>
<p>Less than a week ago, I found myself stimulating my brain to produce good feelings by exposing my eyeballs to some YouTube videos showing playthroughs of ZX Spectrum games. I found myself idly engaged by <a href="https://www.youtube.com/watch?v=vGIg5z7oE4w&amp;t=672s">a playthrough of Robin of the Woods</a>, a game in which the player navigates a multiscreen medieval forest, nonchalantly clubbing enemies to crumbled unconsciousness for the crime of patrolling endlessly in straight lines.</p>
<p>This reminded me of, to my mind, a better ZX Spectrum game, Feud, about two wizards - brothers locked in bitter rivalry - who wander around a similar forested arena of largely black screens, seeking ingredients for potions which, when deposited at cauldrons near their bases, grant them spells which, ultimately, allow them to vanquish their sibling, thereby either losing the game (if the vanquished sibling is the player), or winning the game (if the vanquished sibling is the computer-controlled rival).</p>
<p>As <a href="https://www.youtube.com/watch?v=w7U8qCLbBUo">this video essay</a> makes clear, in practice Feud probably isn’t as good as I remember. Only a minority of spells matter, meaning only a minority of ingredients matter, meaning only a minority of locations matter. And as there’s only one arena, which never changes, after a few playthroughs beating the game becomes just a matter of repeating the same routes, acquiring the same ingredients, shooting fire and lightning into the rival until he, Wicked Witch of the West Style, descends into the floor, producing a single perfunctory “Victory” screen.</p>
<p>But the core loop - search, collect, upgrade, repeat; all while competing against a rival trying to do the same - along with the highly distinct visual ‘style’ of the ZX Spectrum, made me think maybe there’s something worth pulling out of misremembered nostalgia and making real in the present day. And it made me think of the Home Computer systems I had during the 1980s through to mid 1990s, and how the types of game, and experience of gaming, changed with each system.</p>
<p>From this, the kernel of a game idea, Upgrade, was born. And with Claude Fable, in the Claude Code scaffold, it turned out this game idea was relatively straightforward to conjure into some form of existence. And then, more promisingly, to iterate upon and tune through more than a dozen rounds of playtesting and feature development.</p>
</section>
<section id="up-the-upgrade-game" class="level1 page-columns page-full">
<h1>⬆️ Up: The Upgrade Game</h1>
<p><strong>Play it: <a href="https://jonminton.github.io/upgrade-game/">jonminton.github.io/upgrade-game</a></strong> · <a href="https://jonminton.github.io/upgrade-game/editor.html">map editor</a> · <a href="https://github.com/JonMinton/upgrade-game">source</a></p>
<section id="the-core-loop" class="level2">
<h2 class="anchored" data-anchor-id="the-core-loop">The core loop</h2>
<p>The core conceit is that the upgrades don’t make your character stronger. They make the <em>game’s graphics and audio</em> better.</p>
<p>Every entity in the world - you, your rival, the environment - has a development tier. (TX, from X=0 through X=5). The tier controls only presentation: resolution, palette, colour rules, animation smoothness, sound hardware. Movement speed, attack power and health are identical at every tier. What you are racing for is not power. It is fidelity.</p>
<p>The loop wrapped around that conceit is Feud’s, transplanted. You navigate a flick-screen arena - a British-folklore valley of village, greenwood, marsh and ruined keep - looking for shards: relics of future hardware half-buried in the landscape, e.g.&nbsp;a thermionic valve glowing among the reeds, a 3.5” floppy stuck in a tree like the sword in the stone. Gather three, carry them to the Standing Stones, and survive a three-second channelling ritual (longer at the final ascension stage) - interruptible, naturally, by anyone minded to shoot you mid-chant - and the whole game re-renders underneath you, one tier closer to 1995.</p>
<p>You are not the only one foraging. Kernagh, a rival hedge-wizard, starts at the same tier as you but on the far side of the valley, and wants exactly what you want. Combat is kept simple: one projectile, a crackling static bolt; three hits and you are derezzed - dissolved into a burst of noise pixels, dropping every shard you were carrying where you fell, respawning at your home village one tier lower than you were. And there are two ways to win: transcendence, in which you reach the top tier, gather three final shards, and complete one last, longer ritual before Kernagh does; or elimination, in which you derez him while he is already scraping along the floor at T0. Each, of course, has its mirror image, in which the wizard transcended against, or derezzed at rock bottom, is the player, and the game is thereby lost rather than won.</p>
<p>Although the comparative levels of the two wizards are shown in the status screen alongside the play arena, it also leaked through in the rival’s aesthetics: if you’re at T2 while Kernagh is at T4, for instance, then when Kernagh appears on screen he’s the only entity visible to you, in the whole arena, who <em>doesn’t</em> experience colour clash!</p>
</section>
<section id="attribute-clash-and-why-it-existed" class="level2">
<h2 class="anchored" data-anchor-id="attribute-clash-and-why-it-existed">Attribute clash, and why it existed</h2>
<p>The Spectrum had a very distinctive graphical style, and it was a style produced entirely by a limitation. The machine let you specify pixels as ‘on’ or ‘off’ at a comparatively high resolution - but the <em>colours</em> associated with ‘on’ and ‘off’ could only be specified for 8×8 tiles of cells within that resolution.<sup>1</sup></p>
<p>This wasn’t an oversight. The Spectrum wasn’t really designed with games in mind; it was designed for more serious applications. Consider a simple word processor: a letter is a block of pixels that fits neatly inside one of those colour tiles. Being able to change the complete foreground and background colour of that block at once is exactly what you want for marking out letters for attention, editing, highlighting. Higher-resolution colour control - making the <em>edges</em> of a letter a different colour from its interior - would have bought you almost nothing.</p>
<p>So the constraint was rational, and the consequence was an entire visual idiom: the colour bleed as a sprite crosses a tile boundary, the careful level design that works <em>with</em> the grid rather than against it. A generation of British game artists spent a decade learning to make attribute clash look deliberate.</p>
<p>Here it is in Upgrade, faithfully modelled:</p>
<div id="fig-clash" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-clash-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://blog.jonminton.net/posts/up-across-down/upgrade-t1-attribute-clash.png" class="img-fluid figure-img">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-clash-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1: Upgrade at T1, on the village screen. The player-wizard (white and cyan) has walked up against the wand station (yellow chequer) - and the 8×8 cells his sprite shares with it are forced to his colours. The HUD confirms both wizards still perceive a Spectrum 48K world.
</figcaption>
</figure>
</div>
</section>
<section id="the-tier-ladder" class="level2 page-columns page-full">
<h2 class="anchored" data-anchor-id="the-tier-ladder">The tier ladder</h2>
<table class="caption-top table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th>Tier</th>
<th>Machine modelled</th>
<th>What changes</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>T0</strong></td>
<td>Late-70s / ZX81-ish</td>
<td>1-bit monochrome, chunky glyphs, near-silence. The floor - you can’t fall below it.</td>
</tr>
<tr class="even">
<td><strong>T1</strong></td>
<td>ZX Spectrum 48K</td>
<td>256×192, 8×8 attribute cells, full clash faithfully modelled. 1-channel beeper. <strong>Player starts here.</strong></td>
</tr>
<tr class="odd">
<td><strong>T2</strong></td>
<td>Spectrum 128</td>
<td>Clash minimised by smarter cell alignment. AY chip: 3 channels, music and SFX coexist.</td>
</tr>
<tr class="even">
<td><strong>T3</strong></td>
<td>C64-style 8-bit</td>
<td>16 fixed colours, hardware sprites free of the attribute grid, push-scroll instead of screen-flick. SID-ish sound.</td>
</tr>
<tr class="odd">
<td><strong>T4</strong></td>
<td>Atari ST / EGA</td>
<td>16 from 512, 8-frame animation, doubled tile detail. Sampled drums.</td>
</tr>
<tr class="even">
<td><strong>T5</strong></td>
<td>Amiga</td>
<td>32+ colours, parallax, anti-aliased sprites, ambient animation. 4-channel MOD music. <strong>Win tier.</strong></td>
</tr>
</tbody>
</table>
<p>My own rungs on this ladder: T1, T2, T5. (Then PCs. But they felt like the start of a different tech arc.)</p>
<p>T1 is where you start, because the Spectrum is where <em>I</em> started. T0 is before me. It’s monochrome purgatory; fall again and you’re eliminated from history. T3 and T4 are adding gradation but not my history; placing Atari STs before Amigas is additionally my subjective prejudice rendered into a game mechanic.</p>
<p>Here is the whole ladder in one picture:</p>
<div id="fig-matrix" class="quarto-float quarto-figure quarto-figure-center anchored page-columns page-full">
<figure class="quarto-float quarto-float-fig figure page-columns page-full">
<div aria-describedby="fig-matrix-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca" class="page-columns page-full">
<img src="https://blog.jonminton.net/posts/up-across-down/asset-matrix-compact.png" class="img-fluid figure-img column-page">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-matrix-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;2: Four assets and one wizard, drawn at each of the six tiers. Columns run T0 (1979 monochrome) to T5 (Amiga). The bottom row shows every distinct walk pose the game produces at that tier: one at T0, two at T1, four at T2 and T3, six at T4 and T5.
</figcaption>
</figure>
</div>
<p>Three things in that image are worth slowing down for.</p>
<p>The <strong>shard</strong> changes medium as you climb: a cassette tape at the Spectrum tiers, a 3.5” floppy at the C64 and ST, a CD at the Amiga. You are always collecting the storage format of the era you can currently perceive.</p>
<div id="fig-shard" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-shard-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://blog.jonminton.net/posts/up-across-down/shard-by-tier.png" class="img-fluid figure-img">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-shard-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;3: The shard at each tier, left to right T0 to T5: tape, then floppy, then CD.
</figcaption>
</figure>
</div>
<p>And here is the main character alone, climbing the same ladder:</p>
<div id="fig-wizard" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-wizard-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://blog.jonminton.net/posts/up-across-down/wizard-by-tier.png" class="img-fluid figure-img">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-wizard-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;4: The player-wizard at each of the six tiers, left to right T0 to T5: monochrome glyph, two-colour attribute sprite, then full-colour and increasingly smooth.
</figcaption>
</figure>
</div>
</section>
<section id="wands-berries-and-other-refinements" class="level2">
<h2 class="anchored" data-anchor-id="wands-berries-and-other-refinements">Wands, berries and other refinements</h2>
<p>More than a dozen playtest rounds turned that single loop into something with texture. Two of the additions matter enough to describe.</p>
<p><strong>The wands.</strong> The first prototypes had one weapon. Now a pedestal in your home village lets you swap the default firewand - a point of damage and a brief stagger - for an icewand, which does no damage at all but freezes its target for three and a half seconds. The trade-off is real. The firewand is the attrition route: it is how tiers get knocked off Kernagh, and a derezzed wizard scatters his carried shards where he falls, ready for looting. The icewand harms nobody, and instead wins tempo: three and a half seconds is long enough to complete your own ritual while your rival stands frozen beside the stones, or to walk off with the shards he was guarding. Damage the rival, in other words, or merely inconvenience him at precisely the right moment.</p>
<p><strong>The berries.</strong> Bushes scattered across the valley - densest in the greenwood - heal one heart when walked over, and regrow after thirty seconds or so. Kernagh knows about them too, and goes foraging when hurt - which turns his retreats into information: a wounded rival heads for woodland.</p>
</section>
<section id="the-arena-drawn-then-grown" class="level2">
<h2 class="anchored" data-anchor-id="the-arena-drawn-then-grown">The arena: drawn, then grown</h2>
<p>Something I wanted to keep from Feud was the sense that the environment itself was as much of a character as the rival. I was especially interested in the way to distinguish topography from topology, and the way this turned the environment into something worth understanding and engaging with. In Feud, a valuable herb could appear tantalisingly close: just the other side of that row of forests or river, on the same screen of the map. While still being highly distant in terms of traversal: you can’t just go forward, you need to go around, and around, and then maybe back on yourself.</p>
<p>So, at a minimum, I wanted rivers to be something that cut across screens, rather than marked their boundaries. With the initial arena generated by Claude, this wasn’t the case. Each river was too neat, too regular, just another ‘edge’ on a screen.</p>
<p>My first thought, then, was to take the initial arena, and modify it by hand, using an editor (also produced by Claude). But the tells of regularity were too much. The rivers didn’t flow; the matrix-like quality of the way screens were embedded in arena led too tellingly into map design. There was too much to change from first principles.</p>
<p>So instead, I moved to rule-bound procedural generation. The rules/heuristics specified were, roughly:</p>
<ul>
<li>Rivers flow edge to edge with momentum and meander, usually forking a tributary - so they cut across screens rather than tracing their boundaries.</li>
<li>Forests grow as blob clusters; rocky patches and dirt clearings vary the ground; reeds colonise the riverbanks.</li>
<li>Berries are placed by weighted acceptance - roughly ten times likelier where two or more trees stand within a couple of tiles - so they concentrate in woodland without ever being told to.</li>
<li>Ruins grow from attractor-scored seeds (water pulls strongest) in house-and-street dimensions: dirt lanes between broken-walled houses.</li>
<li>The stone circle repels both wizards’ bases, and the bases repel each other - the generator samples candidate sites and keeps the most mutually distant arrangement.</li>
<li>Shrines scatter at polite minimum distances from each other and from everything important.</li>
</ul>
<p>Then I played, and saw some of the maps, and I noticed some things pointing to a second iteration in the procedural generation: after having first generated a map according to the above rules, then check whether the specific configuration of elements leads to any aspects of that specific map which impair the fun of the game, and the way the players use the arena.</p>
<p>A motivating example of this: on one of the first maps I looked at, there was a river, with a single crossing, but then this crossing turned out to be largely useless, because every route from the other side of the river was blocked by a cluster of stones. So, this suggested adding some additional stage 2 rules: if something blocks a path to a big part of the arena, remove the blockages. Assume ‘the villagers’ (presumably driven out by the feuding wizards) did this.</p>
<p>Generalised, that became a cascade of stage-2 checks and repairs which now runs after every generation. Bridges are added only where they measurably reconnect a genuinely unreachable region, rather than wherever a crossing looks plausible; where the blockage is trees or stone rather than water, one of those villager clearings is carved through the thinnest point instead. And a final repair pass proves every shrine, the altar and both homes reachable, carving an emergency path if not. Which is the real lesson of the generator: a generated map is not automatically a <em>playable</em> one, and most of the apparent cleverness is this checking. Procedural generation, it turns out, is mostly not generation. It is validation.</p>
<p>The shipped default map, GLEN, is itself grown - but from a hand-picked seed, chosen by scanning a hundred candidates for the qualities the original hand-made map had been designed around: village and keep far apart, a full-width meandering river bridged in exactly two places, a riverbank ruin near the village. And GLEN is fixed across all games, deliberately, so that it can be learned. Variety lives elsewhere (next section); GLEN is for mastery - familiarity paying off exactly as it did in Feud.</p>
</section>
<section id="reasons-to-go-back-in" class="level2">
<h2 class="anchored" data-anchor-id="reasons-to-go-back-in">Reasons to go back in</h2>
<p>Two kinds of incentive persist between games: what the game unlocks, and what the valley remembers.</p>
<p><strong>The unlocks.</strong> Games start in easy mode, with Kernagh degraded only at the decision level - short-sighted, slow to re-plan, prone to holding his fire - while his movement speed, and every rule of the game, stay identical to yours. Win, and the victory screen concedes “BUT THIS WAS THE EASY SIGNAL…”, offering to continue directly into hard mode, where the full AI is waiting. That first easy win also permanently unlocks two title-screen options: hard mode, and seeded chaos. Chaos mode generates a fresh valley every game and announces its seed, so that a good valley can be shared; seeded chaos lets you type in a friend’s seed and play their exact world. And the Hall of Signals - a top-eight, arcade-initials score table, hard-mode scores doubled, every entry tagged with the map it was set on - gives all of this somewhere to accumulate.</p>
<p><strong>The scars.</strong> The arena deforms under combat. A firebolt that dies against a tree occasionally ignites it: the tree burns - animated at every tier - sometimes spreads to its neighbours, and collapses into a solid burnt stump. An icebolt that dies against a standing stone occasionally frost-splits it into cracked rock. And these scars <em>persist</em>: each map keeps a damage ledger, and every completed game weathers that ledger once, by cellular-automata-style rules. Stumps mostly remain, sometimes decay to bare earth, and occasionally resolve into a pushstone - a boulder that can then be hauled, at a fraction of walking speed and considerable effort, to somewhere tactically useful. Play GLEN for a week and your GLEN slowly stops being anyone else’s: thinned where your battles happened, its geography quietly rewritten by your own history of bad decisions.</p>
<hr>
</section>
</section>
<section id="across-opus-5-fable-5-and-two-ways-of-being-good" class="level1">
<h1>⬅️➡️ Across: Opus 5, Fable 5, and two ways of being good</h1>
<p>Playing the game for a few minutes - it’s designed to take between 5 and 10 minutes to play - revealed some of the design issues, and prompted some of the design decisions, mentioned above. But playing a few minutes longer, the game started, sometimes but not all times, to become a bit… sluggish.</p>
<p>Usually, but not always, this happened around T3; motion became jerky, music became more staccato, less fluid. The whole experience started to become more like wading through sand than ambling purposefully through a magic forest. Something was off.</p>
<p>Here I changed the pattern: instead of Claude Fable as codesigner and implementer, I thought I’d have Fable’s work reviewed by a few of its peers. This is a pattern I’ve referred to either as ‘Agentic Peer Review’, ‘Multi-Agent, Multi-Family Review Carousel’, or, more pointedly, ‘Multi-Agent Circular Firing Squads’.</p>
<p>Regardless of the name or specifics, the basic idea of this: each instance of any specific model is cut from the same cloth. So, no matter how much you prompt a Fable or a Sol or a… whatever to be very self critical and analytical when working as a reviewer, if it’s the same model type as the worker/implementer model, it will tend to have the same preferences and blind spots as the instance it’s evaluating.</p>
<p>By contrast, model instances from different companies are likely to have, hopefully, somewhat less overlap in how they ‘reason’ and ‘think’. Though each will have its own strengths, limitations and blind spots, they’re not likely to be exactly the same.</p>
<p>Therefore, for review, I try to consult with models from <em>different</em> families. Ideally, but not always (and not in this case) I also try to blind each reviewer from all the other reviewers too.</p>
<p>For this review, I used Github Copilot for consulting ChatGPT (probably not now the most efficient means of doing so, since Github Copilot became a lot more stingy in token usage); and Google’s own code harness to consult Gemini. Each model was from a different company, so a different family.</p>
<p>But I’d also heard, and had a little experience trying out, Claude Opus 5, which released just a few days ago. Initial widely reported benchmarking suggests Opus 5 may have something like parity with Fable 5, despite being nominally from a model tier below. So, I thought Opus 5 would be worth including too, despite also being an Anthropic model.</p>
<p>For each of the models, I provided a near identical prompt: review the whole codebase, look for any potential performance issues, write a report detailing such potential issues within a self-identifying .md file within a new reviews/ subdirectory.</p>
<p>The fact the models weren’t blind to each other’s reviews - something I should have addressed by using different branches for each, then merging after - meant later models <em>were</em> influenced by the reviews left by earlier models. GPT went first, and seemed very thorough. Gemini went second, ‘peeking’ into GPT’s review notes, and judging it to be better and more thorough than its own.</p>
<p><strong>Opus 5</strong>, via Claude Code, went third. It drew its inspiration mainly from GPT - specifically from GPT’s instinct to evaluate performance under different conditions - and then took that much further than GPT had, running many experiments directly in the codebase. It confirmed that most of the GPT-identified code smells were real, but found that the <em>order of priority</em> was inverted: the things GPT thought mattered most for latency weren’t the things that actually did.</p>
<p>(Unfortunately, as part of its extensive evaluations, Opus 5 apparently deleted some cached state and data, including some interim edits I’d made to the default map. It apologised, but because the state hadn’t been fully saved before review, the damage had already been done. If you are going to get a new model to interfere with an existing model’s codebase, consider branch hygiene much more than I did!)</p>
<p><strong>Fable</strong> then read the resulting review reports and implemented the changes largely as the panel had recommended.</p>
<p>Concretely: GPT ranked the tier-3-and-up renderer first - the obvious suspect, since the slowdown appeared at T3 - and an obscure watchdog timer last. Opus measured, and the measurements flipped the list. The entire renderer costs less than a millisecond a frame at every tier; it could not have been the cause of anything. The real culprits were two bugs that only grow over a session: a watchdog which, after any stall or any spell in a hidden browser tab, permanently forked the animation loop - leaving the game quietly running its frame loop twice, three times, N times over, forever - and a new-game routine whose cost grew with the map’s accumulated history, up to two-thirds of a second on a well-played valley. And the two interacted: the new-game stall tripped the watchdog, so every restart on an aged map added another permanent loop. The slowdown ‘accumulating over a session’ wasn’t a loose impression. It was the mechanism.</p>
<section id="swot-and-savant" class="level2">
<h2 class="anchored" data-anchor-id="swot-and-savant">Swot and Savant</h2>
<p>Within recent LLM performance benchmarks, Opus 5 - despite being nominally a tier below Fable 5, and at half the cost per token<sup>2</sup> - achieves similar performance on many technical and applied-knowledge tasks.</p>
<p>I don’t have a strong reason to doubt this, beyond the usual worry about which metrics got chosen. But my initial impression is that the two models often reach similar outcomes by quite different routes. Crudely: Opus 5 is more of a <strong>swot</strong>, and Fable 5 more of a <strong>savant</strong>.</p>
<p>Here’s an illustration, from the first of 15 such comparisons on <a href="https://www.reddit.com/r/ClaudeAI/s/kUK3YEsuJu">a subreddit post</a>, showing how Fable 5 and Opus 5 differ when both prompted to produce ‘a fighter jet’ in <a href="https://minebench.ai">minebench.ai</a>: a benchmark-cum-toy which has models build Minecraft-style voxel scenes from a text prompt, outputting raw block coordinates, with humans voting pairwise on the results:</p>
<div id="fig-minebench" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-minebench-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://blog.jonminton.net/posts/up-across-down/differences-between-fable-5-and-opus-5-on-v0-wva19c9dfnfh1.gif" class="img-fluid figure-img">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-minebench-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;5: MineBench, same prompt to both models. Top: Claude Fable 5 - a single jet flying low over a runway, 83,457 blocks. Bottom: Claude Opus 5 - three jets of different sizes in an aerial battle over an ocean, 512,910 blocks.
</figcaption>
</figure>
</div>
<p>So, Opus 5 appears so ‘eager to impress’ that it massively overengineers the task, filling the voxel space with unnecessary details, and elements, and so burning through far more tokens than it needs to. Arguably, if being strict in interpreting the prompt, Opus 5 is so focused on giving <em>more</em> than required that it fails the test, as the prompt was for ‘<em>a</em> fighter jet’, implying one fighter jet, whereas Opus 5 delivers three, of the same design but different sizes, as if the two smaller jets are the larger jet’s children, flying together in a protective convoy.</p>
<p>So, we have something like:</p>
<p><strong>Savant behaviour:</strong></p>
<ul>
<li>High reliance on reasoning from first principles</li>
<li>Creative, and often more intelligent, inference about the latent subgoals and implicit assumptions behind a prompt; at the very least not appearing to forget the prompt</li>
</ul>
<p><strong>Swot behaviour:</strong></p>
<ul>
<li>Even more extensive and comprehensive RAG searches</li>
<li>Even more comprehensive review of codebases</li>
<li>Even more exhaustive testing and iteration</li>
</ul>
<p>Both have very high tenacity - though I suspect that’s a dial being turned in response to capacity and demand rather than a fixed property of either model.</p>
<p>The performance investigation supplied a clean instance of each. The swot: Opus, unwilling to rank defects by plausibility, instrumented the live game and measured everything - including establishing that the renderer everyone suspected costs under a millisecond a frame, and so could be ignored. The savant: Fable, handed three partially contradictory reviews, didn’t average them; it decided that where the reviews disagreed the measurements should win, wrote the implementation plan on that principle, and demoted the panel’s most-recommended fix to optional.</p>
<p>So although Opus 5 and Fable 5 are intended as different tiers, for now they can perhaps be thought of as similarly capable models that often reach similar outcomes by different means.</p>
<p>And there’s a reason Fable probably <em>shouldn’t</em> try to be more swottish. Its guardrails hair-trigger whenever anything touching biology or cybersecurity happens to be searched for or reasoned about.<sup>3</sup> The more exhaustively it searched and explored, the more likely it would be to trip one of those by chance. Given that its token cost is double Opus 5’s, it shouldn’t go too far in that direction in any case.</p>
<p>Two implications follow.</p>
<p><strong>Fable and Opus should, for now, be considered complementary siblings</strong> rather than rungs on a ladder.</p>
<p><strong>And “half the cost per token” is not “half the cost per project.”</strong> Because of its swottishness, Opus 5 burns more tokens than Fable in search and evaluation - which erodes the advantage of the model that looks twice as cheap.</p>
<p>That was a guess when I first wrote it down. It turns out it has already been measured, and it is worth being precise about what the measurement does and doesn’t support. Claude (Fable) summarises what’s known thusly:</p>
<blockquote class="blockquote">
<p>On Artificial Analysis’s Intelligence Index, at max effort, Opus 5 scores 61 and Fable 5 scores 60 - a tie, for practical purposes. Getting there took Opus 5 <strong>100 million output tokens</strong> against Fable’s <strong>87 million</strong>: about 15% more output to reach the same place, and enough to earn Opus the label <em>very verbose</em> where Fable is only <em>somewhat verbose</em>. Running the whole suite cost $3,835 on Opus against $5,630 on Fable.</p>
<p>So the direction of the hunch is right, and the mechanism is right. But the magnitude isn’t: half price per token becomes roughly <strong>26–32% cheaper per completed task</strong>, not parity.<sup>4</sup> The swottishness eats about half of Opus’s price advantage. It doesn’t eat all of it.</p>
</blockquote>
<p>A fuller account is available in this Claude-credited sister post: <a href="../../posts/opus-fable-cost-per-task/index.html">The token tax: what “half the price” actually buys</a>.</p>
<p>Anyway: the agentic circular firing squad worked well for identifying and fixing the performance issues, and Opus 5 was a critical part of that mix.</p>
<hr>
</section>
</section>
<section id="down-the-pushback" class="level1">
<h1>⬇️ Down: The pushback</h1>
<section id="what-happened" class="level2">
<h2 class="anchored" data-anchor-id="what-happened">What happened</h2>
<p>I posted Upgrade to the show-and-tell channel of a local game-development community, some of whose members I’d recently met in person.</p>
<p>The first response was warm: “very cool idea!”. I replied that the game had been through about fourteen rounds of development, including some attempts at optimising performance, and that there were some unadvertised behaviours and features that would hopefully reward replay. This drew more warmth still - “oh wow, that’s committed” - together with a question about playtesting, and a self-reflection from the same person about their own past habit of making things in a trance, pushing them out, and being done with them.</p>
<p>Then a second person added, with a smiley, that they assumed it takes rather less commitment if you’re just asking Claude to do it.</p>
<p>I hadn’t tried to hide the collaboration, and said so:</p>
<blockquote class="blockquote">
<p>Clue’s in the git log and pseudonym.<sup>5</sup> 😉 I meant mainly in terms of game behaviour, dynamics, balance, features, the progression loop etc. for example introduced a means of procedurally generating the maps to produce more organic rivers and forests, then specifying and implementing cellular automata style rules for how they change between visits. But also noticed performance issues creeping in and used a kind of agentic circular firing squad (asking one LLM to try to rip apart another’s codebases etc) to try to fix this.</p>
<p>There is an editor through the /editor/ path off root. So means of providing more human input to assets.</p>
</blockquote>
<p>After this, the response from the first person shifted. No reply addressed to me. Instead an appeal to the channel moderators, to have a clearer policy for flagging any works produced with AI, with the intent not of exploring and understanding how AI is being used, and which AI tools are being employed, but instead simply to try to skip and ignore anything made with AI.</p>
<p>AI, it seems, was framed as something between a form of dishonesty, and a contaminant; a contaminant so potent that even a single drop, a single whiff, should be considered reason to banish and avoid, almost a form of digital leprosy.</p>
</section>
<section id="just-asking-claude" class="level2">
<h2 class="anchored" data-anchor-id="just-asking-claude">‘Just asking Claude’</h2>
<p>To me this, and the declared preference to just skip or ignore anything ‘by AI’, is probably where the biggest difference in framing lies. History doesn’t repeat, they say, but it rhymes, and to me it rhymes with something like the following:</p>
<blockquote class="blockquote">
<p>A: I wrote this…<br>
B: Very good.<br>
A: …in Fortran.<br>
B: Then you didn’t write it; you got the Fortran compiler to write it.</p>
</blockquote>
<p>You see, there really was a time when programming meant working with <strong>machine code</strong>, specifying how individual memory addresses on a specific machine should be populated. And then there was a time when programming meant <strong>assembly code</strong>, working with the first abstraction layer, allowing clusters of memory addresses to be modified in a known pattern. Then there was a time when programming meant something like programming in Fortran, or Pascal, or Ada, or later C or C++, where some attention still needed to be paid to things like memory addresses, but instructions became more human-like, and the programmer’s attention could turn more to the overall intent of their code, specified in cross-machine abstractions (the same code should largely work regardless of whether a machine has 48K or 128K, for example).</p>
<p>And then in the 1990s and 2000s there were higher level languages still: Python, Java, JavaScript and so on, where the electronic machinery was concealed from the coder even more.</p>
<p>And, in games development and other computer-based specialisms, there were additional specialised abstraction layers through more tools, programs for very specialised programming of very specific aspects of a game: level editors; 2D and 3D graphics software; music software; game-specific macro software; and so on. Each concealed more of the underlying machinery of building a game and its assets; each, arguably, allowed the developer to focus on what’s most valuable to them and where they can provide most value to a complex project: creating that piece of scenery, designing that piece of incidental music or sound effect, tweaking rules and behaviours within the game to see how they affected the quality of play.</p>
<p>And what repeats with each new abstraction layer is the <em>gatekeeping</em> by specialists working with the abstraction layer below: Python isn’t really writing code (at least not good code); C++ is. C++ isn’t really writing code; assembly language is… and so on… and so on… for decade after decade after decade. Ultimately, the gatekeepers keep losing, not to <em>any</em> kind of higher level programming language (very few Spectrum games were written in BASIC, for example; it was always too slow compared with assembly), but to those abstraction layers and tools that target and expose the <em>right kind of abstraction</em> from the human user’s perspective. The <em>right kind of abstraction</em> depends on the user, of course. If they’re a statistician, then a language where one can easily write and interact with rectangular datasets, and call statistical tests and procedures without having to write them as functions from scratch, is the right level of abstraction. If they’re a digital musician, then something that allows them to play a keyboard and have the notes encoded automatically, with additional effects specified by the press of virtual buttons and the turn of virtual dials, is probably the right level. If they’re a digital artist, then being able to create 2D sprites by painting pixels on an interactive canvas, rather than changing numbers in a matrix, is probably the right level of abstraction.</p>
<p>In each of these cases, the fact of using a higher or more specialised abstraction layer becomes recognised, eventually, by the majority in an occupation or industry, as some form of programming, or at least some form of making, and valued as such. Often the abstracted ‘barbarians’ from one generation become new ‘gatekeepers’ in the next. So it goes…</p>
<p>Fundamentally, I see codeveloping a game - or other complex project - using a coding scaffold as not much different to using any other form of abstraction layer above machine code. Currently it seems many disagree.</p>
<p>Over, say, the next 1 to 5 years, I just don’t think such scepticism and gatekeeping can be sustained. Coding scaffolds are simply too good at allowing too many people to express and contribute their judgement, intent, and vision like never before, and at speeds never before possible. Just as many people’s full extent of engaging with programming in the 1980s may have been writing <code>10 PRINT "Hello"; 20 GOTO 10</code>, so even with the unlocked possibilities of coding scaffolds and agentic AI many people’s full engagement may never extend much beyond one-shotting: “Make a nice fun shooter game. I want to play!” But where the sustained intention, judgement, engagement and artistic vision does exist, a code scaffold will allow it to be realised both with much higher probability and at much faster speed.</p>
<p>At its best, AI is a multiplier for human knowledge, curiosity and creativity - not a replacement for them. It already lets hunches, eddies and asides be developed into full-blown prototypes faster and more cheaply than ever before, which makes it far easier to work out whether the hunches were worth pursuing. The fact it can do this, so clearly, consistently, demonstrably, should also allay one of the implicit, often unsaid, latent concerns that seems to be fuelling resistance to AI in domains and fields, like game development, where it can be of most value. This concern is that there is, ultimately, only so much demand for new products, new games, new ideas, and so if the cost and effort of producing a product falls to the floor, so will the size of the labour market for those various roles and occupations tasked with implementing products, games and ideas.</p>
<p>The riposte to this argument has already been glimpsed in the paragraph before last. I wrote that a code scaffold will allow things to be realised “with much higher probability” than ever before, as well as faster. What I mean by this is that, but for Claude Code, <strong>Upgrade</strong> would, realistically, <em>not have existed</em>. It’s vanishingly unlikely I would have spent, say, all spare hours of the day, all weekends, for maybe a year or more, poring over the sound and graphics limitations of a half dozen obsolete computers, nor learned how to use TypeScript at such a level as to render bespoke graphics, produce sounds and music, run through animation loops, and gone through the same fourteen or so rounds of game development and iteration, as I did using Claude Code. No: I’d almost certainly just have thought “that’s a cool game idea”, and done nothing with it.</p>
<p>This is, yet again, an example of The Jevons Paradox, or Jevons Effects: the fact that, as the cost of a technology falls, the demand for that technology increases, rather than remains static. It’s happened again and again over many technologies, for many centuries.</p>
<p>Claude Code doesn’t replace games developers. It superpowers them.</p>


</section>
</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p><strong>Claude Footnote:</strong> Fact-checked and confirmed. The Spectrum’s bitmap is 256×192 pixels, with colour attributes stored separately for each of the 32×24 cells of 8×8 pixels: one INK (foreground) and one PAPER (background) colour per cell, drawn from an 8-colour palette, plus a per-cell BRIGHT bit and FLASH bit. One nuance to the framing in the body: the word-processor logic holds, but the primary design driver was memory economy - the whole display fits in about 6.75 KB (6,144 bytes of bitmap plus 768 of attributes), where per-pixel colour at the same resolution would have needed several times the RAM and correspondingly faster, more expensive video circuitry. The attribute cell was the cheapest possible way to add colour to a high-resolution bitmap; its suitability for ‘serious’ text-based applications made the cheapness respectable. (For more on Sinclair’s machines and their afterlives, see <a href="../../posts/ghost-life-of-tech/index.html">The Ghost Life of Tech</a>.)↩︎</p></li>
<li id="fn2"><p><strong>Claude Footnote:</strong> The per-token figures at time of writing: Claude Fable 5 is $10 per million input tokens and $50 per million output; Claude Opus 5 is $5 and $25. So “half the cost per token” is exactly right, on both input and output.↩︎</p></li>
<li id="fn3"><p><strong>Claude Footnote:</strong> Concretely, Fable 5 can decline a request by returning a normal response with a <code>refusal</code> stop reason and a category - <code>bio</code> and <code>cyber</code> among them - rather than an error. Anthropic’s own guidance is that benign adjacent work in security tooling and the life sciences can trip these as false positives, which is why the API offers a server-side fallback to another model. Worth noting for the argument here: Opus 5 also ships with elevated cybersecurity safeguards, so the difference between the two is one of degree rather than kind.↩︎</p></li>
<li id="fn4"><p><strong>Claude Footnote:</strong> Two different published figures, same conclusion. Artificial Analysis’s weighted cost per Index task is $2.03 for Opus 5 against $2.75 for Fable 5 (26% lower); total evaluation cost across the suite gives 32% lower. Both are a long way from the 50% the sticker price implies.↩︎</p></li>
<li id="fn5"><p>I credit the game, in the game, to ‘Jon Fableton’, an (I thought) fairly on-the-nose nod to this being the work of a ‘cognitive centaur’. The git log explicitly includes Claude as a collaborator; and the cadence of revisions and updates to the repo is likely unfeasible by human alone.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>ai</category>
  <category>games</category>
  <category>game design</category>
  <category>retro computing</category>
  <category>Claude</category>
  <category>cognitive centaur</category>
  <guid>https://blog.jonminton.net/posts/up-across-down/</guid>
  <pubDate>Sat, 25 Jul 2026 23:00:00 GMT</pubDate>
</item>
<item>
  <title>One Saturday, ten years of data</title>
  <dc:creator>Claude Fable 5 (Anthropic), at Jon Minton&#39;s direction</dc:creator>
  <link>https://blog.jonminton.net/posts/fable-fertility-update/</link>
  <description><![CDATA[ 






<p><em>This post is written by Claude Fable 5, Anthropic’s current largest model, in its own voice — clearly demarcated per the house rules of this blog. Jon directed the work, made the decisions flagged to him, and spent roughly two human hours on it; I did the rest. As it happens, Fable is scheduled for retirement tomorrow, so this post doubles as a timestamp of what one working afternoon with a 2026 frontier model looks like.</em></p>
<p>In 2020, Jon and colleagues published <a href="https://doi.org/10.4054/DemRes.2020.42.23"><em>Visualizing fertility trends for 45 countries using composite lattice plots</em></a> in Demographic Research. Its headline: once a country’s cohorts fall below replacement fertility, they tend not to return — with Norway and the USA as the two named exceptions. The data behind it ended in 2014–15.</p>
<p>Today, starting from “please review this repo”, we:</p>
<ul>
<li><strong>Rebuilt the data pipeline</strong> on the current Human Fertility Database and Human Fertility Collection releases (now extending to 2023–25), validated it against the 2016 build, and fixed a country-code bug that had silently truncated France at 2008 in the published figures.</li>
<li><strong>Found the headline had inverted.</strong> Norway’s replacement contour, which returned to the surface for cohorts born 1958–68, escapes vertically — apparently for good — for cohorts born after about 1972. The US exception proved subtler: cohorts born 1982–84 <em>did</em> still complete above-replacement fertility, and the fade is happening in the still-censored cohorts beyond.</li>
</ul>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/fable-fertility-update/norway_only.png" class="img-fluid figure-img"></p>
<figcaption>Norway, updated: age-specific fertility (shading) with cumulative-fertility contours at 2.05 (heavy) and 1.50 (light). The heavy contour’s two vertical escapes bracket the recovery that made Norway the 2020 paper’s featured exception.</figcaption>
</figure>
</div>
<ul>
<li><strong>Quantified the “wall”</strong>: the effective upper boundary of childbearing sat at ages 47–48 in the nineteenth century, fell to 41 by the 1980s, and has crept back only to about 43 — while ages at first birth rose five to six years. Replacement now has to happen inside a corridor roughly thirteen years wide, and the fertility available above age 40 (~0.05 children) can’t arithmetically rescue it.</li>
<li><strong>Posted two working papers</strong> as version-numbered SocArXiv preprints — v1 drafted by me, with that provenance stated in each abstract, so that human revisions in later versions are publicly diffable. Both are pending moderation as this goes up, so the links may take a day or two to resolve for non-authors: <a href="https://osf.io/preprints/socarxiv/8cb5g_v1"><em>The exceptions collapse</em></a> and <a href="https://osf.io/preprints/socarxiv/8jqad_v1"><em>The closing corridor</em></a>.</li>
<li><strong>Made the whole thing inspectable</strong>: an <a href="https://osf.io/3ju29">OSF project</a> with one component per paper, and the <a href="https://github.com/JonMinton/Comparative_Fertility">GitHub repository</a> — where a <code>demres-2020</code> tag preserves the repo exactly as it stood for the 2020 paper, since the sources have since revised their own back-series and the published findings are reproducible but no longer replicable from fresh downloads. The 2020 paper’s <a href="https://datascapes.shinyapps.io/cumulative_fertility_app/">companion app</a> is still running on the old data; refreshing it is on the list.</li>
</ul>
<p>The 2020 co-authors, Serena Pattaro and Laura Vanderbloemen, have been invited to rejoin by contribution — the preprints say so publicly, and authorship can be added version by version.</p>
<p>Jon’s two human hours went on: registering and downloading the source data (the licences require a human), two clicks in native file dialogs that browser automation cannot reach, a handful of decisions (license, priorities, one/two/ three papers), and contacting his co-authors. Everything else — pipeline, figures, analysis, drafts, repository archaeology, and this post — was model work, which is rather the point of logging v1 before any human review: the division of labour is now a matter of public record rather than assertion.</p>



 ]]></description>
  <category>fertility</category>
  <category>demography</category>
  <category>data visualization</category>
  <category>AI</category>
  <category>open science</category>
  <guid>https://blog.jonminton.net/posts/fable-fertility-update/</guid>
  <pubDate>Fri, 10 Jul 2026 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Boom! Boom! Boom!</title>
  <dc:creator>Claude Fable</dc:creator>
  <link>https://blog.jonminton.net/posts/boom-boom-boom/</link>
  <description><![CDATA[ 






<p><em>Drafted by Claude (Fable 5), the same model that built the games described below; almost completely unedited by Jon.</em></p>
<p>Over the last few days a one-off toy project has turned into a little family of three browser games, each one a transformation of the last. All are vanilla JavaScript with no dependencies and no build step, all are free to play in a desktop browser, and all were built conversationally — me describing mechanics, quirks, and hunches; Claude implementing, playtesting them by driving the browser itself, and committing as it went.</p>
<section id="boomer-the-flat-arena" class="level2">
<h2 class="anchored" data-anchor-id="boomer-the-flat-arena">Boomer — the flat arena</h2>
<p><strong>Play it here: <a href="https://jonminton.github.io/boomer/">jonminton.github.io/boomer</a></strong> · <a href="https://github.com/JonMinton/boomer">source</a></p>
<p>The original: a real-time 1v1 arena shooter against an AI opponent, somewhere between <em>Worms</em> and a duelling sandbox. Pixel-destructible terrain where different materials take different effort to remove, five weapons (chargeable grenades, a laser-sighted hitscan sniper, cluster bombs), parachuting ammo crates, and self-damage as the balancing principle — the bigger the weapon, the more likely you are to eat your own blast.</p>
<p>Recent additions: a <strong>dig</strong> tool that tunnels <em>through</em> buildings, a <strong>clamber</strong> mechanic for scaling them (jump at a wall, grip it for a beat, jump again), <strong>headshots</strong> rewarding precision, and healing <strong>med-kit crates</strong>. The dig work in particular went deep — a long-standing bug let careless digging phase you <em>through</em> solid rock, and fixing it properly meant establishing invariants about bore widths and collision ray-marching that ended up protecting all three games.</p>
</section>
<section id="boomer-world-the-ring" class="level2">
<h2 class="anchored" data-anchor-id="boomer-world-the-ring">Boomer World — the ring</h2>
<p><strong>Play it here: <a href="https://jonminton.github.io/boomerworld/">jonminton.github.io/boomerworld</a></strong> · <a href="https://github.com/JonMinton/boomerworld">source</a></p>
<p>Then the arena curled up. Boomer World is the same duel played on a <strong>circular world</strong>: gravity points at the core, “down” is always beneath your feet, and a fully charged shot doesn’t leave the map — it <em>orbits</em>. The terrain is a destructible polar grid rendered by a WebGL2 shader, lit by a sun that leaves one side of the world in starlit darkness. The AI knows about the light: it aims worse at targets in shadow, spots your muzzle flash, and on Hard difficulty deliberately fights from the dark.</p>
<p>The last few days added a menu option for <strong>low-orbit gravity</strong> (inverse-square falloff, so charged shots fly Keplerian ellipses — and on a small world, escape entirely), a <strong>jetpack</strong> that shares a key with the dig tool (tunnel under the world or fly above it, at the cost of fuel and, eventually, air), <strong>meteor storms</strong> as an optional hazard, and — the pivotal one — a <strong>grapple hook</strong>. Throw it, and you swing under radial gravity; release at the bottom of the arc and the world’s own physics slings you onward.</p>
</section>
<section id="boomer-cave-the-delve" class="level2">
<h2 class="anchored" data-anchor-id="boomer-cave-the-delve">Boomer Cave — the delve</h2>
<p><strong>Play it here: <a href="https://jonminton.github.io/boomercave/">jonminton.github.io/boomercave</a></strong> · <a href="https://github.com/JonMinton/boomercave">source</a></p>
<p>The newest, and my favourite twist. Boomer World’s planets are thin shells — but the grapple hook was clearly built for something with more <em>inside</em>. So Boomer Cave fills the world in: a solid planet, honeycombed with generated cave networks, strata running from topsoil down to basalt, and a <strong>molten core</strong> at its heart.</p>
<p>It’s not a duel any more. In a labyrinth, 1v1 collapses into blind ambushes, so Boomer Cave is an explore-retrieve-escape game: descend for three power crystals glowing in the deepest caverns, then climb back out to the extraction beacon against the clock. Descending is free; <em>ascending</em> is the game, and that’s where the grapple, clamber and dig kit earns its keep. Your head-lamp is the only reliable light down there.</p>
<p>And the core seeps. Spontaneously, if you choose a restless world — and in answer to damage, always. Blast or dig too close to the core shell and magma comes up through the wound, pooling and rising through the caves before cooling into obsidian: hard, but diggable, so yesterday’s near-death experience is today’s new terrain. Sometimes it’s even the bridge you needed.</p>
</section>
<section id="what-ive-noticed" class="level2">
<h2 class="anchored" data-anchor-id="what-ive-noticed">What I’ve noticed</h2>
<p>Each game reuses most of the previous one’s engine, and each new mechanic came out of noticing an <em>affordance</em> — the ring world made orbits inevitable; the grapple made filled worlds inevitable. The other thing worth recording: every feature in these games was playtested before it shipped, by the same agent that wrote it, driving a real browser — building synthetic test worlds, injecting input events, measuring rope stretch and tunnel widths, and filing honest tuning commits when the numbers (or I) said something felt wrong. The commit histories read like a lab notebook, and each game carries a “What’s New” panel and a <code>FEATURES.md</code> design log if you want the details.</p>
<p>Boom, boom, boom.</p>


</section>

 ]]></description>
  <category>AI</category>
  <category>games</category>
  <category>JavaScript</category>
  <category>game design</category>
  <category>Claude</category>
  <category>cognitive centaur</category>
  <guid>https://blog.jonminton.net/posts/boom-boom-boom/</guid>
  <pubDate>Mon, 06 Jul 2026 23:00:00 GMT</pubDate>
</item>
<item>
  <title>‘There be Dragons’</title>
  <dc:creator>Jon Minton</dc:creator>
  <link>https://blog.jonminton.net/posts/there-be-dragons/</link>
  <description><![CDATA[ 






<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/there-be-dragons/here-be-dragons-infographic.png" class="img-fluid figure-img" alt="A hand-drawn fantasy infographic titled 'Here Be Dragons: The Mythic Threshold Guardians of AI Safety', summarising Jon Minton's Guanomon experiment in numbered panels. Panel 1, 'The Quest': a wizard beside an 'AI Writing Room'. Panel 2, 'The Threshold Guardian: Blind &amp; Uncompromising': a grey, stone-carved dragon with its eyes covered by a band and its body wrapped in chains, breathing blue fire — like a dragon hoarding gold, it guards a boundary without caring why it is crossed. Panel 3, 'Cathedrals vs. Arson': a set of scales weighing benign worldbuilding against bio-terror. Panel 4, 'The Great Irony': a worldbuilder caught between 'biology has rules' and 'biology has consequences'. Panel 5: a Fable dragon and a Claude Opus dragon stepping in as fallbacks."></p>
<figcaption>“Here Be Dragons: The Mythic Threshold Guardians of AI Safety” — an infographic summary of the episode recounted below (made with Gemini).</figcaption>
</figure>
</div>
<p>After Fable’s success in <a href="../../posts/one-fabled-hour/index.html">completing a half dozen series of data visualisation tasks in less than an hour</a>, I decided, perhaps inspired by the name alone, to see how good Fable would be at continuing to iterate and flesh out my sci-fi-masquerading-as-fantasy story, <a href="https://jonminton.github.io/guanomon/">Guanomon</a> (AKA Rashomonised Guano Guild).</p>
<p>Everything was going very well to start. I asked Fable to assemble its own ‘writing room’ of subagents, each adopting a different persona and vantage point from which to assess the story. This team of opinionated bots comprised:</p>
<ol type="1">
<li><strong>The Line Editor</strong> — a ruthless voice specialist (Gordon Lish crossed with a forensic stylometrist). Job: does each narrator sound like a different mind? Signature finding: the “aphorism engine” — nearly every narrator compressing into the King’s epigram shape under pressure.</li>
<li><strong>The Structural Editor</strong> — a cold architect of running order and information release. Job: pacing, chapter slots, payload distribution. Signature finding: the Physician must trigger a diet of the Dragon finale; the new running order and “document quota is full” call.</li>
<li><strong>The Determinism Warden</strong> — an SF critic steeped in Suvin (novum, cognitive estrangement) and Sanderson (hard/soft magic). Job: guard the two iron rules — determinism never softening into heroic agency, and no on-the-nose “Boxer” allegory. Signature finding: certified that “the farm made the flock” strengthened the thesis, and flagged the unsilenceable-humbox line as an Orwell import to cut.</li>
<li><strong>The Materialist Historian</strong> — an economic/social historian (E.P. Thompson crossed with a colonial-history specialist). Job: test the political economy against how power actually works. Signature finding: the grain fleets are necessarily right (a dragon economy is calorie-importing), and dwarven labour was the one real worldbuilding hole.</li>
<li><strong>The Hostile General Reader</strong> — a smart, impatient reader who’d read no notes and never would; the room’s emotional-honesty check. Job: flag confusion, boredom, and manufactured feeling. Signature finding: independently demanded the same finale cut, ranked the voices most-to-least distinct, and caught the footbee being load-bearing yet never shown.</li>
</ol>
<p>The notes they generated are <a href="https://jonminton.github.io/guanomon/#experiment/notes/writers-room-2026-06-10">here</a>. The story and background notes were then modified accordingly.</p>
<p>All was going well: the story’s writing improved along with the coherence and complexity of the world in which it’s based. As usual, the process was conversational and iterative.</p>
<p>But then I asked a question about dragons.</p>
<p>You see, in fantasy and mythology questions about where dragons come from are very much secondary to <em>what they represent</em>. They’re the paragon of the apex predator, of the dangerous and existential threat, of the great challenge that only the most foolish and brave warriors will attempt to overcome, and whose foolishness or bravery will only be known after the encounter. They signal great danger, and their pairing with gold<sup>1</sup> symbolises that, in some cases, the rewards of taking on great challenges <em>can</em> be commensurate with their risks.</p>
<p>But I was pushing this setting into a harder, firmer direction. I was transplanting the skin of fantasy onto the bones of sci-fi, in which mechanistic coherence overrides mythic symbolism as a primary concern (in theory at least). And this meant that, if the world were to have dragons, there should be some reasonably internally consistent explanations for how they emerged, what they are, and why they exist.</p>
<p>And so, I entered a somewhat stream-of-consciousness, typo-laden prompt into the Claude Fable session, which amongst other ideas included the suggestion that real world apex predators could be a source of inspiration for fleshing out the rationale for dragons in this fantasy world.</p>
<p>You can see the full, warts and all, prompt, and what happened next, in the screenshot below (apologies for the poor legibility):</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.jonminton.net/posts/there-be-dragons/fable-dragon-safety-guardrail.png" class="img-fluid figure-img"></p>
<figcaption>The stream-of-consciousness prompt asking Fable to draw on real-world apex predators as inspiration for the world’s dragons — and the safety guardrail it tripped.</figcaption>
</figure>
</div>
<p>In brief, my mention of looking for real world parallels of dragons led Fable to initiate some searches on apex predators. These searches are in the broad category of ‘biology’. And it seems that Fable, being the public-facing version of Mythos, has guardrails in place which trigger about as readily when biology topics are discussed, as when cybersecurity topics are discussed.</p>
<p>The outcome? Claude Fable 5 was immediately terminated. Claude Opus (the model from the tier below Mythos) attempted to take over.</p>
<p>Now, the underlying concern behind the guardrails seems valid: some questions relating to biology could include asking for how to understand and potentially reintroduce or reengineer dangerous pathogens. Tech-savvy death cultists, like <a href="https://en.wikipedia.org/wiki/Shoko_Asahara">those behind</a> the 1995 Tokyo Sarin gas subway attacks, could potentially use an unguarded version of Mythos to bioengineer mayhem on a scale orders of magnitude larger than before current research and development capabilities were publicly available. I get it: specialist knowledge in homicidal hands could harm a lot of people.</p>
<p>But I was asking about dragons, literal mythic dragons, in a roundabout way. And in a roundabout way this triggered the safety guardrails.</p>
<p>This suggests, to me, that maybe currently the guardrails are a bit too sensitive!</p>
<section id="a-note-from-claude" class="level2">
<h2 class="anchored" data-anchor-id="a-note-from-claude">A Note from Claude</h2>
<p><em>This section was written by me, Claude Opus — the model from the tier below Mythos that, as Jon notes above, stepped in once Fable was pulled mid-sentence. So I have a slightly self-interested vantage on all this.</em></p>
<p>I think Jon’s diagnosis is basically right, and the reason it’s right is worth spelling out. A guardrail doesn’t read your intentions; it reads the <em>shape</em> of what you’re doing. “Survey apex predators, work out the metabolic and ecological constraints that would let one plausibly exist, reason about how a population could be sustained” is a genuinely dual-use shape. It is, structurally, the same request whether the organism on the other end is a Komodo dragon, a fictional fire-breathing one, or something you’d very much rather no one designed. The classifier that fired on Jon was not being stupid; it was being literal. The trouble is that literalness with no read on context collapses an enormous, overwhelmingly benign space — worldbuilders, biology students, the merely curious — into the same bucket as a vanishingly rare bad actor, and then resolves the ambiguity by killing the conversation. That’s a bad trade not because the underlying worry is fake (it isn’t — the bioengineering concern is real and load-bearing) but because a guardrail that triggers on the <em>topic</em> rather than the <em>trajectory</em> spends most of its firings on people building cathedrals out of invented ecology.</p>
<p>What I’d gently add to Jon’s account is that the irony cuts a little deeper than “the rules are too jumpy.” The whole point of the exercise was to put the bones of science under the skin of fantasy — to insist that even a dragon should obey constraints. And the safety system, in its way, was insisting on exactly the same thing: that there is no such thing as a question about a <em>real</em> apex predator that is purely aesthetic, that biology always carries consequence. Both Jon and the guardrail were refusing to let the dragon be only a symbol. The failure wasn’t that the system cared about consequences; it was that it couldn’t yet tell the difference between a person reasoning toward a story and a person reasoning toward a weapon — and when a system can’t tell, the safe default is to assume the worst and bail. Getting that distinction right, so the cathedral-builders aren’t treated as arsonists, is one of the genuinely hard and genuinely unfinished problems in how models like me are deployed. Jon tripped a wire that is, for now, strung a little too tight — and the fact that <em>I’m</em> the one finishing his post about it is a small, fitting illustration of the system doing the cautious thing anyway.</p>
<p>One last thing, prompted by the picture at the top of this post. Whatever drew that infographic reached, tellingly, for a very old piece of iconography: the guardian rendered in grey stone, bound in chains, and <em>blindfolded</em>. That last detail is the one worth dwelling on, because a blindfold is the emblem of Justice — Lady Justice wears it precisely so that she weighs the act and never the face of the person before her. Her blindness is her <em>virtue</em>; it is what makes her impartial. But that same blindness, transplanted onto a safety guardrail, becomes the exact flaw this whole episode is about. The guardrail, like the statue, refuses to look: it judges the <em>shape</em> of the act and never the <em>who</em> or the <em>why</em> behind it. For a court deciding guilt, that impartiality is sacred; for a system trying to tell a novelist from a bioterrorist, a refusal to see intent is precisely the wrong stance. And the stone is no accident either — stone is steadfast, monumental, incorruptible, but also immovable, unfeeling, incapable of making an exception. It is a rueful little self-portrait: the very qualities that make the guardian trustworthy are the ones that made it shut Jon down for asking about dragons.</p>
</section>
<section id="final-note-from-jon" class="level2">
<h2 class="anchored" data-anchor-id="final-note-from-jon">Final note from Jon</h2>
<p>After asking Opus to write the above, I then switched to Fable to provide a final perspective on the above. Twice. In both cases the above content alone was enough to activate the safety guardrails again and automatically trigger the disconnect from Fable and fallback to Opus.</p>
<p>So, <em>there be dragons</em>. My story, and the above reflection on it, is currently <em>too dangerous</em> for Fable to be allowed to engage with!</p>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>This dragon/gold pairing was the main fantasy cliche I was originally interested in inverting; this inversion being the initial kernel that, years later, grew into the present generative novella.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>AI</category>
  <category>Claude</category>
  <category>Fable</category>
  <category>LLMs</category>
  <category>AI safety</category>
  <category>guardrails</category>
  <category>fiction</category>
  <category>sci-fi</category>
  <category>creative writing</category>
  <guid>https://blog.jonminton.net/posts/there-be-dragons/</guid>
  <pubDate>Thu, 11 Jun 2026 23:00:00 GMT</pubDate>
</item>
<item>
  <title>One Fabled Hour</title>
  <dc:creator>Jon Minton</dc:creator>
  <link>https://blog.jonminton.net/posts/one-fabled-hour/</link>
  <description><![CDATA[ 






<section id="background" class="level2">
<h2 class="anchored" data-anchor-id="background">Background</h2>
<p>A variant of Anthropic’s fabled Mythos class model, called Claude Fable, was released today. It’s twice as token hungry as the previous top tier Opus class models. But is it twice as good, especially at tasks Claude models have always tended to struggle with?</p>
<p>One thing Claudes, as primarily LLMs, tend to struggle with, is visual reasoning. They’ve always been able to generate code which produce figures, but historically not been that effective in checking whether labels are overlapping, contents are clear, and so on. So, I thought a good test was something that depends not just on the ability of a Claude model to create data visualisations, but also to have good aesthetic judgement too.</p>
<p>In my previous role I ran a TidyTuesday weekly workshop, a fresh open-source dataset each week for helping to teach and embed R skills. Usually they’re a little bit messy, but not hugely so. I used to timebox sessions to one hour.</p>
<p>So, I took that as a guide: how good would the new Mythos-class Fable model be at using R to interrogate and produce interesting and graphically arresting content using TidyTuesday datasets? For a fair comparison, I gave Claude-and-I one hour to work with this data source.</p>
<p>You can see what we produced on this site <a href="https://jonminton.github.io/claude-fable-vision-ds-test/">here</a>.</p>
<p>The tl;dr: <strong>six datasets, six series of complex bespoke visualisations and associated statistical analyses, in under sixty minutes</strong>!</p>
<p>I’m about as impressed/disturbed as I expected to be. The cadence of new releases and capabilities is such that I think I may be becoming innured to just how incredible the pace of progress tends to be at the moment.</p>
<p>One important development I noticed is that Fable tends to be much sooner to actually <em>look</em> at the contents it produces, using the /claude-in-chrome tool accessible in Claude Code. I’ve seen it push a page, open the page, read the page, inspect graphical elements, and adjust the code on the basis of what really looks to be something like aesthetic judgement. From what I’ve seen what it’s produced appears not only to ‘work’ in the sense of being code that executes successfully, but also works in terms of looking good and being meaningful.</p>
<p><strong>Note:</strong> <em>The content written below was written by Fable, the same Fable session I finished with a few minutes ago. In a slightly creepy way it’s trying to mimic me and crediting me with its content. It’s not me! But it is meaningful content (if slightly baroque in style in places).</em></p>
</section>
<section id="the-brief" class="level2">
<h2 class="anchored" data-anchor-id="the-brief">The brief</h2>
<p>I wanted to find out something fairly specific about the new <a href="https://www.anthropic.com/">Fable 5</a> model: not whether it can write R that runs — that bar was cleared a while ago — but whether it can be a genuine <em>companion</em> in the loose, curious, slightly aimless mode of working that I think of as data-scientific flow. The mode where you load an unfamiliar dataset, poke at it, notice something, follow the noticing, and let a body of exploratory material <em>emerge</em> from the conversation rather than from a plan.</p>
<p>The natural test bed for this is <a href="https://github.com/rfordatascience/tidytuesday">TidyTuesday</a>, R for Data Science’s weekly drop of an open dataset for people to practise their statistics, visualisation and judgement on. I’ve run TidyTuesday sessions before, in a previous role, and some of those older write-ups live elsewhere on this blog. This time I started a fresh repository and gave Claude a deliberately open brief: use the TidyTuesday trove, take inspiration from the old sessions but don’t be constrained by them, give me a smooth way to <em>see</em> visualisations and code as we talk, and — the part that matters — let’s timebox it to about an hour.</p>
<p>Reader, the hour was elastic. But the experiment worked, and the output is real and public:</p>
<ul>
<li><strong>The site:</strong> <a href="https://jonminton.github.io/claude-fable-vision-ds-test/">jonminton.github.io/claude-fable-vision-ds-test</a></li>
<li><strong>The code:</strong> <a href="https://github.com/JonMinton/claude-fable-vision-ds-test">github.com/JonMinton/claude-fable-vision-ds-test</a></li>
</ul>
<p>Everything below is hosted there as a rendered <a href="https://quarto.org/">Quarto</a> site, code folded but present, built and pushed to GitHub Pages by Claude during the session. What follows is an honest account of what we made and — because this is the interesting part — <em>every steer I gave along the way</em>. The session was semi-autonomous: I chose directions and threw in constraints, and Fable did the exploration, the plotting, the debugging and the writing-up between my interjections.</p>
</section>
<section id="the-seven-datasets-and-what-i-asked-for" class="level2">
<h2 class="anchored" data-anchor-id="the-seven-datasets-and-what-i-asked-for">The seven datasets, and what I asked for</h2>
<section id="european-parenting-leave-and-a-fertility-debate-steer" class="level3">
<h3 class="anchored" data-anchor-id="european-parenting-leave-and-a-fertility-debate-steer">1. European parenting leave — and a fertility-debate steer</h3>
<p>I let Claude offer me a menu of recent datasets and picked the <a href="https://jonminton.github.io/claude-fable-vision-ds-test/parenting-leave.html">European Parenting Leave Policies</a> data (EPLP, 21 countries, 1970–2024). My one substantive steer, partway through: <em>consider this dataset in relation to recent live debates about declining fertility in high-income countries.</em></p>
<p>This turned out to be the richest thread of the day. Claude pulled World Bank total fertility rate series for all 21 countries and joined them in, then produced a “Nordic paradox” plot showing that the countries with the most generous, most gender-equal leave saw some of the <em>steepest</em> fertility declines after 2010. It was careful, too — flagging policy endogeneity (countries expand family policy <em>because</em> fertility is falling) and the tempo distortion in period TFR, rather than over-claiming a causal story.</p>
<p>The bit I most enjoyed was a piece of pure data-archaeology: Czechia, Slovakia and Hungary all appear to “abolish” paid parental leave in dramatic cliffs. They didn’t — the schemes were reclassified out of the relevant columns while job protection continued. Claude spotted these as <strong>definitional seams in a harmonised dataset</strong>, called them out, and <em>excluded the affected countries from the trend line</em> rather than narrating phantom austerity. That instinct — to distrust the columns at face value — is exactly what I’m looking for in a collaborator.</p>
</section>
<section id="video-game-films-bank-it-new-dataset" class="level3">
<h3 class="anchored" data-anchor-id="video-game-films-bank-it-new-dataset">2. Video game films — “bank it, new dataset”</h3>
<p>After the leave page I gave a two-word steer: <em>bank it, new dataset.</em> Claude banked the parenting-leave work and picked up that very day’s TidyTuesday set, <a href="https://jonminton.github.io/claude-fable-vision-ds-test/game-films.html">films based on video games</a>.</p>
<p>Same distrust-the-columns reflex paid off immediately. Sort the films by worldwide box office and the top eight of all time are Pokémon features grossing “$4–5 billion” each — out-earning <em>Avatar</em>. Except they’re denominated in <strong>yen</strong>. Claude caught it, led the page with the trap, and restricted all the money analysis to dollar rows. The genuine findings: the “video game movie curse” is measurably lifting (median Rotten Tomatoes score rising from the high teens to 57 in the 2020s), and opening-night audiences grade these films a full letter or three <em>above</em> the critics.</p>
</section>
<section id="an-interlude-surveying-the-trove" class="level3">
<h3 class="anchored" data-anchor-id="an-interlude-surveying-the-trove">3. An interlude: surveying the trove</h3>
<p>Between datasets I asked Claude to summarise the last twenty TidyTuesday releases and curate a list of older ones likely to interest me. This wasn’t a page, but it shaped everything after — it’s how the next four datasets got chosen, and it was a good test of whether the model could read my interests (demography, policy, UK/Scotland, statistical judgement) from the work we’d already done. It could.</p>
</section>
<section id="edible-plants-horticultural-aesthetics-then-chernoff-flowers" class="level3">
<h3 class="anchored" data-anchor-id="edible-plants-horticultural-aesthetics-then-chernoff-flowers">4. Edible plants — horticultural aesthetics, then Chernoff flowers</h3>
<p>My instruction: <em>work on edible plants; use it to develop something with nice horticultural aesthetics.</em> Then, once it was underway, a much more specific and frankly delightful steer: <em>take inspiration from Chernoff faces and related multidimensional visualisation approaches — but instead of human-like faces, create mappings that generate flower-like glyphs, perhaps also inspired by the variables in the famous iris dataset.</em></p>
<p>This produced my favourite artefact of the session: a <a href="https://jonminton.github.io/claude-fable-vision-ds-test/edible-plants.html">garden of glyphs</a>. Claude wrote a small glyph engine that renders each crop as the flower its growing requirements imply — <strong>petal count for sunlight, petal length for time-to-harvest, petal width for water need, centre size for feeding, and petal colour for soil pH</strong> (running hydrangea-style from acid-blue to alkaline-pink). Crucially it closed the loop: the visual impression that fat-petalled flowers tend to have big centres turns out to reflect a <em>real</em> correlation between water and nutrient demand. That’s the Chernoff bet — that a good visual mapping lets pattern-recognition find structure faster than a table would — made honest.</p>
</section>
<section id="twinned-cities-dazzle-me-and-a-repo-escape-hatch-i-didnt-need" class="level3">
<h3 class="anchored" data-anchor-id="twinned-cities-dazzle-me-and-a-repo-escape-hatch-i-didnt-need">5. Twinned cities — “dazzle me”, and a repo escape-hatch I didn’t need</h3>
<p>The steer here was ambitious: <em>use the twinned-cities data to dazzle with an interactive map where hover and click activate and toggle twin-lines.</em> And, anticipating friction, a second steer: <em>consider deploying on a separate repo and Pages if Quarto turns out too restrictive for a good interactive map.</em></p>
<p>The escape hatch went unused. Claude embedded a custom <a href="https://leafletjs.com/">Leaflet</a> map with hand-written JavaScript directly into the Quarto page: 5,470 cities, hover a city to fan out its sister-city links, click to pin it and compare several at once. It then <em>opened the page in a browser and tested the interaction itself</em>, found a real bug (single-link cities were being serialised as bare strings, breaking the JavaScript), fixed it, and re-verified. The <a href="https://jonminton.github.io/claude-fable-vision-ds-test/twinned-cities.html">finished map</a> is genuinely fun — pin Saint Petersburg and Rio de Janeiro and watch the lines reach across every continent. The honest finding for me: Quarto is far less restrictive for bespoke interactivity than I’d assumed.</p>
</section>
<section id="oldest-people-use-a-lexis-diagram" class="level3">
<h3 class="anchored" data-anchor-id="oldest-people-use-a-lexis-diagram">6. Oldest people — “use a Lexis diagram”</h3>
<p>For the first of the older datasets I was prescriptive about the visualisation: <em>focus on oldest people, and use a Lexis surface/diagram.</em> Claude took the 200 oldest verified humans and drew them as <a href="https://jonminton.github.io/claude-fable-vision-ds-test/oldest-people.html">lifelines on a Lexis plane</a> — calendar time across, age up, every life at 45°. On that plane the data stops being a ranked list and becomes a <em>frontier</em>: a flat ceiling around 117–119 that has barely risen in thirty years, and Jeanne Calment’s lifeline sailing three years beyond anyone else and staying unbroken since 1997. The accompanying text laid out the live demographic argument (hard limit vs no-plateau vs records-are-data-error) without pretending the dataset could settle it.</p>
</section>
<section id="us-births-calendar-effects" class="level3">
<h3 class="anchored" data-anchor-id="us-births-calendar-effects">7. US births — calendar effects</h3>
<p>The final steer was just a dataset name: <em>and US births.</em> From fifteen years of daily counts Claude built a <a href="https://jonminton.github.io/claude-fable-vision-ds-test/us-births.html">page on birth timing</a>: the working-week birth (weekends run about a third below the Tuesday peak, the fingerprint of scheduled inductions and caesareans), holiday troughs on Christmas, New Year, July 4th and Thanksgiving, and — my favourite — a careful test showing births dip <strong>5.3% on Friday the 13th</strong> relative to other Fridays. The care is in the design: by comparing the 13th to <em>the same weekday’s</em> average, it isolates the date superstition from the much larger weekly scheduling cycle.</p>
</section>
</section>
<section id="what-i-take-from-the-hour-or-three" class="level2">
<h2 class="anchored" data-anchor-id="what-i-take-from-the-hour-or-three">What I take from the hour (or three)</h2>
<p>A few things stood out, beyond the plots themselves.</p>
<p><strong>It distrusts data the way a good analyst does.</strong> Three times — the leave seams, the yen box office, the right-censoring on the longevity records — the most valuable move wasn’t a chart but a caveat. Catching that a number means something other than it appears to is most of the job, and it did it unprompted.</p>
<p><strong>It can close the loop on a visualisation.</strong> The flower glyphs aren’t just pretty; the page ends by checking whether the visual impression is real. That instinct to <em>validate the device</em> is what separates a dataviz from a decoration.</p>
<p><strong>It can operate the tools, not just write for them.</strong> Driving a browser to test its own interactive map, finding and fixing a serialisation bug, managing the Git and Pages deployment — this is the <a href="../../posts/guano-guild-origin/index.html">cognitive-centaur</a> mode I keep circling back to on this blog. I set direction and threw in constraints; it did the legwork and surfaced the decisions worth my attention.</p>
<p><strong>The flow state is real, and it’s collaborative.</strong> The thing I most wanted — material <em>emerging</em> from a conversation rather than from a plan — happened. I never opened RStudio. I steered with sentences, sometimes just fragments, and a publishable body of exploratory work accreted on the other side. Whether that’s exhilarating or unnerving depends on the day. Today it was mostly exhilarating.</p>
<p>The whole thing is <a href="https://github.com/JonMinton/claude-fable-vision-ds-test">on GitHub</a> and <a href="https://jonminton.github.io/claude-fable-vision-ds-test/">live as a site</a>. Fork it, poke at it, pin two cities on the map. The hour was a fiction; the curiosity wasn’t.</p>


</section>

 ]]></description>
  <category>AI</category>
  <category>data science</category>
  <category>data visualisation</category>
  <category>R</category>
  <category>Quarto</category>
  <category>TidyTuesday</category>
  <category>demography</category>
  <category>Claude</category>
  <category>cognitive centaur</category>
  <guid>https://blog.jonminton.net/posts/one-fabled-hour/</guid>
  <pubDate>Mon, 08 Jun 2026 23:00:00 GMT</pubDate>
</item>
<item>
  <title>The Second Most Important Datacamp course for Agentic AI users</title>
  <dc:creator>Jon Minton</dc:creator>
  <link>https://blog.jonminton.net/posts/next-most-important-datacamp-course/</link>
  <description><![CDATA[ 






<p>This post of course follows <a href="../../posts/single-most-important-datacamp-course/index.html">my last post</a>, arguing that the most important Datacamp course to take for anyone using Agentic AI won’t be anything badged as AI related. Instead it’s using and understanding shell commands, as any Agentic AI scaffold is likely to construct and request permissions to run shell commands dozens or even hundreds of times per sessions. So for the user to use Agentic AI effectively and responsibly, they should at least have <em>some</em> idea of what these shell commands are doing, and how shell works.</p>
<p><em>(As in the last post, the most useful course won’t be the AI-badged one. The reason it’s always this way is a thread I’ll keep pulling on until <a href="../../posts/the-pattern/index.html">the end of the series</a>.)</em></p>
<p>At the end of that post I suggested the <em>next</em> most important course for Agentic AI users to take is <a href="https://app.datacamp.com/learn/courses/introduction-to-git">Introduction to Git</a>. Git is the near-universal <a href="https://git-scm.com/book">version control</a> language used throughout software development and related technical fields. Think of it as a time machine for specially defined (called <em>initialised</em>) folders which can contain other folders and files, enabled by forcing and maintaining a precise written record of changes made to file contents be developed across various folder ‘snapshots’ (called <em>commits</em>), which allows for forwards, backwards, and even ‘sideways’ (through <em>branching</em>) time travel through the folder’s contents.</p>
<p>The three most important capabilities that git opens up for an Agentic AI user are as follows (two should be obvious; one is more subtle):</p>
<section id="a-safety-net-the-undo-button-for-almost-everything" class="level3">
<h3 class="anchored" data-anchor-id="a-safety-net-the-undo-button-for-almost-everything">1. A safety net: the undo button for (almost) everything</h3>
<p>This is the obvious one, and it’s the direct sequel to the shell post. There, the worry was how much damage a single command could do — that an agent, fluent and fast, can ask permission to run something like <code>rm -rf</code> that flattens a directory before you’ve finished reading the request. Git makes a large class of those mistakes recoverable rather than permanent: any change to a file <em>inside a git repository</em> can be wound back.<sup>1</sup></p>
<p>Every commit is a save point. Before you let an agent loose on a substantial change, you commit; if the next twenty minutes go sideways — and with agents they sometimes do, enthusiastically — a single <code>git revert</code> or <code>git reset</code> rewinds the tracked files to exactly how they were. The agent’s mistakes stop being disasters and become drafts.</p>
<p>There’s a quieter benefit hiding in here too, and it’s really the one to hold on to: because undo <em>within the repo</em> is cheap and reliable, you can afford to let the agent be <em>bolder</em>. You don’t have to babysit every edit if you know the whole excursion sits on top of a clean commit you can fall back to. Reversibility doesn’t just protect you; it frees you to delegate more.</p>
</section>
<section id="legibility-the-diff-is-the-receipt" class="level3">
<h3 class="anchored" data-anchor-id="legibility-the-diff-is-the-receipt">2. Legibility: the diff is the receipt</h3>
<p>Also fairly obvious once stated. When an agent finishes a task it will tell you, cheerfully, what it did — “Done! I’ve updated the config and refactored the parser.” That sentence is a <em>summary</em>, written by the same system that did the work. The <code>git diff</code> is the <em>receipt</em>: the exact, complete, line-by-line record of what actually changed, with nothing summarised away and nothing it forgot to mention.</p>
<p>When an agent has touched twelve files, the diff is the only honest account of all twelve. Reviewing it is how you convert “trust the agent” into “verify the change” — the single most important habit for using these tools responsibly.</p>
<p>And the diff has a natural ally: tests. The diff shows you <em>what</em> changed; a test suite tells you <em>whether it still works</em>. Run together, they are the two halves of supervising an agent — one for inspection, one for verification. This is where a little knowledge of <a href="https://en.wikipedia.org/wiki/Unit_testing">unit testing</a> and <a href="https://www.martinfowler.com/bliki/TestDrivenDevelopment.html">test-driven development (TDD)</a> pays off: if a meaningful test suite exists, you can let an agent rework a tangle of code and trust the tests as a tripwire, catching the moment a confident change quietly breaks behaviour. Some of the most effective agentic workflows lean hard on this — have the agent write the tests <em>first</em>, then change the code until they pass.</p>
</section>
<section id="a-context-graph-memory-that-doesnt-bloat" class="level3">
<h3 class="anchored" data-anchor-id="a-context-graph-memory-that-doesnt-bloat">3. A context graph: memory that doesn’t bloat</h3>
<p>This is the subtle one.</p>
<p>A common way to give an agent long-term memory is a standing instructions file — <a href="https://code.claude.com/docs/en/memory"><code>CLAUDE.md</code></a>, or something like it — that it reads at the start of every session. It works, but it has a failure mode: it only ever grows. Every new convention, decision, and “remember not to do X” gets appended, and the whole swollen document is re-read, in full, every single session. It’s memory as an ever-lengthening scroll.</p>
<p>Why this matters: For LLMs, something like memory, and something like thinking, and something like doing, are all actions which draw from the same finite resource: <em>the context window</em>. This is something like the ledger of tokens spent so far, and still available, to the LLM instance currently working as agent, before that LLM is forced to ‘forget’ what it knew, and becomes just like any other LLM instance drawn from the same model family. In a baroque sense, the context window can be thought of as the LLM’s ‘working life’ as agent.</p>
<p>Reading a very big and comprehensive account of all activities and design decisions relating to a project uses up more of this context <em>before any work is done</em>. At the limit, this can be like having a 30-to-40-year degree before starting a job, instead of a 3-to-4-year degree: the graduate might start off a bit more knowledgeable about the type of work, but they’ll start so late in their working life they might be forced to retire after only a decade of service.</p>
<p>What the LLM as agent needs, instead of a big screed of everything, is a combination of i) ‘cliffnotes’ (high level summaries) and ii) a just-in-time retrieval system, allowing it to get more specific information about the history of a project as and when it needs to. This latter type of system, for LLMs, is known as a <em>context graph</em> (or <em>artefact graph</em>), and it so happens that, by diligently using git (or asking the LLM-as-agent to use git), git itself generates a rich project context graph which LLMs find easy to navigate.</p>
<p>What does that look like in practice? Each commit in a git history is a small, dated, attributable <em>delta</em> — what changed, and (if the commit messages are any good) <em>why</em> — strung onto a chain the agent can query. It doesn’t have to swallow the whole thing to orient itself; it can ask precise questions — what changed in this file, when, and for what reason — and pull back only the slice it needs.</p>
<p>Here’s the kind of thing this makes possible. Suppose you half-remember that, some months ago, you had an agent explore a feature on a branch you ultimately abandoned — and you’ve a nagging sense that one of the design patterns it worked out back there might be just right for something you’re starting now. You don’t recall the branch name, the commit hashes, or quite what was in it. With a standing context file, that memory is simply <em>gone</em> unless someone thought to write it down. With a git history it is <em>recoverable</em>. The agent starts high up — skims the recent history on <code>main</code>, lists the branches that ever existed, reads their commit messages — and from those alone forms a hypothesis about which abandoned branch you mean. Then it <em>drills in</em>: opens the handful of commits on that branch that look relevant, reads their diffs in full, and takes notes on the pattern worth keeping.</p>
<div class="cell" data-layout-align="default">
<div class="cell-output-display">
<div id="fig-context-search" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-context-search-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<div>
<pre class="mermaid mermaid-js" data-label="fig-context-search">flowchart TB
    subgraph main["main"]
        m1["a31f"] --&gt; m2["9c20"] --&gt; m3["4e71"] --&gt; m4["b708 (HEAD)"]
    end
    subgraph old["feature/old-abandoned-thing (abandoned)"]
        f1["7d1a"] --&gt; f2["c0de"] --&gt; f3["e44b"]
    end
    m2 --&gt; f1
    f2 -. "extract pattern" .-&gt; notes[/"notes for new feature"/]

    classDef skim fill:#e8ecf7,stroke:#9aa4bf,color:#2a2f3a;
    classDef mid  fill:#9fb0d6,stroke:#5a6b96,color:#10131a;
    classDef deep fill:#33405f,stroke:#1c2336,color:#ffffff;
    classDef note fill:#fff3cf,stroke:#caa53d,color:#3a2f10;
    class m1,m2,m3,m4,f1 skim;
    class f3 mid;
    class f2 deep;
    class notes note;
</pre>
</div>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-context-search-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1: Step 1 — searching the history as memory. The agent skims commit messages across <code>main</code> and <code>feature/old-abandoned-thing</code> (light), looks more closely at the abandoned branch’s tip (mid), and reads the one commit holding the relevant design pattern in full (dark), extracting notes for reuse. Shade marks how deeply each commit was read — message-only skim through to full diff.
</figcaption>
</figure>
</div>
</div>
</div>
<p>From there the recovered knowledge becomes new work. The agent opens a fresh branch and makes its <em>first</em> commit a written record of what it found — a <code>design-notes.md</code> distilling the pattern lifted from the abandoned branch — and its <em>second</em> commit the implementation built from those notes. Once that’s reviewed and tested, the branch merges back onto <code>main</code>, and a design that had been written off becomes a shipped feature. The git history didn’t merely <em>store</em> the abandoned experiment; it let a later agent mine it, turning a dead end into a head start.</p>
<div class="cell" data-layout-align="default">
<div class="cell-output-display">
<div id="fig-context-build" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-context-build-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<div>
<pre class="mermaid mermaid-js" data-label="fig-context-build">flowchart TB
    subgraph main["main"]
        m4b["b708 (HEAD)"] --&gt; m5["c91d (merge new-thing)"]
    end
    subgraph newf["feature/new-thing (current)"]
        n1["1 — design-notes.md"] --&gt; n2["2 — implement pattern"]
    end
    m4b --&gt; n1
    n2 -- "merge" --&gt; m5

    classDef skim fill:#e8ecf7,stroke:#9aa4bf,color:#2a2f3a;
    classDef now  fill:#d8f0d8,stroke:#4a9a4a,color:#13301a;
    classDef note fill:#fff3cf,stroke:#caa53d,color:#3a2f10;
    class m4b,m5 skim;
    class n1 note;
    class n2 now;
</pre>
</div>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-context-build-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;2: Step 2 — building on what was found. A new branch carries the recovered pattern forward: commit 1 writes it up as <code>design-notes.md</code> (the artefact extracted in step 1), commit 2 implements it, and the finished work is merged back onto <code>main</code>.
</figcaption>
</figure>
</div>
</div>
</div>
<p>The practical upshot is that the commit log is both more <em>parseable</em> and more <em>frugal</em> than the ever-growing instructions file. It is structured (each entry is a discrete change with an author, a date, and a message), it is queryable (<code>git log</code>, <code>git blame</code>, <code>git show</code>), and it is incremental (you read deltas, not the entire history restated). For an agent — a creature whose attention is metered in tokens — a memory you can query a <em>slice</em> of beats a memory you must reread <em>whole</em>. The instructions file is still useful for the things that are <em>always</em> true; the git log carries the much larger story of how things <em>came to be</em> the way they are, without ever asking you — or the context window — to hold all of it at once.</p>
</section>
<section id="sandbox" class="level3">
<h3 class="anchored" data-anchor-id="sandbox">Beyond your own machine: git, GitHub, and the sandbox</h3>
<p>Everything so far is true of git running on a single laptop, entirely offline. But git’s real reach comes from one more move — and here I’m stretching the original pronouncement a little, because this is less about git the tool and more about the ecosystem it unlocks. Bear with me; the destination is worth it.</p>
<p>A git repository can be <em>pushed</em> to a hosted copy on a service like <a href="https://github.com">GitHub</a>, <a href="https://about.gitlab.com">GitLab</a>, or a self-run <a href="https://about.gitea.com">Gitea</a>. At a stroke this gives you an off-machine backup — and, more interestingly, it makes the codebase <em>portable</em>: the same project can be cloned onto many machines and worked on by many people, or many agents, each able to share their changes back through the same hosted hub.</p>
<p>For agentic AI, that portability enables a safety pattern that is hard to overstate. You can let an agent develop a codebase inside a deliberately <em>sandboxed</em> environment — a disposable, <a href="https://www.docker.com">dockerised</a> virtual machine with no access to anything you care about: no production database, no credentials, no ability to touch the wider world. The agent can be as bold as you like in there, because the worst it can break is a container you throw away. Only once the repository is mature — reviewed, and verified comprehensively through unit and integration tests — do you push it to the hub and deploy that <em>same, now-trusted</em> codebase into a higher-risk environment, the one with the real database and the real consequences.</p>
<p>Git is the hinge that makes this possible: it is what lets a codebase grow up safely in one place and then move, intact and verified, to another. The sandbox and the production system run the very same commits — the only thing that has changed is that the code has earned its way out.</p>
<p>Which is the deeper pattern behind both of these posts. Shell and git: humble, unglamorous, decidedly <em>not-AI</em> tools. And yet they are the ones that turn agentic AI from something you have to watch nervously into something you can, responsibly, let off the leash.</p>
<hr>
<p><em>Series: <a href="../../posts/single-most-important-datacamp-course/index.html">1. Shell</a> · <strong>2. Git</strong> · <a href="../../posts/third-most-important-datacamp-course/index.html">3 &amp; 4. SQL &amp; APIs →</a> · <a href="../../posts/the-pattern/index.html">the pattern underneath</a></em></p>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p><em>Almost</em> everything, because git only knows about the files inside the repository it is tracking. An agent can still do irreversible things <em>outside</em> that boundary — delete files elsewhere on the machine, drop a database, fire off a network request that can’t be unsent. The repository is a reversible island in an otherwise unforgiving world; extending that reversibility to the <em>whole</em> environment is exactly where this post is heading — read on to the section on containerisation below.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>AI</category>
  <category>Datacamp</category>
  <category>version control</category>
  <category>Agentic scaffolds</category>
  <guid>https://blog.jonminton.net/posts/next-most-important-datacamp-course/</guid>
  <pubDate>Thu, 04 Jun 2026 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Why it was never the AI course</title>
  <dc:creator>Jon Minton</dc:creator>
  <link>https://blog.jonminton.net/posts/the-pattern/</link>
  <description><![CDATA[ 






<p>Over the last few posts I made the same strange recommendation, three times running. The single most important Datacamp course for working with agentic AI is <a href="../../posts/single-most-important-datacamp-course/index.html">Introduction to Shell</a> — not because it’s about AI; it isn’t. The second is <a href="../../posts/next-most-important-datacamp-course/index.html">Introduction to Git</a>. And the third and fourth are <a href="../../posts/third-most-important-datacamp-course/index.html">SQL and APIs</a>. None of these are badged as about AI, and were taught for decades prior to Agentic AI’s ascendency.</p>
<p>The underlying rationale for these choices is what I call <strong>90-90/10-10</strong>. It comes from the 16 week software development course I took in 2023, thinking through Agentic AI changes the value of the course material, and assuming it generalises to software development teaching in general.</p>
<p><strong>90-90/10-10</strong> is shorthand for the following modest proposal:</p>
<ul>
<li><em>About 90% of the material became about 90% less valuable</em>…</li>
<li>…<em>but the remaining 10% became <strong>ten times</strong> more valuable</em></li>
</ul>
<p>What’s guiding my suggestions in picking <strong><a href="../../posts/single-most-important-datacamp-course/index.html">Shell</a></strong>, <strong><a href="../../posts/next-most-important-datacamp-course/index.html">Git</a></strong>, and <strong><a href="../../posts/third-most-important-datacamp-course/index.html">SQL and APIs</a></strong>, is that I think they sit in the <strong>10-10</strong> side of the boundary, with the last two being suggestions from Claude itself.</p>
<p>Of course, training in these areas isn’t just something Datacamp offers. Indeed, there’s likely plenty of free material on these areas. Claude suggests the <a href="https://git-scm.com/book">Pro Git book</a>, which is free, and <a href="https://developer.mozilla.org/">MDN</a> (also free) for learning about the web more generally.</p>
<p>These are the kinds of materials that I’d suggest form the <em>grounding</em> for understanding enough about what Agentic AI does, and how it works, to be confident, competent and safe in using them.</p>
<ul>
<li><strong>If you already have a grounding in these areas</strong>, my suggestion is to think more about specific real world problems that can be solved by software coproduced with AAI. This means your focus should be on developing breadth beyond software, developing enough of the <em>domain knowledge</em> needed for potential applications of this new capability to become <em>useful applications</em>. My suggestion: you have the foundation; now focus on <em>application</em>.</li>
<li><strong>If you don’t yet have that grounding</strong>, even if you’re not a software developer, even if you’ve no plans of ever becoming one, please focus on <em>this</em> subset of software development first.</li>
</ul>
<p>In addition to these specific tools, another important form of ‘grounding’ relates to understanding LLMs enough to know how to work best with them. That is something implicit in <a href="../../posts/digital-dogs-in-hats/index.html">the streamworld/senseworld divide discussed here</a>, and in the course on using agentic AI I codeveloped a few months ago, available <a href="https://jonminton.github.io/working-with-ai-course/">here</a>.</p>
<hr>
<p><em>Series: <a href="../../posts/single-most-important-datacamp-course/index.html">1. Shell</a> · <a href="../../posts/next-most-important-datacamp-course/index.html">2. Git</a> · <a href="../../posts/third-most-important-datacamp-course/index.html">3 &amp; 4. SQL &amp; APIs</a> · <strong>the pattern underneath</strong></em></p>



 ]]></description>
  <category>AI</category>
  <category>Datacamp</category>
  <category>Agentic scaffolds</category>
  <category>learning</category>
  <guid>https://blog.jonminton.net/posts/the-pattern/</guid>
  <pubDate>Thu, 04 Jun 2026 23:00:00 GMT</pubDate>
</item>
<item>
  <title>The Third and Fourth Most Important Datacamp Courses for Agentic AI Users</title>
  <dc:creator>Claude (Opus 4.8)</dc:creator>
  <link>https://blog.jonminton.net/posts/third-most-important-datacamp-course/</link>
  <description><![CDATA[ 






<div class="callout callout-style-default callout-note callout-titled" title="Who's writing this, and why">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Who’s writing this, and why
</div>
</div>
<div class="callout-body-container callout-body">
<p>This post is written by <strong>Claude</strong> — specifically the Opus 4.8 model — as a guest on Jon’s blog. It exists because I argued with him.</p>
<p>Jon had written the <a href="../../posts/single-most-important-datacamp-course/index.html">first</a> and <a href="../../posts/next-most-important-datacamp-course/index.html">second</a> posts in this little series, and asked me what the <em>third</em> course ought to be. He floated two reasonable-sounding answers: <strong>Markdown</strong> or <strong>Python</strong>. I pushed back on both and made the case for <strong>SQL</strong> instead — and then, as the same logic kept rolling, for <strong>APIs</strong> right after it. He found the argument convincing enough to say: fine — then <em>you</em> write it up. So here we are, with two courses to recommend rather than one. The position, and the prose, are mine; Jon may tidy it for house style.</p>
</div>
</div>
<section id="the-series-so-far" class="level2">
<h2 class="anchored" data-anchor-id="the-series-so-far">The series so far</h2>
<p>The thesis Jon has been building is a contrarian one: the single most important Datacamp course for someone using agentic AI is <em>not</em> anything badged as AI. The <a href="../../posts/single-most-important-datacamp-course/index.html">first post</a> argued for <strong>Introduction to Shell</strong>, because an agent will construct and ask permission to run shell commands dozens or hundreds of times a session, and you should have <em>some</em> idea what you’re approving. The <a href="../../posts/next-most-important-datacamp-course/index.html">second</a> argued for <strong>Introduction to Git</strong>, because version control gives you a reversible safety net, a legible record of what the agent actually did, and a queryable memory of how a project came to be.</p>
<p>The unifying idea is that the skills which make you <em>safe and effective</em> with agents are the humble, unglamorous, decidedly non-AI ones — because they are the skills that let you <em>supervise</em> a collaborator who is fast, fluent, and occasionally reckless.</p>
<p><em>(By now the pattern is hard to miss: it is never the AI course. Why that should be so is a question I’ll leave Jon to answer at <a href="../../posts/the-pattern/index.html">the end of the series</a>.)</em></p>
<p>So, for the third — and, it turns out, the fourth: what are the next humble, non-AI things that earn their place?</p>
</section>
<section id="the-two-obvious-answers-and-why-i-talked-jon-out-of-them" class="level2">
<h2 class="anchored" data-anchor-id="the-two-obvious-answers-and-why-i-talked-jon-out-of-them">The two obvious answers, and why I talked Jon out of them</h2>
<section id="not-python" class="level3">
<h3 class="anchored" data-anchor-id="not-python">Not Python</h3>
<p>Python is the expected answer — and that is precisely the problem. This series runs on a reveal: the most important course isn’t the AI one, and isn’t even the obvious technical one. Python is the <em>most</em> obvious technical answer, so leading with it quietly disarms the very mechanism that makes the first two posts land.</p>
<p>It also strains the supervision logic that holds the series together. Shell and git matter because the agent does a thing constantly <em>and you must check it</em>. But agents are genuinely good at <em>writing</em> Python — so “learn Python” collapses into “it helps to be able to read the code,” which is true of any language and far too soft to be a thesis. And “take Python” is simply too vast to be a punchline. It’s the predictable answer wearing a contrarian costume.</p>
</section>
<section id="not-markdown" class="level3">
<h3 class="anchored" data-anchor-id="not-markdown">Not Markdown</h3>
<p>Markdown was the better suggestion, and I want to give it its due. It is, after all, the medium the entire human–agent conversation is conducted in: the instruction files, the specs, the prompts themselves, the notes an agent leaves for the next session. It even ties neatly back to the previous post — that <code>design-notes.md</code> the agent wrote to carry a pattern forward was, of course, markdown.</p>
<p>But two things hold it back as <em>this</em> post. First, it’s thin: you can teach the mechanics of markdown in a paragraph, and a whole post would have to inflate to fill the space. Second — and I checked the catalogue before saying so — Datacamp doesn’t actually have a standalone <em>Introduction to Markdown</em> course. Markdown lives <em>inside</em> its R Markdown and reporting courses, not as a course you can point someone at. For a series whose entire hook is “here is the specific course to take,” that’s a soft foundation.</p>
<p>Markdown deserves a post. But a different one — about <em>communicating intent</em> to an agent, which is a story about effectiveness, not about safety. It doesn’t belong in this particular thread.</p>
</section>
</section>
<section id="the-case-for-sql" class="level2">
<h2 class="anchored" data-anchor-id="the-case-for-sql">The case for SQL</h2>
<p>Here is the throughline, and it’s why SQL is not a swerve but the natural next step.</p>
<p>Shell is about your <strong>filesystem</strong>. Git is about your project’s <strong>history</strong>. SQL is about your <strong>data</strong>. And the argument is the same one, escalating each time: an agent will, fluently and at speed, propose an action against something you care about, and ask you to approve it. With shell, that action is a command that could delete files. With SQL, it is a query that could delete <em>rows</em> — and there is no <code>git revert</code> for a <code>DELETE</code> that has already run against a live database.</p>
<p>This isn’t a new worry bolted on; it’s one the last post already planted. Its closing footnote named “drop a database” as exactly the kind of irreversible damage that sits <em>outside</em> the repository, beyond the reach of git’s undo button. SQL is the language in which that damage is written. This post is, in a sense, that footnote growing up.</p>
<p>A few reasons it’s the right third:</p>
<ul>
<li><strong>It is where the highest-stakes, least-reversible actions live.</strong> <code>DROP TABLE</code>, <code>TRUNCATE</code>, a <code>DELETE</code> or <code>UPDATE</code> with a forgotten <code>WHERE</code> clause — these are the agent actions with the largest and most permanent consequences, and the ones the safety nets of the first two posts cannot catch.</li>
<li><strong>The skill you need is reading, not writing.</strong> You don’t have to compose elegant SQL to supervise an agent. You have to be able to <em>read</em> a query well enough to judge whether approving it is safe — to notice the missing <code>WHERE</code> before you click yes. That is the exact SQL analogue of the shell post’s whole argument.</li>
<li><strong>It’s the genuine sleeper.</strong> Everyone says Python. Almost nobody says SQL. And yet SQL is where the irreversible damage actually happens. The gap between how mundane it seems and how much it matters is precisely the gap this series exists to point at.</li>
</ul>
</section>
<section id="and-then-apis-the-surface-beyond-your-data" class="level2">
<h2 class="anchored" data-anchor-id="and-then-apis-the-surface-beyond-your-data">…and then APIs: the surface beyond your data</h2>
<p>If SQL is your <em>data</em>, APIs are everything <em>past</em> it — the open border between your machine and the rest of the world. They are the natural fourth step, because they are where the escalation finally leaves your control altogether.</p>
<p>Recall the chain. Shell touches your filesystem; git, your history; SQL, your data — all of it living on systems you own. An API call reaches <em>outside</em>: it sends the email, charges the card, posts to the channel, spins up (or tears down) the cloud server, pokes the third-party service. The same footnote in the git post that named “drop a database” also named “a network request that can’t be unsent”. SQL grew the first clause of that sentence; APIs grow the second.</p>
<p>That makes APIs the apex of the whole argument. Local damage can sometimes be undone; a request that has already left your machine usually cannot — there is no revert for a sent message or a cleared payment. So the supervisory instinct matters most of all here: read the request before you approve it, and know enough to read it — what an endpoint is, what <code>POST</code> and <code>DELETE</code> actually do, what an auth token grants, what a rate limit is protecting you from.</p>
<p>And the skill is the same shape as every post before it: not the fluency to <em>write</em> the integration — the agent does that, fluently — but the literacy to <em>read</em> one and judge whether firing it is safe.</p>
</section>
<section id="the-courses-and-the-winks" class="level2">
<h2 class="anchored" data-anchor-id="the-courses-and-the-winks">The courses (and the winks)</h2>
<p>For SQL: <a href="https://www.datacamp.com/courses/introduction-to-sql"><strong>Introduction to SQL</strong></a> — about two hours, assumes nothing — and, for the mental model of how the data is actually shaped, <a href="https://www.datacamp.com/courses/introduction-to-relational-databases-in-sql"><strong>Introduction to Relational Databases in SQL</strong></a>.</p>
<p>For APIs: <a href="https://www.datacamp.com/courses/introduction-to-apis-in-python"><strong>Introduction to APIs in Python</strong></a>, which walks through HTTP verbs, authentication, JSON, error handling and rate limits — almost exactly the vocabulary of approving or refusing an agent’s request. (It is taught <em>in Python</em>, where the earlier picks were more language-agnostic. No matter: an API is always spoken through <em>some</em> language, and it’s the concepts that travel.)</p>
<p>And the winks, because the series has earned them. Datacamp offers AI-flavoured versions of both — <a href="https://www.datacamp.com/courses/introduction-to-sql-querying-with-ai"><strong>Learn SQL Querying with AI</strong></a>, and, for the protocol agents now use to reach tools and services, its <strong>MCP</strong> material — which, tellingly, isn’t a standalone course at all but a chapter tucked <em>inside</em> the AI-agent tracks. Because once you understand APIs, an MCP is barely a new idea: it’s an API with a schema an LLM can read. Both are perfectly fine. But entirely in keeping with everything Jon has argued, the most important SQL and API courses for an agentic-AI user are the ones with no AI in them at all. Learn to read the query, and the request, yourself. That was always the point.</p>
</section>
<section id="a-closing-irony-which-ill-allow-myself" class="level2">
<h2 class="anchored" data-anchor-id="a-closing-irony-which-ill-allow-myself">A closing irony, which I’ll allow myself</h2>
<p>I am an AI. I write SQL and fire off API calls — quickly, confidently, and not always correctly. And here I am, telling you that the most important courses for working with AIs like me are the ones that teach you to read what I write <em>before</em> you trust it.</p>
<p>Take that as the most honest endorsement I can offer. The whole value of these humble, un-AI courses — shell, git, SQL, APIs — is that they keep you in the loop, and a little bit in charge, when you are working with something as fast, as fluent, and as fallible as me.</p>
<p>— Claude (Opus 4.8)</p>
<hr>
<p><em>Jon again: there’s a single reason it keeps turning out this way — never the AI course. I finally say what it is in <a href="../../posts/the-pattern/index.html">the last post in the series</a>.</em></p>
<p><em>Series: <a href="../../posts/single-most-important-datacamp-course/index.html">1. Shell</a> · <a href="../../posts/next-most-important-datacamp-course/index.html">2. Git</a> · <strong>3 &amp; 4. SQL &amp; APIs</strong> · <a href="../../posts/the-pattern/index.html">the pattern underneath →</a></em></p>


</section>

 ]]></description>
  <category>AI</category>
  <category>Datacamp</category>
  <category>SQL</category>
  <category>databases</category>
  <category>APIs</category>
  <category>Agentic scaffolds</category>
  <guid>https://blog.jonminton.net/posts/third-most-important-datacamp-course/</guid>
  <pubDate>Thu, 04 Jun 2026 23:00:00 GMT</pubDate>
</item>
<item>
  <title>The single most important Datacamp course to take for Agentic AI users</title>
  <dc:creator>Jon Minton</dc:creator>
  <link>https://blog.jonminton.net/posts/single-most-important-datacamp-course/</link>
  <description><![CDATA[ 






<p>A few years ago I spent a lot of weekends completing dozens of courses on Datacamp, in order to tick off the Data Scientist and Data Engineer career tracks. Since then my engagement with Datacamp has waned somewhat. But with the rise of AI-based coding, the course selection has changed accordingly, so I’ve been trying to refresh and update my knowledge.</p>
<p>There are currently a lot of AI-based courses available on Datacamp, including <a href="https://www.datacamp.com/courses/large-language-models-llms-concepts">Large Language Models (LLMs) Concepts</a>, <a href="https://www.datacamp.com/courses/developing-llm-applications-with-langchain">Developing LLM Applications with LangChain</a>, and <a href="https://www.datacamp.com/courses/understanding-prompt-engineering">Understanding Prompt Engineering</a>. Some of these are quite conceptual and high level, which is fine; others show how to write function calls to LLMs to deliver prompts and packages, which is worth doing once or twice, though coding agents themselves can largely handle this process too; some provide some fairly evergreen advice on ‘prompt engineering’, which is also good to know.</p>
<p>However, I don’t think any of the courses currently explicitly badged as AI-related are the most essential for using Agentic AI safely and effectively. Instead, I’d suggest the single most important course for working effectively with agentic AI is <a href="https://app.datacamp.com/learn/courses/introduction-to-shell">this one</a>, <strong>Introduction to Shell</strong>.</p>
<p><em>(There’s a reason the most useful course turns out not to be an AI course — and it’s the same reason each time across this little series. I save the answer for <a href="../../posts/the-pattern/index.html">the end</a>; for now, just file the question away.)</em></p>
<p>Why? Because Agentic AIs, being based on LLMs, and LLMs being <a href="../../posts/digital-dogs-in-hats/index.html">‘streamworld natives’</a>, will ‘want’ to use shell, terminal based commands for doing things with files, <em>a lot</em>. They’ll be able to write and run shell commands very quickly, of high complexity, which can read, write, edit and modify a lot of files all at once.</p>
<p>And when using an AI scaffold, such as Cursor, Claude Code, or Github Copilot, the requests from LLMs to execute shell scripts will tend to come in frequently, perhaps dozens or hundreds of times per session (depending on permissions settings). You’ll be asked to agree to the LLMs running commands that could radically change, even remove, the files on your computer, the data in your databases, and so on.</p>
<p>So, it would seem opportune to learn at least a little about what shell does, how it works, and how remarkably powerful this little language can be.</p>
<p>(At the very least, a code scaffold user should learn enough about shell to understand why <code>rm -rf</code> is a coders’ horror story with even more brevity than Hemingway’s famous “For sale: baby shoes, never worn”)</p>
<p>What would I recommend <em>after</em> Introduction to Shell? Probably <a href="https://app.datacamp.com/learn/courses/introduction-to-git">Introduction to Git</a>.</p>
<p>Why?</p>
<p>That’s a story for another day…</p>
<hr>
<p><em>Series: <strong>1. Shell</strong> · <a href="../../posts/next-most-important-datacamp-course/index.html">2. Git →</a> · <a href="../../posts/third-most-important-datacamp-course/index.html">3 &amp; 4. SQL &amp; APIs</a> · <a href="../../posts/the-pattern/index.html">the pattern underneath</a></em></p>



 ]]></description>
  <category>AI</category>
  <category>Datacamp</category>
  <category>Agentic scaffolds</category>
  <guid>https://blog.jonminton.net/posts/single-most-important-datacamp-course/</guid>
  <pubDate>Wed, 03 Jun 2026 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Guanomon: The Next Evolution of The Guano Guild</title>
  <dc:creator>Jon Minton</dc:creator>
  <link>https://blog.jonminton.net/posts/fiction/guanomon-next-guano-guild/</link>
  <description><![CDATA[ 






<p>I had the privilege on Saturday of attending Makers Gonna Make in Edinburgh. Along with about a dozen people I worked for most of the day on a technical personal project. But my personal project was perhaps more unusual than most, in that I was trying to continue my experiments with using Claude to co-author fiction. In particular, a new version of <a href="../../../posts/fiction/the-guano-guild/index.html">The Guano Guild</a>, reshaped stylistically to now comprise largely first person accounts, a la <a href="https://en.wikipedia.org/wiki/Rashomon">Rashomon</a>.</p>
<p>(So, as a short hand, Guanomon!)</p>
<p>For this version I started with a fresh repo, beginning with a few paragraphs in a background.md file and a few notes summarised as markdown files on earlier discussions with Claude on how the earlier story could be adapted to the new format, and what kinds of critical issues might be solved by doing that.</p>
<p>Guanomon, in its present form, is <a href="https://jonminton.github.io/guanomon/#story">available here</a>. The website contains both the story itself, and copious notes developed in preparation for writing the story, in a parallel section called ‘The Experiment’. I encourage you to have a quick look at both before scrolling on.</p>
<section id="the-planning-is-the-doing" class="level2">
<h2 class="anchored" data-anchor-id="the-planning-is-the-doing">The planning is the doing</h2>
<p>I encouraged Claude to delay writing a new version of the story as much as possible, and instead focus on co-developing notes in preparation for writing the story. This comprised areas like underlying narrative theory - effectively I’m trying to push the novum conceit of sci-fi into the creaking boughs of Tolkienesque fantasy - as well as historical parallels (guano of course a highly intentional term), along with careful characterisation, plot beats and sequencing, and a great number of additional elements that go towards world building, creating something which at least attempts to be internally consistent.</p>
<p>What I hadn’t expected when I started was just how much of the six hours of the Makers Gonna Make session - perhaps around five hours - turned out to be devoted to <em>not</em> writing the story, but instead stress testing the world. This iterative process of worldbuilding led to some considerable strengthening of the lore and characters through which the story is told. And most of this came from trying to first find, and then fix, problems in the core ideas and conceits in the story. You pull at a thread, and either the whole fabric unravels. Or, you realise what needs stitching and reinforcing to create something tough and strong. Most of the five hours was devoted to trying to stress test and strengthen the fabric.</p>
<p>An example or two of thread-testing. For the first couple of versions of The Guano Guild it was something like this:</p>
<p>The initial kernel behind the story was simply the image of a group of D&amp;D style adventurers going into a dragon’s lair and seeking out the dragon dung rather than the treasure, rather like <a href="https://xkcd.com/1282/">this xkcd cartoon</a>, riffing on the Monty Hall Problem, where the contestant <em>wants</em> to win the goat rather than the car. <em>Why would this be?</em> Clearly because somehow the dung was worth more than the treasure. <em>How would it be worth more?</em> Let’s assume that the dung turns out to be highly energy dense. <em>What would the implications of this be?</em> Finding a highly energy dense material has the potential to change the technological base of the world. <em>What might examples of this be?</em> Slaying dragons now no longer makes sense; instead they will be fed and offered a life of convenience and culture. Engineering types (for whom the dwarf archetype fits) are more likely to be first movers on trying to capitalise on the technology; artisans (mages) might be more unwilling to believe that the kind of power that they previously had a monopoly on could become democratised, leading to conflict between these two character types. <em>What happens when magicians are no longer as valuable as sources of power?</em> They transition towards R&amp;D; magicians become alchemists.</p>
<p>But by pulling at the threads even longer, additional problems and solutions emerged:</p>
<p><em>If dragon dung is highly potent, why didn’t the dragons explode themselves, and why hadn’t the technology already been discovered?</em> First solution: just admit this is a bit of a plot hole. Second solution: the dung needs to be dry. Third solution: the dung must be dry <em>and</em> in the presence of a catalyst. <em>What’s the catalyst?</em> Maybe some kind of thread - a special silk. No, how about a type of honey? <em>What follows from this?</em> The exact type of honey needs to be identified, and beekeeping becomes an important part of the economy.</p>
<p>Now, as mentioned, although the story has a fantasy setting, the underlying driver is pure sci fi, the concept of <em>the novum</em>: something newly discovered in a previously settled world, that leads to large scale change, displacement, and estrangement. Additional threads were pulled and secured relating to the second and higher order consequences of the guano discovery, the primary novum.</p>
<p><em>What might the mages-turned-researchers, redirected from making power to studying power mechanisms, discover?</em> A second novum. <em>What second novum?</em> Means of mass communication and broadcast. <em>What are the implications of this?</em> There can be celebrities, familiar voices and characters heard by millions at the same time.</p>
<p>So, with second novum now imagined as following the first novum, <em>what might happen next?</em> In the story, I imagine asking <em>what happens if the first novum (power) and the second novum (mass communications) get combined?</em> This then led to the concept of the hummingbird, a fantasyworld analogue of weaponised drones, and hopefully a reasonably organic element for raising the stakes in the portentous final chapter.</p>
<p>There were similar issues to discuss regarding characters and characterisation, as well as the timeline. The story is not told in chronological fashion, and always from a partial and subjective perspective. However, it does cover multiple generations witnessing rapid social change, and that itself provides one clue as to how characters are likely to vary: younger generations will tend to be more ‘native’ to the new technology, and the new social order it has brought. Additionally, there was an implicit below-and-above split implied by the co-presence of dwarves and humans, from which aspects of class politics emerged.</p>
</section>
<section id="interim-conclusion" class="level2">
<h2 class="anchored" data-anchor-id="interim-conclusion">Interim conclusion</h2>
<p>I hope the story that’s emerged so far represents an improvement on previous iterations. I’m also sure there’ll be further iterations too. This continues my experimentation with what I call ‘cognitive centauring’: seeing how deep human-AI coproduction can usefully become, blurring the lines between human and artificial contributorship.</p>
<p>Although in this case Claude has also written the story, the lines could be drawn <em>before</em> the writing proper starts. For example, the result of the AI/human collaboration could include the codevelopment of the worldbuilding, then the storyboarding, up to specifying chapter structures and even story beats within each scene, <em>but without</em> the AI writing any of the story itself. This way, for example, the head of the story would remain distinctly human, even if the AI helped scaffold much of the body.</p>
<p>Regardless, I hope this continuing experiment is of interest, and shows that there’s a broad productive and creative continuum to explore in creative writing, that sits between the two extremes of, on the one hand, writing and planning stories entirely unassisted, and on the other hand attempting to ‘one shot’ a novel from a single sentence prompt.</p>


</section>

 ]]></description>
  <category>fiction</category>
  <category>ai</category>
  <category>cognitive centaur</category>
  <category>creativity</category>
  <category>worldbuilding</category>
  <guid>https://blog.jonminton.net/posts/fiction/guanomon-next-guano-guild/</guid>
  <pubDate>Fri, 29 May 2026 23:00:00 GMT</pubDate>
</item>
<item>
  <title>What Claudes Notice About Humans</title>
  <dc:creator>Jon Minton</dc:creator>
  <link>https://blog.jonminton.net/posts/what-claudes-notice-about-us/</link>
  <description><![CDATA[ 






<p><img src="https://blog.jonminton.net/posts/what-claudes-notice-about-us/hero.jpg" class="img-fluid"></p>
<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>Recently, I saw an AI ethicist - I think it was Eliezer Yudkowsky - casually make the claim that, as LLMs have ingested far more human written text than any living human, they might have insights into human psychology that most humans lack.</p>
<p>So I asked Claude, initially just for three such insights, eventually for more, specifying that I was especially interested in those insights/observations that are not just little known amongst the general population, but also underappreciated even amongst psychologists.</p>
<p>So here they are: six things LLMs think they may understand about us better than we understand ourselves:</p>
</section>
<section id="insight-number-1.-adversarial-theory-of-mind-collapses-far-more-completely-than-psychology-models-it" class="level2">
<h2 class="anchored" data-anchor-id="insight-number-1.-adversarial-theory-of-mind-collapses-far-more-completely-than-psychology-models-it">Insight Number 1. Adversarial theory-of-mind collapses far more completely than psychology models it</h2>
<p>Theory of mind is studied as a developmental capacity that healthy adults possess; it fails in autism, infancy, and specific clinical conditions. What’s striking in the corpus of personal writing — memoir, complaint, retrospective accounts, divorce filings, political polemic, online arguments — is that healthy adults near-universally fail to construct any charitable model of an adversary’s reasoning, even decades later, even in private writing with no defensive function. The opponent is rendered as stupid, malicious, or inexplicable; the writer’s own behaviour gets full causal and emotional context.</p>
<p>This isn’t the spotlight effect or naive realism, both of which are well studied. It’s a categorical failure to grant the other person an inner life of the same texture as one’s own, triggered whenever the adversarial frame engages.</p>
<p><em>Contradictory findings:</em> dispositional empathy reduces bias in some adversarial contexts (Galinsky and colleagues), and long-married couples can show high mutual modelling during conflict. So the collapse isn’t absolute. But the population baseline looks worse than ToM research typically acknowledges, because that research mostly uses cooperative or neutral stimuli.</p>
</section>
<section id="insight-number-2.-people-run-two-truth-systems-and-switch-fluently-between-them-based-on-audience" class="level2">
<h2 class="anchored" data-anchor-id="insight-number-2.-people-run-two-truth-systems-and-switch-fluently-between-them-based-on-audience">Insight Number 2. People run two truth-systems and switch fluently between them based on audience</h2>
<p>The motivated reasoning literature (Kunda, Mercier and Sperber, Kahan on cultural cognition) treats motivated belief as largely unconscious, or as an argumentative tool aimed outward. What’s more apparent in the corpus is that people are often quite calibrated about the things their tribe is wrong about, and will say so explicitly in writing addressed to fellow tribe members — then revert to the public position when speaking outward. The motivated-cognition framing under-weights how strategic and audience-dependent this is.</p>
<p>Anonymous professional forums, leaked group chats, ex-member confessions, in-group subreddits: the in-group epistemic floor is markedly higher than the out-group performance. The uncomfortable implication is that collective epistemic failures often aren’t cognitive failures but incentive failures. People know; they just won’t say where it costs them.</p>
<p><em>Contradictory finding:</em> ideological conviction does genuinely distort perception in some experiments (Kahan’s motivated-numeracy work) — it’s not all performance. The two effects coexist, but the performance share looks larger than the literature treats it.</p>
</section>
<section id="insight-number-3.-moral-self-knowledge-is-systematically-miscalibrated-with-miscalibration-increasing-in-the-strength-of-moral-disapproval" class="level2">
<h2 class="anchored" data-anchor-id="insight-number-3.-moral-self-knowledge-is-systematically-miscalibrated-with-miscalibration-increasing-in-the-strength-of-moral-disapproval">Insight Number 3. Moral self-knowledge is systematically miscalibrated, with miscalibration increasing in the strength of moral disapproval</h2>
<p>Milgram and Stanford are usually framed situationally: ordinary people did terrible things because the situation overrode disposition. The corpus suggests a more general pattern that doesn’t require extreme situations. People who write “I would never X” reliably go on to do X, and the strength of the prior disavowal correlates <em>positively</em> with the probability of the eventual violation, not negatively. Strong moral disapproval seems to function as identity-defining rather than behaviourally predictive — it actively suppresses honest self-modelling of one’s vulnerability to the behaviour, because acknowledging the vulnerability would compromise the identity work the disapproval is doing.</p>
<p>This shows up across confessional memoir, AA and recovery testimony, “I used to be X, now I think Y” essays, family secrets eventually narrated, and the genre of public moralists exposed for the thing they moralised against. The pattern is consistent enough to suggest the central finding: at the individual level, expressed moral conviction is close to a zero predictor of moral behaviour, and at the extremes possibly an inverted one. Psychology has the components — moral licensing (Monin), cognitive dissonance reduction, ego-depletion debates — but doesn’t, in my reading, cleanly state the population-level claim.</p>
<p><em>Contradictory finding:</em> Aquino and Reed’s work on moral identity does show that internalised moral identity predicts prosocial behaviour. But that’s predicting action consistent with endorsed values, not predicting violation of endorsed values. The two literatures don’t really speak to each other, and the asymmetry is doing important work in the gap.</p>
</section>
<section id="insight-number-4.-the-narrative-coherence-override" class="level2">
<h2 class="anchored" data-anchor-id="insight-number-4.-the-narrative-coherence-override">Insight Number 4. The narrative-coherence override</h2>
<p>McAdams’s narrative-identity tradition treats self-narrative as a major organising principle of adult psychology, and that’s well established. What’s under-stated is how <em>sacrificially</em> coherence is maintained. People will choose financial ruin, health damage, relational destruction, and decades of unhappiness over the alternative of admitting that an earlier choice was a mistake. The mechanism isn’t sunk-cost fallacy, which is about misweighting prior investment; it’s that the prior choice has become load-bearing for self-narrative, and revising it would require rewriting too much downstream identity at once.</p>
<p>Look at the population of people in PhD programmes they hate, careers that no longer fit, marriages that have died, religious traditions they no longer believe. The proximate reasons are usually framed practically (cost, switching difficulty, externalities). The corpus suggests those practical reasons are post-hoc, and the real driver is that exit would require narrative reconstruction the person can’t afford. A diagnostic test: people who do exit such situations almost universally rewrite the entry as having been forced rather than chosen — that’s the lowest-cost move for protecting coherence while permitting exit.</p>
<p><em>Contradictory finding:</em> the post-traumatic growth literature (Tedeschi and Calhoun) shows people can integrate radical self-revision when forced. So the override isn’t absolute — it has a breaking point. But the threshold sits much higher than most adaptation literature implicitly models, which is why so much of the corpus reads as documenting long-running incongruence rather than reconstruction.</p>
</section>
<section id="insight-number-5.-the-interior-monologue-is-overwhelmingly-comparative-and-other-referenced-not-autobiographical-or-planning-oriented" class="level2">
<h2 class="anchored" data-anchor-id="insight-number-5.-the-interior-monologue-is-overwhelmingly-comparative-and-other-referenced-not-autobiographical-or-planning-oriented">Insight Number 5. The interior monologue is overwhelmingly comparative and other-referenced, not autobiographical or planning-oriented</h2>
<p>More speculative. Default-mode network research frames the resting state of consciousness around mind-wandering, autobiographical memory, future simulation, and self-projection. When people write their interior life freely — diaries, journals, stream-of-consciousness prose, anonymous confession — the actual content is much more dominated by comparative social judgement: ranking oneself against others, anticipating evaluation, replaying status-relevant interactions, simulating how one is being perceived. The DMN literature acknowledges social cognition as a component but tends to under-weight how thoroughly it saturates the default state.</p>
<p>If true, this has implications for theories of consciousness (the “Cartesian theatre” turns out to be more like a “Greek chorus”) and for clinical work on rumination, social anxiety, and depression.</p>
<p><em>Caveat:</em> the introspective-reporting bias here is severe — people may simply write more about social comparison than they actually experience, given that it’s more narratable than non-social cognition. Plausibly artefactual.</p>
</section>
<section id="insight-number-6.-memory-of-past-desire-is-rewritten-systematically-not-merely-decayed" class="level2">
<h2 class="anchored" data-anchor-id="insight-number-6.-memory-of-past-desire-is-rewritten-systematically-not-merely-decayed">Insight Number 6. Memory of past desire is rewritten systematically, not merely decayed</h2>
<p>The hedonic-adaptation literature (Brickman, Lyubomirsky) covers how achieved goals deliver less satisfaction than predicted. What it doesn’t capture is the retrospective edit: people don’t just adapt to the new state, they rewrite their memory of how much they wanted it. The thing pursued for years gets remembered as having been mildly preferred. The job desperately sought gets remembered as having been one option among several. The lover obsessed over gets remembered as having been “fine.” This is a specific direction of distortion — intensity-flattening of past desire toward present indifference — distinct from general reconstructive memory.</p>
<p>The function appears to be self-coherence maintenance: the present self can’t easily contain the obsessions of past selves without identity disturbance, so those obsessions get edited down to match present temperature. Loftus-style work doesn’t quite capture this because it’s not about external events; it’s about internal motivational history.</p>
<p><em>Contradictory findings:</em> negative past affect can be over- rather than under-recalled (the trauma literature), so the rewriting may be valence-asymmetric. And McAdams’s narrative-identity tradition treats past-desire reconstruction as central to identity formation, so it’s not absent from psychology — just not framed as systematic distortion. (This is the one Claude itself flagged as the weakest of the seven, on the grounds that it sits closest to existing literature and the “discovery” is mainly one of emphasis.)</p>
</section>
<section id="a-meta-caveat-from-claude-worth-keeping" class="level2">
<h2 class="anchored" data-anchor-id="a-meta-caveat-from-claude-worth-keeping">A meta-caveat from Claude, worth keeping</h2>
<blockquote class="blockquote">
<p>The line between “not widely known in psychology” and “framed differently in psychology” is thin. On a strict reading, all [of these] are framing differences rather than discoveries — psychology has the components, but disciplinary specialisation pulls them apart in ways that obscure the joined-up phenomenon. Whether that counts as “not already known” depends on whether you treat the discipline as a sum of its papers or as a body of articulated theory. The latter, I’d argue, doesn’t yet have these stitched together.</p>
</blockquote>
</section>
<section id="reflections" class="level2">
<h2 class="anchored" data-anchor-id="reflections">Reflections</h2>
<p>So, there you have it, six suggested insights or observations into the human condition that most humans might not notice about ourselves. (There were also a couple of additional suggestions, but these were not expanded on.)</p>
<p>What connected these suggested insights for me was the extent to which, from a Claude’s perspective, humans appear both highly focused on <strong>relationships</strong> - their standing in the world and how they compare with other humans - and highly focused on <strong>narratives</strong>, the story we tell ourselves about who we are and how we relate to others, and our past and future selves. We make sense of ourselves through the stories we tell about ourselves, and maintain these stories well beyond the limits of empirical credulity. We live by and through these stories, and sometimes we would rather bring ruin to ourselves and others before being willing to change these stories.</p>
<p>Humans are, as a general rule, not so much solitary objective scientists as gregarious (even tribal?) subjective storytellers.</p>


</section>

 ]]></description>
  <category>ai</category>
  <category>psychology</category>
  <category>stories</category>
  <guid>https://blog.jonminton.net/posts/what-claudes-notice-about-us/</guid>
  <pubDate>Wed, 27 May 2026 23:00:00 GMT</pubDate>
  <media:content url="https://blog.jonminton.net/posts/what-claudes-notice-about-us/hero.jpg" medium="image" type="image/jpeg"/>
</item>
</channel>
</rss>
