<?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>Posts on scripting.pro</title><link>https://scripting.pro/posts/</link><description>Recent content in Posts 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/posts/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><item><title>The System Is Working as Designed</title><link>https://scripting.pro/posts/the-system-is-working-as-designed/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>https://scripting.pro/posts/the-system-is-working-as-designed/</guid><description>On why large organizations structurally produce technical debt, select for political behavior, and reliably defeat every attempt at reform, including Agile.</description><content:encoded><![CDATA[<p><em>On why large organizations structurally produce technical debt, select for political behavior, and reliably defeat every attempt at reform, including Agile.</em></p>
<hr>
<p>I have watched a pattern repeat itself across organizations too many times to believe it is accidental. A technically competent person does careful work, raises legitimate concerns about architectural shortcuts, pushes back on timelines that will generate problems downstream. They are right. Their concerns are documented. And they are quietly sidelined while the project proceeds, delivers on schedule, and the manager who overrode their concerns is promoted.</p>
<p>The promoted manager is not incompetent. In many cases, they are genuinely skilled at something. But skilled at what, exactly? And why does that skill, rather than technical judgment, determine who advances?</p>
<p>This article is an attempt to answer that question rigorously. The answer implicates organizational dynamics, but also the educational institutions that train managers, the governance models that structure IT investment, and the reform movements, Agile among them, that have tried and failed to change the outcome. The system is not broken; it is working exactly as its underlying structure dictates. In 2007, Robert Schaefer, writing in ACM SIGSOFT Software Engineering Notes, asked the same question in more general terms: why do large complex systems so often work against their declared goals? His answer pointed directly at organizational governance, specifically at what he termed the Authoritarian Hierarchy of Control. What follows builds on that diagnosis and extends it into the specific dynamics of IT investment, selection, and reform.</p>
<blockquote>
<p><em>Technical debt is not a failure of discipline. It is a system of incentives working exactly as designed.</em></p>
</blockquote>
<hr>
<h2 id="the-incentive-structure-that-generates-technical-debt">The Incentive Structure That Generates Technical Debt</h2>
<p>Large organizations govern IT investment through annual budget cycles and delivery metrics. A project is funded for a year, expected to deliver defined functionality by a defined date, and evaluated on whether it did. This structure imposes a specific temporal resolution on decision-making: what matters is what is visible within twelve months.</p>
<p>Architectural quality does not operate on a twelve-month horizon. The decisions that determine whether a system can be evolved cheaply in three years (modularity, decoupling, reversibility, testability) produce no visible output in the current budget cycle. By the logic of the measurement instrument, they are invisible.</p>
<p>Every technical role in a delivery team, whether developer, tech lead, or architect, is in the business of reducing the cost of being wrong. Good design does not predict the future; it ensures that when the system must evolve in ways no one anticipated, the cost of that evolution is bounded rather than catastrophic. But this value cannot be captured by a metric that closes at year end. It has no line in the budget and generates no deliverable.</p>
<p>The project manager who allocates time and money to architectural quality is making an investment whose return will appear in someone else&rsquo;s budget cycle, under someone else&rsquo;s name. The project manager who defers that investment delivers on time and on budget, and receives the recognition that comes with it. That is a sensible response to the incentive structure rather than a failure of individual judgment.</p>
<p>Schaefer named this mechanism <em>risk shifting</em>: when direct action to reduce a risk is judged too costly, the less costly tactic is to transfer that risk burden to others. If this transfer can proceed without immediate observation, the conflict it generates will simply be deferred. Annual budget cycles are, structurally, a machine for making risk shifting invisible. The cost lands in a future cycle, under a different manager, attributed to different causes.</p>
<p>Game theory offers a complementary framing. In a prisoner&rsquo;s dilemma, two actors each face a choice between cooperation, which produces the best collective outcome, and defection, which protects individual interest at collective cost. When both actors reason independently and arrive at the locally coherent choice, both defect. The problem is not irrationality but the fact that individually sensible behavior produces collectively irrational outcomes. The parallel with IT governance runs deep enough to carry predictive weight. Every project manager, every budget cycle, every delivery team faces the same calculus. When every actor optimizes for their own position, the collective result is a technology estate that grows progressively more rigid, more expensive to evolve, and less capable of supporting the business it was built to serve. Nobody made a bad decision; everyone made a good one, given the game they were playing.</p>
<hr>
<h2 id="the-cascade-from-deferral-to-dissimulation-to-manipulation">The Cascade: From Deferral to Dissimulation to Manipulation</h2>
<p>Technical debt is the first and most visible symptom of this structure. But the same logic operates at every level of the organizational hierarchy, producing a cascade of increasingly consequential behaviors.</p>
<p>At the project level, the actor defers architectural quality. This is risk shifting in its most direct form: a cost that is real but diffuse, transferred to a future that belongs to someone else.</p>
<p>As the project encounters difficulty (deferred costs begin to materialize, timelines slip, complexity compounds), the actor at the next level faces a different version of the same calculus. Delivering bad news upward is costly. It damages reputation, invites scrutiny, and moves the problem from the future into the present. Filtering that information, presenting progress in the most favorable available framing, managing perception rather than reality: this is individually sensible for exactly the same reason that deferring architectural debt is individually sensible. The cost is real but diffuse, while the benefit is immediate and personal.</p>
<p>Schaefer formalized this in what he called the Liars&rsquo; Axioms. A liar, his term for any actor who strategically manages information to protect their position, suppresses, manufactures, or denies evidence to align observers&rsquo; judgments with their own goals. The intent of the lie, he observed, may simply be to stall for time. If the delay runs long enough, the consequences will have had greater impact on the world than the uncovering of the lie. Those who discover it afterward (auditors, commissions of inquiry, historians) matter only to a small audience. The actor has long since moved on.</p>
<p>The calculus that defers architectural quality also defers information. Technical debt accumulates at the bottom of the hierarchy; informational debt accumulates at the top. The mechanism is identical, and the consequences, when they finally surface, are proportional to how long the deferral has continued.</p>
<p>This is a structural observation, not a cynical one about human nature: it describes what happens when the same incentive pattern operates at multiple levels of a hierarchy simultaneously. Each level protects its position by deferring its costs to the next. The progression from deferral to dissimulation is continuous, not discrete. There is no moment at which a sensible actor becomes a dishonest one, only a gradual drift toward behaviors that the structure rewards and away from behaviors that it penalizes.</p>
<hr>
<h2 id="what-gets-selected">What Gets Selected</h2>
<p>Organizations do not select randomly among the people available to them. Over time, through promotion decisions made by individuals operating within the incentive structure described above, they exercise a form of natural selection. The behaviors that advance are the behaviors that the structure rewards. The behaviors that are penalized (transparency, technical rigor, willingness to deliver unwelcome news) become associated with career stagnation.</p>
<p>Schaefer described this dynamic in terms of the Authoritarian Hierarchy of Control: organizations structured around command and control systematically suppress independent judgment in favor of loyalty and conformance, rewarding those who display alignment with authority over those who bring accurate but unwelcome observations. The result, he noted, is that the quality of products and services tends to be driven to the lowest level of mediocrity the market will bear, and that responsibility for poor performance will be attributed to individual contributors, never to the structure that produced it.</p>
<p>This selection process has a name for each of its outcomes. HEC Montréal, one of Quebec&rsquo;s leading business schools, administers a political skill assessment that classifies managers into five profiles: Machiavellian, Strategist, Survivor, Good Soldier, and Sacrificial Lamb. The Machiavellian profile, described as driven by a strong thirst for power, politically motivated behavior, and the belief that ends justify means, is listed as having two strengths: highly effective, and achieves objectives. Ethical risks appear as a limitation, alongside friction and mistrust. The profile is presented not as a pathology but as a high-performance option with known trade-offs.</p>
<p>At the other end of the scale, the Sacrificial Lamb, described as believing that merit is sufficient, unable to decode political dynamics, potentially becoming a victim of the system, is listed as having three strengths: integrity, authenticity, and focus on work well done. Its risks include marginalization and incomprehension of real organizational dynamics.</p>
<hr>
<h2 id="what-gets-trained">What Gets Trained</h2>
<p>HEC is not inventing the reality it describes. It is documenting what it observes in organizations, and then teaching it. HEC is not alone in this. The framing of political skill as a legitimate and measurable managerial competency has been widely adopted across business schools. What was once informal knowledge (how to handle power, manage perception, read the room) has been systematized into curriculum. By naming these profiles, measuring them, and transmitting them to the next generation of managers as legitimate knowledge about how organizations actually work, business education completes a feedback loop that Schaefer identified: the selection pressure that organizations exert is validated, codified, and taught as professional competence.</p>
<blockquote>
<p><em>The Machiavellian who advances in a large organization is not a deviation from the system. They are its product: shaped by the incentive structure, selected by promotion decisions, and trained by the curriculum.</em></p>
</blockquote>
<p>There is an irony here. Schaefer&rsquo;s 2007 paper received only three citations in the seventeen years following its publication, not because it was wrong, but because the professional and academic structures of software engineering had no established category for an argument that located the root cause of system failure in governance, power, and the suppression of independent judgment. The diagnosis arrived before the vocabulary existed to receive it. That, too, is the system working as designed.</p>
<p>There is a question this article does not pretend to resolve: does the organization produce this selection pressure, which the educational institution then documents? Or does the educational institution legitimate and amplify a pressure that would otherwise remain informal? The honest answer is that causality runs in both directions. The organization and its educational infrastructure have co-evolved into a system that is now very difficult to disturb from within.</p>
<hr>
<h2 id="why-agile-was-structurally-condemned">Why Agile Was Structurally Condemned</h2>
<p>The Agile movement emerged in the early 2000s as a direct response to the dysfunctions described above. Its founding documents, particularly the Agile Manifesto, called for transparency over performance theater, genuine collaboration over contract negotiation, and working software over comprehensive documentation. It identified, correctly, that waterfall project dynamics generated exactly the kind of rigidity and deferral that technical debt represents.</p>
<p>The adoption of Agile in large organizations over the following two decades produced a result that is by now well documented: the vocabulary was adopted; the underlying dynamics were not changed. Sprints became fixed-scope, fixed-date delivery commitments. Velocity became a production output target. Retrospectives became compliance rituals. The Agile transformation was managed by the same people operating within the same incentive structure, producing the same behaviors under a new name.</p>
<blockquote>
<p><em>Agile did not transform governance. Governance transformed Agile.</em></p>
</blockquote>
<p>The standard explanation for this failure centers on the frozen middle: middle managers whose positional authority depends on the existing governance model, who absorbed the pressure for change without transmitting it upward. This explanation is correct but incomplete.</p>
<p>The deeper explanation is that Agile, authentically practiced, requires a specific type of organizational actor. It requires transparency about progress and problems, the willingness to deliver unwelcome news early, and collaboration that is genuine rather than performed. These are the behaviors associated with the Good Soldier and the Sacrificial Lamb in the HEC taxonomy, the profiles described as loyal, competent, and appreciated for their work, but also naive, vulnerable, and easily marginalized in competitive environments.</p>
<p>The Strategist and the Machiavellian, the profiles that large organizations have systematically selected and elevated, are precisely those for whom authentic Agile practice is not a viable strategy. Transparency exposes their deferral. Early bad news undermines their narrative management. Genuine collaboration limits their control of information flows. For these actors, adopting the vocabulary of Agile while hollowing out its content is political competence applied to organizational survival, not resistance to change.</p>
<p>Schaefer anticipated this failure with what he called the Process Paradox: the more a process is commanded, the less independent judgment is permitted, and when something goes wrong (as it inevitably will), the worse the consequences. Agile, commanded from above within an authoritarian hierarchy, does not produce agility. It produces a rigid process that eliminates independent judgment while preserving the appearance of flexibility. The name changes; the structure does not.</p>
<p>Agile did not fail because it was poorly designed or poorly implemented. It failed because it was introduced into organizations that had spent decades selecting against the human dispositions it required. The frozen middle did not block Agile. The selection process that produced the frozen middle made authentic Agile adoption structurally improbable before the first sprint planning meeting.</p>
<p>The Agile coach role, now a standard position in many large organizations, crystallizes this contradiction with particular clarity. It is an officially sanctioned mandate to transform a culture that the incentive structure actively reproduces. The role signals commitment to change without requiring it. In Schaefer&rsquo;s terms, it is a display directed outward: the organization can point to its coaches as evidence of transformation while the governance model remains untouched. And it produces a specific collateral damage that rarely appears in any measurement. Developers who glimpse a different way of working, who are shown what genuine collaboration and technical quality could look like, find themselves unable to practice any of it within the real constraints of the system. The choices available to them are narrow: exit the organization, remain with a chronic frustration that compounds over time, or disengage quietly and accept the distance between what they know is possible and what the system will permit. The organization does not notice this damage, because what it measures is sprint velocity.</p>
<hr>
<h2 id="the-normalization-of-failure">The Normalization of Failure</h2>
<p>One final mechanism completes the loop and explains why the system persists without generating the corrective pressure one might expect.</p>
<p>Large IT project failure is not an occasional anomaly. The Standish Group has tracked IT project outcomes for decades; their data consistently show that only around 30% of IT projects are considered fully successful, a figure that drops further for large-scale initiatives, with roughly half of all projects challenged and nearly one in five outright cancelled or abandoned. The pattern is stable across years and geographies. Yet when a specific project fails (costs overrun, the system delivered is less capable than the system it replaced, timelines stretch beyond any defensible estimate), the failure is almost never attributed to the incentive structure that generated it. It is attributed to poor management, to vendor problems, to scope creep, to technical complexity. The postmortem identifies individuals and decisions. It does not identify the game those individuals were playing or the rules that made their decisions predictable.</p>
<p>Schaefer identified this as a structural property of hierarchical governance: the source of all faults will ultimately be whatever legitimate authority claims it is, whether or not such claims are true. Accountability flows downward to individual contributors. The structure that produced the conditions for failure is never the finding. To make it the finding would require those conducting the examination to indict what elevated them.</p>
<p>This misattribution operates at two scales simultaneously, and the two reinforce each other. At the organizational level, the postmortem blames individuals and decisions, protecting the incentive structure. But the same dynamic operates earlier, at the level of the project itself. When timelines slip, as they inevitably do when architectural shortcuts accumulate and deferred complexity begins to surface, the reading is almost always that the technical team is slow, that estimates were poor, that execution was lacking. This interpretation is structurally necessary. If the delay were attributed to its actual cause, the decisions that sacrificed quality to meet an earlier date, accountability would travel upward, toward the people who made those decisions. Attributing it to technical competence severs that causal chain cleanly. The practitioners who lived through the accumulation carry the reputational cost of a problem they did not create. They raised concerns that were overridden and worked inside constraints they did not choose. Some internalize the blame, wondering whether they could have done better, whether they should have pushed back harder, whether they lack something. The structure produces this doubt as a feature, not a side effect.</p>
<p>The system then produces a second deferral: the failed system is declared legacy (too old, too rigid, too expensive to maintain) and replaced. The replacement project is governed by the same annual budget cycle, managed by the same profiles, and evaluated by the same metrics. The cycle restarts. The debt that accumulated in the previous system is not examined as evidence of a structural problem but treated as the natural aging of technology, as entropy rather than design.</p>
<p>Software does not age. The observation is Schaefer&rsquo;s, made in passing but worth dwelling on: software stays fixed in time. What changes is the context around it: the business it serves, the expectations placed on it, the people who maintain it. When an organization declares a system legacy, it is not describing a property of the technology. It is describing the accumulated consequences of decisions that were never attributed to their real cause.</p>
<blockquote>
<p><em>A system whose failures are consistently misattributed, whose lessons are never learned, and whose replacements reproduce its conditions is not a system that is trying and failing to improve. It is a system that is successfully maintaining itself.</em></p>
</blockquote>
<hr>
<h2 id="a-final-observation">A Final Observation</h2>
<p>This analysis is not offered as a counsel of despair to the practitioners who have spent years pushing against these dynamics, advocating for better design, raising concerns that were overridden, watching careful work be undone by delivery pressure. The frustration those practitioners feel does not mean they misunderstood something. It means they understood something correctly and found themselves playing a game whose rules made their understanding a competitive disadvantage.</p>
<p>Schaefer ended his 2007 paper with a question that remains unanswered: what are the limits of the will? He was asking whether individuals operating within deeply coercive systems retain any meaningful capacity for independent judgment. The question is not rhetorical. History suggests that the levers which have actually changed systems of this kind are rarely internal. They tend to be external: competitive pressure severe enough to punish rigidity, regulatory constraint that removes certain decisions from the negotiating table, or the cumulative weight of people who refuse to play the game and vote with their feet. Departures concentrate in exactly the profiles the system needs most, the Good Soldiers and Sacrificial Lambs who carry the technical judgment the Machiavellians cannot replace. Whistleblowing, when it occurs, is almost always punished before it produces change. Smaller organizations built deliberately outside the AHoC model sometimes succeed precisely because they have not yet had time to reproduce its conditions. None of these are solutions. They are the terrain on which change, when it happens, actually occurs.</p>
<p>The technical argument for architectural quality (modularity, decoupling, reversibility) remains correct. The problem is that it is a technical argument being made in an environment where the selection pressure runs in the opposite direction, and technical correctness has never overridden incentive structure.</p>
<p>What this analysis suggests is that the relevant question is not how to make the case for better architecture more persuasively. It is a prior question: in an organization that has systematically selected for political behavior, trained its managers in its legitimacy, and structured its governance to make individual rationality and collective interest incompatible, from what position, and with what leverage, is change actually possible?</p>
<p>That question does not have a technical answer.</p>
<hr>
<p><em>Gabriel Mailhot</em><br>
<em>Software Architect and Software Engineering Quality Advisor</em><br>
<em>Researcher (2005–2010): Image Processing &amp; Creative AI</em><br>
<em>Business Expert / Domain Expert (2010–2026): Software Architecture, Software Development and Quality Practices</em></p>
<hr>
<p><strong>Reference</strong></p>
<p>Schaefer, R. (2007). The Grand Theory of Everything: What Man-Made Systems Are, and Why They Fail. <em>ACM SIGSOFT Software Engineering Notes</em>, 32(4).</p>
]]></content:encoded></item><item><title>The Tipping Point</title><link>https://scripting.pro/posts/the-tipping-point/</link><pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate><guid>https://scripting.pro/posts/the-tipping-point/</guid><description>Partial AI integration in software development creates a structural instability that leads to a tipping point: a discontinuity in how organizations must configure themselves. This article examines the two stable configurations, the hierarchy of durable assets, and the organizational implications of choosing deliberately versus drifting.</description><content:encoded><![CDATA[<h1 id="the-tipping-point">The Tipping Point</h1>
<p><em>What AI Cannot Replace in Software Development, Part 3</em></p>
<hr>
<p>In a previous article in this series, I proposed a redefinition of legacy: legacy is not a property of the code itself, but a state of the relationship between the code and those expected to maintain it. A system becomes legacy the moment no one in the organization mentally inhabits what they are nonetheless expected to evolve. The problem lies less in the age of the technology than in the developer&rsquo;s lack of deep cognitive engagement with their own code.</p>
<p>This definition raises an urgent question: if generative AI produces code in place of developers, and if those developers only supervise the output without having genuinely thought through the underlying reasoning, are we creating the conditions for legacy at scale from the very first generated line?</p>
<p>The purpose of this article is to examine this question and its organizational consequences. Partial integration of AI into the development process tends to create a structural instability, one that leads logically to what I call a <em>tipping point</em>: a discontinuity in how an organization must configure itself. Getting through this transition also requires a precise understanding of which organizational assets are truly durable, and the answer is less obvious than it appears.</p>
<hr>
<h2 id="cognitive-engagement-as-a-condition-of-maintainability">Cognitive Engagement as a Condition of Maintainability</h2>
<p>When a developer writes code, they do more than produce text: they build a mental representation of the problem, its constraints, edge cases, and trade-offs. This representation lives in procedural memory and enables effective maintenance: the ability to anticipate where things will break, to understand why a decision was made, and to assess the impact of a change without simulating the entire system.</p>
<p>When a developer merely supervises AI-generated code, this mental representation does not fully form. They can read the code, validate its apparent logic, and approve a pull request, but they have not traversed the reasoning that produced it.</p>
<blockquote>
<p><em>Supervising AI-generated code without engagement in the reasoning that produces it is functionally similar to maintaining a legacy system: one understands what the code does, but not why it does it that way.</em></p>
</blockquote>
<p>I am not criticizing generative AI as such. I am describing a structural property of the situation: intellectual ownership of code is a consequence of the creation process, not of reading the result, and review cannot supply it after the fact.</p>
<hr>
<h2 id="the-tipping-point-a-structural-discontinuity">The Tipping Point: A Structural Discontinuity</h2>
<p>Organizations that integrate generative AI without changing the structure of responsibility tend to drift into an unstable intermediate state, which typically becomes visible only during the first serious incidents.</p>
<p>Developers believe they are supervising, but have progressively lost the capacity to intervene autonomously. The system keeps growing, technically modern and cognitively orphaned. In several AI-assisted transitions I have observed, the pattern is consistent: productivity is high for months, velocity metrics look excellent, confidence is strong. Then comes the first non-trivial evolution (a scaling constraint, an architectural shift, or a subtle behavioral regression), and no one can confidently explain why the system behaves as it does.</p>
<p>The problem with gradual transition is precisely that it produces this situation without anyone having made the deliberate choice to accept it. The organization bears the costs of both models without benefiting from the advantages of either.</p>
<p>The relationship between human intellectual ownership and AI integration is not linear. Below a certain threshold of engagement, maintainability tends to collapse in a way that is difficult to reverse once the accumulated gap reaches critical mass. This threshold is the tipping point. It separates two internally stable configurations from a fragile intermediate zone.</p>
<hr>
<h2 id="the-two-stable-configurations">The Two Stable Configurations</h2>
<p><strong>The Human-Author Model</strong></p>
<p>Humans remain the cognitive authors of the code. Generative AI serves as an accelerator for boilerplate, refactoring, or exploration, but the developer still traverses the reasoning. They can explain every significant decision, debug unexpected behaviors, and anticipate the consequences of changes. This model preserves long-term maintainability and integrates naturally with existing quality practices. Its main constraint is speed: AI amplifies productivity but does not replace the human traversal of reasoning.</p>
<p><strong>The Agent-Author Model</strong></p>
<p>Agents become responsible for producing the code. Humans step out of the traditional technical loop. In exchange, the organization reconfigures itself deeply: code loses its status as a durable strategic asset and becomes a temporary instantiation of behavior defined elsewhere, rewritten on demand from specifications and behavioral tests, which now form the primary reference. Classical technical debt tends to be largely replaced by a different form of accumulated cost centered on specification quality and test completeness. Architecture becomes declarative: focused on <em>what</em> the system must do, not <em>how</em>.</p>
<p>Which of these assets, then, are truly durable over time? Current agent-oriented frameworks largely leave this question unanswered, and it deserves careful examination before committing to this model.</p>
<hr>
<h2 id="the-hierarchy-of-durable-assets">The Hierarchy of Durable Assets</h2>
<h3 id="specification-drift-and-the-limits-of-natural-language-stability">Specification Drift and the Limits of Natural Language Stability</h3>
<p>Current agent-oriented frameworks tend to treat specifications as a stable abstraction layer above the model. The assumption is that you write the spec once and can reliably regenerate the system across model versions and technology changes.</p>
<p>This assumption deserves scrutiny. Practitioners already observe <em>prompt drift</em>, <em>LLM drift</em>, and <em>context drift</em>: the gradual degradation in how a specification is interpreted as models evolve. A specification that worked reliably with one model version can produce subtly different behaviors in its successor, not because the spec changed, but because the model&rsquo;s implicit understanding of its constructs has shifted. The long-term stability of a specification is coupled, implicitly, to the stability of the model that interprets it.</p>
<p>In systems meant to last years or decades, this <em>specification drift</em> becomes more than a prompt engineering inconvenience; it threatens the long-term reproducibility of the system itself. Subtle divergences can accumulate in the spaces between explicit requirements, even when tests continue to pass on covered behaviors. Current frameworks do not yet formally manage this coupling.</p>
<h3 id="the-asset-hierarchy">The Asset Hierarchy</h3>
<p>This leads to a clear hierarchy of durability:</p>
<ul>
<li><strong>Code</strong> is ephemeral by design, the least durable asset. It is regenerated, not evolved.</li>
<li><strong>Specifications</strong> are semi-stable. More durable than code, but subject to semantic drift relative to evolving models. They require active, periodic re-validation.</li>
<li><strong>Behavioral tests</strong> constitute the most stable anchor. A well-designed test yields a binary, objective verdict (it passes or it fails), independent of any model&rsquo;s interpretation of intent.</li>
</ul>
<p>However, the durability of tests ultimately rests on the quality of the human oracle that defines them. A poorly conceived test can protect incorrect behavior as reliably as a good one protects the right one. This brings us back directly to the oracle problem examined in the first article of this series: tests are only as strong as the human reasoning behind them.</p>
<blockquote>
<p><em>In the agent-author model, the true organizational anchor is the behavioral test suite, but only insofar as it crystallizes genuine human understanding of expected behavior. Tests are the formal record of the oracle&rsquo;s judgment, not a substitute for it.</em></p>
</blockquote>
<h3 id="quality-assurance-as-a-foundational-discipline">Quality Assurance as a Foundational Discipline</h3>
<p>This inversion is structural. In traditional development, QA is positioned as downstream validation. In the agent-author model, defining, maintaining, and evolving behavioral tests becomes the first step in the process, and the most consequential one.</p>
<p>The quality engineer who designs solid behavioral test suites is no longer in a support role. They steward the behavioral knowledge that makes reliable system regeneration possible across time, model versions, and technology generations. QA shifts from a verification function to a core strategic competency.</p>
<hr>
<h2 id="the-human-role-in-the-agent-author-model">The Human Role in the Agent-Author Model</h2>
<p>Agents operate within a bounded context, a necessary reduction of reality that always implies information loss. The real world is structurally larger than any context an agent can receive: regulatory constraints, internal political dynamics, implicit contractual commitments, strategic directions, stakeholder relationships. None of this is fully visible to a system operating within a defined context.</p>
<p>A concrete example: agents might correctly choose a technically superior tool within their context, yet overlook a token cost ten times higher, an unevaluated vendor dependency, or a strategic direction not yet formally communicated. These elements simply were not in their context.</p>
<p>The human role is therefore not to supervise code, but to maintain alignment between the space of agents and the real world that will never be entirely captured in a context. It is a <em>translation role</em>: transposing the constraints, objectives, and values of the real world into clear intentions for systems that operate within bounded spaces. Humans retain responsibility for the <em>what</em> and the <em>why</em>. Agents manage the <em>how</em>.</p>
<p>In this model, IT professionals do not disappear; they migrate. Their expertise moves from writing code to mastering specification quality, behavioral verification, and domain knowledge. The longstanding comprehension gap between business and IT dissolves here through a deeper reconfiguration of the IT role itself.</p>
<hr>
<h2 id="a-historical-precedent-the-transition-to-deep-learning">A Historical Precedent: The Transition to Deep Learning</h2>
<p>The shift I describe has a direct parallel in AI&rsquo;s own history. For several decades, symbolic expert systems emphasized full interpretability: every rule was explicit and traceable. The transition to deep learning abandoned this property. Neural networks produce impressive results through mechanisms their creators cannot fully explain. The debate was settled by results rather than philosophy: deep learning produced capabilities that symbolic systems could not reach.</p>
<blockquote>
<p><em>AI became what it is today because the scientific community collectively accepted abandoning internal interpretability as a necessary condition of a system&rsquo;s validity. Observable performance replaced transparency of mechanism as the primary evaluation criterion.</em></p>
</blockquote>
<p>The parallel with the tipping point is direct. In the agent-author model, one abandons code comprehensibility as a condition of maintainability. It is replaced by the quality of specifications and, above all, the completeness of behavioral tests. Observable performance replaces internal understanding.</p>
<p>This precedent does not prove the tipping point is inevitable everywhere, but it shows that abandoning one form of comprehensibility for another form of validation can produce significant gains, and that resisting the shift can carry a competitive cost.</p>
<hr>
<h2 id="the-organizational-question-the-greenfield-model">The Organizational Question: The Greenfield Model</h2>
<p>For large organizations with decades of technological history, transforming the existing base is rarely feasible in the short term. Legacy systems (those for which intellectual ownership has already been lost) do not lend themselves to migration toward the agent-author model without massive prior investment in specification.</p>
<p>The coherent pattern is the <em>greenfield model</em>: creating a new entity, such as a division, a subsidiary, or a distinct organization, configured according to the agent-author model from day one. This entity develops the competencies in specification, declarative architecture, and behavioral testing while the existing organization continues under the human-author model.</p>
<p>This pattern is not without precedent. Large financial institutions have used it for digital transformation initiatives. Cooperatives have created subsidiaries to explore new business models without risking their operational core. When transformation requires a reconfiguration too deep to be achieved from within, one creates something new alongside.</p>
<p>The resulting coexistence, with units in human-author mode managing the existing systems and units in agent-author mode building the future, is stable when the boundary between the two models is explicit and deliberate. The danger lies in blurring the line between them, not in having two models.</p>
<hr>
<h2 id="implications-for-practitioners-and-decision-makers">Implications for Practitioners and Decision-Makers</h2>
<p>Three practical observations emerge:</p>
<p><strong>First</strong>, diagnose honestly. The relevant question is not &ldquo;what percentage of our code is AI-generated?&rdquo; but &ldquo;can our developers intervene autonomously and confidently in the code that exists?&rdquo; An uncertain answer signals that the organization is likely already in the unstable intermediate zone, without having made the deliberate choice to be there.</p>
<p><strong>Second</strong>, choose deliberately. Maintaining the human-author model requires frameworks that preserve developers&rsquo; traversal of reasoning: not excluding AI, but ensuring they remain genuine authors of what they maintain. Moving to the agent-author model demands significant prior investment in specification quality and behavioral tests <em>before</em> the transition, not after.</p>
<p><strong>Third</strong>, protect the right asset. Resist the temptation to treat specifications as the primary investment. The behavioral test suite, grounded in rigorous human judgment, is the more stable and strategically critical anchor. Specifications communicate intent to agents; tests verify that the intent was correctly understood. Only the latter survives model evolution without active re-validation.</p>
<p>The intermediate zone, where humans supervise code they have not genuinely inhabited without strong specifications and tests, is a trap rather than a transitional state. It is precisely where tomorrow&rsquo;s legacy forms, at the accelerated speed of generative AI.</p>
<hr>
<p>In the previous article in this series, I argued that the capacity to judge the correctness of a result is an irreplaceably human competency. Machines can evaluate outputs; what they cannot do is define what constitutes a correct output, because that requires an understanding of the real world that exceeds any formalizable context.</p>
<p>The tipping point does not contradict this thesis. It extends it upward. In the agent-author model, humans no longer judge the correctness of code. They define the behavioral tests that encode what correctness means, and they translate the real-world constraints that no bounded context will ever fully capture. The oracle does not disappear: it moves upstream and becomes the organization&rsquo;s most critical competency.</p>
<p>AI is already transforming software development.<br>
The question is whether your organization will deliberately choose its tipping point, or simply drift into one without realizing what it has surrendered.</p>
<hr>
<p><em>Gabriel Mailhot</em><br>
<em>Organizational Engineering for the AI Era<br>
Researcher (2005–2010): Image Processing &amp; Creative AI<br>
Business Expert / Domain Expert (2010-2026): Software Architecture, Software Development and Quality Practices</em></p>
<p><em>Series: <a href="/series/what-ai-cannot-replace-in-software-development/">What AI Cannot Replace in Software Development</a></em></p>
]]></content:encoded></item><item><title>Memory, Speed, and Understanding: The Cognitive Division Between Developer and AI</title><link>https://scripting.pro/posts/the-cognitive-division/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><guid>https://scripting.pro/posts/the-cognitive-division/</guid><description>What the developer must retain, what can legitimately be delegated, and why confusing the two leads to the erosion of knowledge.</description><content:encoded><![CDATA[<p><em>What AI Cannot Replace in Software Development, Part 2</em><br>
<em>What the developer must retain, what can legitimately be delegated, and why confusing the two leads to the erosion of knowledge.</em></p>
<hr>
<h2 id="an-operational-distinction">An Operational Distinction</h2>
<p>I have spent a significant part of my career working with organizations whose human foundation is unstable: high turnover, frequent reassignments, temporary teams assembled for a project and dissolved at its close. In these organizations, something specific happens to software systems over time. The knowledge of why the code is the way it is gradually disappears.</p>
<p>It is most visible with legacy systems. Take VB6 applications, COBOL modules, early Java codebases: the developers who built them have moved on, retired, or simply forgotten. What remains is the code itself, and a thin layer of documentation that rarely captures the decisions and constraints that shaped it. New developers inherit a system they can run but not fully understand.</p>
<p>I had assumed this was a problem of time, in which knowledge erodes because the people who held it leave. Then I started observing something different in teams using AI coding assistants intensively. The developers were still there, yet the knowledge was still eroding. The mechanism was disengagement rather than departure.</p>
<p>AI creates distance through engagement rather than through time, and that distinction changes how we should think about what developers must retain.</p>
<hr>
<h2 id="the-structural-advantages-of-ai-memory-and-computational-speed">The Structural Advantages of AI: Memory and Computational Speed</h2>
<p>AI has two advantages that do not depend on the quality of the model or its version: near-unlimited memory and processing speed that vastly exceeds human cognition.</p>
<p>Memory first. A large language model has been trained on billions of lines of code, millions of technical discussions, years of documentation. It can instantly retrieve the exact syntax of a rarely used API, the correct pattern for an obscure edge case, the exhaustive list of parameters for a given function. No developer, however experienced, can compete on this terrain.</p>
<p>Speed next. AI accomplishes in seconds what would take hours: generating boilerplate, converting an algorithm from one language to another, reformatting a data structure, producing variants. This is a real, measurable advantage, and it is not going away.</p>
<p>These two advantages are what they are: memory and performance, not judgment.</p>
<hr>
<h2 id="what-the-developer-must-retain-causal-understanding">What the Developer Must Retain: Causal Understanding</h2>
<p>The boundary between what AI does well and what it cannot do is more precise than a split between memory and reasoning in the abstract sense. It runs between pattern recognition and causal understanding.</p>
<p>An experienced developer who identifies a race condition in multithreaded code does more than recognize a familiar pattern. They understand why that pattern is problematic in this specific context: which timing constraint creates the risk, which property of the system makes the bug intermittent, which fix will resolve the problem without creating another.</p>
<p>AI can recognize the pattern. It does not possess the causal understanding that allows one to evaluate whether that recognition is relevant in this context. This understanding of the system, the domain, and the real constraints is what the developer must retain.</p>
<p>The concern has empirical support. A randomized controlled trial examining how AI coding assistance affects skill development found that developers using AI assistance scored 17 percentage points lower on comprehension and debugging tests than those coding manually (50% versus 67% on average). The contrast was even sharper by usage pattern: developers who delegated code generation to AI scored below 40%, while those who used AI for conceptual inquiry while coding independently scored 65% or higher. The engagement pattern mattered more than the tool itself.</p>
<p>This includes, as discussed in the first article of this series, the definition of expected behaviors and the design of tests. These activities call for judgment about what the system must do in the real world, not memorization.</p>
<hr>
<h2 id="knowledge-erosion-an-underestimated-organizational-risk">Knowledge Erosion: An Underestimated Organizational Risk</h2>
<p>When a developer delegates to AI not only memory and speed, but also understanding, a silent phenomenon takes hold: knowledge erosion.</p>
<p>The traditional form of this erosion is familiar. Developers leave, and with them goes the understanding of why the system is structured the way it is (the decisions, constraints, and trade-offs that shaped it). Call it a distance of time: the gap between the people who understood the system and those who now maintain it.</p>
<p>What AI introduces is structurally different. The developers are still there, but their engagement with the code has diminished. The cognitive effort of reading it, holding its structure in mind, and reasoning about its consequences no longer happens. They generate, accept, and move on, and the knowledge never forms.</p>
<p>This is a distance of engagement, and it is more insidious than the distance of time because it is invisible. The team is stable, the velocity metrics are green, the system runs. Yet the understanding that would allow someone to reason confidently about changing it has quietly failed to accumulate: anticipating the consequences of a modification, recognizing a subtle regression, formulating a test without looking at the code.</p>
<p>Teams using coding assistants intensively report that developers increasingly struggle to explain code they have recently written themselves. Understanding atrophies from lack of exercise, and a developer who does not fully understand their own system can no longer evaluate its quality. This closes the loop with the testing problem from the first article. Such developers can no longer verify that the system does what it should. They may not have lost sight of the intent, but they no longer understand the code well enough to reason about whether it delivers it.</p>
<hr>
<h2 id="the-optimal-division-of-labor">The Optimal Division of Labor</h2>
<p>The right question is therefore not &ldquo;should we use AI?&rdquo; but &ldquo;for what should we use it?&rdquo;</p>
<p><strong>AI as a memory extension:</strong> syntax, APIs, known patterns, mechanical conversions, boilerplate. The developer formulates the request, evaluates the result, decides whether to integrate it. AI accelerates access to what they already know how to look for.</p>
<p><strong>The developer as guardian of understanding:</strong> architecture, expected behaviors, edge cases, domain constraints, tests, decisions that commit the future of the system. These activities are not delegated. AI may well produce something that resembles them, but their value lies precisely in the human judgment that produces them.</p>
<p>This division is a stable structure rather than a temporary limitation, grounded in what causal understanding requires: lived experience of the system, knowledge of the domain, and accountability for the outcome.</p>
<hr>
<h2 id="implications-for-organizations-and-training">Implications for Organizations and Training</h2>
<p>This analysis has direct consequences for how organizations train their developers and evaluate the value of AI.</p>
<p>On training: the goal should not be to teach developers to use AI, but to ensure that AI use does not replace the development of understanding. Practices that require reading code, manual debugging, and peer review, precisely those that delivery pressure tends to eliminate, become more important.</p>
<p>On value assessment: the usual metrics (lines of code produced, delivery speed, test coverage rates) do not capture knowledge erosion. An organization can see its metrics improve while its capacity to master its own system degrades. The indicators that matter are harder to measure: a developer&rsquo;s ability to explain why an architectural decision was made, to recognize a subtle regression without running the tests, or to reason confidently about the consequences of a change they have not yet made.</p>
<p>AI does not save time; it changes the nature of work by shifting value toward what the machine cannot do. Organizations that understand this invest in human understanding. Those that do not let it atrophy without even noticing.</p>
<p>Legacy systems are already showing us what a system looks like when its knowledge has disappeared. The question is whether we are building the legacy systems of 2035 right now. If the specifications and tests that protect expected behavior are themselves produced by developers who no longer fully understand the system, the circle closes on itself, and the erosion spreads beyond the code to the knowledge that was supposed to protect it.</p>
<hr>
<blockquote>
<p>The distance of engagement is a choice, until it isn&rsquo;t.</p>
</blockquote>
<hr>
<p><em>Gabriel Mailhot</em><br>
<em>Software Architect and Software Engineering Quality Advisor</em><br>
<em>Series: <a href="/series/what-ai-cannot-replace-in-software-development/">What AI Cannot Replace in Software Development</a></em></p>
]]></content:encoded></item><item><title>Unit Testing and Artificial Intelligence: The Oracle Problem</title><link>https://scripting.pro/posts/the-oracle-problem/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><guid>https://scripting.pro/posts/the-oracle-problem/</guid><description>A perspective on the structural limits of automated test generation, and what they reveal about the nature of work in software engineering.</description><content:encoded><![CDATA[<p><em>What AI Cannot Replace in Software Development, Part 1</em><br>
<em>A perspective on the structural limits of automated test generation, and what they reveal about the nature of work in software engineering.</em></p>
<hr>
<h2 id="the-problem-nobody-names">The Problem Nobody Names</h2>
<p>A few years ago, I reviewed a software development contract between an organization and a vendor. The terms were standard: a fixed delivery date, a penalty clause for late delivery, and an obligation to maintain 80% code coverage. The intent was twofold. It would protect the organization from negligence, and guard against the kind of deliberate opportunism that governance frameworks exist precisely to prevent.</p>
<p>When the project fell behind schedule, the vendor found a way to satisfy the coverage requirement without slowing down: they had the AI generate unit tests after the developers had written the code. The coverage metric turned green, the delivery date was met, and the penalty was avoided.</p>
<p>Then came UAT, and the acceptance phase surfaced problem after problem. The tests had protected nothing, because they had been written to describe what the code did rather than what the system was supposed to do.</p>
<p>The contract had specified a metric, and the metric had been satisfied. The organization had paid, contractually and technically, for a test suite that institutionalized its own blind spots.</p>
<p>I am often asked whether it is a good idea to let AI generate unit tests. That experience is part of my answer. The complete answer is more interesting, because it touches on the nature of testing, the source of truth in a software system, and what AI actually changes in the work of a developer.</p>
<hr>
<h2 id="the-test-oracle-problem-what-research-already-knows">The Test Oracle Problem: What Research Already Knows</h2>
<p>In the software engineering literature, the problem has a precise name: the test oracle problem. It designates the central challenge of any automated test generation. How do you automatically distinguish correct behavior from incorrect behavior?</p>
<p>Automated generation tools, including those based on large language models, produce what are called regression oracles: tests that capture what the code does today, not what it should do.</p>
<p>When you ask AI to generate tests from source code, you invert the causality of testing. The test becomes a mirror of the implementation, and if the implementation contains a bug, the test will capture it in order to protect it rather than flag it. Beyond introducing a bug into the system, you put in place an infrastructure that resists its correction.</p>
<p>Alan Turing demonstrated formally that one can never prove a program is free of all bugs. This is a consequence of undecidability: no general procedure can determine whether a program behaves correctly in all cases. In practice, this means there will always be incorrect behaviors the code produces without anyone having intended them. When AI takes the code as its source of truth, it freezes these invisible behaviors at industrial scale.</p>
<p>The test oracle problem is not new; what AI changes is its scale. A developer writing tests manually is constrained by the time it takes. An AI generating tests from code can institutionalize incorrect behavior at industrial speed, producing in seconds a test suite that would have taken days to write and that is wrong in exactly the same way throughout.</p>
<hr>
<h2 id="what-kent-beck-understood-and-what-automated-generation-ignores">What Kent Beck Understood, and What Automated Generation Ignores</h2>
<p>Kent Beck, in his Test-Driven Development philosophy, establishes a distinction that remains underappreciated: a test must speak to behavior, not implementation. Behavior is the very reason the code needs to exist. Unlike code, it is stable: it survives refactorings, technology changes, and complete rewrites.</p>
<p>A behavior-based test is a living document of the system&rsquo;s intent. Future developers will refer to it to understand what the system must do, as opposed to what it happens to do today.</p>
<p>A test generated from code lies about that intent, documenting the accident rather than the design.</p>
<p>This has an organizational consequence the technical literature does not make explicit. An untested bug can be discovered and fixed freely. A bug protected by a test becomes a norm. Any attempt to correct it will cause the test to fail, creating institutional pressure not to fix it. At that point the problem is one of governance as much as of technique.</p>
<blockquote>
<p>A test generated from code does not protect against bugs. It protects against change, including the change that would fix the bug.</p>
</blockquote>
<hr>
<h2 id="the-limits-of-specifications-as-a-substitute">The Limits of Specifications as a Substitute</h2>
<p>One might think the problem is solved by asking AI to generate tests from specifications rather than from code. This is a direction academic research is actively exploring, enriching prompts with documentation, developer comments, and semantic context. It is better, but it is not enough.</p>
<p>A specification is always incomplete. Consider a typical example: a spec describes how a search feature should return results ranked by relevance. It says nothing about what happens when two users submit the same query simultaneously, or how the system should behave when the underlying index is being updated, or what &ldquo;relevance&rdquo; means when the user&rsquo;s implicit intent differs from their explicit query. No negligent author forgot these edge cases. They belong to the class of conditions that only become visible when the system meets real users in a real environment.</p>
<p>Human judgment detects these gaps naturally, by confronting the spec with lived experience of how systems fail, how users actually behave, and what the production environment will impose. AI generates tests that are consistent with what is written, without the ability to signal what is missing.</p>
<p>A better model will not remove this limitation, because it is structural rather than temporary: understanding the real world, with its complexity, ambiguity, and unspoken assumptions, remains a capability current systems do not possess.</p>
<hr>
<h2 id="the-real-asset-of-a-software-organization">The Real Asset of a Software Organization</h2>
<p>In a world where AI generates code, the real asset of an organization becomes its specifications and its tests.</p>
<p>The code itself will be rewritten, migrated, replaced. What endures is the knowledge of expected behavior, captured by humans who understand the problem in its full complexity.</p>
<p>This conclusion does not appear in the technical literature or in analyst reports, which measure the value of AI in terms of volume produced. It is a thesis about the nature of a software organization&rsquo;s intellectual asset, and it radically changes what is worth investing in.</p>
<p>Organizations that have understood this invest in the quality of their specifications and in the human rigor of their tests. Those that delegate both to AI, working from existing code, leave their technical debt in place while making it harder to see and harder to correct.</p>
<p>The question of what the developer must retain, and what can legitimately be delegated, extends beyond the problem of tests alone. It touches on the cognitive division between human and machine, which is the subject of the next article in this series.</p>
<hr>
<blockquote>
<p>If the real asset of a software organization is not its code but its understanding of expected behavior, who in your organization is responsible for building and protecting that understanding? And what happens to it when the pressure to deliver is high enough?</p>
</blockquote>
<hr>
<p><em>Gabriel Mailhot</em><br>
<em>Software Architect and Software Engineering Quality Advisor</em><br>
<em>Series: <a href="/series/what-ai-cannot-replace-in-software-development/">What AI Cannot Replace in Software Development</a></em></p>
]]></content:encoded></item><item><title>Legacy Is Not a Property of Code</title><link>https://scripting.pro/posts/legacy-is-not-a-property-of-code/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://scripting.pro/posts/legacy-is-not-a-property-of-code/</guid><description>Legacy code is not about age, language, or missing tests. It is the state of a system whose meaningful relationship with its human maintainers has been broken.</description><content:encoded><![CDATA[<p><em>A sociotechnical perspective on what makes code legacy, and what actually keeps it alive.</em></p>
<hr>
<p>In the organization where I work, there is a mainframe COBOL system that has been running at the core of operations for decades. By every conventional definition, it should be legacy: old language, old architecture, a technology that most developers under forty have never touched.</p>
<p>It is not legacy. The team responsible for it is among the most mature and capable in the organization. They understand every decision embedded in that system: the constraints that shaped it, the business rules it encodes, the edge cases it handles. They can explain why a specific field is structured a certain way, what regulatory requirement drove a particular branching condition, and exactly what would happen downstream if you changed it. There is no question about the system they cannot answer.</p>
<p>Contrast that with a microservices architecture I reviewed at another organization. It had been built two years prior on a modern stack, with 85% test coverage and a full CI/CD pipeline. The team that built it had since been reorganized. No one could explain why the service boundaries had been drawn that way. Modifying anything felt like defusing a bomb. That system was legacy from the inside out, despite being less than two years old.</p>
<hr>
<p>Michael Feathers defined legacy code as code without tests. The definition is pragmatic and useful, since tests reduce the uncertainty of change, but it is incomplete.</p>
<p>Tests are not the cause of human engagement with code. They are a partial substitute for its erosion.</p>
<p>When a team genuinely understands a system (its decisions, its constraints, its intended behaviors), tests are almost redundant as a knowledge preservation mechanism. When that understanding has eroded, tests become the last line of defense against the unknown. They matter enormously in that role. But their presence does not mean the understanding is there.</p>
<hr>
<p>Legacy is not a property of the code. It is the state of the relationship between the code and the people responsible for it.</p>
<p>A system becomes legacy at the moment when no one can confidently answer: <em>why does it work this way?</em> Not <em>how</em>, since any developer can read code, but <em>why</em>: the reasoning, the trade-offs, the domain constraints that shaped the implementation. When that knowledge is gone, whether through team turnover, disengagement, or the gradual accumulation of changes nobody fully understood, the system has crossed the threshold.</p>
<p>This distinction matters because it changes what the problem actually is. If legacy is a technical property, the solution is technical: rewrite, refactor, add tests, modernize the stack. If legacy is a relational property (a broken link between a system and its human maintainers), then the solution requires restoring that link. Sometimes that means tests. More often it means something harder: rebuilding the shared understanding of what the system is supposed to do, and why.</p>
<hr>
<p>Tests, documentation, and architecture diagrams are mechanisms for transmitting intent across time and team boundaries. They matter, but they are proxies for something more fundamental: the capacity of a human being to understand a system well enough to change it with confidence.</p>
<p>As long as that capacity exists, the software is alive, regardless of its age, its language, or its test coverage.</p>
<p>The moment it disappears, the system becomes legacy. And no amount of refactoring will fix that without first addressing the human dimension.</p>
<hr>
<p><em>This is the foundation on which the rest of this series is built. The next article takes up the question that follows: what happens to that human capacity when AI generates the code?</em></p>
<hr>
<p><em>Gabriel Mailhot</em><br>
<em>Software Architect and Software Engineering Quality Advisor</em><br>
<em>Series: <a href="/series/what-ai-cannot-replace-in-software-development/">What AI Cannot Replace in Software Development</a></em></p>
]]></content:encoded></item><item><title>Structural Analogy as a Diagnostic Method: How to Read Organizational Pathologies Through Distant Domains</title><link>https://scripting.pro/posts/structural-analogy-diagnostic/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://scripting.pro/posts/structural-analogy-diagnostic/</guid><description>How structural analogy across distant domains can serve as a rigorous diagnostic method for organizational pathologies, and why the difference between metaphor and analogy is epistemological rather than stylistic.</description><content:encoded><![CDATA[<p><em>A first series of four articles on technology governance is already published on LinkedIn and established a diagnosis: inherited governance models are structurally misaligned with the pace of AI-driven change. This new series addresses a prior question: how do we diagnose organizational pathologies rigorously in the first place? The answer proposed here is methodological: structural analogy across distant domains.</em></p>
<hr>
<h2 id="why-i-am-writing-this">Why I Am Writing This</h2>
<p>I have been thinking about analogy since 2005, longer than I have been thinking about most things professionally.</p>
<p>At the time, I was working as a researcher in Québec City, trying to build a system that could assist creative professionals in finding visual inspiration. The technical problem was tractable. But solving it required first answering a question I had not expected: what is creativity, actually? Not as a personality trait or a cultural value, but as a cognitive mechanism.</p>
<p>The answer I arrived at led to an architecture, a patent specification, and a set of ideas that I could not discuss publicly for fifteen years due to contractual obligations.</p>
<p>By the time those constraints lifted, the world had changed considerably. LLMs had appeared, AI had become a public conversation, and the organizations I was working with were exhibiting exactly the pathologies I had been thinking about. I finally had both the freedom and the context to say so.</p>
<p>This essay is where those two threads meet.</p>
<blockquote>
<p>The solutions to most organizational problems already exist. They were developed in other domains, under a different name.</p>
</blockquote>
<hr>
<h2 id="analogy-versus-metaphor-a-distinction-that-matters">Analogy versus Metaphor: A Distinction That Matters</h2>
<p>There is a common confusion between metaphor and analogy that matters more than it might appear. A decorative metaphor makes an idea accessible; it creates recognition, sometimes resonance. A structural analogy reveals a real correspondence between two systems: it diagnoses, and it points toward solutions. The difference is epistemological, not stylistic.</p>
<p>Saying &ldquo;an organization is like an organism&rdquo; is a metaphor. It invites a certain way of seeing. Demonstrating that the mechanism of cellular apoptosis and the dysfunction of project management share exactly the same causal structure (a local unit disconnected from systemic feedback, optimizing for its own survival at the cost of the whole) is a structural analogy. The first inspires; the second diagnoses.</p>
<p>The core formulation is this: human creativity is combinatorial, not generative ex nihilo. The only way to produce something genuinely new within a bounded experiential space is to discover a structural correspondence between two distant domains that are already known. Novelty is a function of semantic distance between domains. Utility is a function of the match with the problem and with the evaluator&rsquo;s own criteria.</p>
<p>This formulation connects to a tradition of research in cognitive science that has approached the same question with more formal rigor. Dedre Gentner&rsquo;s structure-mapping theory (1983) established that what gets mapped in an analogy is not object attributes but relational structure: the causal and functional architecture of a domain, independent of its surface content. Douglas Hofstadter and Emmanuel Sander, in <em>Surfaces and Essences</em> (2013), argued that analogy is not a special cognitive operation but the very engine of thought, the mechanism by which every act of categorization and understanding operates. Arthur Koestler, in <em>The Act of Creation</em> (1964), called the productive collision of two incompatible frames of reference &ldquo;bisociation,&rdquo; the mechanism behind both humor and discovery.</p>
<p>What this research tradition establishes, and what the diagnostic method proposed here builds on, is that structural correspondence is the operative criterion. The question is not whether &ldquo;these domains feel similar&rdquo; but whether &ldquo;these domains share the same relational architecture.&rdquo; The implication for organizational diagnosis is direct: the value of an analogy is structural rather than rhetorical, and it can be evaluated as such.</p>
<hr>
<h2 id="a-taxonomy-of-analogical-domains">A Taxonomy of Analogical Domains</h2>
<p>Not all distant domains are equivalent as diagnostic tools, and not all combinations of domains are equally powerful. The patent specification formalized a taxonomy for a metaphor-based search system, and that taxonomy maps directly onto the diagnostic method proposed here.</p>
<p>Three types of relationships between analogical domains matter:</p>
<p><strong>Alternative domains</strong> cover the same structural dimension of the problem. They are interchangeable: selecting one or the other yields the same diagnostic contribution. Using both is redundant. They compete rather than combine.</p>
<p><strong>Complementary domains</strong> cover distinct structural dimensions of the problem. They are combinable, and their combination produces a structural coverage that neither achieves alone. This is where the power of the method concentrates: finding two or three domains that together cover all dimensions of the problem.</p>
<p><strong>Linked domains</strong> are complementary domains that also share an internal overlap with each other. That coherence strengthens the combination and makes it more than the sum of its parts.</p>
<p>The selection criterion for a strong set of analogical domains is therefore maximum structural coverage with maximum internal coherence, not quantity. Three well-chosen complementary domains with strong internal links produce a richer diagnostic than ten loosely related ones.</p>
<p>This taxonomy disciplines the method. Without it, analogical reasoning risks becoming what it seeks to transcend: the accumulation of decorative metaphors that feel illuminating without actually diagnosing anything.</p>
<hr>
<h2 id="the-constraint-of-the-judge">The Constraint of the Judge</h2>
<p>A structurally rigorous analogy is not automatically an adopted solution. Its value is co-constructed between the structural correspondence and the human evaluator who receives it.</p>
<p>The 2005 theory was precise on this point: utility is a function of the match with the problem and with the evaluator&rsquo;s own criteria. For organizational diagnostics, this introduces a constraint that the method cannot dissolve but can make visible: the judges of a proposed solution are often precisely the people whose reward system is aligned with the status quo that the solution diagnoses.</p>
<p>A chief risk officer evaluating a proposal to extend project manager accountability beyond delivery dates is simultaneously the person whose career was built on the existing governance model. A board reviewing a recommendation to shift from process-driven to principle-driven governance is the same board that approved the processes now being questioned.</p>
<p>The method does not resolve this. What it does is name it with precision, which is the first condition for treating it. It also shifts the framing: the resistance is structurally predictable rather than irrational. That means it can be anticipated and designed around, and sometimes dissolved by finding the frame in which the solution resonates with the judge&rsquo;s own criteria.</p>
<p>This is itself an analogical problem: finding the presentation of the solution that achieves maximum structural coverage of the judge&rsquo;s own conceptual framework. The method recurses.</p>
<hr>
<h2 id="the-demonstration-project-management-and-the-short-horizon">The Demonstration: Project Management and the Short Horizon</h2>
<h3 id="the-observation">The Observation</h3>
<p>A technology asset with a multi-year lifecycle is managed through a sequence of fixed-budget, fixed-date projects. Each project team is constituted for the duration of the project and evaluated on its ability to deliver within its commitments. Decisions are made to protect delivery dates and budget envelopes, and those decisions degrade the asset over the longer term. The team&rsquo;s focus has shifted from the organization&rsquo;s interest to the project&rsquo;s success, which are not the same thing.</p>
<p>The pathology is consistent and well-recognized by practitioners. What is less well-understood is its causal structure, and therefore what kinds of interventions might actually address it rather than merely managing its symptoms.</p>
<h3 id="applying-the-taxonomy-three-complementary-domains">Applying the Taxonomy: Three Complementary Domains</h3>
<p>The search for analogical domains begins with a structural characterization of the dysfunction: a local unit optimizes for its own constraints, producing decisions whose costs are externalized to the larger system and to the future. The local unit has no mechanism to perceive or weight these externalized costs. Its reward system reinforces the optimization.</p>
<p><strong>Domain 1, Biology (apoptosis): the mechanism</strong></p>
<p>A cancer cell is not malfunctioning within its own frame of reference. It is optimizing perfectly for its own reproduction, which is precisely what makes it pathological for the organism. What is absent is apoptosis: the signal received from the organism that tells the cell when to stop reproducing, when to sacrifice itself for the integrity of the whole. Cancer is cellular disconnection rather than cellular rebellion: the rupture of the feedback channel through which the organism communicates systemic state to its constituent units.</p>
<p>The project team is in the structurally identical situation. It is not irresponsible by nature; it is disconnected from the signals that would allow it to integrate the systemic impact of its decisions. The organizational system has not built the equivalent of apoptosis, the mechanism by which a local unit receives information about what its decisions cost the larger whole.</p>
<p><em>What this domain contributes: the dimension of mechanism.</em> The pathology is architectural, not motivational. The solution direction is not better incentives alone but the construction of a feedback channel.</p>
<p><em>Taxonomy check:</em> this domain covers the mechanism dimension. It does not address who bears responsibility for the effects, nor why the disconnection is individually rational.</p>
<p><strong>Domain 2, Law (deferred responsibility): the governance gap</strong></p>
<p>Law has progressively recognized that retrospective responsibility is insufficient when effects are diffuse and temporally distant. The evolution from simple liability to fiduciary duty, from shareholder primacy to stakeholder obligation, from individual fault to systemic accountability, represents a legal tradition grappling with exactly the problem at hand: how to assign responsibility for effects that materialize outside the perimeter and after the horizon of the actor who caused them.</p>
<p>The project manager&rsquo;s perimeter of responsibility does not correspond to the perimeter of impact of their decisions. That is a governance design problem rather than a competence problem, and law has spent two centuries developing frameworks for precisely this mismatch.</p>
<p><em>What this domain contributes: the dimension of governance.</em> It reframes the question from &ldquo;how do we motivate better behavior&rdquo; to &ldquo;how do we design a responsibility structure whose perimeter matches the impact perimeter of the decisions being made.&rdquo;</p>
<p><em>Taxonomy check:</em> complementary to biology. Biology covers mechanism; law covers governance. Their structural dimensions are distinct, so they combine instead of competing.</p>
<p><strong>Domain 3, Neuroeconomics (reward systems): the deep cause</strong></p>
<p>The human brain discounts the future at a high rate: a certain reward today is structurally worth more than an uncertain consequence in eighteen months. This is a cognitive architecture, not a character flaw. And organizational reward systems, when they encode short evaluation horizons, amplify this natural discounting rather than counteracting it.</p>
<p>Nassim Taleb&rsquo;s skin in the game formulates the structural response: the person who makes the decision must bear a portion of the risk of its future consequences, as an alignment mechanism rather than a punitive measure. When the decision-maker&rsquo;s long-term interest is structurally coupled to the long-term consequences of their decisions, the cognitive discounting of the future is partially corrected by the system design.</p>
<p><em>What this domain contributes: the dimension of deep cause.</em> The disconnection is not merely architectural (biology) or ungoverned (law); it is also individually rational given the reward structure.</p>
<p><em>Taxonomy check:</em> linked to biology. Both neuroeconomics and biology address adaptive mechanisms, one at the cellular level and one at the cognitive level. This internal overlap strengthens the coherence of the combination without making them redundant. Together, all three domains cover: mechanism + governance + deep cause.</p>
<h3 id="the-synthetic-diagnostic">The Synthetic Diagnostic</h3>
<blockquote>
<p>The local unit is disconnected from systemic feedback (biology). The organizational system has no mechanism to assign it responsibility for its deferred effects (law). And its reward system gives it no reason to seek reconnection (neuroeconomics). Each domain alone produces a partial diagnosis. Together, they produce a complete one.</p>
</blockquote>
<h3 id="solution-directions-what-the-source-domains-suggest">Solution Directions: What the Source Domains Suggest</h3>
<p>The <strong>biological analogy</strong> suggests constructing a systemic feedback channel: a technology asset health metric that follows the project manager after delivery, visible to them during the project as a forward-looking indicator of the consequences their decisions are accumulating.</p>
<p>The <strong>legal analogy</strong> suggests redefining the responsibility perimeter. The next team that inherits the asset should have a formal mechanism to evaluate and record the state in which they received it, and that evaluation should be part of the delivering team&rsquo;s record. Accountability extends to the handoff instead of ending at the launch.</p>
<p>The <strong>neuroeconomic analogy</strong> suggests realigning the reward system with the asset&rsquo;s horizon rather than the project&rsquo;s: evaluating the project manager&rsquo;s performance at 24 months post-delivery, weighted toward asset quality indicators, as incentive alignment rather than punishment.</p>
<p>These three solution directions are as complementary as the domains that generated them. Each addresses a dimension the others do not, and their combination amounts to a governance redesign rather than a management improvement.</p>
<hr>
<h2 id="what-the-method-does-and-what-it-does-not">What the Method Does, and What It Does Not</h2>
<p>The method produces precise diagnostics and solution directions that the source domains have already explored. It does not produce turnkey solutions: the transposition to the specific organizational context remains a work of judgment that the method cannot replace.</p>
<p>What it avoids: reinventing wheels that other domains have already manufactured, and remaining imprisoned in the managerial vocabulary that masks the real structure of the problem. A problem named in managerial terms produces managerial solutions. The same problem named in biological, legal, and neuroeconomic terms produces a radically different solution space.</p>
<p>The method also has direct implications for agentic AI systems. An agent that reasons purely by similarity, retrieving the nearest known pattern and applying it, is executing the organizational equivalent of process-following. An agent capable of structural analogy (identifying correspondence across distant domains, composing complementary representations, evaluating coverage rather than proximity) would be executing something closer to genuine reasoning. In AI systems, the gap between similarity and analogy is the gap between a sophisticated retrieval engine and a system capable of diagnosis.</p>
<hr>
<blockquote>
<p>Organizations do not lack solutions. They lack the ability to recognize them across domains.</p>
<p>The method remains constant. The domains change. And each time, the question is the same: what is the structural correspondence, who has already solved this problem, and what does that suggest here?</p>
<p>If the pathologies of organizations have already been solved (in biology, in law, in physics, in software design), what are we waiting for to transpose those solutions? And what does it say about our field that we keep reinventing the same diagnoses without looking next door?</p>
</blockquote>
<hr>
<p><em>Gabriel Mailhot</em><br>
<em>Software Architect and Software Engineering Quality Advisor</em><br>
<em>Series: <a href="/series/structural-analogy-as-an-organizational-diagnostic/">Structural Analogy as an Organizational Diagnostic</a></em></p>
]]></content:encoded></item><item><title>Processes Are Becoming Legacy Systems: Why AI Demands a New Organizational Architecture</title><link>https://scripting.pro/posts/processes-becoming-legacy-systems/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://scripting.pro/posts/processes-becoming-legacy-systems/</guid><description>AI is an organizational architecture disruption as much as a technological one. Why processes are becoming legacy systems, and what principle-driven governance looks like in practice.</description><content:encoded><![CDATA[<p><em>Part IV of a series on rethinking technology governance foundations, and a pivot toward what comes next</em></p>
<hr>
<p>The first three articles in this series examined specific symptoms: the instability of the People-Process-Tools model under high human variability, the strategic liability of tool positioning in a fast-moving AI market, and the asymmetric risk that regulated organizations are structurally failing to measure. This fourth article steps back to name the underlying condition, the diagnosis from which those symptoms follow.</p>
<blockquote>
<p>AI is not just a technological disruption. It is an organizational architecture disruption.</p>
</blockquote>
<hr>
<h2 id="a-mismatch-that-went-unnoticed-until-now">A Mismatch That Went Unnoticed Until Now</h2>
<p>For most of the industrial and information age, there was a comfortable relationship between the pace of technological change and the pace of organizational adaptation. Technology evolved, but slowly enough that organizations could absorb each shift, stabilize their processes around it, and build institutional knowledge before the next wave arrived. The lag between technological possibility and organizational practice was an inconvenience, not a structural threat.</p>
<p>That relationship has inverted. For the first time in the history of organized work, the speed of technological evolution is structurally outpacing the speed of organizational adaptation. Rather than a temporary disruption caused by one particularly fast technology cycle, this is a change of regime: a permanent shift in the relative velocities of technological change and organizational response.</p>
<p>The evidence is visible in every domain. Organizations complete a tool evaluation cycle and find the market has already moved. They design a training program for a capability that AI has partially automated by the time the program launches. They build processes around a set of constraints that are redefined by regulatory guidance six months later. The gap is widening rather than closing, and the organizational models built for a slower world are showing the strain.</p>
<hr>
<h2 id="why-processes-were-the-right-answer-and-what-they-assumed">Why Processes Were the Right Answer, and What They Assumed</h2>
<p>Consider what processes actually are, and why they represented such a powerful organizational technology for so long. Beyond being a list of steps, a process is an encoded solution to a recurring problem, a crystallization of organizational learning into a repeatable, transferable, auditable form. When an organization documents a process, it is converting tacit knowledge into institutional memory, individual judgment into scalable behavior.</p>
<p>This is genuinely valuable, and it rests on three assumptions that held for most of the twentieth century and well into the twenty-first: that the problem being solved is sufficiently stable to justify encoding, that the conditions under which the process operates will remain predictable enough for the steps to stay valid, and that repeatability is itself a source of value (doing the same thing reliably, at scale, is better than improvising every time).</p>
<p>AI attacks all three assumptions simultaneously. It renders stable problems unstable by continuously shifting what is technically possible and economically rational. It introduces permanent uncertainty into operating conditions. And it transforms repeatability from an asset into a fragility: the ability to execute the same steps reliably becomes a liability when those steps are precisely what needs to change.</p>
<p>Processes are not so much wrong as misaligned, optimized for a world that is receding faster than most organizations have recognized.</p>
<hr>
<h2 id="processes-are-becoming-legacy-systems">Processes Are Becoming Legacy Systems</h2>
<p>In technology, we use the term &rsquo;legacy system&rsquo; to describe something specific: not a system that is broken, but a system that was built for a set of constraints that no longer match the environment in which it now operates. A legacy system can be technically functional, even well-maintained. What makes it legacy is the growing gap between its underlying assumptions and current reality.</p>
<p>This is precisely the condition of process-driven organizational architectures in the face of AI-driven technological turbulence. The processes themselves may be executing correctly. The people following them may be doing so diligently. The problem is architectural. The way the organization governs work (through predefined steps, stable roles, documented procedures, sequential approvals) was designed for a world of slower change, and that world is no longer the operating environment.</p>
<p>The recognition is uncomfortable because process-driven governance is deeply embedded in how organizations understand accountability, compliance, and quality. Audits verify process adherence. Performance frameworks reward process execution. Regulatory frameworks often mandate specific processes. Saying that processes are becoming legacy systems does not mean that accountability, compliance, and quality no longer matter. It means that the mechanism through which they have been achieved is reaching the limits of its fitness for purpose.</p>
<hr>
<h2 id="principle-driven-systems-as-the-architectural-response">Principle-Driven Systems as the Architectural Response</h2>
<p>If processes assume stability, principles assume change. This is the essential distinction, and it points toward a different architecture for organizational governance.</p>
<p>A principle defines what must be true: the quality threshold that cannot be compromised, the constraint that is non-negotiable, the outcome that must be achieved. It does not prescribe how. It governs by results rather than by steps. Teams operating under a principle-driven system follow guardrails and pursue defined objectives, but they adapt their methods continuously as the environment evolves, while the principle itself stays stable.</p>
<p>This is not a novel idea in theory. Agile movements, outcome-based management, and mission-command doctrine in military organizations have all pointed in this direction. What is new is the urgency and the mechanism. The urgency comes from the acceleration of technological change. The mechanism comes from agentic AI architectures: systems that are natively coupled to objectives and constraints rather than to specific tools or procedures, and that can adapt to changing operating conditions without requiring the governance layer to be redesigned every time the tooling shifts.</p>
<p>Agentic architectures are not simply a more efficient way to execute processes. They are an architectural alternative to them, embedding adaptability at the level of the system itself rather than relying on human judgment to compensate for procedural rigidity.</p>
<p>Consider a concrete illustration. A logistics team operating under a process-driven model has a documented approval workflow for any change to its supply chain routing tools, a cycle that takes weeks and requires sign-off from architecture, security, and procurement. When a new AI-powered routing tool becomes available, the process triggers in full, regardless of how minor the change. Under a principle-driven model, the governing constraint is different: <em>&ldquo;all routing decisions must maintain delivery reliability above X%, cost variance below Y%, and full auditability.&rdquo;</em> An agent operating under those principles can evaluate and adopt a new routing tool autonomously, because what is being governed is the outcome rather than the mechanism. The principle holds, and the approval cycle dissolves.</p>
<p>The shift from process-driven to principle-driven governance is therefore primarily an architectural decision rather than a technology one. It concerns where stability should live in an organization. In a world of permanent technological turbulence, the answer is that stability must live in principles and outcomes, not in procedures and tools.</p>
<hr>
<h2 id="organizations-must-be-engineered-for-technological-turbulence">Organizations Must Be Engineered for Technological Turbulence</h2>
<p>None of this argues for improvisation, or for abandoning the rigor that processes have historically provided. The argument is that rigor itself must be rearchitected. The question to settle is what to govern and at what level of abstraction, not whether to govern.</p>
<p>The organizations that handle the coming decade well will not be the ones that execute their current processes better, but the ones that have made a deliberate architectural choice: to invest in stable, well-defined principles rather than brittle, step-by-step procedures; to build agentic systems capable of working with continuously shifting tooling; and to develop adaptive governance frameworks that measure outcomes rather than adherence.</p>
<p>Engineering an organization for technological turbulence means building a particular kind of resilience. Bouncing back from disruption is one form of it; being structurally designed to absorb continuous change without losing coherence is another. The distinction matters, because the first is a recovery capability and the second is an architectural property.</p>
<p>The organizations that possess this property will not be immune to the challenges of an AI-accelerated environment. But they will face those challenges with a structural advantage: the ability to adapt their methods while holding their principles constant, and to absorb technological change as a normal operating condition rather than as an exceptional disruption.</p>
<hr>
<p><em>Gabriel Mailhot</em><br>
<em>Software Architect and Software Engineering Quality Advisor</em><br>
<em>Series: <a href="/series/organizational-engineering-for-the-ai-era/">Organizational Engineering for the AI Era</a></em></p>
]]></content:encoded></item><item><title>Beyond the People-Process-Tools Model: Toward Resilient Organizational Engineering</title><link>https://scripting.pro/posts/beyond-people-process-tools/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://scripting.pro/posts/beyond-people-process-tools/</guid><description>Rethinking the foundations of technology governance in an era of structural human variability: why the PPT model needs to be rebalanced, and what replaces it.</description><content:encoded><![CDATA[<p><em>Rethinking the foundations of technology governance in an era of structural human variability</em></p>
<hr>
<h2 id="a-time-tested-model-confronting-an-unprecedented-context">A Time-Tested Model Confronting an Unprecedented Context</h2>
<p>The People, Process, Tools (PPT) model has shaped technology governance for decades. Its founding premise rests on the stability of human capital: skilled individuals, carrying a shared culture, apply defined processes using adapted tools. In its mature form, this model has always recognized that processes and tools encode organizational knowledge, with the human dimension serving as the activation vector.</p>
<p>But in an environment defined by high resource turnover, systematic reliance on external consultants, and the proliferation of teams assembled for short-term needs, that premise of stability no longer holds. The PPT model remains theoretically valid. What is in question is whether it can operate effectively when its human pillar is structurally unstable.</p>
<hr>
<h2 id="the-people-pillar-as-an-unstable-variable">The &lsquo;People&rsquo; Pillar as an Unstable Variable</h2>
<p>When resource turnover is high, organizational knowledge disperses instead of accumulating. Every departure takes with it decision-making context, tacit practices, and domain understanding that formal artifacts only partially capture. Internal culture loses its coherence when a significant proportion of contributors operates within a temporary horizon. Practices imported from outside, heterogeneous by nature, complicate governance and introduce variability that neither documented processes nor available tools can adequately contain.</p>
<p>Under these conditions, structuring quality around a constantly renewing pool of human expertise exposes the organization to real risks: operational discontinuity, practice drift, and erosion of technological maturity. What this calls for is a shift in ratio, not an inversion of the model. The human factor remains central, but it can no longer serve as the sole foundation.</p>
<hr>
<h2 id="repositioning-the-foundation-processes-tools-and-platform-engineering">Repositioning the Foundation: Processes, Tools, and Platform Engineering</h2>
<p>Faced with this reality, it becomes necessary to shift the model&rsquo;s foundation toward elements that remain constant: processes, tools, and now the platform. This reconfiguration does not marginalize the human role; it relieves it of a responsibility it can no longer bear alone in a context of high variability. Individuals stop being the source of coherence and become its beneficiaries: they join a structured environment that guides them from day one, regardless of their background.</p>
<p>The natural evolution of this approach is platformization. An internal platform encodes organizational knowledge in a reusable ecosystem of normalized pipelines, pre-configured environments, project templates, automated controls, and standardized practices. It substitutes a human memory that erodes with turnover for an integrated, persistent operational memory.</p>
<p>That said, this approach is demanding. Building and maintaining a quality internal platform requires a competent, stable, and well-governed team. The structural irony is real: to reduce dependence on interchangeable individuals, you create an infrastructure that requires highly specialized individuals over the long term. Many organizations underestimate this cost. A poorly designed or poorly governed platform can become an even greater obstacle than having no platform at all. This repositioning is no magic solution but a long-term investment, with its own governance requirements.</p>
<hr>
<h2 id="artificial-intelligence-as-a-lever-and-as-a-responsibility">Artificial Intelligence as a Lever and as a Responsibility</h2>
<p>The integration of artificial intelligence represents a significant acceleration of this logic. Within a heavily tooled system, AI can transform static processes into adaptive mechanisms: automated code analysis, test generation, continuous review, technical drift detection, and domain knowledge assistance. These capabilities reduce dependence on individual expertise and strengthen the system&rsquo;s resilience against team turnover.</p>
<p>However, it would be inaccurate to present AI as a frictionless solution. Its effective deployment raises several challenges:</p>
<ul>
<li>AI system governance (prompt engineering, continuous output evaluation, data lineage management, bias monitoring) itself creates dependence on specialized competencies (MLOps, LLMOps, Platform AI) that are often rare and expensive.</li>
<li>AI shifts human dependencies; it does not eliminate them. It generates new layers of specialization, often more demanding than those it replaces.</li>
<li>The cognitive debt risk is real: junior profiles who become overly reliant on AI suggestions may develop impoverished reasoning, undermining precisely the human capital the system seeks to make less critical.</li>
</ul>
<p>An organization that adopts AI as a pillar of its quality engineering must simultaneously invest in the governance of that pillar. Without it, you are simply substituting one fragility for another.</p>
<hr>
<h2 id="scope-of-application-and-model-limitations">Scope of Application and Model Limitations</h2>
<p>This repositioning is particularly well-suited to high-variability organizations: fast-growing scale-ups, technology consulting firms, product teams with a significant proportion of contractors, or IT service delivery environments. In these contexts, platformization and AI augmentation represent high-ROI levers for operational resilience.</p>
<p>In high-criticality domains such as aerospace, healthcare, heavily regulated finance, and critical infrastructure, this logic must be applied with considerable care. Individual accountability and accumulated expertise remain non-substitutable pillars in these fields. Automation and standardization can play a supporting role, but they cannot render the human factor &lsquo;interchangeable&rsquo; without introducing risks of a fundamentally different nature.</p>
<hr>
<h2 id="a-hybrid-model-for-an-asymmetric-environment">A Hybrid Model for an Asymmetric Environment</h2>
<p>The repositioning proposed here aims to rebalance the PPT model rather than invert it. In an environment where human variability has become the norm, operational excellence rests on an asymmetric combination: a solid platform infrastructure, processes that enforce coherence, and well-governed AI that increases resilience. As an indispensable complement, it also needs a core of highly skilled individuals who maintain and evolve the system and embody its vision.</p>
<p>This model does not guarantee excellence on its own. It creates the structural conditions under which excellence becomes reproducible and less dependent on the luck of individual trajectories. What you gain is predictability. You do not eliminate the need for exceptional people; their role concentrates where it is least substitutable, in judgment, innovation, and governance of the system itself.</p>
<hr>
<p><em>Gabriel Mailhot</em><br>
<em>Software Architect and Software Engineering Quality Advisor</em><br>
<em>Series: <a href="/series/organizational-engineering-for-the-ai-era/">Organizational Engineering for the AI Era</a></em></p>
]]></content:encoded></item><item><title>When Tool Positioning Becomes a Strategic Liability: The Case for Principle-Driven Agentic Architectures</title><link>https://scripting.pro/posts/principle-driven-agentic-architectures/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://scripting.pro/posts/principle-driven-agentic-architectures/</guid><description>In a world where AI is redefining the available tools every few months, even the Tools layer of your platform needs to be rethought. The case for governing outcomes, not mechanisms.</description><content:encoded><![CDATA[<p><em>Part II of a series on rethinking technology governance foundations</em></p>
<hr>
<p>In a previous article, I argued that the People-Process-Tools model needs to be rebalanced toward platform engineering in contexts of high resource variability. This article extends that argument one step further: in a world where AI is redefining the available tools every few months, even the &lsquo;Tools&rsquo; layer of that platform deserves to be rethought.</p>
<hr>
<h2 id="the-paradox-of-tool-positioning">The Paradox of Tool Positioning</h2>
<p>In large organizations, the process of selecting, evaluating, approving, and deploying a new tool is rarely a lightweight exercise. Between security reviews, architecture assessments, procurement cycles, integration planning, and training programs, the full lifecycle from initial evaluation to production readiness commonly spans six to eighteen months. For highly regulated environments, that timeline can extend further.</p>
<p>This investment was once rational. When technology moved slowly, the cost of a rigorous positioning process was amortized over years of standardized usage. The approved tool became part of the organizational fabric, embedded in workflows, documentation, onboarding paths, and institutional memory.</p>
<p>That calculus has changed. The current cycle of AI-driven tool evolution is measured not in years but in months, sometimes weeks. By the time an organization completes its positioning process for a given tool, the competitive situation may have shifted, the tool itself may have been substantially transformed, and a new generation of alternatives may have emerged. The organization ends up optimized for a world that no longer exists.</p>
<hr>
<h2 id="why-this-was-rational-and-why-it-no-longer-is">Why This Was Rational, and Why It No Longer Is</h2>
<p>It would be unfair to dismiss tool positioning processes as bureaucratic excess. They exist for legitimate reasons: security and compliance requirements, interoperability constraints, support and vendor stability considerations, and the very real cost of fragmented tooling across teams. These concerns have not disappeared.</p>
<p>What has changed is the nature of the coupling between an organization and its tools. In a slower-moving environment, investing deeply in a specific tool (building expertise, integrations, and institutional knowledge around it) generated durable returns. That depth was an asset.</p>
<p>In today&rsquo;s environment, that same depth increasingly functions as a liability. Deep coupling to a specific tool creates switching costs that slow adaptation. Institutional knowledge built around a particular interface or workflow becomes obsolete as AI transforms the tools themselves. The more thoroughly an organization has embedded a tool into its operating fabric, the more painful the inevitable transition becomes.</p>
<p>The issue lies less in the tools themselves than in the strategic weight organizations assign to tool selection. When tool positioning is treated as a long-horizon strategic commitment, the organization assumes a stability that the environment no longer provides.</p>
<hr>
<h2 id="the-pivot-from-tools-to-principles">The Pivot: From Tools to Principles</h2>
<p>If tools are no longer a stable strategic variable, what is? I would argue for principles: the articulation of expected behaviors, quality standards, operational constraints, and governance guardrails that define how work should be conducted, independently of which tool happens to be executing it.</p>
<p>This shift goes deeper than it may initially appear. Principle-driven governance asks organizations to invest in defining what good looks like (what outcomes are expected, what boundaries must be respected, what quality thresholds must be met) rather than prescribing the specific mechanism through which those outcomes are achieved. The principle is stable; the tooling that enacts it is fluid.</p>
<p>Consider the difference between these two governance postures:</p>
<p><strong>Tool-centric:</strong> <em>&ldquo;All code reviews must be conducted using platform X, following workflow Y.&rdquo;</em></p>
<p><strong>Principle-centric:</strong> <em>&ldquo;All code changes must demonstrate coverage above threshold T, pass static analysis at severity level S, and include a human review sign-off before merging.&rdquo;</em></p>
<p>The second posture is tool-agnostic. It can be enacted by a human reviewer, a CI/CD pipeline, an AI-assisted review agent, or any combination thereof. As tooling evolves, the principle remains intact. Only the mechanism of enactment changes, and that change becomes an optimization rather than a disruption.</p>
<hr>
<h2 id="agentic-architectures-as-a-tooling-abstraction-layer">Agentic Architectures as a Tooling Abstraction Layer</h2>
<p>This is precisely where agentic AI architectures become strategically relevant, as a structural response to tooling volatility and not merely as a productivity lever.</p>
<p>A well-designed agent is coupled to an objective, a set of constraints, and a definition of acceptable outputs, rather than to a specific tool. Given those parameters, the agent selects, orchestrates, and adapts its tooling dynamically. The tool becomes an implementation detail, visible to the agent but invisible to the governance layer.</p>
<p>In a multi-agent architecture, this abstraction scales. Individual agents can specialize (one handling code analysis, another managing test generation, another monitoring technical debt), each operating against the same set of organizational principles while independently managing their tooling layer. As new, more capable tools emerge, the agents can incorporate them without requiring a governance review of the tool itself. What gets reviewed is whether the agent&rsquo;s outputs continue to satisfy the principles.</p>
<p>This represents a meaningful inversion of the traditional governance model. Rather than controlling quality by controlling tools, the organization controls quality by controlling outcomes. The locus of governance shifts from inputs to outputs, from <em>&ldquo;what tool are you using&rdquo;</em> to <em>&ldquo;are the results meeting the standard.&rdquo;</em></p>
<p>The implications for large organizations are significant. Tool evaluation cycles shorten dramatically. Shadow tooling, a persistent governance challenge in organizations with slow approval processes, largely dissolves as a concern: if the agent is producing compliant outputs, the underlying tooling becomes an operational detail rather than a governance risk.</p>
<hr>
<h2 id="limits-and-conditions-for-success">Limits and Conditions for Success</h2>
<p>This architecture relocates governance complexity rather than eliminating it. Several challenges deserve honest acknowledgment.</p>
<p><strong>Defining good principles is harder than it appears.</strong> Principle-driven governance requires organizations to articulate, with precision, what they actually care about. Vague principles produce inconsistent agent behavior. Overly rigid principles reproduce the brittleness of tool-centric governance in a different form. Getting the level of abstraction right requires significant organizational investment and ongoing calibration.</p>
<p><strong>Output evaluation at scale is a partially unsolved problem.</strong> For well-defined, measurable outcomes such as test coverage, static analysis scores, or deployment frequency, this is tractable. For more qualitative dimensions like architectural coherence, domain appropriateness, and long-term maintainability, it remains genuinely difficult.</p>
<p><strong>Agent maturity remains a limiting factor.</strong> Current agentic systems are capable and improving rapidly, but they are not infallible. Human oversight, particularly for high-stakes decisions, cannot be fully removed from the loop, at least not yet.</p>
<p><strong>Regulated environments require special treatment.</strong> In domains where regulatory compliance is tied to specific tools, processes, or audit trails, the fluidity of agentic tooling introduces compliance risks that cannot be resolved through principle-definition alone.</p>
<hr>
<h2 id="a-governance-model-built-for-the-speed-of-change">A Governance Model Built for the Speed of Change</h2>
<p>The organizations best equipped for the current period of technological acceleration are not necessarily those with the best tools. They are those with the clearest principles, along with the architectural flexibility to let those principles be enacted by whatever mechanisms become available.</p>
<p>This is a direct extension of the argument made in the first article of this series. If the People-Process-Tools model needs to be rebalanced toward platform and process in a context of human variability, then the tooling layer of that platform needs to be rebalanced toward principles and agents in a context of technological volatility.</p>
<p>The strategic question for technology leaders has shifted from <em>&ldquo;which tools should we standardize on&rdquo;</em> to <em>&ldquo;which principles are non-negotiable, and how do we build systems, human and agentic, that reliably enact them, regardless of what the tooling landscape looks like six months from now.&rdquo;</em></p>
<hr>
<p><em>Gabriel Mailhot</em><br>
<em>Software Architect and Software Engineering Quality Advisor</em><br>
<em>Series: <a href="/series/organizational-engineering-for-the-ai-era/">Organizational Engineering for the AI Era</a></em></p>
]]></content:encoded></item><item><title>Why Governance Frameworks Miss the Biggest AI Risk: The Case of Regulated Organizations</title><link>https://scripting.pro/posts/governance-frameworks-ai-risk/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://scripting.pro/posts/governance-frameworks-ai-risk/</guid><description>Organizations have built sophisticated systems to detect technological risk. They have not built systems to detect technological irrelevance. The asymmetric risk that does not appear in governance reports.</description><content:encoded><![CDATA[<p><em>Part III of a series on rethinking technology governance foundations</em></p>
<hr>
<p>The first two articles in this series examined how to rebalance technology governance toward platform engineering in contexts of high human variability, and why tool positioning is becoming a strategic liability in a world of accelerating AI. This third article steps back from the technical layer to address a more basic challenge: the organizational resistance that makes any of these transformations genuinely difficult, and the asymmetric risk of not moving fast enough.</p>
<blockquote>
<p>Organizations have spent decades building systems to control technological risk. They have not built systems to detect technological irrelevance.</p>
</blockquote>
<hr>
<h2 id="an-organization-does-not-have-processes-it-is-its-processes">An Organization Does Not Have Processes: It Is Its Processes</h2>
<p>There is a common way of framing organizational change that sounds reasonable but is misleading: the idea that an organization <em>has</em> processes, in the same way it has office space or software licenses, assets that can be evaluated, updated, or replaced through a sufficiently deliberate management decision.</p>
<p>The reality is more unsettling. An organization does not merely possess its processes. In a meaningful sense, it <em>is</em> its processes. They define how decisions get made, how work gets coordinated, how risk gets assessed, how value gets delivered. They encode the accumulated responses to past failures, regulatory pressures, and hard-learned lessons. Rather than a layer sitting on top of the organization, they are its operating identity.</p>
<p>This is the central insight behind Allen Holub&rsquo;s work on systems of work: you cannot remove or change one element without affecting the entire system, and the system will actively resist changes that threaten its coherence, pulling the organization back toward its previous state. Organizational resistance to change is therefore not a failure of leadership courage or a deficit of innovation culture; it is the system functioning exactly as designed. The challenge is not to overcome that resistance through force of will, but to understand which parts of the system need to transform, and how to do so without collapsing the coherence that holds everything together.</p>
<hr>
<h2 id="ai-is-not-waiting-at-the-door-it-is-already-inside">AI Is Not Waiting at the Door: It Is Already Inside</h2>
<p>Regulated organizations (financial institutions, healthcare systems, energy companies, public sector bodies, legal and professional services firms) have historically managed technological adoption through deliberate, controlled processes. This was rational. In a stable technological environment, moving carefully reduced integration risk, ensured regulatory compliance, and preserved operational continuity.</p>
<p>That posture is increasingly misaligned with the current moment. AI does not present itself as a discrete technology that organizations can choose to evaluate and adopt on their own timeline. It is infiltrating through every layer of operations: the productivity tools individual contributors are already using, the platforms vendors are embedding AI capabilities into, the competitors who are quietly compressing delivery timelines and cost structures, the talent market where expectations about AI-augmented work are shifting rapidly.</p>
<p>In financial institutions, the question is no longer whether AI will affect credit risk modeling, fraud detection, regulatory reporting, or client-facing services. It already does, whether through internal adoption or through the competitive and regulatory environment that surrounds the institution. The relevant question has shifted from <em>should we adopt AI?</em> to <em>at what rate are our current processes becoming a competitive and operational disadvantage, and are we measuring that rate?</em></p>
<hr>
<h2 id="the-asymmetry-of-risk-that-does-not-appear-in-governance-reports">The Asymmetry of Risk That Does Not Appear in Governance Reports</h2>
<p>This is the most structurally important challenge for regulated organizations, and it is one that their governance frameworks are poorly designed to surface.</p>
<p>The risk of moving too fast with AI is visible and auditable. It manifests as compliance failures, model risk incidents, data governance violations, operational disruptions. It appears in risk committee reports, regulatory examinations, and audit findings. Regulated organizations have spent decades building sophisticated machinery to detect, quantify, and contain exactly this type of risk, and they are genuinely good at it.</p>
<p>The risk of not moving fast enough is structurally different. It is diffuse, cumulative, and largely invisible to conventional risk measurement frameworks. It does not generate an incident or trigger a regulatory finding. It accumulates silently as a widening gap between the organization&rsquo;s operational capabilities and those of its environment: competitors, technology providers, talent expectations, and eventually regulators themselves.</p>
<p>By the time this second type of risk becomes visible, it typically manifests not as a discrete event but as a condition: an inability to attract engineering talent with relevant AI skills, a growing gap in delivery speed relative to competitors, a technological debt so deep that transformation becomes structurally prohibitive.</p>
<p>Consider a concrete illustration. A major bank&rsquo;s regulatory reporting process relies on manual data consolidation across legacy systems. The cycle takes three to four weeks per quarter, absorbs dozens of analyst hours, and produces results that are already partially stale by the time they reach the board. An AI-augmented equivalent could compress that cycle to days, reduce error rates, and free the analysts for higher-judgment work. The risk of implementing such a system is visible and manageable (model validation, auditability, change management). The risk of not implementing it accumulates invisibly: mounting operational cost, growing talent frustration, and an expanding gap relative to institutions that have already made the transition. The first risk has a line in the risk register; the second does not.</p>
<blockquote>
<p>The asymmetry is this: the governance machinery of regulated organizations is optimized for the first type of risk and structurally blind to the second.</p>
</blockquote>
<hr>
<h2 id="regulation-as-constraint-and-as-underestimated-lever">Regulation as Constraint, and as Underestimated Lever</h2>
<p>In conversations about AI adoption in regulated industries, regulatory constraints are frequently invoked as the primary justification for caution. This framing is not wrong; regulatory constraints are real and consequential.</p>
<p>But it is increasingly incomplete, and in some cases it has become a rhetorical convenience that obscures something less comfortable: the pace of adoption is often constrained less by regulation than by organizational inertia dressed in regulatory language.</p>
<p>Regulators themselves are not standing still. Financial supervisory authorities, including the AMF, OSFI, the European Banking Authority, and others, are actively developing AI governance frameworks, publishing guidance on responsible AI use, and in some cases explicitly encouraging institutions to build AI capabilities in areas such as real-time compliance monitoring, fraud detection, and operational risk management. The implicit message from regulators is not <em>&ldquo;wait until we have figured this out&rdquo;</em> but <em>&ldquo;develop the governance maturity to use these tools responsibly.&rdquo;</em></p>
<p>An organization that waits for the regulatory framework to be fully stabilized before investing in AI capabilities is making a specific bet: that the cost of early compliance investment outweighs the cost of late adoption. In a faster-moving environment, that bet is becoming harder to justify.</p>
<p>Regulation, properly understood, is a constraint on the speed and form of AI adoption, not a justification for its absence.</p>
<hr>
<h2 id="navigating-the-transition-changing-without-breaking">Navigating the Transition: Changing Without Breaking</h2>
<p>The response to this challenge is not a wholesale transformation that attempts to change everything at once. Holub&rsquo;s insight about systems of work applies with particular force here: an organization that tries to revolutionize its entire operating model in response to an external pressure is as likely to collapse its coherence as to improve its capabilities.</p>
<p>This requires organizations to develop a capability that is itself relatively new: the ability to map their own processes according to their strategic value in an AI-augmented environment. Not all rigidity is equivalent. Some processes derive their value precisely from their stability and resistance to change: regulatory compliance mechanisms, audit trails, risk controls, fiduciary obligations. These are not candidates for AI-driven transformation. They are anchors that must be protected even as the surrounding system evolves.</p>
<p>Other processes derive value from their efficiency and adaptability: knowledge management, delivery pipelines, onboarding, tooling, internal reporting, operational monitoring. These are precisely the areas where AI augmentation offers the highest return, and where the cost of inaction is accumulating most rapidly. Treating them with the same conservatism as core compliance processes is a category error, not prudent risk management.</p>
<p>The practical implication is a dual governance posture: rigorous protection of the processes whose value is their stability, combined with active transformation of the processes whose value is their performance. The organizations that handle this transition most effectively will be those that can hold both imperatives simultaneously, and resist the temptation to use the first as cover for avoiding the second.</p>
<p>This is not a call to abandon prudence, but to redefine where prudence actually applies.</p>
<hr>
<p><em>Gabriel Mailhot</em><br>
<em>Software Architect and Software Engineering Quality Advisor</em><br>
<em>Series: <a href="/series/organizational-engineering-for-the-ai-era/">Organizational Engineering for the AI Era</a></em></p>
]]></content:encoded></item><item><title>Similarity Is (almost) Solved. Analogy Is Not.</title><link>https://scripting.pro/posts/analogy-not-similarity/</link><pubDate>Thu, 26 Feb 2026 00:00:00 +0000</pubDate><guid>https://scripting.pro/posts/analogy-not-similarity/</guid><description>On creativity, metaphor, and what AI still needs to learn: a research perspective from 2005–2010 that remains an open architectural problem today.</description><content:encoded><![CDATA[<p><em>On Creativity, Metaphor, and What AI Still Needs to Learn</em></p>
<hr>
<h2 id="a-theory-of-creativity-first">A Theory of Creativity First</h2>
<p>Before building any system, I needed to understand what creativity actually is.</p>
<p>Here is the formulation I arrived at around 2005, working as a researcher in Québec City:</p>
<p>Humans cannot create something entirely new from nothing.</p>
<p>We can only perceive reality through our senses. You cannot imagine a color that does not exist. You cannot conceive a sound you have never heard. The entire domain available to human creativity is bounded by accumulated sensory experience.</p>
<p>Creative thinking is therefore combinatorial rather than generative ex nihilo. The only way to produce something genuinely new within a bounded experiential space is to discover a structural correspondence between two distant domains that are already known.</p>
<p>When that correspondence holds, it is a metaphor.</p>
<p>But novelty alone is insufficient. A creative idea must also be useful, and usefulness is not intrinsic to the idea itself. It is evaluated by a human observer with a specific problem and a specific set of objectives. The same association can be brilliant in one context and irrelevant in another.</p>
<p>This leads to a precise formulation:</p>
<blockquote>
<p>A creative idea is an association between two distant known domains whose relevance is judged by a human evaluator as both novel and useful within a specific context.</p>
</blockquote>
<p>Novelty is a function of semantic distance between domains.</p>
<p>Utility is a function of the match with the problem and with the evaluator&rsquo;s own criteria.</p>
<p>From this theory, an architecture follows naturally.</p>
<hr>
<h2 id="the-architecture-20052010">The Architecture (2005–2010)</h2>
<p>If creativity is the identification of structural correspondences across distant domains, then a system designed to assist creativity should not search for what is similar. It should search for what is structurally equivalent across distance.</p>
<p>Between 2005 and 2010, working at a private imaging company in Québec City, I designed and implemented such an architecture.</p>
<p>Each object in the system (initially images, but the framework was modality-independent) was described through three structured vectors:</p>
<ul>
<li>A <strong>composition vector</strong> capturing spatial organization, perspective, and luminosity</li>
<li>An <strong>object-property vector</strong> encoding detected geometries, shapes, and physical attributes</li>
<li>A <strong>semantic vector</strong> containing qualitative keyword descriptors</li>
</ul>
<p>These vectors were computed automatically using classical computer vision techniques: color histograms, wavelet decompositions, geometric segmentation, texture analysis, spatial frequency distributions. Each image received a multidimensional signature, which we called a &ldquo;genetic code,&rdquo; stored in a database and queryable in real time across a collection of 100,000 images.</p>
<p>In today&rsquo;s terminology: a hand-crafted feature-embedding pipeline feeding a structured vector database, with sub-second query response time. Built in 2008, before those words existed in this context.</p>
<p>But the architectural intent was quite different from similarity search.</p>
<p>The system did not ask: <em>What is nearest?</em></p>
<p>It asked:</p>
<ul>
<li>Which objects share equivalent structural overlaps with a reference? <em>(alternative objects: substitutable, not combinable)</em></li>
<li>Which objects contribute complementary, non-overlapping components of a reference? <em>(complementary objects: combinable to form a stronger metaphor)</em></li>
<li>Which combinations increase analogical coherence rather than surface resemblance? <em>(linked objects: internal reinforcement as a tiebreaker)</em></li>
</ul>
<p>The metaphorical strength of a combination was computed as the aggregate overlap across structured dimensions. Combinations were ranked by analogical coverage, not by proximity.</p>
<p>A red apple and a white tablecloth, taken separately, are only partial metaphors for the Japanese flag. Combined, they cover it completely: one contributes the red circle, the other the white rectangle. Their combination scores higher not because they resemble the flag, but because together they account for its structure. That is analogy, not similarity.</p>
<p>Similar questions were being explored across content-based retrieval and computational creativity research during that period. The problem was recognized; what was missing were the representational tools to address it at scale.</p>
<hr>
<h2 id="why-this-distinction-still-matters">Why This Distinction Still Matters</h2>
<p>Modern embedding systems, including the best multimodal foundation models, are extraordinarily capable. They organize high-dimensional spaces where related concepts cluster together. Distance minimization in embedding space has proven to be a remarkably powerful paradigm.</p>
<p>But the analogical operation itself remains largely latent in these systems.</p>
<p>Current architectures optimize for distance, retrieve nearest neighbors, and interpolate within learned manifolds. They do not explicitly evaluate which pairs or sets of representations together form a structurally stronger mapping to a reference than any single element alone.</p>
<p>Foundation models can produce metaphor-like outputs through statistical association, sometimes impressively so. But the mechanism is emergent rather than structured, which means it cannot be controlled, composed, or inspected.</p>
<p>Making analogy a first-class, explicit, steerable operation in AI systems remains an open architectural problem.</p>
<hr>
<h2 id="what-ai-still-needs">What AI Still Needs</h2>
<p>Revisiting this research today, three limitations of current AI systems stand out, each rooted in the same theory of creativity I was working from in 2005.</p>
<h3 id="1-implicit-context-inference">1. Implicit context inference</h3>
<p>Human creativity does not operate in a vacuum. The relevance of any idea depends heavily on the context in which the human is operating: their constraints, objectives, mental state, environment. A skilled collaborator reads this context without being explicitly told.</p>
<p>Current AI systems depend almost entirely on what the user explicitly provides. They do not perceive the context in which the human evolves. For AI to become a genuine creative partner, it needs access to richer contextual signals, along with the capacity to infer meaning from them without requiring the human to articulate everything. That is a problem of situated cognition rather than retrieval.</p>
<h3 id="2-memory-as-a-knowledge-reservoir">2. Memory as a knowledge reservoir</h3>
<p>In my theory of creativity, the quality of associative reasoning is directly proportional to the richness of available memory. More diverse experience means more potential connections across distant domains.</p>
<p>Current AI systems have impressive parametric knowledge, but their memory architecture is largely static between training runs. The strategic management of episodic, contextual, and long-term memory, treated as a dynamic, queryable reservoir that evolves with use, remains underdeveloped. Memory, in this view, is the substrate of association and not just storage.</p>
<h3 id="3-emotional-memory">3. Emotional memory</h3>
<p>This is perhaps the most significant gap, and the one most likely to trigger an objection from researchers in reinforcement learning or affective computing.</p>
<p>The objection is predictable: AI systems do incorporate affective signals, through reward modeling, reinforcement learning from human feedback, and preference learning. This is true, and the work is serious.</p>
<p>But it addresses a different problem. These approaches treat affect as an external training signal: feedback injected during learning to shape behavior. Human emotional memory is structurally different. Rather than a signal applied to knowledge from the outside, it is woven into knowledge itself.</p>
<p>The neuroscientist Antonio Damasio demonstrated this precisely. Emotion is not separate from rational cognition; it is constitutive of it. Patients with damage to emotional memory centers do not become more rational. They lose the capacity to make decisions at all, because they can no longer assign differential weight to recalled experiences.</p>
<p>Every human memory carries affective encoding (fear, joy, discomfort, wonder) that influences which associations surface, which combinations feel meaningful, and which ideas resonate. This weighting is embedded in the retrieval structure itself rather than applied post-hoc.</p>
<p>Current AI systems process semantic relationships without this integrated affective architecture. The gap may therefore be architectural rather than merely incremental.</p>
<p>Building systems where affective structure is embedded in memory, instead of applied to it from outside, may be one of the most important open problems in AI research on creativity and reasoning.</p>
<hr>
<h2 id="why-i-am-writing-this-now">Why I Am Writing This Now</h2>
<p>The research described here was conducted between 2005 and 2010 and was not publicly discussed at the time due to contractual obligations.</p>
<p>Revisiting it now is less an exercise in retrospection than a recognition that the underlying questions remain open, and that the technological conditions to investigate them meaningfully finally exist.</p>
<p>I am not writing to claim priority. Parallel discovery is the norm in research, and I have no interest in relitigating timing. I am writing because the problem is still in front of us.</p>
<p>If you are working on reasoning architectures, compositional intelligence, contextual AI systems, or human–AI collaboration, I would like to talk.</p>
<p><em>The research described above is documented in an unpublished patent specification and a research poster produced in 2008.</em></p>
<hr>
<p><em>Gabriel Mailhot</em><br>
<em>Software Architect and Software Engineering Quality Advisor</em><br>
<em>Series: <a href="/series/organizational-engineering-for-the-ai-era/">Organizational Engineering for the AI Era</a></em></p>
]]></content:encoded></item></channel></rss>