<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[TEP: Technology, Education and Policy: Under The Hood]]></title><description><![CDATA[The engineering behind things that work. Architecture patterns, system design, and technical deep-dives that cross industries — from AI to blockchain to web. For builders who want to know why it works, not just that it works.]]></description><link>https://www.thewhyman.blog/s/under-the-hood</link><image><url>https://substackcdn.com/image/fetch/$s_!Z0Ez!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb866b3c9-2a56-41b2-8864-3239eb0ef170_1280x1280.png</url><title>TEP: Technology, Education and Policy: Under The Hood</title><link>https://www.thewhyman.blog/s/under-the-hood</link></image><generator>Substack</generator><lastBuildDate>Sat, 15 Aug 2026 22:50:12 GMT</lastBuildDate><atom:link href="https://www.thewhyman.blog/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[The Why Man]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[thewhyman@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[thewhyman@substack.com]]></itunes:email><itunes:name><![CDATA[The Why Man]]></itunes:name></itunes:owner><itunes:author><![CDATA[The Why Man]]></itunes:author><googleplay:owner><![CDATA[thewhyman@substack.com]]></googleplay:owner><googleplay:email><![CDATA[thewhyman@substack.com]]></googleplay:email><googleplay:author><![CDATA[The Why Man]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Only 18¢ of Your AI Dollar Reaches the Product. Here's How to Fix It.]]></title><description><![CDATA[Rework has always been most of the work. What changed is that generation outran review, and the two things everyone is buying more of are making it worse.]]></description><link>https://www.thewhyman.blog/p/only-18-of-your-ai-dollar-reaches</link><guid isPermaLink="false">https://www.thewhyman.blog/p/only-18-of-your-ai-dollar-reaches</guid><dc:creator><![CDATA[The Why Man]]></dc:creator><pubDate>Sat, 15 Aug 2026 18:59:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Z0Ez!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb866b3c9-2a56-41b2-8864-3239eb0ef170_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Paper 1 in the Reliable AI Systems series. Companion to <a href="https://www.thewhyman.blog">Defense in Depth for AI Agents</a>.</em></p><p><em>Written as the companion to my lightning talk at ClawCamp SF, Saturday 15 August 2026. If you just scanned the code from the room: this is the whole argument, with the sources.</em></p><p><em>Slides from the talk: <a href="https://xteamos.exponentialos.io/deck/">https://xteamos.exponentialos.io/deck/</a> </em></p><div><hr></div><p>A survey of 2,444 companies put a number on something most engineering teams already feel.</p><p>For every dollar spent on AI tokens: <strong>44 cents goes to fixing bugs the AI created. 27 cents to rewriting its code. 11 cents to review and merge delays.</strong></p><p>Eighteen cents reaches production.</p><p>That number went around as &#8220;82% of your AI spend is wasted,&#8221; and I want to deal with the objection before I use it, because the objection is good.</p><h2>The number is directionally right and numerically dubious</h2><p>The study comes from <a href="https://research.entelligence.ai/">Entelligence</a>, a company that sells tooling for the exact problem the statistic describes. The methodology is self-reported. The 2,444 companies likely include free-tier accounts. A <a href="https://jakecuth.com/work/ai-rework-lab/">forensic teardown</a> of the claim landed on the right verdict: <em>directionally right, numerically dubious.</em></p><p>The teardown&#8217;s sharpest point is the one nobody quoting the stat mentions: <strong>pre-AI software development already spent 75&#8211;80% of effort on maintenance and debugging.</strong> So 82% isn&#8217;t a shocking new tax. It&#8217;s roughly the historical baseline wearing a new hat.</p><p>Which means the interesting question isn&#8217;t &#8220;how much is wasted.&#8221; It&#8217;s <strong>what actually changed.</strong></p><h2>What changed: generation outran review</h2><p>Rework has always been most of the work. What&#8217;s new is the ratio between how fast you can produce code and how fast anyone can check it.</p><p>CodeRabbit measures AI-generated changes carrying roughly <strong>1.7&#215; more issues</strong> than human-written ones. Lightrun&#8217;s 2026 report found <strong>43% of AI-generated code still requires manual debugging in production &#8212; after it passed quality checks.</strong></p><p>Sit with that second one. Not &#8220;before review caught it.&#8221; After.</p><p>So the bottleneck was never cost per token. It&#8217;s <strong>review throughput</strong>, and every model upgrade makes the imbalance worse, because generation scales and human review does not.</p><p>That reframes what a quality gate is. A gate isn&#8217;t a tax on velocity. <strong>A gate is the only thing that raises the share of your spend that reaches the product.</strong> Yield, not savings.</p><p>Two things are quietly eating that yield, and the second one is the one nobody says out loud.</p><div><hr></div><h2>Leak one: you route every task as if it were the hardest one</h2><p>You get access to a frontier model. It&#8217;s good at everything, so you send it everything &#8212; file reads, git operations, deploys, browser automation, boilerplate tests, and the two decisions a day that actually need judgment.</p><p>Those are not the same task. You are paying judgment prices for clerical work, and you hit the rate ceiling by mid-afternoon because you spent the budget on <code>git status</code>.</p><p>The fix is routing by <strong>task class</strong> rather than by habit:</p><p>1) <strong>Deterministic work</strong> &#8212; deploys, git, file operations &#8212; goes to a small fast model. On current public pricing that&#8217;s roughly <strong>20&#215; cheaper</strong> than the frontier tier.</p><p>2) <strong>Browser automation and large reads</strong> go to a cheap high-context model, roughly <strong>50&#215; cheaper</strong>. This one matters more than it sounds: a single page snapshot can dump an entire DOM into your context, and you pay for those tokens on every subsequent turn.</p><p>3) <strong>Code generation</strong> goes to a code-specialised model.</p><p>4) <strong>The expensive model does one thing: judgment.</strong> Specs, gates, synthesis. That&#8217;s it.</p><p>None of that is controversial. It&#8217;s the second leak that people argue with.</p><div><hr></div><h2>Leak two: a bigger context window makes your agent worse</h2><p>Everyone has been told to start a new session when things go sideways. Almost nobody explains why.</p><p>It&#8217;s a cure prescribed without a diagnosis, and once you have the diagnosis, the advice turns out to be the crudest possible intervention.</p><h3>Why a fresh session feels smarter</h3><p>Not because it&#8217;s emptier. <strong>Because the wrong turns are gone.</strong></p><p>Every dead end you explored is still sitting in that window. The three incorrect things you told it about your schema two hours ago are still there, still being conditioned on. A fresh session doesn&#8217;t give the model more room to think &#8212; it removes the accumulated wrong answers.</p><p>That distinction kills the naive fix. <strong>Compressing by volume doesn&#8217;t help if you compress the wrong turns along with the right ones.</strong> You end up with a tidy summary of your own mistakes.</p><h3>The research says it&#8217;s worse than dilution</h3><p>Two findings, both well-established, both counterintuitive.</p><p><strong>Position matters, badly.</strong> Liu et al., <em><a href="https://arxiv.org/abs/2307.03172">Lost in the Middle: How Language Models Use Long Contexts</a></em> (Stanford, published in <a href="https://direct.mit.edu/tacl/article/doi/10.1162/tacl_a_00638/119630/Lost-in-the-Middle-How-Language-Models-Use-Long">TACL</a>), found performance is highest when relevant information sits at the beginning or end of the context and <strong>degrades significantly when the model must retrieve from the middle</strong>. Put the important thing in the middle of a long window and you have hidden it.</p><p><strong>Irrelevant context isn&#8217;t neutral &#8212; it competes.</strong> Chroma&#8217;s context-rot work and the <a href="https://arxiv.org/abs/2505.18761">GSM-DC benchmark</a> both find that models are meaningfully degraded by distractors, and that <strong>semantic similarity drives decay more than length does.</strong> A distractor that looks like the answer costs you far more than one that obviously doesn&#8217;t. A single distractor already degrades baseline; several compound it.</p><p>And then the finding that should change how you think about this entirely:</p><p><strong>Models performed better on shuffled context than on logically coherent context</strong> &#8212; across 18 models. Coherent documents share terminology and structure, which makes them <em>better</em> distractors.</p><p>Read that again, because it inverts the instinct everyone has. <strong>The more relevant-looking the material you stuff into the window, the more damage it does.</strong> &#8220;Just give it all the related files, it&#8217;s all connected&#8221; is precisely the wrong move.</p><p>&#8220;It fits&#8221; is not the same as &#8220;it helps.&#8221;</p><div><hr></div><h2>The architecture: the smallest thing that does the job</h2><p>Both leaks have the same shape, and the same fix.</p><p><strong>Sharp focus.</strong> Keep the working context deliberately small. Not as a limitation you&#8217;re working around &#8212; as a design choice.</p><p><strong>Long-term memory.</strong> Everything else lives in an index <em>outside</em> the window. The agent doesn&#8217;t need to hold it. It needs to know where it is.</p><p><strong>Just-in-time injection.</strong> Hydrate only the relevant slice, at the moment the task needs it. When the session ends, distil what was learned back into the index.</p><p>That&#8217;s what I run daily. The agent doesn&#8217;t carry everything. It carries the right thing at the right moment and knows where the rest lives.</p><p>Which makes &#8220;start a new session&#8221; look like what it is: <strong>amputation.</strong> It works. It also throws away everything you learned getting there. That&#8217;s only a rational trade if you have no memory layer &#8212; which, for most people giving the advice, is true.</p><p><strong>Two better techniques:</strong></p><p><strong>Self-compress on your own schedule.</strong> The critical word is <em>your</em>. Auto-compaction fires when the system hits a limit, which is precisely the moment you have least control over what survives. Compress deliberately, at a natural boundary, and you choose what carries forward &#8212; by relevance, not by volume.</p><p><strong>Write the handoff as insurance.</strong> You don&#8217;t get to pick when a session dies. This is the case you can&#8217;t schedule, which is exactly why it&#8217;s load-bearing.</p><p>Both convert a reset from a loss into a checkpoint.</p><div><hr></div><h2>The gates, and why they&#8217;re the yield story</h2><p>Cheap routing and a small context window let you generate faster. That&#8217;s only an improvement if what you generate is right. Otherwise you&#8217;ve optimised your way into producing defects more efficiently.</p><p>So: gates. Acceptance criteria and evals fixed <em>before</em> code is written. Ships only if it beats baseline.</p><p>If you take one gate from this piece, take this one.</p><p><strong>Never let the model that wrote the code be the model that reviews it.</strong></p><p>Not a different prompt. Not a different persona. A <strong>different family</strong>. Claude reviewing Claude shares the training, so it shares the blind spot &#8212; and it will confidently approve its own mistake.</p><p>I didn&#8217;t want to believe that on vibes, so I tested it: 50 artifacts seeded with known flaws from a taxonomy of five failure modes, four review conditions, 240 review runs, hypothesis registered before a single run so I couldn&#8217;t move the goalposts afterward.</p><p>But the production evidence is blunter than the experiment.</p><p><strong>A cross-family review panel caught a data-integrity bug and a silent cost-tracking regression that the CI gates &#8212; including 100% SonarCloud coverage &#8212; had waved through.</strong> Perfect coverage. Static analysis green. Two real defects shipped anyway, one of them quietly burning money.</p><p>That is the Lightrun 43% statistic happening in a single repository.</p><p>Two more from the same period:</p><p><strong>A single judge passed an attribution defect that the cross-family panel flagged RED at 97% confidence.</strong> One event keyed a raw session-row id while its pair used a different identity, so conversion credit would never have joined back to the referrer. Same code, same moment &#8212; one reviewer missed it, a panel of different families caught it.</p><p><strong>One model caught a corrupt-state bug that two models from the same other family both missed</strong> &#8212; corrupt state silently wiping configuration to defaults.</p><p>I&#8217;m not going to give you a catch rate. I don&#8217;t have a denominator, and a made-up percentage would undo everything above. What I have is a dated record of gates catching defects that coverage, unit tests, and single-model review all passed.</p><div><hr></div><h2>The tax nobody prices</h2><p>Rework doesn&#8217;t only burn tokens. It burns the thing you can&#8217;t buy back.</p><p>Debugging plausible-looking code you didn&#8217;t write is a genuinely harder cognitive task than debugging your own. You have no mental model to fall back on, so you reconstruct intent from scratch. Every defect pulls someone out of build mode, and the context switch costs more than the fix.</p><p>And then the compounding one: <strong>every defect that ships through your gates teaches the developer to stop trusting the output.</strong> Once that happens, they re-read everything &#8212; and you have paid for speed and lost it.</p><p>That isn&#8217;t a soft cost. It&#8217;s the mechanism by which the entire investment decays, and it appears in none of the studies above, because nobody is measuring it.</p><div><hr></div><h2>What to change on Monday</h2><p><strong>One.</strong> Take the three most repetitive things you send to a frontier model this week and route them to a cheap one. Measure the difference. You will be annoyed at how much you were spending.</p><p><strong>Two.</strong> Take whatever you stuff into context by default and move it behind a retrieval step. Inject it when the task needs it, not before. Then add one review pass from a <em>different model family</em> before anything ships.</p><p>The model isn&#8217;t your bottleneck. Your routing is &#8212; both kinds.</p><div><hr></div><p><em>This is Paper 1 in the Reliable AI Systems series, which argues that AI systems must be governed at multiple layers simultaneously to be reliable in deployment. Each piece takes one layer and contributes a primitive. The companion piece, <a href="https://www.thewhyman.blog">Defense in Depth for AI Agents</a>, covers the operational layer: structured evaluation pipelines, drift monitoring, and guardrail-as-architecture.</em></p><p><em>I&#8217;m Anand Vallamsetla &#8212; Exponential OS, ex-Google, ex-AI Fund (Andrew Ng&#8217;s venture studio). I build the systems that build AI products.</em></p><h2>Sources</h2><ul><li><p>Entelligence AI &#8212; token spend breakdown across 2,444 companies &#8212; https://research.entelligence.ai/</p></li><li><p>Lightrun &#8212; 2026 State of AI-Powered Engineering &#8212; 43% of AI code needs manual debugging after passing quality checks</p></li><li><p>CodeRabbit &#8212; AI-generated changes carry ~1.7&#215; more issues than human-written</p></li><li><p>Jake Cuthbertson &#8212; <em>The Rework Tax</em>, forensic teardown of the 82% claim &#8212; https://jakecuth.com/work/ai-rework-lab/</p></li><li><p>Liu, Lin, Hewitt, Paranjape, Bevilacqua, Petroni, Liang &#8212; <em>Lost in the Middle: How Language Models Use Long Contexts</em>, TACL 2024 &#8212; https://arxiv.org/abs/2307.03172</p></li><li><p><em>How Is LLM Reasoning Distracted by Irrelevant Context? An Analysis Using a Controlled Benchmark</em> (GSM-DC) &#8212; https://arxiv.org/abs/2505.18761</p></li><li><p>Chroma &#8212; context rot research on distractor semantics and shuffled-vs-coherent haystacks</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Why your site is invisible to ChatGPT (even when Google loves you)]]></title><description><![CDATA[Ranking on Google and being citable by AI are not the same problem &#8212; and I asked four engines the same question to prove it.]]></description><link>https://www.thewhyman.blog/p/why-your-site-is-invisible-to-chatgpt</link><guid isPermaLink="false">https://www.thewhyman.blog/p/why-your-site-is-invisible-to-chatgpt</guid><dc:creator><![CDATA[The Why Man]]></dc:creator><pubDate>Fri, 24 Jul 2026 23:55:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Z0Ez!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb866b3c9-2a56-41b2-8864-3239eb0ef170_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>An accountant asked a friend of mine a simple question: <em>"If someone asks ChatGPT for an accountant near me, do I show up?"</em> He had no idea. So he checked 15 small-business sites. Two showed up. Thirteen were invisible &#8212; most of them ranking perfectly well on Google.</p><p>That gap is the whole story. Ranking on Google and being citable by AI are <strong>not the same problem</strong>, and treating them as one is why so many sites have gone quiet in AI answers without noticing.</p><p>Here's what's actually happening under the hood.</p><p><strong>An AI answer comes from one of two places.</strong> Either the model answers from memory &#8212; what it absorbed in training, which you can't change and which is months stale &#8212; or it runs a live retrieval, fetches pages, and cites them. Only the second path is one you can influence. And that path has two gates almost nobody checks.</p><h2>Gate 1: Can the crawler even fetch you?</h2><p>The retrieval bots behind ChatGPT, Claude, and Perplexity &#8212; OAI-SearchBot, ClaudeBot, PerplexityBot &#8212; <strong>do not run JavaScript.</strong> A large-scale study of roughly a billion requests found none of them render JS. So if your site builds its content in the browser (any SPA &#8212; React, Vue, most modern stacks), the crawler sees an almost-empty shell where a human sees a full page. You can rank on Google, which does render JS, and be a blank page to ChatGPT.</p><p>The other half of Gate 1 is your own security layer. A WAF or Cloudflare rule that challenges "bot-like" traffic will 403 the AI crawler while serving humans normally. You never see it. You just quietly disappear.</p><p>Here's the ten-second test. Run this on your own site:</p><pre><code><code>curl -A "ClaudeBot/1.0 (+https://www.anthropic.com/claude-bot)" https://yoursite.com</code></code></pre><p>If you get your real content back, good. If you get an empty shell, a redirect loop, or a 403 &#8212; that's why you're not cited, and no amount of content strategy fixes it until you fix this.</p><h2>Gate 2: Once fetched, the index decides &#8212; and every engine's index is different</h2><p>I ran one experiment that made this vivid. I asked four assistants the same open question &#8212; <em>"best API to extract structured data from PDFs"</em> &#8212; each on its own search index.</p><ul><li><p><strong>ChatGPT (Bing index):</strong> surfaced exact-match-domain microsites &#8212; frompdf.dev, transpdf.ai, extractocr.com. When I actually fetched frompdf.dev, it returned <strong>zero bytes</strong> &#8212; no readable content at all &#8212; yet it was cited the most. These sites have no measurable traffic and zero presence on Reddit. They won on one thing: their domain name is the query.</p></li><li><p><strong>Gemini (Google index):</strong> Google Document AI, AWS Textract, Azure, LlamaParse, Unstructured &#8212; plus LandingAI, a legitimate, well-built player with a fraction of the incumbents' traffic.</p></li><li><p><strong>Claude (Brave index):</strong> cloud incumbents and real tools; Parseur, Klippa, LlamaParse.</p></li></ul><p>Same question. Four different worlds. On Bing/ChatGPT, keyword-stuffed domains with no audience beat a readable, funded product. On Google and Brave, legitimacy won. <strong>"Getting cited by AI" isn't one target &#8212; it's four, and they reward different things.</strong></p><p>There's a concentration story on top of this. One synthesis of 680M+ AI citations (Everything-PR / 5WPR, 2026) found the <strong>top 15 domains capture ~68% of all citations</strong>, with Reddit alone near 40% and #1 on every engine. (It's a third-party aggregation, not an audited study &#8212; treat it as directional.) Much of AI citation flows through a handful of high-trust intermediaries you don't own &#8212; a different fight from making your own site citable.</p><h2>What doesn't work, despite the hype</h2><p><strong>llms.txt.</strong> One audit of 1,500 sites found <strong>0.2%</strong> use it, and real crawler consumption today is near zero. Schema/JSON-LD helps a parser understand you but doesn't get you retrieved. Both are fine hygiene; neither is the lever people think it is.</p><h2>So, in order of impact</h2><ol><li><p>Make sure AI crawlers can <em>fetch</em> you &#8212; server-render or pre-generate your main content, and stop challenging verified bots at the edge. (The curl test above.)</p></li><li><p>Put concrete, quotable facts in the first few hundred words, not boilerplate.</p></li><li><p>Optimize per engine, not in general &#8212; the index that feeds your buyers' assistant is the one that matters.</p></li><li><p>llms.txt last, if at all.</p></li></ol><p>None of this requires a rebrand. It requires knowing what an AI agent actually sees when it reads you &#8212; which, it turns out, is almost never what you see in a browser.</p><p><em>(I got tired of running that curl test by hand, so I built a free scanner that fetches your page as ChatGPT and Claude's crawlers do and shows the exact gaps &#8212; no signup: <a href="https://getagentview.com">getagentview.com</a>. But the curl one-liner above will get you 80% of the way for free.)</em></p><p><em>Caveats, because they matter: the four-engine test is a single snapshot, not a controlled study &#8212; results drift week to week. The citation-share figures are third-party aggregations. And correlation isn't causation &#8212; reachability tracks closely with citation in my testing, but the clean proof is a before/after on a site you actually fix.</em></p>]]></content:encoded></item></channel></rss>