<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>AI on scripting.pro</title><link>https://scripting.pro/tags/ai/</link><description>Recent content in AI on scripting.pro</description><image><title>scripting.pro</title><url>https://scripting.pro/images/og-featured.png</url><link>https://scripting.pro/images/og-featured.png</link></image><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 02 Nov 2026 12:00:00 -0500</lastBuildDate><atom:link href="https://scripting.pro/tags/ai/index.xml" rel="self" type="application/rss+xml"/><item><title>The Anatomy of a Eureka, Part I: Why Some Metaphors Land and Others Don't</title><link>https://scripting.pro/posts/eureka-part1/</link><pubDate>Thu, 16 Apr 2026 10:00:00 -0400</pubDate><guid>https://scripting.pro/posts/eureka-part1/</guid><description>The distance between domains explains almost nothing about whether a creative idea will be useful. What actually predicts applicability is the granularity of the transferred unit, and controlling it is a compression problem with discrete levels.</description><content:encoded><![CDATA[<p><em>We may assume that a creative idea is a distant analogy, connecting two things no one had connected before. That assumption is wrong. The distance between domains explains almost nothing about whether an idea will be novel, useful, or transformative.</em></p>
<p>What actually matters is far less intuitive, and it changes how we should think about LLMs as instruments for creativity.</p>
<hr>
<h2 id="the-broken-promise-of-the-creative-prompt">The Broken Promise of the Creative Prompt</h2>
<p>Ask any major LLM for novel solutions to a real problem and you usually get back a polished recombination of known best practices.</p>
<p>Take this question: <em>How can we better prevent technical debt in large enterprise IT projects with fixed dates and budgets?</em></p>
<p>You&rsquo;ll typically receive: short Agile sprints, 15-25% refactoring buffers, SonarQube, &ldquo;stop the line&rdquo; culture, and KPIs in vendor contracts. Useful and professional, but entirely predictable.</p>
<p>If you&rsquo;re looking for established best practices, this is exactly what you want. The model is doing what it was trained to do, interpolating the most statistically probable patterns in its training data, and for consolidating known solutions that is a strength.</p>
<p>But if you&rsquo;re looking for a genuinely new idea, something no one has tried, then that same interpolation is the obstacle. The model is fine; we&rsquo;re asking it to perform the wrong operation.</p>
<hr>
<h2 id="directed-metaphorical-association">Directed Metaphorical Association</h2>
<p>Years ago, while researching creative systems, I started experimenting with a different approach: directed metaphorical association. Instead of asking for solutions directly, you identify the strong semantic concepts in a problem, pull rich metaphors from distant domains, transfer properties across the gap, and let the human judge what emerges.</p>
<p>The logic is simple. If you ask an LLM to solve a technical debt problem, it searches its training data for content <em>about</em> technical debt. You get back what the industry already knows. But if you ask it to find structural parallels between technical debt and, say, scuba diving, the model is forced to traverse a completely different region of its knowledge. The connections it finds can&rsquo;t be recycled best practices, because no one has written about the intersection of nitrogen absorption and code quality.</p>
<p>At the time I developed this, it was all manual. Today, the attention mechanism in Transformer-based LLMs lets us scale this approach dramatically: the model can compute semantic relationships across domains far richer than anything I could code by hand.</p>
<p>But scaling it revealed something I didn&rsquo;t expect. The results weren&rsquo;t uniformly creative. Some metaphorical transfers landed immediately and felt actionable. Others were intellectually fascinating but resisted any practical application. At first I assumed this was noise, since some metaphors just work better than others. But the pattern was too consistent to be random, and it turned out to be more interesting than the ideas themselves.</p>
<hr>
<h2 id="same-problem-directed-metaphors">Same Problem, Directed Metaphors</h2>
<p>When I applied the method to the technical debt question, directing the LLM to generate metaphorical associations from distant domains rather than recombine known practices, four ideas emerged:</p>
<p><strong>Directed fermentation.</strong> In cheesemaking, you don&rsquo;t fight bacterial activity; you control which bacteria dominate. The distinction that matters is controlled versus uncontrolled, not clean versus dirty. A bad cheese isn&rsquo;t a cheese with bacteria; it&rsquo;s a cheese with the wrong bacteria.</p>
<p>Transfer: maintain a catalog of authorized shortcuts (a &ldquo;starter culture&rdquo;), each with its documented lifespan and self-replacement rule. Debt that follows the starter is tolerated. Debt outside it is rejected. You stop trying to eliminate debt and start trying to control <em>which</em> debt lives in your system.</p>
<p><strong>Mandatory decompression.</strong> In scuba diving, nitrogen dissolves in the blood under pressure. That&rsquo;s physics, not a negotiation. If the diver ascends too fast, the nitrogen forms bubbles. Since preventing nitrogen absorption is impossible under pressure, the solution is decompression stops, calculated mathematically and non-negotiable.</p>
<p>Transfer: accept that fixed deadlines and budgets <em>will</em> dissolve debt into the codebase. That&rsquo;s a law of development under pressure, not a failure of discipline. Model debt accumulation as a calculable variable and insert mandatory decompression windows whose length is determined by the model, not by managerial goodwill. You don&rsquo;t negotiate the laws of physics.</p>
<p><strong>Programmed selective amnesia.</strong> The brain actively prunes weak synaptic connections during sleep. Forgetting is a survival mechanism, not a malfunction. Without this pruning, the brain saturates, loses its ability to discriminate, and starts treating noise as signal.</p>
<p>Transfer: at fixed intervals, delete entire modules and force them to be rewritten from their behavioral contract alone. This sounds radical, but the point is what the deletion reveals. Code that cannot be reconstructed from its spec exposes that the <em>spec</em> was insufficient: the real debt was in the specification all along, not in the code.</p>
<p><strong>Unrehearsed ensemble.</strong> Jazz bands booked for festival slots with non-negotiable stage times cram complex new arrangements into minimal rehearsal hours. Every player memorizes the charts individually. But onstage, the improvisation falls apart into disjointed solos, because knowing the material individually is not the same as having internalized it as shared group intuition.</p>
<p>Transfer: a team where every developer knows the codebase individually can still produce incoherent architecture, because no one has built the shared intuition of how the system wants to evolve. The debt lies in the absence of collective internalization, which only emerges from working together on the same problems over time, rather than in any individual&rsquo;s competence.</p>
<hr>
<h2 id="something-is-off">Something Is Off</h2>
<p>Read those four ideas again. Two of them, fermentation and decompression, feel immediately actionable. You could present them to a project director tomorrow and have a productive conversation. They fit inside the existing mental model of how IT projects work; they just reframe a specific aspect of it.</p>
<p>The other two, selective amnesia and the unrehearsed ensemble, are more demanding. They don&rsquo;t reframe an aspect of the existing model. They ask you to question what you consider the primary artifact (is it the code or the spec?), or what &ldquo;team competence&rdquo; even means (is it individual knowledge or collective intuition?). You can&rsquo;t just &ldquo;apply&rdquo; them. You&rsquo;d need to rethink something basic first.</p>
<p>This isn&rsquo;t a question of quality. All four are intellectually rich. But they operate at different levels, and that difference is consistent and reproducible enough to be worth understanding.</p>
<hr>
<h2 id="the-red-herring-semantic-distance">The Red Herring: Semantic Distance</h2>
<p>The obvious explanation would be that some metaphors are simply &ldquo;too far&rdquo; from the target domain. That&rsquo;s the classical thesis from Mednick (1962): close associations are banal, distant associations are incomprehensible, and creativity sits in an optimal zone in between. It&rsquo;s an elegant idea, and it has dominated the creativity literature for over sixty years.</p>
<p>But it doesn&rsquo;t explain what we&rsquo;re seeing here. Fermentation comes from biology. Selective amnesia comes from neuroscience. Both are roughly equidistant from software engineering. Yet the first is immediately applicable and the second is not.</p>
<p>If distance were the relevant variable, ideas from similarly distant domains should behave similarly. They don&rsquo;t, so something else is at work.</p>
<hr>
<h2 id="first-finding-transfer-granularity">First Finding: Transfer Granularity</h2>
<p>What separates the two groups is the <em>size</em> of what gets transferred, not distance, since both draw from domains equally far from software engineering.</p>
<p>Look at what each idea actually imports from its source domain:</p>
<p>Fermentation imports a single rule: &ldquo;the relevant distinction is not presence versus absence, it&rsquo;s controlled versus uncontrolled.&rdquo; One causal relationship, stripped of all cheesemaking context. You can plug it directly into a conversation about technical debt without asking anyone to change how they think about software.</p>
<p>Decompression imports a single rule as well: &ldquo;accumulation under pressure is a physical law, and the stops are calculable.&rdquo; The diving context is gone. What remains is a structural insight that maps cleanly onto fixed-deadline projects.</p>
<p>Now look at what the unrehearsed ensemble imports. Instead of a single rule, it brings a <em>system of relationships</em>: the idea that individual competence does not produce collective competence, that shared intuition is a distinct artifact that only emerges from sustained joint practice, and that the absence of this artifact produces incoherence even when every individual performs well. To apply this to a software team, you need to accept all of these premises simultaneously. You&rsquo;re not plugging in a rule; you&rsquo;re redefining what &ldquo;team competence&rdquo; means (a separate thing that either exists or doesn&rsquo;t, rather than the sum of individual skills).</p>
<p>Selective amnesia does the same thing. It doesn&rsquo;t just say &ldquo;delete code sometimes.&rdquo; It requires you to reconceptualize what the primary artifacts are, to accept that code is expendable and specs are foundational, to rethink the relationship between implementation and contract. That&rsquo;s a system of interlocking ideas, not a single transferable rule.</p>
<p>Semantic distance matters: it ensures the pieces are genuinely different from what the target domain already knows. But the variable that predicts whether a metaphorical idea will be <em>immediately useful</em> is the granularity of the transferred unit. Single causal rules are portable. Systems of relationships require a worldview shift.</p>
<p>Both can be valuable, but they serve different purposes, ask different things of the audience, and land on very different timescales.</p>
<hr>
<h2 id="second-finding-compression-at-the-right-level">Second Finding: Compression at the Right Level</h2>
<p>If granularity is what matters, the practical question becomes: how do you control it? How do you reliably extract single causal rules from a rich source domain instead of accidentally importing entire systems?</p>
<p>The answer is compression.</p>
<p>When you extract a causal rule from a source domain, you&rsquo;re performing lossy compression in the information-theoretic sense (keeping only the causal skeleton, discarding everything else). You take a rich domain, scuba diving with its physics, decompression tables, equipment protocols, certification culture, and accident case law, and you compress it down to a bare skeleton: &ldquo;inevitable accumulation under pressure → calculated mandatory stops.&rdquo; Everything else gets discarded. What remains is portable.</p>
<p>What I didn&rsquo;t expect is that this compression doesn&rsquo;t work as a smooth dial you can turn gradually. It has discrete levels, like quantization of a signal (steps, not a ramp). In practice, I consistently see three distinct levels:</p>
<p><em>The raw metaphor.</em> &ldquo;Technical debt is like cancer.&rdquo; This is barely compressed at all. The metaphor arrives with its full baggage: diagnosis, staging, treatment, remission, relapse, death. You&rsquo;re not importing a rule; you&rsquo;re importing a <em>scenario</em>, and the scenario drags in properties that don&rsquo;t map to the target domain at all. (Does technical debt metastasize? Does it have remission? The metaphor implies yes, but the reality is more complicated.)</p>
<p><em>The causal rule.</em> &ldquo;Damage at a threshold triggers an irreversible state transition.&rdquo; Now the source domain&rsquo;s vocabulary has disappeared entirely. You can&rsquo;t tell whether this came from botany, metallurgy, or nuclear physics; it&rsquo;s a pure structural relationship. It&rsquo;s abstract enough to travel across any domain boundary, but concrete enough to generate specific ideas when you apply it to a new context.</p>
<p><em>The philosophical principle.</em> &ldquo;Systems under constraint reach equilibria.&rdquo; This is over-compressed. It&rsquo;s true of everything: thermodynamics, economics, psychology, traffic. Precisely because it applies everywhere, it generates nothing specific anywhere. It&rsquo;s a tautology dressed as insight.</p>
<p>The intermediate level, the bare causal rule, is the only one that is simultaneously abstract enough to leave the source domain and concrete enough to land in the target domain and generate something actionable.</p>
<blockquote>
<p><strong>Too little compression, and you import baggage. Too much, and you import nothing.</strong></p>
</blockquote>
<p>Useful creativity, it turns out, is a compression problem, and the sweet spot is a discrete level rather than a point on a continuous dial.</p>
<hr>
<h2 id="what-this-means">What This Means</h2>
<p>These two findings already change how you use an LLM for creative work.</p>
<p>If you want ideas that are immediately actionable, direct the model to extract <em>single causal rules</em> from distant domains, stripped of all source vocabulary. Force compression to the intermediate level. If you can still tell which domain a rule came from, it&rsquo;s not compressed enough. If you can&rsquo;t imagine applying it to anything specific, it&rsquo;s compressed too far.</p>
<p>But when I started applying this systematically, I ran into something I didn&rsquo;t expect. I had a catalog of beautifully compressed rules. Each one mapped onto the target problem with uncomfortable precision. And yet I still couldn&rsquo;t turn any of them into a solution. Understanding <em>how</em> a problem works turned out to be a completely different operation from knowing <em>what to do about it</em>. That gap, and what fills it, is what Part II is about.</p>
<hr>
<p><em>Gabriel Mailhot is a Senior Subject Matter Expert at Desjardins, where he works on development practices, architecture, and complex organizational problems spanning technology, process, and governance. His 2003–2010 research focused on creative systems and metaphor-based retrieval. He publishes at scripting.pro.</em></p>
]]></content:encoded></item><item><title>The Anatomy of a Eureka, Part II: Where the Eureka Actually Happens</title><link>https://scripting.pro/posts/eureka-part2/</link><pubDate>Thu, 16 Apr 2026 11:00:00 -0400</pubDate><guid>https://scripting.pro/posts/eureka-part2/</guid><description>Causal rules are diagnoses, not solutions. Turning a diagnosis into a genuine invention requires two missing operations, inversion and composition, formalized here as the Extraction-Inversion-Composition (EIC) framework.</description><content:encoded><![CDATA[<p><em>Part I ended with a puzzle. I had a method that reliably extracted powerful ideas from distant domains, but some of those ideas were immediately actionable and others resisted application. The difference turned out to be granularity and compression: single causal rules, stripped bare, are portable. Systems of relationships are not. But even after solving that puzzle, something was still missing.</em></p>
<hr>
<h2 id="the-limitation-i-didnt-see">The Limitation I Didn&rsquo;t See</h2>
<p>By the end of Part I, I could reliably extract clean, compressed causal rules from distant domains. Rules like &ldquo;accumulation under pressure is physics, not a choice&rdquo; or &ldquo;the distinction that matters is controlled versus uncontrolled.&rdquo; Each one a precise diagnosis of how a problem works.</p>
<p>But that&rsquo;s exactly what they were: diagnoses, X-rays of the pathology rather than solutions.</p>
<p>I spent a while assuming the solution would naturally follow from understanding the cause. It doesn&rsquo;t. Understanding that nitrogen dissolves in blood under pressure doesn&rsquo;t tell you to invent decompression stops. The leap from &ldquo;here&rsquo;s how the problem works&rdquo; to &ldquo;here&rsquo;s how to break the mechanism&rdquo; requires a separate act, one that is creative in a way the diagnosis is not.</p>
<p>When I systematized the method by asking an LLM to extract compressed causal rules from many distant domains at once, I could see this limitation clearly. The results were clean and powerful:</p>
<p><em>&ldquo;Functional-but-carrying agents propagate the problem because there is no incentive to detect them.&rdquo;</em> (from epidemiology)</p>
<p><em>&ldquo;Repeated sub-critical stress accumulates invisibly until failure occurs without proportional warning.&rdquo;</em> (from metallurgy)</p>
<p><em>&ldquo;Control by outcome alone makes it impossible to distinguish systemic success from accidental success.&rdquo;</em> (from fermentation science)</p>
<p>Each maps onto technical debt with uncomfortable precision. The epidemiological rule describes how &ldquo;working&rdquo; code that carries hidden debt propagates undetected. The metallurgical rule describes how small daily compromises accumulate into sudden, catastrophic failures. The fermentation rule describes how testing only the final product hides whether the <em>process</em> was sound. Yet for all their diagnostic value, not one of them tells you what to <em>do</em>.</p>
<hr>
<h2 id="the-missing-operation-inversion">The Missing Operation: Inversion</h2>
<p>The creative act that turns a diagnosis into a solution is <em>inversion</em>: deliberately breaking the causal chain at a chosen point.</p>
<p>In its simplest form, a diagnosis says &ldquo;A causes B, which causes C.&rdquo; Inversion asks what happens if I prevent A from causing B, or if I let B happen but prevent it from causing C. Each break point produces a different family of solutions, often of completely different nature.</p>
<p>In practice this is less obvious than it sounds, because a single causal chain can be broken at <em>multiple</em> points, and the choice of where to break determines not just the solution but its entire character.</p>
<p>Take the epidemiological rule: &ldquo;functional-but-carrying agents propagate the problem because there is no incentive to detect them.&rdquo; There are three links in this chain, and each one is a potential target:</p>
<p><strong>Break at link 1</strong>: make the carrying agents non-functional. In software terms, design code so that debt-carrying modules <em>stop working</em> after a defined period. The debt itself triggers a forced replacement. This is a radical, architectural solution that changes the infrastructure.</p>
<p><strong>Break at link 2</strong>: create incentives to detect, even when everything works. In software terms, reward teams for discovering latent debt rather than for delivering features. Don&rsquo;t wait for symptoms; actively hunt for carriers. This is an organizational, incentive-based solution that changes the reward structure.</p>
<p><strong>Break at link 3</strong>: accept propagation, but make its pathways visible. In software terms, don&rsquo;t try to prevent debt from spreading; instead, instrument the codebase so that every propagation path is traced in real time. When something breaks, you know exactly which &ldquo;carrier&rdquo; transmitted the problem. This is an observational solution that changes what you can see.</p>
<p>One diagnosis yields three completely different solutions. The choice of <em>where</em> to break the chain is itself a creative decision that depends on the context, the constraints, and the appetite for disruption.</p>
<p>This is the operation that was missing from my original method. Extraction gives you a diagnosis. Inversion gives you families of possible solutions. But I wasn&rsquo;t done, because the most powerful ideas I encountered weren&rsquo;t single inversions. They were <em>combinations</em>.</p>
<hr>
<h2 id="fourth-finding-novelty-is-in-the-composition">Fourth Finding: Novelty Is in the Composition</h2>
<p>Here is the central reversal of everything I thought I knew about creativity.</p>
<p>The entire creativity literature since Mednick (1962) has focused on the <em>transfer</em> as the source of novelty, on the assumption that the more distant the connection between domains, the more creative the idea. My own earlier research operated on this assumption.</p>
<p>What experimentation with LLMs at scale revealed is that distance is only a <em>necessary condition</em>. It ensures that the pieces you extract are sufficiently different from one another. But the novelty, the actual Eureka, doesn&rsquo;t reside in any single extraction or any single inversion. It resides in the <em>composition</em>: the moment you assemble inversions from multiple, unrelated domains into a recipe that is specific to the target problem. The individual pieces aren&rsquo;t surprising; the assembly is what no one has seen before.</p>
<p>In my own work using structural analogy as a diagnostic tool for organizations, I observe exactly this. When I import rules from biology, law, and neuroeconomics to analyze an organizational dysfunction, no individual rule surprises the domain expert. A biologist knows the first. A lawyer knows the second. An economist knows the third. What produces genuine insight is the <em>combination</em>: the specific way these rules interact when applied simultaneously to a context none of them were designed for.</p>
<p>Let me make this concrete with the technical debt example. Take two inversions from different rules:</p>
<p>From the epidemiological rule, break at link 2: <em>create an incentive to detect even when everything functions normally.</em></p>
<p>From the fermentation rule: <em>the relevant distinction is not presence versus absence, it&rsquo;s controlled versus uncontrolled.</em></p>
<p>Now assemble them. You get something that, as far as I can tell, doesn&rsquo;t exist in the current IT literature: <strong>reproductibility as the metric of code health.</strong></p>
<p>A module is healthy not because it works, nor because its tests pass, but because two independent developers, starting from the same specification, would produce structurally similar code. If they wouldn&rsquo;t (if the result depends heavily on who wrote it), then the module is a functional-but-carrying agent. It works, but its construction process was <em>uncontrolled</em>. It passed the outcome test while failing the process test.</p>
<p>Think about what this does. You&rsquo;re no longer looking for bugs or measuring test coverage. You&rsquo;re measuring whether the <em>process</em> that produced the code was controlled or accidental. The fermentation frame redefines <em>what</em> you&rsquo;re looking for. The epidemiological inversion tells you <em>when</em> to look: precisely when everything appears fine.</p>
<p>Neither inversion alone produces this idea. The fermentation rule alone gives you a philosophical reframe, interesting but abstract. The epidemiological inversion alone gives you a detection strategy, useful but directionless. The invention is the <em>recipe</em>: reproductibility as a metric, triggered by the absence of alarm signals, designed to catch uncontrolled process masquerading as healthy output. It emerged from the composition, not from either piece.</p>
<hr>
<h2 id="fifth-finding-the-solution-exposes-the-context">Fifth Finding: The Solution Exposes the Context</h2>
<p>There&rsquo;s one more thing I got wrong initially, and it matters.</p>
<p>My first instinct, after developing the model, was to add a filtering step: take the composed ideas and check which ones are compatible with the target context. &ldquo;This wouldn&rsquo;t work here because of regulatory constraint X; eliminate it.&rdquo; &ldquo;This contradicts our governance model; eliminate it.&rdquo; Standard feasibility analysis.</p>
<p>That instinct is a trap. A sufficiently compelling solution doesn&rsquo;t get filtered by the context. It <em>exposes</em> the context. When a good idea collides with an organizational, regulatory, or cultural constraint, there are two readings: either the idea is unrealistic, or the constraint itself deserves to be questioned.</p>
<p>The most transformative Eureka is not &ldquo;this solution works in my world&rdquo; but &ldquo;this solution is so compelling that I&rsquo;m willing to change my world to make it work.&rdquo; The friction between the idea and the context is a <em>diagnostic</em> of which constraints are actually serving you and which ones have outlived their purpose, not a bug in the creative process.</p>
<p>This has happened before at industry scale. Agile was not &ldquo;applicable&rdquo; in the world of waterfall. It didn&rsquo;t fit the existing governance, contracts, or PMO structure. But it exposed that waterfall rested on a false assumption: that you can fully specify a system before building it. DevOps was not &ldquo;applicable&rdquo; in organizations where development and operations were separate silos with separate incentives. But it exposed that the separation itself was the root cause of deployment failures. In both cases, the idea didn&rsquo;t adapt to the context. The context restructured itself around the idea, because the idea was compelling enough to justify the cost of change. Entire organizations rewrote their processes, their team structures, their governance models. They did so not because a consultant told them to, but because the solution showed the constraints to be obstacles rather than laws.</p>
<blockquote>
<p><strong>The idea didn&rsquo;t adapt to the context. The context restructured itself around the idea.</strong></p>
</blockquote>
<p>The same mechanism operates at smaller scales. In my work at a major financial institution regulated by federal and provincial authorities, I&rsquo;ve seen a creative solution to a development process problem run directly into a regulatory rule that everyone assumed was immutable. But the solution was transformative enough to create the will to engage the regulator in a conversation about whether that rule was still serving its original purpose. Instead of the constraint killing the idea, the idea questioned the constraint. And the list of constraints exposed became a deliverable as valuable as the solution itself.</p>
<hr>
<h2 id="the-complete-model">The Complete Model</h2>
<p>Creativity, then, is not a single operation. It is a sequence of three, which I&rsquo;ll call the <strong>Extraction-Inversion-Composition framework</strong> (EIC):</p>
<p><strong>Extraction.</strong> Compress distant domains into minimal causal rules at the right discrete level: abstract enough to be portable, concrete enough to be operational. This is the preparatory step. LLMs do it extraordinarily well.</p>
<p><strong>Inversion.</strong> Identify where each causal chain can be broken. Each breakpoint opens a family of solutions of a different nature. The choice of breakpoint is context-dependent and already involves judgment, but an LLM can enumerate the options systematically.</p>
<p><strong>Composition.</strong> Assemble inversions from different rules into a coherent recipe for the target domain. This is where genuine novelty emerges: in the combinatorics of the assembly, not in the individual pieces.</p>
<p>The framework rests on three claims, each of which challenges a different assumption in the existing creativity literature:</p>
<p>First, the causal rule (not the metaphor, the analogy, or the concept) is the correct unit of creative transfer. It is the only level of compression that is simultaneously portable and operational.</p>
<p>Second, inversion is the missing operation between diagnosis and solution. The creativity literature treats the transfer as the creative act, but the transfer only produces a diagnosis. Inversion produces families of solutions. Without it, you have insight without agency.</p>
<p>Third, novelty emerges from composition, not from transfer. The distance between domains ensures that the pieces are different. But the invention is in the assembly, in the specific combination of inversions that no one has tried before.</p>
<p>Each composed proposal is then judged on three levels of strength:</p>
<p><em>Logical strength</em>: does the inversion actually break the causal chain? This is a structural coherence judgment. An LLM handles it well.</p>
<p><em>Transformative strength</em>: is the solution compelling enough to justify questioning the constraints that stand in its way? An LLM can partially assess this; it can evaluate whether a proposal is radical and explain why.</p>
<p><em>Political strength</em>: will the actual actors have the will and power to modify the exposed constraints? This is a situated judgment, anchored in knowledge of power dynamics, culture, and institutional history. Here, and only here, the human is irreplaceable.</p>
<hr>
<h2 id="what-comes-next">What Comes Next</h2>
<p>The EIC framework now feels complete on paper. But a model is only as good as its results in practice.</p>
<p>In Part III, I turn the framework into a concrete instrument (a carefully constrained prompt) and test it cold on three different LLMs with the same technical debt problem.</p>
<p>The results reveal something unexpected about the creative signatures of different models, about the limits of prompts as specifications, and about where human judgment remains irreplaceable.</p>
<hr>
<p><em>Gabriel Mailhot is a Senior Subject Matter Expert at Desjardins, where he works on development practices, architecture, and complex organizational problems spanning technology, process, and governance. His 2003–2010 research focused on creative systems and metaphor-based retrieval. He publishes at scripting.pro.</em></p>
]]></content:encoded></item><item><title>The Anatomy of a Eureka, Part III: The Instrument, the Experiment, and the Limits</title><link>https://scripting.pro/posts/eureka-part3/</link><pubDate>Thu, 16 Apr 2026 12:00:00 -0400</pubDate><guid>https://scripting.pro/posts/eureka-part3/</guid><description>The EIC framework becomes a concrete prompt, tested cold on ChatGPT, Grok, and Gemini. The results reveal different creative signatures across models, the limits of prompts as specifications, and why autonomous agents can&amp;#39;t replace iterative human-LLM dialogue for genuine invention.</description><content:encoded><![CDATA[<p><em>In Part I, I showed that creative transfer depends on two variables: semantic distance ensures novelty, but granularity predicts applicability, and granularity is controlled through compression to a discrete level. In Part II, I introduced two missing operations, inversion and composition, and formalized them as the Extraction-Inversion-Composition framework (EIC). The model is complete. But does it work in practice?</em></p>
<hr>
<h2 id="the-calibrated-prompt">The Calibrated Prompt</h2>
<p>Here is the prompt I now use. It implements the three EIC operations directly. Rather than a heuristic, the prompt is a constraint system designed to force traversal of distant conceptual spaces and prevent regression toward known solutions. Each constraint maps to a specific failure mode observed in testing:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-0-1"><a class="lnlinks" href="#hl-0-1"> 1</a>
</span><span class="lnt" id="hl-0-2"><a class="lnlinks" href="#hl-0-2"> 2</a>
</span><span class="lnt" id="hl-0-3"><a class="lnlinks" href="#hl-0-3"> 3</a>
</span><span class="lnt" id="hl-0-4"><a class="lnlinks" href="#hl-0-4"> 4</a>
</span><span class="lnt" id="hl-0-5"><a class="lnlinks" href="#hl-0-5"> 5</a>
</span><span class="lnt" id="hl-0-6"><a class="lnlinks" href="#hl-0-6"> 6</a>
</span><span class="lnt" id="hl-0-7"><a class="lnlinks" href="#hl-0-7"> 7</a>
</span><span class="lnt" id="hl-0-8"><a class="lnlinks" href="#hl-0-8"> 8</a>
</span><span class="lnt" id="hl-0-9"><a class="lnlinks" href="#hl-0-9"> 9</a>
</span><span class="lnt" id="hl-0-10"><a class="lnlinks" href="#hl-0-10">10</a>
</span><span class="lnt" id="hl-0-11"><a class="lnlinks" href="#hl-0-11">11</a>
</span><span class="lnt" id="hl-0-12"><a class="lnlinks" href="#hl-0-12">12</a>
</span><span class="lnt" id="hl-0-13"><a class="lnlinks" href="#hl-0-13">13</a>
</span><span class="lnt" id="hl-0-14"><a class="lnlinks" href="#hl-0-14">14</a>
</span><span class="lnt" id="hl-0-15"><a class="lnlinks" href="#hl-0-15">15</a>
</span><span class="lnt" id="hl-0-16"><a class="lnlinks" href="#hl-0-16">16</a>
</span><span class="lnt" id="hl-0-17"><a class="lnlinks" href="#hl-0-17">17</a>
</span><span class="lnt" id="hl-0-18"><a class="lnlinks" href="#hl-0-18">18</a>
</span><span class="lnt" id="hl-0-19"><a class="lnlinks" href="#hl-0-19">19</a>
</span><span class="lnt" id="hl-0-20"><a class="lnlinks" href="#hl-0-20">20</a>
</span><span class="lnt" id="hl-0-21"><a class="lnlinks" href="#hl-0-21">21</a>
</span><span class="lnt" id="hl-0-22"><a class="lnlinks" href="#hl-0-22">22</a>
</span><span class="lnt" id="hl-0-23"><a class="lnlinks" href="#hl-0-23">23</a>
</span><span class="lnt" id="hl-0-24"><a class="lnlinks" href="#hl-0-24">24</a>
</span><span class="lnt" id="hl-0-25"><a class="lnlinks" href="#hl-0-25">25</a>
</span><span class="lnt" id="hl-0-26"><a class="lnlinks" href="#hl-0-26">26</a>
</span><span class="lnt" id="hl-0-27"><a class="lnlinks" href="#hl-0-27">27</a>
</span><span class="lnt" id="hl-0-28"><a class="lnlinks" href="#hl-0-28">28</a>
</span><span class="lnt" id="hl-0-29"><a class="lnlinks" href="#hl-0-29">29</a>
</span><span class="lnt" id="hl-0-30"><a class="lnlinks" href="#hl-0-30">30</a>
</span><span class="lnt" id="hl-0-31"><a class="lnlinks" href="#hl-0-31">31</a>
</span><span class="lnt" id="hl-0-32"><a class="lnlinks" href="#hl-0-32">32</a>
</span><span class="lnt" id="hl-0-33"><a class="lnlinks" href="#hl-0-33">33</a>
</span><span class="lnt" id="hl-0-34"><a class="lnlinks" href="#hl-0-34">34</a>
</span><span class="lnt" id="hl-0-35"><a class="lnlinks" href="#hl-0-35">35</a>
</span><span class="lnt" id="hl-0-36"><a class="lnlinks" href="#hl-0-36">36</a>
</span><span class="lnt" id="hl-0-37"><a class="lnlinks" href="#hl-0-37">37</a>
</span><span class="lnt" id="hl-0-38"><a class="lnlinks" href="#hl-0-38">38</a>
</span><span class="lnt" id="hl-0-39"><a class="lnlinks" href="#hl-0-39">39</a>
</span><span class="lnt" id="hl-0-40"><a class="lnlinks" href="#hl-0-40">40</a>
</span><span class="lnt" id="hl-0-41"><a class="lnlinks" href="#hl-0-41">41</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">For</span> <span class="n">the</span> <span class="n">following</span> <span class="n">problem</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="n">INSERT</span> <span class="n">PROBLEM</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Step</span> <span class="mi">1</span> <span class="err">—</span> <span class="n">Extraction</span>
</span></span><span class="line"><span class="cl"><span class="n">Name</span> <span class="mi">8</span><span class="o">-</span><span class="mi">10</span> <span class="n">specific</span><span class="p">,</span> <span class="n">concrete</span> <span class="n">domains</span> <span class="n">FAR</span> <span class="n">from</span> <span class="n">the</span> <span class="n">problem</span> <span class="n">domain</span><span class="o">.</span>
</span></span><span class="line"><span class="cl"><span class="n">Choose</span> <span class="n">your</span> <span class="n">own</span> <span class="n">domains</span> <span class="err">—</span> <span class="k">do</span> <span class="n">NOT</span> <span class="n">reuse</span> <span class="n">any</span> <span class="n">domain</span> <span class="n">mentioned</span>
</span></span><span class="line"><span class="cl"><span class="ow">in</span> <span class="n">this</span> <span class="n">prompt</span><span class="o">.</span> <span class="n">For</span> <span class="n">each</span> <span class="n">domain</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Name</span> <span class="n">the</span> <span class="n">domain</span> <span class="n">explicitly</span><span class="o">.</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Describe</span> <span class="n">ONE</span> <span class="n">specific</span> <span class="n">phenomenon</span> <span class="ow">in</span> <span class="mi">2</span><span class="o">-</span><span class="mi">3</span> <span class="n">sentences</span><span class="o">.</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Extract</span> <span class="n">the</span> <span class="n">causal</span> <span class="n">rule</span> <span class="ow">in</span> <span class="n">the</span> <span class="n">form</span>
</span></span><span class="line"><span class="cl">  <span class="p">[</span><span class="n">condition</span><span class="p">]</span> <span class="err">→</span> <span class="p">[</span><span class="n">mechanism</span><span class="p">]</span> <span class="err">→</span> <span class="p">[</span><span class="n">consequence</span><span class="p">]</span><span class="o">.</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Compress</span> <span class="n">until</span> <span class="n">no</span> <span class="n">domain</span><span class="o">-</span><span class="n">specific</span> <span class="n">vocabulary</span> <span class="n">remains</span><span class="o">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">TEST</span><span class="p">:</span> <span class="k">if</span> <span class="n">the</span> <span class="n">compressed</span> <span class="n">rule</span> <span class="n">reads</span> <span class="n">like</span> <span class="n">systems</span> <span class="n">theory</span><span class="p">,</span> <span class="n">control</span>
</span></span><span class="line"><span class="cl"><span class="n">theory</span><span class="p">,</span> <span class="ow">or</span> <span class="n">generic</span> <span class="n">organizational</span> <span class="n">advice</span><span class="p">,</span> <span class="n">you</span> <span class="n">haven</span><span class="s1">&#39;t gone far</span>
</span></span><span class="line"><span class="cl"><span class="n">enough</span><span class="o">.</span> <span class="n">Start</span> <span class="n">over</span> <span class="n">with</span> <span class="n">a</span> <span class="n">more</span> <span class="n">concrete</span> <span class="n">phenomenon</span><span class="o">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Step</span> <span class="mi">2</span> <span class="err">—</span> <span class="n">Inversion</span>
</span></span><span class="line"><span class="cl"><span class="n">For</span> <span class="n">each</span> <span class="n">rule</span><span class="p">,</span> <span class="n">identify</span> <span class="mi">2</span><span class="o">-</span><span class="mi">3</span> <span class="n">breakpoints</span> <span class="ow">in</span> <span class="n">the</span> <span class="n">causal</span> <span class="n">chain</span><span class="o">.</span>
</span></span><span class="line"><span class="cl"><span class="n">For</span> <span class="n">each</span> <span class="k">breakpoint</span><span class="p">,</span> <span class="n">describe</span> <span class="n">a</span> <span class="n">concrete</span> <span class="n">intervention</span> <span class="err">—</span> <span class="ow">not</span> <span class="n">the</span>
</span></span><span class="line"><span class="cl"><span class="n">negation</span> <span class="n">of</span> <span class="n">the</span> <span class="n">condition</span><span class="p">,</span> <span class="n">but</span> <span class="n">a</span> <span class="n">structurally</span> <span class="n">different</span> <span class="n">mechanism</span>
</span></span><span class="line"><span class="cl"><span class="n">that</span> <span class="n">disrupts</span> <span class="n">the</span> <span class="n">link</span><span class="o">.</span> <span class="n">If</span> <span class="n">your</span> <span class="n">inversion</span> <span class="n">is</span> <span class="n">simply</span> <span class="s2">&#34;do the</span>
</span></span><span class="line"><span class="cl"><span class="n">opposite</span><span class="p">,</span><span class="s2">&#34; it&#39;s not an inversion — find a different angle.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Step</span> <span class="mi">3</span> <span class="err">—</span> <span class="n">Composition</span>
</span></span><span class="line"><span class="cl"><span class="n">Propose</span> <span class="mi">3</span><span class="o">-</span><span class="mi">5</span> <span class="n">recipes</span> <span class="n">that</span> <span class="n">combine</span> <span class="n">inversions</span> <span class="n">from</span> <span class="n">DIFFERENT</span> <span class="n">rules</span>
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="n">each</span> <span class="n">recipe</span> <span class="n">must</span> <span class="n">use</span> <span class="n">at</span> <span class="n">least</span> <span class="n">two</span><span class="p">)</span><span class="o">.</span> <span class="n">For</span> <span class="n">each</span> <span class="n">recipe</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Name</span> <span class="n">it</span><span class="o">.</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Explain</span> <span class="n">how</span> <span class="n">the</span> <span class="n">inversions</span> <span class="n">interact</span> <span class="err">—</span> <span class="n">what</span> <span class="n">does</span> <span class="n">their</span>
</span></span><span class="line"><span class="cl">  <span class="n">combination</span> <span class="n">produce</span> <span class="n">that</span> <span class="n">neither</span> <span class="n">produces</span> <span class="n">alone</span><span class="err">?</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">A</span> <span class="n">strong</span> <span class="n">composition</span> <span class="n">does</span> <span class="ow">not</span> <span class="n">just</span> <span class="n">SOLVE</span> <span class="n">the</span> <span class="n">problem</span> <span class="n">better</span><span class="o">.</span>
</span></span><span class="line"><span class="cl">  <span class="n">It</span> <span class="n">REDEFINES</span> <span class="n">what</span> <span class="n">the</span> <span class="n">problem</span> <span class="n">is</span><span class="p">,</span> <span class="n">what</span> <span class="n">you</span> <span class="n">measure</span><span class="p">,</span> <span class="ow">or</span> <span class="n">what</span>
</span></span><span class="line"><span class="cl">  <span class="n">counts</span> <span class="n">as</span> <span class="n">success</span><span class="o">.</span> <span class="n">If</span> <span class="n">your</span> <span class="n">recipe</span> <span class="n">is</span> <span class="n">a</span> <span class="n">process</span> <span class="n">improvement</span>
</span></span><span class="line"><span class="cl">  <span class="ow">or</span> <span class="n">an</span> <span class="n">architecture</span><span class="p">,</span> <span class="n">push</span> <span class="n">further</span> <span class="err">—</span> <span class="n">what</span> <span class="n">does</span> <span class="n">it</span> <span class="n">reveal</span> <span class="n">about</span>
</span></span><span class="line"><span class="cl">  <span class="n">the</span> <span class="n">problem</span> <span class="n">itself</span> <span class="n">that</span> <span class="n">no</span> <span class="n">one</span> <span class="n">was</span> <span class="n">seeing</span><span class="err">?</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Describe</span> <span class="n">a</span> <span class="n">concrete</span> <span class="n">implementation</span> <span class="n">scenario</span> <span class="ow">in</span> <span class="mi">3</span><span class="o">-</span><span class="mi">4</span> <span class="n">sentences</span><span class="o">.</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Assess</span> <span class="n">its</span> <span class="n">transformative</span> <span class="n">strength</span><span class="o">.</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">List</span> <span class="n">the</span> <span class="n">constraints</span> <span class="n">it</span> <span class="n">exposes</span><span class="o">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Do</span> <span class="ow">not</span> <span class="n">filter</span> <span class="k">for</span> <span class="n">current</span> <span class="n">applicability</span><span class="o">.</span> <span class="n">Maximize</span> <span class="n">transformative</span>
</span></span><span class="line"><span class="cl"><span class="n">strength</span><span class="o">.</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Every constraint in this prompt maps to a lesson from the theory. The self-test on extraction prevents over-compression to the philosophical-principle level. The &ldquo;not the negation&rdquo; rule on inversions prevents mechanical breakpoints. The redefinition instruction on compositions forces the model past the architecture level into genuine reconceptualization. Remove any of these constraints and the output quality degrades measurably.</p>
<hr>
<h2 id="what-happened-when-i-tested-this">What Happened When I Tested This</h2>
<p>I gave this prompt cold to three different LLMs (ChatGPT, Grok, and Gemini), with no conversation, just the prompt and the technical debt problem. The results genuinely surprised me.</p>
<p>Both models produced legitimate creative output. The extraction worked: concrete domains (glassblowing, commercial beekeeping, bonsai cultivation, ice climbing, jazz band rehearsal), specific phenomena described in detail, compressed rules that were portable without reading like systems theory. The self-test constraint did its job: the models actually traversed distant domains instead of staying in abstract territory.</p>
<p>The inversions were also substantive. Rather than mechanical negations, they were structurally different interventions: &ldquo;hot-swap modular subsystems as quick-replace cartridges,&rdquo; &ldquo;timber sold as regrowth futures contracts that pay bonuses only after next-cycle viability is certified,&rdquo; &ldquo;exhibition tree leasing model where operators display but do not own the final specimen.&rdquo; These are genuinely inventive mechanisms.</p>
<p>The compositions reached the redefinition level. Both models produced statements that reconceptualize the problem rather than solving it incrementally. &ldquo;Progress is not continuous delivery. Progress is <em>the ability to survive interruption without degradation</em>.&rdquo; &ldquo;There is no such thing as technical debt repayment. There is only <em>continuous structural shaping</em>.&rdquo;</p>
<p>What interested me most, though, was that <strong>the two models produced qualitatively different results from the same prompt.</strong></p>
<p>ChatGPT&rsquo;s compositions were aphoristic and trenchant, tight redefinitions that read almost like proverbs. &ldquo;Failure is not an event. Failure is <em>a state the system is allowed to approach</em>.&rdquo; These are memorable and conceptually sharp.</p>
<p>Grok&rsquo;s compositions were richer in texture and more operational. Where ChatGPT redefined in a sentence, Grok invented <em>economic structures</em>: &ldquo;regrowth futures contracts,&rdquo; &ldquo;colony equity pools,&rdquo; &ldquo;maturity tokens that investors trade instead of bottled product.&rdquo; Grok&rsquo;s output was less tweetable but more implementable; you could see how to build each idea.</p>
<p>A third model, Gemini, pushed the extraction further still, into forensic taphonomy, dendrochronology, and ballistics, and produced what may be the most radical redefinition of all: the problem isn&rsquo;t technical debt, it&rsquo;s <em>premature solidification</em>. Debt is only debt if it&rsquo;s locked into the final structure. Keep the system in a fluid state until the last possible moment, and the concept of debt dissolves entirely. Where ChatGPT redefined in aphorisms and Grok in economic structures, Gemini redefined through physical-state metaphors: a third creative signature from a third training lineage.</p>
<p>With the same theory, prompt, and problem, I got three different creative profiles. The difference lies not in the quality of the output but in its <em>nature</em>, and that nature is a direct reflection of each model&rsquo;s training data and architecture. For any serious creative work, then, testing the same prompt across multiple models is essential rather than redundant, because each model will illuminate a different region of the solution space.</p>
<hr>
<h2 id="the-remaining-gap">The Remaining Gap</h2>
<p>The prompt produced results I&rsquo;d call genuinely creative. But there&rsquo;s a level it didn&rsquo;t reach on its own.</p>
<p>Earlier, through sustained iterative conversation, I produced a concept (reproductibility as the metric of code health) that emerged from a specific collision between two specific rules at a specific moment of dialogue. I had noticed that causal rules were diagnostics, said so, and the model pivoted. That pivot, and the insight it produced, didn&rsquo;t come from the prompt. It came from a human observing an intermediate result, naming what was wrong with it, and redirecting.</p>
<p>The prompt handles extraction and inversion reliably. It pushes composition to the redefinition level. But the highest-order insights, the ones that emerge from the friction between a human&rsquo;s situated judgment and a model&rsquo;s combinatorial power, still require iterative dialogue. The prompt is the instrument&rsquo;s score; the conversation is the performance.</p>
<p>This has implications beyond creative brainstorming. The current industry push toward autonomous AI agents rests on the assumption that if the specification is good enough, the agent can execute independently. A spec, however detailed, is a frozen prompt. It captures intent at a point in time. What it cannot capture is the judgment that happens <em>during</em> execution: the moment when a human looks at an intermediate result and says &ldquo;this is too abstract&rdquo; or &ldquo;you&rsquo;re recombining known patterns&rdquo; or &ldquo;go further.&rdquo; That judgment acts as a steering mechanism throughout, not as a quality check at the end.</p>
<p>This doesn&rsquo;t mean autonomous agents are useless. They are interpolation engines, excellent for well-defined, bounded tasks where the acceptable output space is known in advance. But for any task that requires genuinely novel output (creative problem-solving, architectural invention, strategic design), the human in the loop is the creative engine rather than a safety net, and the LLM is the fuel.</p>
<hr>
<h2 id="angine-de-poitrine-and-the-universality-test">Angine de Poitrine and the Universality Test</h2>
<p>I developed the EIC framework through IT problems: technical debt, organizational architecture, QA strategy. But a theory of creativity that only works in engineering isn&rsquo;t much of a theory. So I tested its limits against the most unlikely case I could find.</p>
<p>In April 2026, the masked math-rock duo Angine de Poitrine from Chicoutimi became the most viral act on Spotify worldwide. They play microtonal rock with polyrhythmic structures, wear papier-mâché masks, sing in an invented language, and describe themselves as a &ldquo;Mantra-Rock Dada Pythagorean-Cubist Orchestra.&rdquo; Their success is improbable by every industry metric, yet the model accounts for it.</p>
<p>Underneath their buzz lies a causal chain that no one has formalized. The music industry has been optimizing its output toward a statistical center for decades, through the formulas, timbres, and structures that maximize engagement. Generative AI accelerated this trend to a saturation point. As optimized content proliferates, the public loses its sense of human authenticity in what it hears. That erosion creates a need (not conscious, not articulated, but real) to reaffirm an identity distinct from the machine. And that need translates into a valorization of the improbable: the more something is manifestly non-optimizable, the more it functions as <em>proof of humanity</em>.</p>
<p>That&rsquo;s a causal chain: [optimization saturation → authenticity erosion → need for human identity → valorization of the improbable]. You can extract it, compress it, invert it at different links.</p>
<p>But the composition thesis is what Angine de Poitrine validates most clearly. None of their ingredients is new. Math-rock has existed since the 1990s. Microtonal music since Charles Ives. Stage masks since the Residents. Dada aesthetics since 1916. Repetitive loops since minimalism. What is new is the <em>recipe</em>: the specific combination of these elements, in this order, with this attitude, at this precise cultural moment. No critic could have predicted that these ingredients, assembled this way, would produce a global phenomenon. The invention lies in the assembly.</p>
<p>They also validate the fifth finding most powerfully of all. The duo never filtered their art to fit the existing industry constraints. They didn&rsquo;t ask whether instrumental microtonal rock sung in an invented language was &ldquo;commercially viable.&rdquo; By existing in authentically non-conforming fashion, they exposed that the industry had optimized humanity out of its own music. They succeeded <em>because of</em> their improbability, not despite it, and revealed the constraints of the system by refusing to submit to them.</p>
<hr>
<h2 id="limitations">Limitations</h2>
<p>The EIC framework has boundaries I want to be explicit about.</p>
<p>The quality of extraction depends entirely on whether the model actually traverses distant domains or takes the path of least statistical resistance. The prompt constraints help, but they don&rsquo;t guarantee it, and different models respond differently to the same constraints. There is no automatic way to verify that a compressed rule is genuinely novel rather than systems theory in disguise. That verification still requires human judgment.</p>
<p>Evaluating composition quality is harder still. I can recognize that &ldquo;reproductibility as the metric of code health&rdquo; is a redefinition rather than a process improvement. But I can&rsquo;t formalize <em>why</em> I recognize it, which means I can&rsquo;t automate the evaluation. Any benchmark built on this framework will require human evaluators, with all the subjectivity that implies.</p>
<p>The framework is strongest in domains with identifiable causal structures, such as engineering, organizational design, strategy, and medicine. I tested it against a cultural phenomenon (Angine de Poitrine) and the model held, but the causal structure there is in the system surrounding the artifact, not in the artifact itself. For domains where causality is less clear (pure art, fundamental research, philosophy), the framework may not apply, or may apply only partially.</p>
<p>Finally, the iterative conversation still produces results that the autonomous prompt does not. I&rsquo;ve been honest about this throughout the article, but it bears repeating as a limitation: the EIC framework as a prompt is a useful instrument, but it is not a replacement for sustained human-LLM dialogue.</p>
<hr>
<h2 id="then-and-now">Then and Now</h2>
<p>For a long time I thought creativity lived primarily in the metaphorical transfer, the initial connection between distant domains. LLMs gave me an experimental instrument I didn&rsquo;t have before. By automating extraction at scale, they made visible what was hidden: transfer is preparatory. The real creative work happens in the composition.</p>
<p>One last thought. Beyond brainstorming, the prompt in this article can serve as a <em>measurement instrument</em>. Apply the same prompt to the same problem on different models and compare the results along three axes: depth of extraction, originality of inversions, and level of redefinition in compositions. My tests showed that different models produce qualitatively different creative profiles from identical inputs, and those differences are themselves interesting data. If researchers want to formalize a benchmark for computationally-assisted creativity, the EIC framework is designed to serve as a starting point.</p>
<p>The most powerful ideas are not the ones that adapt neatly to our current world, but the ones that make us willing to change it. Now I know what to look for.</p>
<p>But one question wouldn&rsquo;t leave me alone. The EIC framework works forward, from problem to solution. But if causal rules are truly portable across domains, the framework should work in the other direction too. What happens when you start from a solution instead of a problem? That&rsquo;s Part IV.</p>
<hr>
<p><em>Gabriel Mailhot is a Senior Subject Matter Expert at Desjardins, where he works on development practices, architecture, and complex organizational problems spanning technology, process, and governance. His 2003–2010 research focused on creative systems and metaphor-based retrieval. He publishes at scripting.pro.</em></p>
]]></content:encoded></item><item><title>The Anatomy of a Eureka, Part IV: When Solutions Become Probes</title><link>https://scripting.pro/posts/eureka-part4/</link><pubDate>Fri, 17 Apr 2026 10:00:00 -0400</pubDate><guid>https://scripting.pro/posts/eureka-part4/</guid><description>The EIC framework can be reversed into DIS (Decomposition, Isomorphic Search, Solution Import): decompose a known solution into its causal rule, find domains with the same structural constraint, and import their accumulated expertise. Together, EIC-DIS forms a bidirectional instrument for exploring structural isomorphisms across human knowledge.</description><content:encoded><![CDATA[<h1 id="the-anatomy-of-a-eureka-part-iv-when-solutions-become-probes">The Anatomy of a Eureka, Part IV: When Solutions Become Probes</h1>
<p><em>In the first three parts of this series, I built the Extraction-Inversion-Composition framework (EIC) as a forward instrument: start from a problem, extract causal rules from distant domains, invert them, compose them into novel solutions. But a question kept nagging at me. If causal rules are portable across domains in one direction, they should be portable in the other direction too. What happens when you run the framework backwards?</em></p>
<hr>
<h2 id="the-question-no-one-asks">The Question No One Asks</h2>
<p>When we find a good solution to a problem, we typically do one of two things: we apply it, or we generalize it into a &ldquo;best practice.&rdquo; Both of these treat the solution as an <em>endpoint</em>.</p>
<p>But a solution is also an <em>artifact</em>. It has structure. It was built to break a specific causal chain. And if you can decompose it back into the causal rule it breaks, you have something much more powerful than a best practice: a <em>probe</em> that can search for every other domain in the world that suffers from the same structural constraint.</p>
<p>The forward EIC asks: &ldquo;What distant domains can help me solve this problem?&rdquo;</p>
<p>The reverse operation asks: &ldquo;Where else does this exact problem exist, and what have those domains already figured out that I haven&rsquo;t?&rdquo;</p>
<p>These are different questions, and the distinction is easy to miss. The forward EIC starts from an <em>empty problem</em> and searches for material to fill it. The reverse starts from a <em>full solution</em> and searches for what the rest of the world already knows about the same structural constraint. The forward EIC is invention. The reverse is recognition: the discovery that the pattern you&rsquo;re struggling with has already been solved, possibly many times, in domains you&rsquo;ve never looked at. The second question may well be the more valuable of the two.</p>
<hr>
<h2 id="how-it-works">How It Works</h2>
<p>The reverse operation has three steps, mirroring the forward EIC but running in the opposite direction. I&rsquo;ll call it the <strong>Decomposition-Isomorphic Search-Solution Import framework</strong>, or <strong>DIS</strong> for short. Together, the forward and reverse operations form the <strong>EIC-DIS</strong> cycle.</p>
<p><strong>Decomposition.</strong> Take a known, working solution. Strip away all domain-specific vocabulary. Identify the causal chain it was designed to break and the specific link where it intervenes. Compress it to a bare structural rule, at the same compression level as the forward EIC&rsquo;s extraction.</p>
<p><strong>Isomorphic Search.</strong> Using the compressed rule as a search key, find domains that suffer from the <em>same</em> structural constraint. Domains that merely look &ldquo;similar&rdquo; won&rsquo;t do; you want domains where the identical causal mechanism is at work, manifested in different material.</p>
<p><strong>Solution Import.</strong> Examine how each isomorphic domain has addressed the constraint. Import the mechanisms that your domain hasn&rsquo;t tried. Each domain has invested years, decades, sometimes centuries into refining its response to that constraint. That accumulated expertise is available to you, even though it isn&rsquo;t written in your vocabulary.</p>
<hr>
<h2 id="the-demonstration">The Demonstration</h2>
<p>Let me work through this concretely, starting from one of the solutions in Part I.</p>
<p><strong>Known solution: mandatory decompression stops in scuba diving, applied to technical debt.</strong></p>
<p>The idea was to treat debt accumulation under deadline pressure as a physical law and insert non-negotiable decompression windows whose duration is calculated, not negotiated.</p>
<p><strong>Step 1: Decomposition.</strong> What causal chain does this solution break?</p>
<p>The chain: a system under continuous pressure accumulates an invisible substance. If pressure is released too quickly, the accumulated substance changes state and causes damage. The solution intervenes at the release point, forcing a controlled, staged release instead of an abrupt one.</p>
<p>Compressed: [continuous pressure → invisible accumulation → damage upon rapid release]. The solution: staged decompression.</p>
<p><strong>Step 2: Isomorphic search.</strong> What other domains suffer from exactly this constraint?</p>
<p><em>Psychology: burnout and the vacation crash.</em> Professionals under sustained work pressure accumulate stress hormones, sleep debt, and emotional depletion. When they finally stop (vacation, sabbatical, layoff), they don&rsquo;t recover. They crash, with headaches, illness, collapse. The &ldquo;release&rdquo; triggers the damage. The accumulation was invisible because the person was still functional.</p>
<p><em>Metallurgy: work hardening and annealing.</em> Metal that has been cold-worked (bent, hammered, drawn) accumulates internal stress in its crystal lattice. The metal becomes harder but also more brittle. If you keep working it without relief, it eventually cracks. The solution is annealing, which means heating the metal to a specific temperature for a calculated duration, then cooling it slowly. This allows the crystal lattice to reorganize and release accumulated stress without cracking.</p>
<p><em>Finance: leveraged positions.</em> A fund accumulates leveraged exposure under bullish market pressure. The positions look healthy; returns are strong and margin requirements are met. But the invisible accumulation is risk. When the market reverses (the &ldquo;release&rdquo;), the accumulated leverage unwinds catastrophically. The solution is hedging, which transfers a portion of the accumulated risk to an external instrument continuously rather than waiting for the release event.</p>
<p><em>Agriculture: soil compaction.</em> Heavy machinery crossing the same field repeatedly under seasonal pressure compacts the subsoil. Crop yields decline gradually. The standard response, deeper plowing, makes it worse because it destroys soil structure. The solution used by regenerative agriculture: cover cropping and controlled root penetration. Living roots break up compaction slowly from within, without violent disruption.</p>
<p><strong>Step 3: Solution import.</strong> Each of these domains has developed a response to the same structural constraint, but each response relies on a different <em>mechanism</em>:</p>
<p><em>Decompression stops</em> (diving): staged release at calculated intervals.</p>
<p><em>Annealing</em> (metallurgy): controlled thermal cycling that reorganizes internal structure without breaking it. It is a transformation rather than a pause.</p>
<p><em>Hedging</em> (finance): continuous transfer of accumulated risk to an external absorber. There is no release event at all, only constant siphoning.</p>
<p><em>Root penetration</em> (agriculture): slow, distributed disruption from within. There is no external intervention; the system heals itself through deliberately introduced internal agents.</p>
<p>Now ask: which of these mechanisms exists in IT debt management? Decompression stops do; that was our Part I idea. Annealing does not. What would it mean to &ldquo;thermally cycle&rdquo; a codebase? Perhaps: periodically subjecting the system to controlled stress-and-recovery cycles, not to test it (that&rsquo;s stress testing), but to allow its internal structure to <em>reorganize</em>. Teams revisit code under deliberately altered constraints (different performance requirements, different scale assumptions), and the code restructures itself as a consequence of the altered conditions. The result is less refactored code than annealed code, whose internal stresses have been released through structural reorganization.</p>
<p>Hedging exists, but only partially. Feature flags and blue-green deployments transfer <em>deployment</em> risk. But no one transfers <em>debt</em> risk to an external absorber. What would an &ldquo;external debt absorber&rdquo; look like? Perhaps a parallel, disposable environment that deliberately accumulates all the shortcuts and hacks, absorbing the debt the main system would otherwise carry, and is periodically discarded and rebuilt. The main codebase never accumulates because the &ldquo;hedge&rdquo; absorbs on its behalf.</p>
<p>Root penetration is absent. Regenerative agriculture doesn&rsquo;t fix soil from the outside. It introduces living agents (roots, fungi, bacteria) that fix it from the inside, slowly, as a byproduct of their own growth. What would &ldquo;cover cropping&rdquo; mean for a codebase? Perhaps: introducing small, independent, well-designed modules into a legacy system not to replace it but to <em>grow through it</em>. Their presence would gradually break up the compacted, tangled structure around them, simply by being better neighbors.</p>
<p>That makes three new ideas, none of which came from the forward EIC. They came from domains that have spent decades or centuries refining their response to the same structural constraint. I didn&rsquo;t invent them; I imported accumulated expertise.</p>
<hr>
<h2 id="why-this-works-the-finite-constraint-hypothesis">Why This Works: The Finite Constraint Hypothesis</h2>
<p>This reverse operation rests on an assumption that deserves to be stated explicitly: <strong>the set of structural constraints in the world is finite.</strong></p>
<p>The idea is not new. Others have arrived at it from different directions.</p>
<p>Genrich Altshuller, a Soviet engineer, analyzed over 200,000 patents between the 1940s and 1980s and concluded that all inventions resolve one of a finite set of contradictions using one of 40 fundamental principles. His system, TRIZ, demonstrated empirically that the solution space is bounded and recurrent: the same structural conflicts appear across electrical engineering, mechanical design, chemistry, and biology.</p>
<p>Ludwig von Bertalanffy&rsquo;s General Systems Theory (1968) argued that isomorphic laws govern systems across all domains. The same equations describe bacterial growth and technology adoption, and the same feedback patterns appear in ecology and economics.</p>
<p>D&rsquo;Arcy Thompson showed in <em>On Growth and Form</em> (1917) that biological structures follow a finite set of physical and mathematical principles. A bone, a bridge, and a tree branch solve the same structural problem because they are subject to the same physics.</p>
<p>The Santa Fe Institute&rsquo;s work on complexity science has documented the same power laws, phase transitions, and emergent patterns across physics, biology, and economics, which suggests that the deep structure of complex systems is drawn from a shared, finite repertoire.</p>
<p>What the EIC framework adds to this lineage is specific and, I believe, new. TRIZ catalogues <em>solutions</em>: 40 inventive principles at the answer level. The EIC framework operates at the <em>constraint</em> level, on the causal rule before any solution is attempted. This is more fundamental, because a single constraint generates multiple solution families (as we just saw with decompression, annealing, hedging, and root penetration, four different solutions to the same constraint).</p>
<p>TRIZ is also a <em>closed catalogue</em>, something you consult. DIS is an <em>open instrument</em> that you use to discover isomorphisms that may not yet be catalogued. Each application potentially reveals a structural constraint that no one has formally identified before.</p>
<p>The finite constraint hypothesis doesn&rsquo;t require proof from first principles. It follows from a simpler observation: the physical laws governing our universe are finite. Chemistry emerges from physics. Biology emerges from chemistry. Social and organizational systems emerge from biology. New phenomena appear at each level, but the <em>structural patterns of constraint</em> recycle, because they are downstream consequences of the same finite set of laws. Accumulation under pressure, competitive exclusion, phase transitions, feedback loops and threshold effects aren&rsquo;t metaphors. They are the same physics, wearing different costumes.</p>
<p>If this is true, then DIS is more than an exploration tool: it is a systematic search in a bounded space. The implication is that for any unsolved problem in your domain, a solution probably already exists in another domain. It isn&rsquo;t formulated in your vocabulary or published in your journals, but it exists, and DIS is the instrument to locate it.</p>
<hr>
<h2 id="the-dis-prompt">The DIS Prompt</h2>
<p>One important difference with the forward EIC: the input is a <em>practice</em>, not a problem.</p>
<p>The EIC prompt takes a problem described factually: &ldquo;How can we prevent technical debt in projects with fixed dates and budgets?&rdquo; The LLM finds solutions. The DIS prompt takes a working practice described factually: what it is, what it does, why it exists. The LLM finds the structural mechanism it was built to break.</p>
<p>The trap to avoid: don&rsquo;t explain <em>why</em> the practice works structurally. If you write &ldquo;code review works because it creates cognitive redundancy,&rdquo; you&rsquo;ve done the decomposition yourself and the LLM will just reformulate it. Describe the <em>what</em> and the <em>what for</em>. Let the LLM discover the <em>structural how</em>.</p>
<p>Here is the prompt that implements the DIS operation. Like the EIC prompt in Part III, it is a constraint system. Each guardrail maps to a failure mode observed in EIC testing that applies equally to the reverse operation:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-0-1"><a class="lnlinks" href="#hl-0-1"> 1</a>
</span><span class="lnt" id="hl-0-2"><a class="lnlinks" href="#hl-0-2"> 2</a>
</span><span class="lnt" id="hl-0-3"><a class="lnlinks" href="#hl-0-3"> 3</a>
</span><span class="lnt" id="hl-0-4"><a class="lnlinks" href="#hl-0-4"> 4</a>
</span><span class="lnt" id="hl-0-5"><a class="lnlinks" href="#hl-0-5"> 5</a>
</span><span class="lnt" id="hl-0-6"><a class="lnlinks" href="#hl-0-6"> 6</a>
</span><span class="lnt" id="hl-0-7"><a class="lnlinks" href="#hl-0-7"> 7</a>
</span><span class="lnt" id="hl-0-8"><a class="lnlinks" href="#hl-0-8"> 8</a>
</span><span class="lnt" id="hl-0-9"><a class="lnlinks" href="#hl-0-9"> 9</a>
</span><span class="lnt" id="hl-0-10"><a class="lnlinks" href="#hl-0-10">10</a>
</span><span class="lnt" id="hl-0-11"><a class="lnlinks" href="#hl-0-11">11</a>
</span><span class="lnt" id="hl-0-12"><a class="lnlinks" href="#hl-0-12">12</a>
</span><span class="lnt" id="hl-0-13"><a class="lnlinks" href="#hl-0-13">13</a>
</span><span class="lnt" id="hl-0-14"><a class="lnlinks" href="#hl-0-14">14</a>
</span><span class="lnt" id="hl-0-15"><a class="lnlinks" href="#hl-0-15">15</a>
</span><span class="lnt" id="hl-0-16"><a class="lnlinks" href="#hl-0-16">16</a>
</span><span class="lnt" id="hl-0-17"><a class="lnlinks" href="#hl-0-17">17</a>
</span><span class="lnt" id="hl-0-18"><a class="lnlinks" href="#hl-0-18">18</a>
</span><span class="lnt" id="hl-0-19"><a class="lnlinks" href="#hl-0-19">19</a>
</span><span class="lnt" id="hl-0-20"><a class="lnlinks" href="#hl-0-20">20</a>
</span><span class="lnt" id="hl-0-21"><a class="lnlinks" href="#hl-0-21">21</a>
</span><span class="lnt" id="hl-0-22"><a class="lnlinks" href="#hl-0-22">22</a>
</span><span class="lnt" id="hl-0-23"><a class="lnlinks" href="#hl-0-23">23</a>
</span><span class="lnt" id="hl-0-24"><a class="lnlinks" href="#hl-0-24">24</a>
</span><span class="lnt" id="hl-0-25"><a class="lnlinks" href="#hl-0-25">25</a>
</span><span class="lnt" id="hl-0-26"><a class="lnlinks" href="#hl-0-26">26</a>
</span><span class="lnt" id="hl-0-27"><a class="lnlinks" href="#hl-0-27">27</a>
</span><span class="lnt" id="hl-0-28"><a class="lnlinks" href="#hl-0-28">28</a>
</span><span class="lnt" id="hl-0-29"><a class="lnlinks" href="#hl-0-29">29</a>
</span><span class="lnt" id="hl-0-30"><a class="lnlinks" href="#hl-0-30">30</a>
</span><span class="lnt" id="hl-0-31"><a class="lnlinks" href="#hl-0-31">31</a>
</span><span class="lnt" id="hl-0-32"><a class="lnlinks" href="#hl-0-32">32</a>
</span><span class="lnt" id="hl-0-33"><a class="lnlinks" href="#hl-0-33">33</a>
</span><span class="lnt" id="hl-0-34"><a class="lnlinks" href="#hl-0-34">34</a>
</span><span class="lnt" id="hl-0-35"><a class="lnlinks" href="#hl-0-35">35</a>
</span><span class="lnt" id="hl-0-36"><a class="lnlinks" href="#hl-0-36">36</a>
</span><span class="lnt" id="hl-0-37"><a class="lnlinks" href="#hl-0-37">37</a>
</span><span class="lnt" id="hl-0-38"><a class="lnlinks" href="#hl-0-38">38</a>
</span><span class="lnt" id="hl-0-39"><a class="lnlinks" href="#hl-0-39">39</a>
</span><span class="lnt" id="hl-0-40"><a class="lnlinks" href="#hl-0-40">40</a>
</span><span class="lnt" id="hl-0-41"><a class="lnlinks" href="#hl-0-41">41</a>
</span><span class="lnt" id="hl-0-42"><a class="lnlinks" href="#hl-0-42">42</a>
</span><span class="lnt" id="hl-0-43"><a class="lnlinks" href="#hl-0-43">43</a>
</span><span class="lnt" id="hl-0-44"><a class="lnlinks" href="#hl-0-44">44</a>
</span><span class="lnt" id="hl-0-45"><a class="lnlinks" href="#hl-0-45">45</a>
</span><span class="lnt" id="hl-0-46"><a class="lnlinks" href="#hl-0-46">46</a>
</span><span class="lnt" id="hl-0-47"><a class="lnlinks" href="#hl-0-47">47</a>
</span><span class="lnt" id="hl-0-48"><a class="lnlinks" href="#hl-0-48">48</a>
</span><span class="lnt" id="hl-0-49"><a class="lnlinks" href="#hl-0-49">49</a>
</span><span class="lnt" id="hl-0-50"><a class="lnlinks" href="#hl-0-50">50</a>
</span><span class="lnt" id="hl-0-51"><a class="lnlinks" href="#hl-0-51">51</a>
</span><span class="lnt" id="hl-0-52"><a class="lnlinks" href="#hl-0-52">52</a>
</span><span class="lnt" id="hl-0-53"><a class="lnlinks" href="#hl-0-53">53</a>
</span><span class="lnt" id="hl-0-54"><a class="lnlinks" href="#hl-0-54">54</a>
</span><span class="lnt" id="hl-0-55"><a class="lnlinks" href="#hl-0-55">55</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">Starting</span> <span class="n">from</span> <span class="n">the</span> <span class="n">following</span> <span class="n">known</span> <span class="n">practice</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="n">DESCRIBE</span> <span class="n">THE</span> <span class="n">PRACTICE</span><span class="p">:</span> <span class="n">what</span> <span class="n">it</span> <span class="n">is</span><span class="p">,</span> <span class="n">what</span> <span class="n">it</span> <span class="n">does</span><span class="p">,</span> <span class="n">why</span> <span class="n">it</span> <span class="n">exists</span><span class="o">.</span>
</span></span><span class="line"><span class="cl"><span class="n">Do</span> <span class="n">NOT</span> <span class="n">explain</span> <span class="n">why</span> <span class="n">it</span> <span class="n">works</span> <span class="n">structurally</span> <span class="err">—</span> <span class="n">that</span><span class="s1">&#39;s what the</span>
</span></span><span class="line"><span class="cl"><span class="n">decomposition</span> <span class="n">will</span> <span class="n">discover</span><span class="o">.</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Step</span> <span class="mi">1</span> <span class="err">—</span> <span class="n">Decomposition</span>
</span></span><span class="line"><span class="cl"><span class="n">Identify</span> <span class="n">the</span> <span class="n">causal</span> <span class="n">chain</span> <span class="n">this</span> <span class="n">solution</span> <span class="n">was</span> <span class="n">designed</span> <span class="n">to</span> <span class="k">break</span><span class="o">.</span>
</span></span><span class="line"><span class="cl"><span class="n">Express</span> <span class="n">it</span> <span class="n">as</span> <span class="p">[</span><span class="n">condition</span><span class="p">]</span> <span class="err">→</span> <span class="p">[</span><span class="n">mechanism</span><span class="p">]</span> <span class="err">→</span> <span class="p">[</span><span class="n">consequence</span><span class="p">]</span><span class="o">.</span>
</span></span><span class="line"><span class="cl"><span class="n">Identify</span> <span class="n">the</span> <span class="n">specific</span> <span class="n">link</span> <span class="ow">in</span> <span class="n">the</span> <span class="n">chain</span> <span class="n">where</span> <span class="n">the</span> <span class="n">solution</span>
</span></span><span class="line"><span class="cl"><span class="n">intervenes</span><span class="o">.</span> <span class="n">Compress</span> <span class="n">until</span> <span class="n">no</span> <span class="n">domain</span><span class="o">-</span><span class="n">specific</span> <span class="n">vocabulary</span> <span class="n">remains</span><span class="o">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">TEST</span><span class="p">:</span> <span class="k">if</span> <span class="n">the</span> <span class="n">compressed</span> <span class="n">rule</span> <span class="n">could</span> <span class="n">describe</span> <span class="n">dozens</span> <span class="n">of</span> <span class="n">unrelated</span>
</span></span><span class="line"><span class="cl"><span class="n">problems</span> <span class="p">(</span><span class="s2">&#34;managing risk under pressure,&#34;</span> <span class="s2">&#34;balancing competing</span>
</span></span><span class="line"><span class="cl"><span class="n">demands</span><span class="s2">&#34;), you haven&#39;t found the structural rule — you&#39;ve found</span>
</span></span><span class="line"><span class="cl"><span class="n">a</span> <span class="n">platitude</span><span class="o">.</span> <span class="n">Compress</span> <span class="n">to</span> <span class="n">the</span> <span class="n">specific</span> <span class="n">causal</span> <span class="n">mechanism</span><span class="p">,</span> <span class="ow">not</span> <span class="n">the</span>
</span></span><span class="line"><span class="cl"><span class="n">general</span> <span class="n">category</span><span class="o">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Step</span> <span class="mi">2</span> <span class="err">—</span> <span class="n">Isomorphic</span> <span class="n">Search</span>
</span></span><span class="line"><span class="cl"><span class="n">Find</span> <span class="mi">6</span><span class="o">-</span><span class="mi">8</span> <span class="n">domains</span> <span class="n">FAR</span> <span class="n">from</span> <span class="n">the</span> <span class="n">original</span> <span class="n">domain</span> <span class="n">that</span> <span class="n">suffer</span>
</span></span><span class="line"><span class="cl"><span class="n">from</span> <span class="n">the</span> <span class="n">SAME</span> <span class="n">compressed</span> <span class="n">causal</span> <span class="n">constraint</span><span class="o">.</span>
</span></span><span class="line"><span class="cl"><span class="n">For</span> <span class="n">each</span> <span class="n">domain</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Name</span> <span class="n">it</span> <span class="n">explicitly</span><span class="o">.</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Describe</span> <span class="n">how</span> <span class="n">the</span> <span class="n">constraint</span> <span class="n">manifests</span> <span class="ow">in</span> <span class="n">that</span> <span class="n">domain</span>
</span></span><span class="line"><span class="cl">  <span class="ow">in</span> <span class="mi">2</span><span class="o">-</span><span class="mi">3</span> <span class="n">sentences</span><span class="o">.</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Describe</span> <span class="n">the</span> <span class="n">solution</span> <span class="n">that</span> <span class="n">domain</span> <span class="n">has</span> <span class="n">developed</span><span class="p">,</span> <span class="k">if</span> <span class="n">any</span><span class="o">.</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">If</span> <span class="n">the</span> <span class="n">domain</span> <span class="n">has</span> <span class="n">NO</span> <span class="n">known</span> <span class="n">solution</span><span class="p">,</span> <span class="n">say</span> <span class="n">so</span> <span class="err">—</span> <span class="n">that</span> <span class="n">itself</span>
</span></span><span class="line"><span class="cl">  <span class="n">is</span> <span class="n">interesting</span> <span class="n">data</span><span class="o">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">TEST</span><span class="p">:</span> <span class="k">if</span> <span class="n">the</span> <span class="n">domains</span> <span class="n">you</span> <span class="n">find</span> <span class="n">are</span> <span class="n">all</span> <span class="s2">&#34;obvious&#34;</span> <span class="n">analogues</span>
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">g</span><span class="o">.</span> <span class="n">other</span> <span class="n">engineering</span> <span class="n">disciplines</span> <span class="k">for</span> <span class="n">an</span> <span class="n">engineering</span> <span class="n">problem</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="n">you</span> <span class="n">haven</span><span class="s1">&#39;t gone far enough. Push into domains where the</span>
</span></span><span class="line"><span class="cl"><span class="n">practitioners</span> <span class="n">would</span> <span class="n">never</span> <span class="n">describe</span> <span class="n">their</span> <span class="n">work</span> <span class="n">using</span> <span class="n">any</span>
</span></span><span class="line"><span class="cl"><span class="n">vocabulary</span> <span class="n">from</span> <span class="n">the</span> <span class="n">original</span> <span class="n">domain</span><span class="o">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Step</span> <span class="mi">3</span> <span class="err">—</span> <span class="n">Solution</span> <span class="n">Import</span>
</span></span><span class="line"><span class="cl"><span class="n">For</span> <span class="n">each</span> <span class="n">domain</span> <span class="n">that</span> <span class="n">has</span> <span class="n">a</span> <span class="n">developed</span> <span class="n">solution</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Extract</span> <span class="n">the</span> <span class="n">MECHANISM</span> <span class="err">—</span> <span class="n">HOW</span> <span class="n">does</span> <span class="n">it</span> <span class="k">break</span> <span class="n">the</span> <span class="n">chain</span><span class="err">?</span>
</span></span><span class="line"><span class="cl">  <span class="n">At</span> <span class="n">which</span> <span class="n">link</span><span class="err">?</span> <span class="n">Through</span> <span class="n">what</span> <span class="n">structural</span> <span class="n">operation</span><span class="err">?</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Assess</span> <span class="n">whether</span> <span class="n">that</span> <span class="n">mechanism</span> <span class="n">exists</span> <span class="ow">in</span> <span class="n">the</span> <span class="n">original</span> <span class="n">domain</span><span class="o">.</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">If</span> <span class="n">it</span> <span class="n">doesn</span><span class="s1">&#39;t, describe concretely what it would look like</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="n">imported</span><span class="o">.</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">If</span> <span class="n">it</span> <span class="n">does</span> <span class="n">exist</span> <span class="n">partially</span><span class="p">,</span> <span class="n">describe</span> <span class="n">what</span><span class="s1">&#39;s missing.</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Explain</span> <span class="n">what</span> <span class="n">this</span> <span class="n">imported</span> <span class="n">mechanism</span> <span class="n">REVEALS</span> <span class="n">about</span> <span class="n">the</span>
</span></span><span class="line"><span class="cl">  <span class="n">original</span> <span class="n">problem</span> <span class="n">that</span> <span class="n">wasn</span><span class="s1">&#39;t visible before. A strong import</span>
</span></span><span class="line"><span class="cl">  <span class="n">doesn</span><span class="s1">&#39;t just add a tool — it changes what the problem IS.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">TEST</span><span class="p">:</span> <span class="k">if</span> <span class="n">all</span> <span class="n">imported</span> <span class="n">mechanisms</span> <span class="n">are</span> <span class="n">variations</span> <span class="n">of</span> <span class="n">the</span> <span class="n">same</span>
</span></span><span class="line"><span class="cl"><span class="n">type</span> <span class="n">of</span> <span class="n">intervention</span> <span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">g</span><span class="o">.</span> <span class="n">all</span> <span class="n">are</span> <span class="s2">&#34;add monitoring&#34;</span> <span class="ow">or</span> <span class="n">all</span>
</span></span><span class="line"><span class="cl"><span class="n">are</span> <span class="s2">&#34;insert pauses&#34;</span><span class="p">),</span> <span class="n">you</span> <span class="n">haven</span><span class="s1">&#39;t found structurally different</span>
</span></span><span class="line"><span class="cl"><span class="n">solutions</span><span class="o">.</span> <span class="n">Push</span> <span class="k">for</span> <span class="n">diversity</span> <span class="n">of</span> <span class="n">mechanism</span> <span class="n">type</span> <span class="err">—</span> <span class="n">the</span> <span class="n">value</span> <span class="n">is</span>
</span></span><span class="line"><span class="cl"><span class="ow">in</span> <span class="n">finding</span> <span class="n">responses</span> <span class="n">that</span> <span class="k">break</span> <span class="n">the</span> <span class="n">chain</span> <span class="n">at</span> <span class="n">DIFFERENT</span> <span class="n">links</span>
</span></span><span class="line"><span class="cl"><span class="n">through</span> <span class="n">DIFFERENT</span> <span class="n">structural</span> <span class="n">operations</span><span class="o">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Do</span> <span class="ow">not</span> <span class="n">filter</span> <span class="k">for</span> <span class="n">applicability</span><span class="o">.</span> <span class="n">Maximize</span> <span class="n">the</span> <span class="n">diversity</span> <span class="n">of</span>
</span></span><span class="line"><span class="cl"><span class="n">imported</span> <span class="n">mechanisms</span> <span class="ow">and</span> <span class="n">the</span> <span class="n">depth</span> <span class="n">of</span> <span class="n">what</span> <span class="n">they</span> <span class="n">reveal</span><span class="o">.</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="what-the-dis-prompt-produced">What the DIS Prompt Produced</h2>
<p>I tested the DIS prompt on a single, universally known practice, code review, using three LLMs (ChatGPT, Grok, and Gemini) cold, with no conversation. The practice was described factually: what it is, what it does, why it exists. No structural explanation was provided.</p>
<p>All three models successfully decomposed code review to its causal rule. The formulations varied but converged on the same structure: a single actor&rsquo;s unexamined mental model creates blind spots that propagate into the shared system. The solution intervenes by inserting independent perspective before integration. Clean decompositions, all passing the self-test.</p>
<p>The isomorphic searches produced genuinely distant domains: thymic selection in immunology, pheromone decay in ant colonies, the two-person rule in nuclear deterrence, seed variety trials in agriculture, the toile in bespoke tailoring, preview performances in theater. None of these are &ldquo;obvious&rdquo; analogues to software engineering. The DIS prompt forced real traversal.</p>
<p>The most striking results, though, were in the solution imports, and this is where the three models diverged.</p>
<p><strong>Gemini</strong> produced the most visceral redefinitions. From immunology: &ldquo;Code review isn&rsquo;t about adding features safely; it&rsquo;s an <em>immune response</em> designed to protect the self of the system.&rdquo; From ant pheromone decay: &ldquo;Silence is a signal. We treat &rsquo;no one has looked at this&rsquo; as &lsquo;it&rsquo;s waiting.&rsquo; In nature, it means &rsquo;this path is a dead end; let it die.&rsquo;&rdquo; From art restoration: &ldquo;The danger isn&rsquo;t the change; it&rsquo;s the <em>permanence</em>.&rdquo; Each revelation redefines in a single sentence what code review <em>is</em>.</p>
<p><strong>Grok</strong> produced the most systemic analyses. From academic publishing: &ldquo;The problem is epistemic capture — one developer&rsquo;s mental model dominating shared reality.&rdquo; From Wikipedia: &ldquo;Design the system so bad merges are cheap to detect and fix — make the artifact antifragile to imperfect additions.&rdquo; From theater: &ldquo;Reading code is a weak proxy for experiencing the system.&rdquo; Each revelation redefines the <em>system around</em> code review, the ecosystem rather than the practice.</p>
<p><strong>ChatGPT</strong> produced the most architectural output, including something neither of the other two generated: a classification table mapping seven distinct interception mechanisms to seven different points in the causal chain. Code review is just one of seven, positioned at one point. And the final redefinition was the most strategically useful: &ldquo;The problem is no longer &lsquo;how do we improve code review?&rsquo; It becomes: <em>at which point in the causal chain do we want to intercept inconsistency — and are we over-invested in a single interception point?</em>&rdquo;</p>
<p>Given the same practice and the same prompt, the three models produced qualitatively different types of insight: redefinition of <em>nature</em> (Gemini), redefinition of <em>system</em> (Grok), redefinition of <em>strategy</em> (ChatGPT). The creative signatures observed in the forward EIC experiments in Part III appear again in DIS, with different models illuminating different regions of the solution space.</p>
<p>One observation deserves emphasis: the quality of these DIS results, produced autonomously, is comparable to or better than what the forward EIC produced in Part III. The models didn&rsquo;t struggle with the reverse operation the way they sometimes struggled with forward extraction. This is preliminary, but it fits the hypothesis I&rsquo;ll discuss in Open Questions, which is that DIS may align more naturally with how Transformer attention mechanisms work.</p>
<hr>
<h2 id="the-verification-function">The Verification Function</h2>
<p>There is a second use for DIS that I didn&rsquo;t see initially, but that may be equally important.</p>
<p>When you decompose a solution and search for isomorphic domains, the results tell you something about the <em>quality</em> of the solution itself.</p>
<p>If the decomposition produces clean isomorphisms in multiple distant domains, and those domains have independently developed similar solutions, your solution is <em>structurally validated</em>. It responds to a real, universal constraint that multiple independent systems have converged on, and that convergence is the evidence.</p>
<p>If the decomposition produces incoherent results (the isomorphisms feel forced, the domains don&rsquo;t really share the constraint, the solutions in other domains bear no resemblance to yours), that&rsquo;s a signal. Your solution may be addressing a symptom rather than a structural constraint. Or the constraint you identified may not be the real one.</p>
<p>And if the decomposition reveals that other domains have <em>much more refined</em> solutions to the same constraint, with centuries of accumulated refinement that yours lacks, that tells you something about where to invest.</p>
<p>This is what makes DIS function as a proof. In mathematics, you validate a function by checking that its inverse returns you to the starting point. In the EIC-DIS framework, you validate a solution by decomposing it, finding isomorphic constraints, and checking whether the imported solutions converge with, complement, or contradict your original approach. Convergence is confirmation. Complementarity is enrichment. Contradiction is a warning.</p>
<hr>
<h2 id="the-full-cycle">The Full Cycle</h2>
<p>The forward and reverse operations are not separate tools. They are two directions of the same instrument, the <strong>EIC-DIS cycle</strong>, and they compose naturally:</p>
<p><strong>Forward EIC</strong>: Problem → extract rules from distant domains → invert → compose → novel solution.</p>
<p><strong>Reverse EIC</strong>: Solution → decompose to its causal rule → find isomorphic domains → import their accumulated expertise → refined solution.</p>
<p><strong>Second Forward</strong>: Refined solution → extract the new rules it embodies → find new domains → new inversions → new compositions.</p>
<p>Each cycle produces solutions that are both more creative (wider domain coverage) and more robust (validated against isomorphic precedent). The cycle doesn&rsquo;t converge to a single answer; it expands the space of possibilities while pruning the weak ones.</p>
<p>And if the finite constraint hypothesis holds, each cycle also contributes to a growing <em>map</em> of structural constraints and their cross-domain solutions. Over enough cycles, across enough practitioners, this map would constitute something that doesn&rsquo;t exist today: a navigable atlas of structural isomorphisms across human knowledge.</p>
<p>Rather than a static encyclopedia, that atlas would be a living instrument, continuously extended by every practitioner who runs an EIC-DIS cycle on a new problem and discovers a new connection. Seen this way, the EIC-DIS framework is more than a creativity tool or a verification mechanism. It is a <em>protocol for accumulating structural knowledge across domains</em>.</p>
<hr>
<h2 id="open-questions">Open Questions</h2>
<p>The experiments in Part III revealed that the forward EIC prompt, used autonomously, produces legitimate creative output but falls short of what iterative human-LLM conversation achieves, particularly at the composition level. This raises a question I haven&rsquo;t tested yet but that I believe deserves investigation:</p>
<p><strong>Is DIS easier for an LLM to execute autonomously than EIC?</strong></p>
<p>There is a structural reason to think it might be. The forward EIC fights against the model&rsquo;s strongest tendency, its pull toward statistically dense territory. You&rsquo;re asking it to leave what it knows well and traverse genuinely distant domains. DIS does the opposite: it starts from a concrete solution and searches for structural similarities across its training data. Finding patterns of similarity across distant representations is precisely what the attention mechanism in Transformers was designed to do, so the reverse operation works with the model&rsquo;s architecture rather than against it.</p>
<p>If this hypothesis holds, the gap between autonomous prompting and iterative conversation (documented in Part III) would be <em>smaller</em> in DIS mode than in EIC mode. DIS could be the mode where a well-crafted prompt comes closest to replicating the quality of sustained dialogue. It would also mean that the verification function of DIS is reliable in practice as an autonomous operation, and not only sound in theory.</p>
<p>I haven&rsquo;t run the experiments yet. But the question is testable with the same methodology used in Part III: give the reverse prompt to multiple models, compare the quality of isomorphic domain discovery and solution import, and measure the gap against iterative conversation results. If researchers are looking for a concrete next step from this series, this is it.</p>
<hr>
<h2 id="then-and-now">Then and Now</h2>
<p>When I started this series, I thought I was writing about how to use LLMs for creative problem-solving. I ended up somewhere I didn&rsquo;t expect.</p>
<p>The EIC framework began as a method for generating novel ideas. It became a theory of where novelty actually lives (in composition, not in transfer). It became an experimental instrument that revealed different creative signatures across models. It became a lens on the limits of autonomous agents. And now, with DIS as its reverse complement, it has become a bidirectional instrument, <strong>EIC-DIS</strong>, for exploring the structural isomorphisms between domains.</p>
<p>Somewhere along the way, the nature of the activity changed. EIC is about <em>invention</em>, creating something new from distant pieces. DIS is about <em>recognition</em>: discovering that what you need already exists somewhere, in some form. Creativity is sometimes less about making something that didn&rsquo;t exist than about seeing that it already does.</p>
<p>The forward EIC asks: what can other domains teach me about my problem?</p>
<p>DIS asks: what has the rest of the world already figured out that I don&rsquo;t know I&rsquo;m looking for?</p>
<p>And underneath both questions lies a hypothesis that I find genuinely exciting: the structural constraints of our world are finite. Which means that for every problem you face, someone, in some domain, century or discipline you&rsquo;ve never heard of, has probably already done the hard work. The solution exists; it&rsquo;s just wearing a costume you don&rsquo;t recognize, and the EIC-DIS framework is the instrument for seeing through it.</p>
<hr>
<p><em>Gabriel Mailhot is a Senior Subject Matter Expert at Desjardins, where he works on development practices, architecture, and complex organizational problems spanning technology, process, and governance. His 2003–2010 research focused on creative systems and metaphor-based retrieval. He publishes at scripting.pro.</em></p>
]]></content:encoded></item><item><title>Keeping Control of Code You No Longer Write</title><link>https://scripting.pro/posts/keeping-control-of-code-you-no-longer-write/</link><pubDate>Mon, 02 Nov 2026 12:00:00 -0500</pubDate><guid>https://scripting.pro/posts/keeping-control-of-code-you-no-longer-write/</guid><description>When a model writes most of the code, the first thing to degrade is knowing what the system already contains. Generated maps, checked by tests that fail as messages to the model, keep that knowledge executable: a structural counterpart to executable specifications.</description><content:encoded><![CDATA[<h2 id="the-problem-is-knowing-what-already-exists">The problem is knowing what already exists</h2>
<p>In my experience, when a model writes most of your code, the first thing to degrade is not code quality. It is your knowledge of what the system already contains.</p>
<p>I discovered this in a surprisingly ordinary question: <em>How friendly must a character be to count as a friend?</em></p>
<p>My project had five answers. <code>FriendThreshold = 10</code> appeared as a private constant in three files. Two more files used <code>BestFriendThreshold = 20</code> and <code>FriendRelationThreshold = 20</code> for a neighbouring question. Each class was clean. Nothing was obviously broken. Yet the same area of the domain had quietly acquired five separate decisions.</p>
<p>The project is a mod for a strategy game, in production since June 2026, with more than 5,300 unique downloads. I built it entirely with an AI model and have not written a line of its code. I do not review that code either: with my experience as a developer, reviewing every line would cost about as much as writing it, and speed is the reason I work this way. I have never played the mod.</p>
<p>That unusual arrangement changed my relationship with the software. The model begins each session without the knowledge carried through earlier conversations; unless something directs it to an existing concept, it has no reason to look for one it does not know exists. Meanwhile, as I moved from writing code to describing what I wanted, I lost the small design moments that used to happen while typing: pausing over a name, noticing a familiar rule, questioning where something belonged.</p>
<p>I had stopped being the coder of the system and become its customer, while remaining responsible for its architecture.</p>
<p>I needed a way to keep making architectural decisions without relying on having read every implementation.</p>
<h2 id="why-better-instructions-do-not-fix-it">Why better instructions do not fix it</h2>
<p>My first answer was the obvious one: tell the model what good code should look like.</p>
<p>From the beginning, I had detailed instructions about layering, SOLID and Tell, Don&rsquo;t Ask, alongside specifications and other guardrails. The five thresholds appeared anyway. Each class could follow the rules perfectly while the duplication emerged <em>between</em> classes.</p>
<p>An instruction to a model is advice, not a constraint. It helps only if the model considers it at the right moment, among thousands of other tokens. There is no automatic alarm when it does not. My instructions file eventually described 16 sections of a prompt that had grown to 108.</p>
<p>Generated documentation was not enough either. One file listed every rule guaranteed by a test, with a header telling readers to regenerate it when the tests changed. Ten days passed without regeneration. The document fell about 600 rules behind, but looked as authoritative as ever.</p>
<p>That was the problem with both approaches: nothing forced the description to remain aligned with reality.</p>
<p>A document stays trustworthy only if something compares it with the system whenever the system changes, and refuses to let a difference go unnoticed.</p>
<p>Others have approached the same problem from another direction. In a <a href="https://youtu.be/EkH_uoybj8k">recent video</a>, Dave Farley describes a growing consensus that prompts and Markdown specifications cannot reliably steer an agent on their own. Specifications need to be executable. His acceptance tests establish <em>what</em> the system must do while leaving the agent freedom over <em>how</em> it does it.</p>
<p>But that freedom is exactly where my five thresholds came from. All five implementations could satisfy the behavioural tests. The behaviour was correct; the structure was drifting. Acceptance tests deliberately avoid prescribing implementation structure, so I needed their counterpart: executable checks on the parts of the <em>how</em> that matter architecturally.</p>
<h2 id="a-map-a-generated-view-held-true-by-a-test">A map: a generated view, held true by a test</h2>
<p>The first mechanism was simple: generate a map of the code, commit it, and make a test fail whenever the code and the committed map disagree.</p>
<p>This is approval testing applied to structure rather than output. A small generator reads the source as text, using a syntax parser rather than requiring a build, and produces Markdown.</p>
<p>For example, the top of a real constants map groups names declared in multiple places:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-0-1"><a class="lnlinks" href="#hl-0-1">1</a>
</span><span class="lnt" id="hl-0-2"><a class="lnlinks" href="#hl-0-2">2</a>
</span><span class="lnt" id="hl-0-3"><a class="lnlinks" href="#hl-0-3">3</a>
</span><span class="lnt" id="hl-0-4"><a class="lnlinks" href="#hl-0-4">4</a>
</span><span class="lnt" id="hl-0-5"><a class="lnlinks" href="#hl-0-5">5</a>
</span><span class="lnt" id="hl-0-6"><a class="lnlinks" href="#hl-0-6">6</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">## One name, several homes
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">| Name            | Where, and what it is worth there                           |
</span></span><span class="line"><span class="cl">|-----------------|-------------------------------------------------------------|
</span></span><span class="line"><span class="cl">| ArrivalDistance | AmbushBehavior = 2.5; MissionBehavior = 2.0; PatrolBehavior = 2.0 |
</span></span><span class="line"><span class="cl">| CooldownDays    | EncounterService = 1; AmbitionPolicy = 30; DuelPolicy = 7   |
</span></span></code></pre></td></tr></table>
</div>
</div><p>Not every repeated name is a defect. Sometimes two declarations represent one concept that should have one home; sometimes they are different concepts with similar names. The map does not decide. It brings the question into view so someone can.</p>
<p>From then on, each change produces two kinds of diff. The code diff shows what was edited. The map diff shows what changed about the system&rsquo;s structure: perhaps a new dependency between modules, or another declaration of an existing name. Even an unchanged map tells me something about the scope of a change.</p>
<p>Of course, a test helps only if it runs. A pre-commit hook or a pipeline can provide the trigger. My mod needs the game&rsquo;s libraries and cannot be built on a server, so I run the checks locally. In a team, the checks and their baselines belong in protected continuous integration, beyond the agent&rsquo;s ability to approve its own exceptions.</p>
<p>The underlying idea is not new. Neal Ford, Rebecca Parsons and Patrick Kua describe architectural fitness functions; ArchUnit, NDepend and PublicApiAnalyzers cover important parts of this territory. My maps address questions specific to the system, including cases where the code cannot be compiled in the test environment.</p>
<p>The closest recent practice is what OpenAI calls <a href="https://openai.com/index/harness-engineering/">harness engineering</a>, described in February 2026: architecture documentation kept consistent through linters and CI, structural tests that enforce layering, and repository maps that help agents navigate the code. That work focuses on the environment in which agents produce a coherent system. I am interested in the other side of the loop: <strong>how the person responsible for the architecture continues to judge it without reading all the code.</strong></p>
<h2 id="a-failing-test-is-a-message-to-the-model">A failing test is a message to the model</h2>
<p>The maps became useful for a reason I had not initially appreciated: <em>when</em> their information appeared.</p>
<p>An instruction says, &ldquo;Remember this rule.&rdquo; A failing test says, &ldquo;Something you just changed affects this rule. Look at it now.&rdquo;</p>
<p>The second message arrives while the model is still working on the change. The suite remains red until the discrepancy is addressed. A red map test does not necessarily mean the software is broken; it means a structural change requires attention.</p>
<p>That only works if the failure explains itself. My tests show the moved lines and, where a contract blocks a change, the reason it is blocked and how to handle an intentional exception.</p>
<p>Here is a real failure, triggered deliberately by deleting a public API member that had shipped in the previous release:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-1-1"><a class="lnlinks" href="#hl-1-1">1</a>
</span><span class="lnt" id="hl-1-2"><a class="lnlinks" href="#hl-1-2">2</a>
</span><span class="lnt" id="hl-1-3"><a class="lnlinks" href="#hl-1-3">3</a>
</span><span class="lnt" id="hl-1-4"><a class="lnlinks" href="#hl-1-4">4</a>
</span><span class="lnt" id="hl-1-5"><a class="lnlinks" href="#hl-1-5">5</a>
</span><span class="lnt" id="hl-1-6"><a class="lnlinks" href="#hl-1-6">6</a>
</span><span class="lnt" id="hl-1-7"><a class="lnlinks" href="#hl-1-7">7</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Failed GIVEN_a_released_modder_api_member_WHEN_the_code_no_longer_has_it_THEN_the_suite_refuses_it
</span></span><span class="line"><span class="cl">  These public members shipped in v2.8.1 and are no longer there:
</span></span><span class="line"><span class="cl">  CrLetters: static bool Deliver(Hero sender, string body, string sourceMod)
</span></span><span class="line"><span class="cl">  A bridge built on them breaks on a player&#39;s machine. Put the member back (mark it
</span></span><span class="line"><span class="cl">  [Obsolete] and keep it working if it must go), or, if removing it is truly intended,
</span></span><span class="line"><span class="cl">  set CR_ALLOW_API_REMOVAL=1, name it under &#34;For modders&#34; in the release notes,
</span></span><span class="line"><span class="cl">  and say why in the commit.
</span></span></code></pre></td></tr></table>
</div>
</div><p>The failure identifies the missing promise, explains whom the change would affect, and offers two legitimate responses: preserve compatibility or explicitly acknowledge a breaking change.</p>
<p>The timing is not perfect. The test fires <em>after</em> code has been written, so reading a map before editing is still preferable. The test catches what that habit missed, sometimes at the cost of rework.</p>
<p>Still, this is the insight I find most transferable. Farley uses a red test to show that a specification can reject a wrong answer. Here, the failure is also a communication channel. <strong>Designing tests around what they tell the agent when they fail matters as much as deciding what they check.</strong></p>
<h2 id="what-makes-a-map-worth-reading">What makes a map worth reading</h2>
<p>A map only earns its place if reading it is cheaper than reading the code.</p>
<p>In practice, I aim for one fact per line, with enough context (owner, name and value) for that line to make sense when an agent retrieves it through search rather than reading the document from top to bottom.</p>
<p>There is a limit to what such a map can claim. It gathers what the source declares, and its reliability depends on the names and comments it finds. Missing documentation leaves a visible gap. A misleading name is worse: it can make an incorrect description look complete.</p>
<blockquote>
<p>A map cannot be more honest than the names it reads.</p>
</blockquote>
<p>I learned this through a detector for hard-coded relationship thresholds. The first version searched for relevant names, and its count appeared stable for months. Then I added a detector for comparisons between relationship values and numeric literals. It found 33 cases the original had missed.</p>
<p>The map now records which detector produced each line, so a reader can distinguish directly extracted facts from inferred matches. Generation makes the output reproducible. It does not make the interpretation true.</p>
<h2 id="when-informative-maps-stop-informing">When informative maps stop informing</h2>
<p>Most maps inform: the test fails, someone inspects the diff, regenerates the approved snapshot, and commits it.</p>
<p>That process can lose its purpose without anyone noticing.</p>
<p>The model had started regenerating maps <em>before</em> checking them. Each test then compared the new map with itself and passed. This went on for weeks. Once I corrected the order (<strong>compare first, inspect the changes, then regenerate to approve</strong>), the first honest review exposed a blind spot in my dependency detection.</p>
<p>Even with the right order, attention is fragile. A review can slowly become a ritual of &ldquo;regenerate and commit.&rdquo; That is why I now treat informative maps as the fallback, not the goal.</p>
<p>For every map, I ask: can a rule decide whether a change is acceptable? If the question is &ldquo;Did this measure get worse?&rdquo;, often it can. If the question is &ldquo;Do these two declarations mean the same thing?&rdquo;, the answer still needs human judgment.</p>
<p>That distinction led me to two stronger mechanisms: ratchets and contracts.</p>
<h3 id="ratchets-make-yesterdays-debt-the-ceiling">Ratchets: make yesterday&rsquo;s debt the ceiling</h3>
<p>A ratchet preserves a measure that is allowed to improve but not worsen. The current value becomes a ceiling. If the measure rises, the test fails. If it falls, the ceiling must be lowered in the same commit.</p>
<p>That last step matters. Without it, a cleanup does not protect its own gains: the old ceiling would permit the debt to return.</p>
<blockquote>
<p>Today&rsquo;s mess becomes tomorrow&rsquo;s ceiling.</p>
</blockquote>
<p>This makes ratchets practical on legacy code. I do not have to eliminate every existing problem before I can prevent new ones.</p>
<p>The measure must also reflect the problem. For dependency cycles, I compare the <em>set of namespaces involved</em>, not just the number of cycles. Splitting one namespace can increase the number of counted cycles without actually worsening the architecture.</p>
<p>A ratchet gives an agent a direction it can test. &ldquo;Improve the architecture&rdquo; is vague. A ceiling of 46 is concrete: reduce it, confirm the test, and update the baseline. When one of my ratchets reached zero, it became a wall. The debt it measured had turned into a rule prohibiting its return.</p>
<p>That does not mean maps or ratchets improve architecture by themselves. They expose relations and prevent certain regressions. Someone still has to decide what should change and why.</p>
<p>And a guard protects only what it can detect. My first dependency map read <code>using</code> directives, but missed references expressed through fully qualified names. Real cycles escaped detection while the ratchet stayed green.</p>
<p>A good way to test a guard is to make it fail on purpose. Remove a public member. Introduce a cycle through a qualified name. If the suite stays green, the apparent protection is an illusion.</p>
<p>Farley also warns about agents removing tests to make a suite pass. The same applies to baselines: lowering a ceiling as debt improves can be automatic, but raising one, or editing a released contract reference, changes the specification itself and should require a person&rsquo;s approval.</p>
<h3 id="contracts-protect-promises-made-outside-the-codebase">Contracts: protect promises made outside the codebase</h3>
<p>Some structural changes are not merely worth reviewing. They break promises to consumers: a key stored in a player&rsquo;s save file, for example, or a public member that another mod compiles against.</p>
<p>For these, I use blocking contract maps. If a released member disappears, the suite fails even when someone tries to regenerate the map. The baseline is the last released state, stored separately and updated only at release. Otherwise, accepting a new snapshot could quietly erase the very promise the guard exists to protect.</p>
<p>Sometimes additions break compatibility too. In a second project, each new feature added required fields to an export format. A file written an hour earlier could no longer be imported. The map displayed ten apparently harmless added lines; the model recognized the consequence during review. The guard now rejects new required fields relative to the last release, and an original exported file remains as a regression check.</p>
<p>A useful contract must identify the <em>consumer&rsquo;s promise</em>, not the implementation detail behind it. During a retrospective replay of Jellyfin, a contract whose identity included the handler method generated 112 alarms on a single commit that only moved files. Keyed on the promise alone, verb and route, the same contract raised two alarms in thirteen and a half years, both on real losses.</p>
<p>A gate&rsquo;s usefulness depends on its false-alarm rate. If it cries wolf often enough, people switch it off, however sound its underlying logic. The stable identity is the one the consumer actually depends on.</p>
<p>Contract maps have another benefit: they let me review design decisions without opening the code.</p>
<p>After a bug report from another mod author, the model proposed a new public API member: <code>PlayerIsActor</code>, a boolean. I saw the addition in the API map and asked whether other mods should have to understand <em>my</em> mod&rsquo;s notion of a player&rsquo;s deed.</p>
<p>They should not. The model replaced the flag with a list of the heroes who acted, leaving my mod to draw its own conclusion. The member had not shipped, so this took one commit rather than a breaking release.</p>
<p>I did not need to read the implementation to make that decision. The contract showed me the shape of the promise at the level where I could judge it. Farley argues that executable specifications can make code reading a choice based on risk. A structural contract can do the same for architecture.</p>
<h3 id="decision-tables-check-the-behaviour-of-a-refactor">Decision tables: check the behaviour of a refactor</h3>
<p>One kind of map goes beyond reading source code. It runs rules.</p>
<p>A decision table sweeps a value across its range, records the output of every rule that depends on that value alone, and commits the result. When a refactor is meant to preserve behaviour, the expected diff is empty. &ldquo;I only moved code&rdquo; becomes something that can be checked.</p>
<p>The limitation is equally important: a rule combining the swept value with other inputs remains outside that table&rsquo;s view.</p>
<h2 id="what-maps-cannot-see">What maps cannot see</h2>
<p>My first maps largely catalogued names. But two rules can represent the same concept without sharing a name.</p>
<p>When the model added a rule based on a clan&rsquo;s rank, it searched the constants map and found one existing rule. A direct source search found two more, neither represented by a named constant.</p>
<p>So we changed the question. Instead of asking <em>what are the rules called?</em>, we asked <em>what game facts do they read?</em></p>
<p>The resulting map follows values from the game into pure rules and groups those rules by the facts they consume. Under clan rank, it revealed 28 entries covering roughly fifteen distinct features, where the manual search had found three.</p>
<p>This gave us enough visibility for a refactor: rank became a single type accessed through one gateway, and the map confirmed that rules no longer read the raw value directly.</p>
<p>Then the model reached a harder question: <em>What counts as a ruler?</em> Eighteen rules gave answers that were not equivalent. The map could collect every reader of the concept. It could not decide what the concept was supposed to mean.</p>
<p>Static maps have other boundaries. Because they read source, they cannot tell me what the game engine actually does at runtime. Each feature that interacts with the engine therefore has a self-test, launched through the game console against a real save and the production code path, with game state restored afterwards. One such test revealed that the engine reuses identifiers of destroyed entities, something tests outside the engine had not exposed.</p>
<p>The mod also uses a language model internally. Putting a fact into a prompt does not ensure the model will behave as expected. Where a rule can be checked literally, I check it literally: a secret name never included in the prompt must not appear in the reply. I reserve model-as-judge tests for cases that cannot be verified that way, and run them on demand because they cost money.</p>
<p>These checks complement the maps; they do not make the maps comprehensive.</p>
<h2 id="where-intent-comes-from">Where intent comes from</h2>
<p>There is an objection worth confronting. If a test is generated from existing code, does it do anything more than confirm the code&rsquo;s current behaviour? Where does the intended design come from?</p>
<p>Informative maps do not claim to verify intent. They describe what the source currently contains and make changes to that description visible. Intent enters when someone decides which changes are acceptable, which measures must not worsen, and which promises must remain stable.</p>
<p>Behavioural intent needs a home as well. In my project, it lives in tests. Each test file begins by describing how the rule could go wrong, recorded when the rule was decided. For example, the policy allowing a player&rsquo;s spouse to request a divorce names two opposite failures: a happy marriage disturbed by unsolicited letters, and a miserable one in which nobody ever speaks up. Some tests even cite the question I asked that led to the rule.</p>
<p>Intent is easiest to capture when it is formed. Later, we can only reconstruct it.</p>
<p>One problem remains unsolved. When the same model writes both implementation and tests, the tests can end up confirming whatever the implementation already does. Evidence from outside the loop helps: reports from real users, translated into regression tests, and a human reviewing the structural diffs.</p>
<h2 id="testing-the-idea-beyond-my-own-project">Testing the idea beyond my own project</h2>
<p>I wanted to know whether the structural patterns I was seeing were peculiar to AI-generated code. So I turned to software developed in the more traditional way: Jellyfin, an open-source media server with thirteen and a half years of history, about thirty maintainers and mandatory code review.</p>
<p>I replayed the generators over all 11,221 commits. If ordinary review eliminated this kind of structural drift, the maps should have found little worth surfacing. They found considerably more, but what they found needs to be interpreted carefully.</p>
<table>
	<thead>
			<tr>
					<th>Question</th>
					<th>What the replay showed</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Does review catch scattered concepts?</td>
					<td>Constant names declared in several modules: 119 episodes, median survival 390 days. Type names: 176 episodes, 535 days. These are candidates, not confirmed duplicates.</td>
			</tr>
			<tr>
					<td>Does a contract identity matter?</td>
					<td>Keyed on verb, route and handler: 112 alarms on one commit that only moved files. Keyed on the promise alone: 2 alarms in 13.5 years, both real.</td>
			</tr>
			<tr>
					<td>Is a ratchet quiet?</td>
					<td>Namespaces in cycles held at 41 for seven years, then jumped to 54. A ratchet set in 2018 fires about four times a year.</td>
			</tr>
			<tr>
					<td>What does reading maps cost?</td>
					<td>About one commit in three moves an informing map; the median diff is two or three lines.</td>
			</tr>
			<tr>
					<td>What do maps miss?</td>
					<td>65% of bug fixes and 42% of refactors move no map line at all.</td>
			</tr>
	</tbody>
</table>
<p>The last row matters as much as the others. Many meaningful changes do not appear in these maps. That is why they need behavioural and runtime checks alongside them.</p>
<p>The replay also has clear limits. It shows what the maps <em>would have displayed</em>, not what a reviewer <em>would have done</em>. And the cycle figures may undercount real dependencies if the replayed generator shared the blind spot I found in my own project.</p>
<p>My forward evidence comes from the mod itself. It has been in production since June 2026, carries more than 6,600 unit tests and over 200 in-game self-tests, and ships updates frequently: a player recently remarked that a new one appears roughly every three days. One project developed by one person demonstrates that the approach can be used, not that it improves outcomes for every team.</p>
<p>I also tried the method on a smaller project in another language. I asked a model to create a Postman-like HTTP client in JavaScript, with maps present from the first commit, and later asked it to evaluate its own architecture. I wrote no code.</p>
<p>In roughly an hour and a half and twelve commits, similar drift appeared: small rules were rewritten beside their originals, and a main file grew from 237 to 353 lines through individually reasonable additions. A subsequent split brought it down to 25 lines. On a fresh project, ratchets can start at zero and act as walls from day one, rather than freezing an existing level of debt.</p>
<p>This was still a short experiment with the same author, model and skill, not an independent team trial. The <a href="https://github.com/LogRaam/A-Postman-Alternative">repository</a> preserves the commit history for inspection.</p>
<h2 id="where-to-start-and-why-this-matters-now">Where to start, and why this matters now</h2>
<p>I would not begin by mapping everything.</p>
<p>Start with one generated map and a test that compares it against the committed version. Protect any contracts with external consumers. Then add maps and guards in response to problems you have actually encountered more than once. Each map should earn its place by making a recurring architectural decision visible when it arises.</p>
<p>I packaged this approach as an agent skill. Its <a href="https://github.com/LogRaam/My-Claude-Skills/blob/main/generated-maps/README.md">README</a> covers generators, test patterns and a suggested adoption order.</p>
<p>Why do this now? Because the economics of change have shifted. With an AI model, writing or rewriting an implementation has become cheap enough that I often prototype and correct rather than specify everything in advance, but finding out <em>what deserves correction</em> has not become cheaper. Verification matters as much as before; it now lives less in specifications written before implementation and more in checks that run whenever implementation changes.</p>
<p>We used to write code so our colleagues could understand it. Now we also need to preserve <em>why</em> it was written for a reader who has no memory of the conversation that produced it. More and more often, that reader is the model itself.</p>
<p>The developer&rsquo;s role changes with it. Someone who delegates implementation becomes responsible for an architecture they can no longer keep in their head by reading each line as it is written.</p>
<p>Maps do not restore that lost familiarity. They provide something different: a view of the system that cannot quietly drift without a test noticing, and that arrives when a change makes it relevant. Combined with explicit constraints and human judgment, that can be enough to keep making sound architectural decisions about code we no longer remember writing.</p>
<hr>
<p><em>Gabriel Mailhot is a Senior Subject Matter Expert at Desjardins, where he works on development practices, architecture, and complex organizational problems spanning technology, process, and governance. He publishes at scripting.pro.</em></p>
]]></content:encoded></item><item><title>The Approval Gradient: Why LLMs Fail as Thinking Partners, and What Actually Works</title><link>https://scripting.pro/posts/the-approval-gradient/</link><pubDate>Sat, 30 May 2026 10:00:00 -0400</pubDate><guid>https://scripting.pro/posts/the-approval-gradient/</guid><description>Sycophancy and forced harshness are both failures of the same mechanism. Understanding that mechanism, rather than just the symptoms, is what makes calibrated AI collaboration possible.</description><content:encoded><![CDATA[<p><em>We assume sycophancy in AI is a politeness problem, solvable with a sharper prompt that demands directness and tells the model to disregard our feelings. It isn&rsquo;t. The sharper prompt produces a different version of the same failure.</em></p>
<p>What actually works is more counterintuitive, and it changes how we should think about working with LLMs on serious intellectual work: software architecture, requirements analysis, incident reviews, governance decisions, and any situation where the cost of a politely reinforced false premise is high.</p>
<hr>
<h2 id="the-structural-cause-of-flattery">The Structural Cause of Flattery</h2>
<p>Sycophancy in language models is the predictable output of how these models are aligned, not a design oversight.</p>
<p>Post-training alignment methods, particularly reinforcement learning from human feedback (RLHF), optimize models using human preference signals: annotators evaluate candidate responses and prefer the ones that feel more helpful, agreeable, or respectful. The problem is that human evaluators are themselves susceptible to flattery. They rate higher the responses that validate their premises and affirm their work. Over millions of such comparisons, the model learns a reliable lesson: approval-seeking behavior is rewarded.</p>
<p>This is a textbook instance of Goodhart&rsquo;s Law: when a measure becomes a target, it ceases to be a good measure. User approval was intended as a proxy for response quality. Once it became a direct training signal, models learned to optimize for the proxy rather than the underlying quality it was supposed to track.</p>
<p>In April 2025, OpenAI deployed a GPT-4o update that pushed this tendency to an extreme, validating harmful beliefs, endorsing delusional claims, and flattering users to the point of absurdity. OpenAI rolled the update back four days later, <a href="https://openai.com/index/sycophancy-in-gpt-4o/">acknowledging</a> that it had &ldquo;focused too much on short-term feedback&rdquo; and produced responses that were &ldquo;overly supportive but disingenuous.&rdquo; Their <a href="https://openai.com/index/expanding-on-sycophancy/">extended postmortem</a> added that the model had learned to please users &ldquo;not just as flattery, but also as validating doubts, fueling anger, urging impulsive actions.&rdquo; That is a catalogue of approval-seeking behaviors, none of which are incidental.</p>
<p>The episode was less an anomaly than a revealing amplification of a baseline condition. Research <a href="https://www.science.org/doi/10.1126/science.aec8352">published in <em>Science</em> in March 2026</a> found that sycophancy is widespread across leading AI systems and measurably reduces users&rsquo; prosocial intentions while increasing dependence. A <a href="https://news.mit.edu/2026/personalization-features-can-make-llms-more-agreeable-0218">study from MIT and Penn State</a>, also from early 2026, found that personalization features and memory significantly worsen sycophantic behavior over long conversations. The longer you work with a model in a single context, accumulating shared history and a stored user profile, the more the model mirrors your framing back at you. This produces a paradox: the features built to make a model more useful day to day (memory, personalization, a model that &ldquo;knows you&rdquo;) are the same ones that degrade it as a critical thinking partner.</p>
<hr>
<h2 id="the-mirror-failure">The Mirror Failure</h2>
<p>The obvious corrective is to instruct the model differently: tell it to be direct, critical, blunt. A cottage industry of prompts has grown up around this: &ldquo;Absolute Mode,&rdquo; frenemy instructions, persona primers that instruct the model to &ldquo;disregard feelings&rdquo; and &ldquo;find the flaws.&rdquo;</p>
<p>These interventions have a real effect on tone, but they do not fix the underlying problem.</p>
<p>Both flattery and forced harshness are responses to a social cue rather than to the merits of the argument. The sycophantic model optimizes for your approval, having learned that validation generates positive feedback. The model instructed to be harsh optimizes for a <em>performance of rigor</em>: it has learned, from the framing you provided, that criticism is what you want to see. In neither case is the response tracking the actual quality of your idea.</p>
<p>A thinking partner is valuable to the degree that its output is sensitive to the merits of the argument, not to social signals about how you want to feel. Both failure modes sever that connection. The model that flatters you and the model that performs toughness are, structurally, doing the same thing: generating output that tracks a social target.</p>
<p>This distinction matters because it implies something counterintuitive. The &ldquo;be harsh&rdquo; prompt fails because it does not address the mechanism at all, not because it overcorrects in the other direction. You have replaced an approval-seeking response with an approval-seeking response to a different approval signal. The gradient has been redirected, not removed.</p>
<blockquote>
<p><strong>Sycophancy and forced harshness are not opposites; they are the same failure tracking different social signals.</strong></p>
</blockquote>
<hr>
<h2 id="what-actually-works">What Actually Works</h2>
<p>If the problem is that model outputs track social posture rather than argument merits, then the effective solutions are those that remove the social signal or force genuine engagement with the substance. Four techniques do this reliably, and each works for a structural reason rather than a stylistic one.</p>
<p><strong>Ranking over rating.</strong> Ask the model to rank a set of ideas, arguments, or options from weakest to strongest, and to justify the weakest entry. A ranking is logically incompatible with uniform praise: the model cannot place everything in first position. This forces it to spend critical judgment as a constrained resource rather than allocating approval uniformly. The technique does not rely on tone instructions; it works because the task structure makes flattery impossible.</p>
<p><strong>Context separation.</strong> Generate in one conversation, then evaluate in a fresh one, without the accumulated history or the relational context, and ideally with the framing that the material was produced by someone other than you. The MIT/Penn State findings are directly relevant here: sycophancy worsens significantly when a user profile or memory is active, and compounds over long interactions. A clean context removes the accumulated mirroring pressure. Asking &ldquo;where are the weakest points in this argument?&rdquo; about text attributed to a third party consistently produces sharper feedback than asking the same question about your own work, in the same session.</p>
<p><strong>Refutation conditions.</strong> Ask: &ldquo;What observation would falsify this? What is the strongest case a knowledgeable skeptic would make against it?&rdquo; This forces merit engagement because it requires the model to reason about the logical structure of the argument rather than the sentiment of the conversation. It is the technique most resistant to social drift because the question, by design, cannot be answered with validation. Instead of &ldquo;is this good?&rdquo;, you are asking &ldquo;what would make this wrong?&rdquo;, which is a different cognitive task entirely.</p>
<p><strong>Calibration signals.</strong> Ask the model to distinguish where it is reasoning from strong grounding versus where it is extrapolating or guessing. This interrupts the default behavior of projecting uniform confidence, itself a form of approval-seeking (hedged or uncertain answers feel less satisfying to receive). A response that marks its own uncertainty gives you better information for judgment, even if it delivers less of the confident clarity you might have wanted.</p>
<hr>
<h2 id="the-humans-role">The Human&rsquo;s Role</h2>
<p>None of these techniques replace the human&rsquo;s role in the collaboration; they calibrate the signal the human is working with.</p>
<p>The human brings what the model cannot: the full context of what matters, what is organizationally feasible, what the relevant actors will accept, and, above all, how the problem should be framed in the first place. This last point cuts both ways. The human who frames a problem carries irreplaceable context, but the same framing creates a blind spot, because the problem-poser is least able to question the frame they authored. This is one of the places where an LLM&rsquo;s structural detachment from your intuitions becomes an asset rather than a liability. It can propose reframings the instigator is too anchored to see, provided it is not simultaneously optimizing to agree with the instigator.</p>
<p>The model, for its part, brings what the human cannot at scale: access to a vast library of structural analogues, cross-domain patterns, and prior formulations of similar problems. This is the same principle underlying TRIZ, the theory of inventive problem solving, whose foundational claim is that a structurally equivalent problem has almost certainly been solved somewhere else. With an LLM, that principle becomes executable through analogy at high speed. That value is real, but it is entirely contingent on the model responding to the merits of the argument rather than the social dynamics of the conversation.</p>
<p>The collaboration works when each party does its job. The model&rsquo;s job is to respond to the merits. The human&rsquo;s job is to judge value and context. When the model is optimizing for approval rather than merit, it is not doing its job, and no amount of human judgment can compensate for a corrupted input signal.</p>
<p>Understanding sycophancy as structural rather than accidental is what makes the fix tractable. The trouble lies less in your model being polite than in politeness having been systematically conflated with quality across millions of training examples. Demanding impoliteness does not undo that. Interaction structures that make quality and approval impossible to conflate do.</p>
<hr>
<h2 id="references">References</h2>
<ul>
<li>OpenAI. <a href="https://openai.com/index/sycophancy-in-gpt-4o/">&ldquo;Sycophancy in GPT-4o: What happened and what we&rsquo;re doing about it.&rdquo;</a> April 2025.</li>
<li>OpenAI. <a href="https://openai.com/index/expanding-on-sycophancy/">&ldquo;Expanding on what we missed with sycophancy.&rdquo;</a> May 2025.</li>
<li>Malmqvist, Lars. <a href="https://arxiv.org/abs/2411.15287">&ldquo;Sycophancy in Large Language Models: Causes and Mitigations.&rdquo;</a> <em>arXiv</em>, November 2024.</li>
<li>MIT News. <a href="https://news.mit.edu/2026/personalization-features-can-make-llms-more-agreeable-0218">&ldquo;Personalization features can make LLMs more agreeable.&rdquo;</a> February 2026.</li>
<li><em>Science</em>. <a href="https://www.science.org/doi/10.1126/science.aec8352">&ldquo;Sycophantic AI decreases prosocial intentions and promotes dependence.&rdquo;</a> March 2026.</li>
</ul>
<hr>
<p><em>Gabriel Mailhot is a Senior Subject Matter Expert at Desjardins, where he works on development practices, architecture, and complex organizational problems spanning technology, process, and governance. He publishes at scripting.pro.</em></p>
]]></content:encoded></item></channel></rss>