<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Chris Wijnia — Notes</title>
    <link>https://chriswijnia.com/</link>
    <atom:link href="https://chriswijnia.com/feed.xml" rel="self" type="application/rss+xml" />
    <description>Things I’m working on, learning or trying to understand.</description>
    <language>en</language>
    <item>
      <title>AI makes software cheaper. Systems thinking becomes more valuable.</title>
      <link>https://chriswijnia.com/notes/ai-makes-software-cheaper</link>
      <guid isPermaLink="true">https://chriswijnia.com/notes/ai-makes-software-cheaper</guid>
      <pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate>
      <category>Software</category>
      <description>Writing code is getting cheap. Deciding what the system is, where it can fail and how its parts fit together is not, and that is where the work moves.</description>
      <content:encoded><![CDATA[<p>The cost of writing code is falling fast.</p>
<p>A function that took an afternoon now takes a prompt and a review. A prototype that took a week can exist by lunch. Boilerplate, migrations, test scaffolding, the fifth CRUD screen: models produce all of it quickly and mostly correctly.</p>
<p>It is tempting to conclude that software itself is getting cheap.</p>
<p>I don’t think that follows. <strong>Code is getting cheaper. Software isn’t, at least not at the same rate.</strong></p>
<p>The difference is where the interesting work is moving.</p>
<h2 data-no="01 / 07">Code was never the whole cost</h2>
<p>Anyone who has run a software project for long knows that typing was rarely the bottleneck.</p>
<p>The expensive parts were elsewhere:</p>
<ul>
<li>working out what the system should actually do,</li>
<li>deciding where one component ends and another begins,</li>
<li>integrating with systems you don’t control,</li>
<li>handling the cases nobody mentioned in the spec,</li>
<li>keeping it running, observable and correct once real people use it,</li>
<li>changing it later without breaking what depends on it.</li>
</ul>
<p>Models help with some of this. They are good at reading unfamiliar code, proposing a design and spotting an obvious gap.</p>
<p>But most of that list is about <strong>decisions</strong>, not keystrokes. And decisions have consequences that outlive the session in which they were made.</p>
<p>When the cost of producing code drops, the relative cost of those decisions goes up.</p>
<h2 data-no="02 / 07">Cheap code means more code</h2>
<p>When something gets cheaper, we tend to use more of it.</p>
<p>That is already visible. More internal tools. More prototypes. More scripts that quietly become services. More integrations, because building one is now an evening instead of a sprint.</p>
<p>Each of those pieces may be simple. The system they form together is not.</p>
<p>Every new component brings interfaces, state, failure modes and an owner who may or may not remember it exists in six months. Cheap code lowers the cost of adding parts. It does nothing for the cost of understanding how the parts interact.</p>
<p>So the total amount of complexity in a company can grow faster than before, not slower.</p>
<p>That is not an argument against using AI to write software. I use it constantly. It is an argument for paying more attention to the shape of what we are building.</p>
<h2 data-no="03 / 07">What systems thinking actually means here</h2>
<p>“Systems thinking” can sound like a consultancy slide. I mean something quite practical.</p>
<p>It is the habit of asking questions like:</p>
<ul>
<li>Where does state live, and who is allowed to change it?</li>
<li>What happens when this call fails halfway?</li>
<li>What does this component assume about the others, and what happens when that assumption stops being true?</li>
<li>Where are the feedback loops? How would we notice if this were quietly wrong?</li>
<li>What is the cost of being wrong here, and who pays it?</li>
</ul>
<p>None of these questions gets easier because the code was generated.</p>
<p>Some of them get harder. Generated code is often locally reasonable and globally unaware. A model can write a perfectly sensible retry loop that, combined with 3 other perfectly sensible retry loops, produces a very efficient way of taking down a dependency.</p>
<h2 data-no="04 / 07">Agents make it more obvious</h2>
<p>Working with agents makes this especially visible.</p>
<p>An agent iterating on its own work has the same failure modes as a team without a clear definition of done. When I wrote a small skill for iterating on an artifact until it reaches a confidence threshold, the 2 problems I had to design against were exactly that:</p>
<ul>
<li><strong>Score inflation</strong>: every pass nudges the number up without evidence.</li>
<li><strong>Scope padding</strong>: to reach 100%, the loop invents work the artifact doesn’t need.</li>
</ul>
<p>The fix wasn’t a smarter model. It was structure: every re-score has to cite specific evidence, the loop stops when the same weakness appears twice, and trade-offs go back to a human instead of being guessed.</p>
<p>That is systems design. The model is one component. The loop around it determines whether the result is useful.</p>
<p>The same thing showed up in a trading experiment with a fast decision model. Changing the wording of the question moved the rate at which it wanted to trade from 3% to 70% of decisions on identical market states. The model hadn’t become braver. The system around it had changed, and nobody would have noticed without caching answers by prompt and comparing like with like.</p>
<h2 data-no="05 / 07">Where the value moves</h2>
<p>If code gets cheaper and systems don’t, a few things become relatively more valuable.</p>
<p><strong>Knowing what not to build.</strong> When building is nearly free, the discipline is in saying no. Every feature you ship is something you operate.</p>
<p><strong>Clear boundaries.</strong> Good interfaces were always valuable. They are more valuable when a lot of the code on either side of them is written quickly, by people and by models, and replaced often.</p>
<p><strong>Cheap ways of being wrong early.</strong> Before spending money on model calls in that trading experiment, the useful first step was computing the cost floor: the minimum a strategy has to earn to pay its own fees. It said the idea was impossible at that horizon, and every later result agreed. A few lines of arithmetic did more than any amount of generated code.</p>
<p><strong>Operating knowledge.</strong> Someone still has to know why the system is shaped the way it is. Some of that can live in documentation and, increasingly, in agent memory. But somebody has to decide what is worth remembering.</p>
<p><strong>Taste.</strong> Not the aesthetic kind only. The judgment that a design is too clever, that a dependency isn’t worth it, that 2 services should really be one.</p>
<h2 data-no="06 / 07">The open questions</h2>
<p>I’m not sure how far this goes.</p>
<p>Models are getting better at the system level too. They can already read a whole codebase and point out that 3 services duplicate the same logic. It would be naive to assume that architecture is a permanently human activity.</p>
<p>I’m also not sure how people will learn systems thinking if they rarely write the code themselves. A lot of systems intuition comes from building things that broke and having to understand why. If a model writes the code and another model fixes it, where does that intuition come from?</p>
<p>And there is an organisational question. Many companies measure engineering by output. Cheap code makes output a worse measure than ever. What replaces it?</p>
<h2 data-no="07 / 07">Where I’ve landed for now</h2>
<p>For now, I treat generated code roughly the way I treat code from a fast, capable colleague I haven’t worked with for long.</p>
<p>Useful. Often right. Occasionally confidently wrong in ways that only show up at the boundaries.</p>
<p>The code is the cheap part. The system is the product.</p>
<p>Which, to be fair, was always true. It is just harder to ignore now.</p>
]]></content:encoded>
    </item>
    <item>
      <title>JEV, tiny models and strange new interfaces</title>
      <link>https://chriswijnia.com/notes/jev-tiny-models-strange-interfaces</link>
      <guid isPermaLink="true">https://chriswijnia.com/notes/jev-tiny-models-strange-interfaces</guid>
      <pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate>
      <category>Experiments</category>
      <description>I gave a fast decision model a computer from 1999, the 1978 Oregon Trail and a Bitcoin order book. What it did, and what interfaces without chat look like.</description>
      <content:encoded><![CDATA[<p>Most of what we call AI today arrives as a conversation.</p>
<p>You type, it answers. The model produces text, and everything else, tools, agents, structured output, gets built on top of that text.</p>
<p>Jev is a different kind of thing, and playing with it is a good way to think about where models can sit inside software.</p>
<h2 data-no="01 / 06">What Jev is</h2>
<p>Jev is a model from TypeSafe. They describe it as a <strong>System One model</strong>: built for decisions inside software rather than for conversation.</p>
<p>You don’t send it a prompt and get prose back. You send it structured state and a question with a fixed set of options, and it returns a typed choice with probabilities for each option.</p>
<p>A decision looks roughly like this:</p>
<div class="code-win"><pre class="code" data-lang="ts"><code class="hljs"><span class="hljs-keyword">const</span> result = <span class="hljs-keyword">await</span> client.<span class="hljs-title function_">systemOne</span>({
  <span class="hljs-attr">state</span>: { objective, computer, availableActions },
  <span class="hljs-attr">questions</span>: {
    <span class="hljs-attr">action</span>: <span class="hljs-title function_">choice</span>(<span class="hljs-string">&quot;Choose the best available action.&quot;</span>, criteria),
  },
});
</code></pre>
</div>
<p>It is also cheap and fast. TypeSafe prices it at $42 per billion input tokens, and their own demo shows a decision in about a tenth of a second.</p>
<p>When I say <em>tiny</em> in the title, that is what I mean: tiny per decision, in cost and in time. I don’t know how big the model actually is. What matters for the experiments is that you can afford to ask it something every half second, for hours.</p>
<p>That changes what you can build.</p>
<h2 data-no="02 / 06">I gave Jev a computer from 1999</h2>
<p>One experiment is JEV/98: a small simulated late-90s computer in which Jev chooses every action.</p>
<p>Every ~650 ms the loop runs:</p>
<ul>
<li>the simulated computer changes state,</li>
<li>Jev sees that state and a finite list of legal actions,</li>
<li>Jev chooses exactly 1 of them,</li>
<li>the interface shows the full probability distribution,</li>
<li>ordinary deterministic code applies the consequence.</li>
</ul>
<p>There are 3 missions. Get online and download a file without infecting the machine. Identify a suspicious sender and delete the attachment. Finish a download before Mom needs the dial-up phone line.</p>
<p>The important design choice is that Jev can’t do anything the code doesn’t allow. It is not a chatbot wearing a beige-computer skin. There is no way for it to invent a command, break the fourth wall or talk its way out of the simulation. The code defines the action space. The model only chooses within it.</p>
<p>Everything is recorded: the selected action, the top probabilities, whether the answer came from the live model or a local fallback, and the latency. A run can be shared as a replay link that plays back the recorded decisions without calling the model again.</p>
<p>If there is no API key, a simple heuristic plays instead, and the interface labels it <strong>DEMO POLICY</strong>. No fake model results.</p>
<h2 data-no="03 / 06">I gave Jev dysentery</h2>
<p>JEV/78 does the same thing with the 1978 Oregon Trail.</p>
<p>The original is a BASIC program, and JEV/78 is not a wrapper that sends keystrokes to it. The rules are rebuilt in the same shape as JEV/98: one function returns the available actions, another advances the state. Jev chooses every legal wagon action. The world is seeded, so a death can be replayed.</p>
<p>Some things didn’t fit. The famous <code>TYPE BANG</code> shooting minigame is about reaction time, not decisions, so Jev doesn’t play it: its rifle skill becomes a roll. Shop and fort amounts are bucketed so the set of choices stays finite.</p>
<p>That last constraint turns out to be the whole trick. <strong>Once the choices are finite and explicit, a model can operate a system safely and legibly.</strong></p>
<h2 data-no="04 / 06">I gave it money, on paper</h2>
<p>Games are forgiving. Markets are not.</p>
<p>I also built a lab to test whether Jev had any short-horizon trading value on the Hyperliquid Bitcoin perpetual. Same pattern: normalised market state in, buy, sell or hold out, with probabilities, and deterministic code deciding whether anything actually happens.</p>
<p>The answer was no.</p>
<p>Across about 2,100 decisions at a 30-second horizon, its signal was indistinguishable from noise once the sample was large enough, and never within an order of magnitude of the cost of trading. Longer horizons, maker orders, regime classification and daily news briefs didn’t rescue it either.</p>
<p>Two details stayed with me.</p>
<p>First, in the early runs Jev’s own estimate that a trade would be profitable after costs never went above 0.51. It had no edge, and in a sense it knew.</p>
<p>Second, the wording of the question mattered enormously. Changing the phrasing moved its trade rate from 3% to 70% of decisions on identical market states. Within one test window, prose briefs beat JSON dumps. Verbose <em>you are a risk manager</em> instructions added nothing. I ended up writing a house style for questions, because otherwise experiments weren’t comparable with each other.</p>
<p>Jev is documented as weak on raw numbers, so none of this is a verdict on the model. It is a verdict on one use of it. Structured yes-or-no decisions look like a much better fit than predicting prices.</p>
<h2 data-no="05 / 06">Strange new interfaces</h2>
<p>The part I find most interesting isn’t the trading result. It’s what these experiments look like on screen.</p>
<p>There is no chat box. You don’t talk to the model. You watch it.</p>
<p>The interface is the state of the world, the list of things that can happen next, and a probability bar for each option. You can see the model hesitate between 2 choices. You can see it become confident. You can replay a run and see exactly where it went wrong.</p>
<p>That feels closer to how we might want software with a model inside to behave generally:</p>
<ul>
<li><strong>The action space is the interface.</strong> What the model may do is visible, not hidden in a prompt.</li>
<li><strong>Uncertainty is shown, not hidden.</strong> Probabilities are more honest than a fluent paragraph.</li>
<li><strong>Decisions are replayable.</strong> You can inspect a past choice with exactly the inputs it had.</li>
<li><strong>The model is a component, not the product.</strong> Deterministic code owns the consequences.</li>
</ul>
<p>Chat is a wonderful interface for open-ended questions. It is a strange interface for a system that should make 1 of 5 known choices 100 times a minute.</p>
<h2 data-no="06 / 06">Open questions</h2>
<p>I don’t know yet where the useful applications are.</p>
<p>Games and simulations make the pattern easy to see. The JEV/98 notes already list a virtual railway dispatched by the same decision API, and eventually physical hardware. Whether that is useful or just fun is part of the question.</p>
<p>The bigger question is where fast, cheap decisions inside software beat either hand-written rules or a large model reasoning in text. My guess is routing, gating, triage and control loops, anywhere the choices are known and the cost of asking needs to be close to zero. The trading lab is also a reminder that a one-line rule is sometimes just as good.</p>
<p>And I’m curious what happens when interfaces like these become normal. When the model is not something you talk to, but something you can watch deciding.</p>
<p>That seems like a strange new interface worth building more of.</p>
]]></content:encoded>
    </item>
    <item>
      <title>What I learned giving agents memory</title>
      <link>https://chriswijnia.com/notes/what-i-learned-giving-agents-memory</link>
      <guid isPermaLink="true">https://chriswijnia.com/notes/what-i-learned-giving-agents-memory</guid>
      <pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate>
      <category>AI</category>
      <description>Memory is not a transcript. On selection, lifetimes, forgetting and what persistent agents change about software.</description>
      <content:encoded><![CDATA[<p>Most AI products still have a peculiar form of amnesia.</p>
<p>They can reason surprisingly well about whatever is in front of them, but start a new conversation and much of that understanding disappears. You explain the company again. The project again. Your preferences again. The reason a decision was made three weeks ago, again.</p>
<p>For a chatbot, that can be mildly annoying.</p>
<p>For an agent that is supposed to do useful work over time, it becomes a fundamental limitation.</p>
<p>Over the past year I’ve spent a lot of time building with agents and thinking about what happens when they stop being isolated prompts and begin operating as persistent software systems.</p>
<p>Memory turns out to be one of the more interesting parts.</p>
<p>Not because storing information is difficult. We have been exceptionally good at putting things into databases for several decades.</p>
<p>The difficult part is deciding <strong>what deserves to be remembered, what it means later, and when it should come back.</strong></p>
<h2 data-no="01 / 07">Memory is not a transcript</h2>
<p>The obvious implementation of agent memory is to save every conversation.</p>
<p>That is useful, but it isn’t really memory.</p>
<p>A transcript is history. Memory is compression.</p>
<p>Humans don’t replay every sentence they have ever heard before making a decision. We retain some facts, forget others, form abstractions and gradually build a model of the world.</p>
<p>An agent needs something similar.</p>
<p>Imagine an engineering agent working inside a large codebase.</p>
<p>Over time it might discover that:</p>
<ul>
<li>a certain service deliberately avoids local state,</li>
<li>a particular API has an ugly compatibility constraint,</li>
<li>the team prefers one architectural pattern over another,</li>
<li>a bug that looks obvious has already been investigated twice,</li>
<li>one engineer tends to care deeply about backwards compatibility,</li>
<li>another system is scheduled to disappear in six months.</li>
</ul>
<p>None of those facts necessarily belong in the immediate prompt.</p>
<p>But they can dramatically change the quality of the next decision.</p>
<p>The useful unit of memory therefore isn’t:</p>
<blockquote>
<p>Here is everything that happened.</p>
</blockquote>
<p>It is closer to:</p>
<blockquote>
<p>Here is what appears to remain important.</p>
</blockquote>
<p>That distinction sounds small. It changes the architecture considerably.</p>
<h2 data-no="02 / 07">More context is not the same as more intelligence</h2>
<p>Large context windows created a tempting idea: perhaps we can simply give models everything.</p>
<p>Eventually, that becomes its own failure mode.</p>
<p>An agent with access to thousands of irrelevant facts can be worse than one with ten useful ones. Retrieval becomes noisy. Old assumptions survive long after reality changed. Contradictory information accumulates.</p>
<p>Context has a cost even when the model can technically accept it.</p>
<p>The real problem becomes <strong>selection</strong>.</p>
<p>When an agent is working on a database migration, what should it remember about the product?</p>
<p>When it is replying to a customer, what should it know about the architecture?</p>
<p>When a user changes their mind, how quickly should an older preference lose authority?</p>
<p>The quality of a memory system is therefore not measured by how much it stores.</p>
<p>It is measured by how well it decides what to surface.</p>
<p>That starts looking less like a database problem and more like an information architecture problem.</p>
<p>Which, conveniently, means software engineers get to reinvent librarianship with embeddings.</p>
<h2 data-no="03 / 07">Memories have different lifetimes</h2>
<p>Another thing that becomes obvious surprisingly quickly: not all memory should behave the same way.</p>
<p>Some things are effectively permanent.</p>
<blockquote>
<p>This application uses PostgreSQL.</p>
</blockquote>
<p>Some are durable preferences.</p>
<blockquote>
<p>Prefer boring infrastructure over introducing another service.</p>
</blockquote>
<p>Some are observations.</p>
<blockquote>
<p>The current implementation appears to be CPU-bound during type checking.</p>
</blockquote>
<p>Some are temporary.</p>
<blockquote>
<p>We are debugging the authentication flow this week.</p>
</blockquote>
<p>And some are conclusions that may later turn out to be wrong.</p>
<blockquote>
<p>This bug is probably caused by caching.</p>
</blockquote>
<p>Treating all of these as equivalent creates trouble.</p>
<p>Useful agent memory needs some notion of <strong>provenance, confidence and time</strong>.</p>
<p>Where did this belief come from?</p>
<p>Was it explicitly told to the agent or inferred?</p>
<p>Has it subsequently been contradicted?</p>
<p>When was it last relevant?</p>
<p>That metadata matters because an agent is not merely retrieving facts. It is retrieving beliefs about a changing system.</p>
<p>Software changes.</p>
<p>Organizations change.</p>
<p>People change their minds.</p>
<p>A memory system that cannot forget eventually becomes a very confident historian of a world that no longer exists.</p>
<h2 data-no="04 / 07">Forgetting is a feature</h2>
<p>This may be the counterintuitive part.</p>
<p>Good memory requires good forgetting.</p>
<p>Engineers naturally like persistence. Losing information feels like failure.</p>
<p>But forgetting can be an important form of compression.</p>
<p>If an agent worked through twenty hypotheses before finding the cause of a production bug, the useful long-term memory probably isn’t all twenty hypotheses.</p>
<p>It might be:</p>
<blockquote>
<p>Requests to this service can appear stale because this cache is process-local. Prefer the shared Redis path for cross-instance state.</p>
</blockquote>
<p>The investigation mattered while solving the problem.</p>
<p>The conclusion matters afterward.</p>
<p>That raises an interesting question: should agents periodically reinterpret their own histories?</p>
<p>I think increasingly they will.</p>
<p>Rather than memory being written once and retrieved forever, persistent agents may continuously consolidate what they know. Recent experiences become observations. Repeated observations become patterns. Some patterns become durable knowledge. Others decay.</p>
<p>That starts to resemble learning, even if the underlying model weights never change.</p>
<h2 data-no="05 / 07">Memory changes the interface</h2>
<p>Persistent memory also changes how software feels.</p>
<p>Today we largely think of AI interfaces as conversations.</p>
<p>Open a box. Ask a question. Receive an answer.</p>
<p>But once the system remembers projects, decisions, people and unfinished work, the conversation becomes only one view into something larger.</p>
<p>The interesting object isn’t the chat.</p>
<p>It is the evolving relationship between the agent and its environment.</p>
<p>An agent might remember that a migration was postponed, notice the dependency has since disappeared, and bring the issue back months later.</p>
<p>It might understand why a particular architectural decision was made instead of merely observing that the code exists.</p>
<p>It might recognize that the problem somebody is describing today looks suspiciously similar to an incident from last year.</p>
<p>At that point the system begins to feel less like a tool waiting for commands and more like another participant in the work.</p>
<p>That introduces plenty of uncomfortable questions around privacy, control, observability and trust.</p>
<p>It also makes the software considerably more useful.</p>
<h2 data-no="06 / 07">The model is only part of the product</h2>
<p>Building with increasingly capable models has reinforced something I already believed about software.</p>
<p>The cleverest component is rarely the whole product.</p>
<p>A powerful model without the right context can produce a mediocre result. A slightly less capable model embedded in a system with good tools, useful memory and strong feedback loops can be remarkably effective.</p>
<p>The surrounding architecture matters.</p>
<p>So does product judgment.</p>
<p>What information do we expose?</p>
<p>What actions can the agent take?</p>
<p>When should it ask instead?</p>
<p>What should be remembered?</p>
<p>What should disappear?</p>
<p>What can the user inspect and correct?</p>
<p>Those decisions increasingly determine whether an AI system feels impressive for five minutes or remains useful after five months.</p>
<h2 data-no="07 / 07">Where this gets interesting</h2>
<p>I don’t think the eventual form of agent memory will look much like a folder labelled <code>memories</code>.</p>
<p>It will probably be distributed across several layers: explicit facts, semantic retrieval, project state, interaction history, environmental observations and learned preferences.</p>
<p>Some memory will belong to a person.</p>
<p>Some to a company.</p>
<p>Some to a task.</p>
<p>Some to the agent itself.</p>
<p>And agents will need to reason about the boundaries between them.</p>
<p>We are still early enough that many of these systems feel slightly improvised. That is part of what makes working on them fun.</p>
<p>A lot of AI right now is focused on making the model smarter.</p>
<p>I suspect an equally important frontier is making software around the model better at <strong>remembering what matters</strong>.</p>
<p>Because intelligence without continuity is useful.</p>
<p>But continuity is what starts turning intelligence into a system.</p>
]]></content:encoded>
    </item>
    <item>
      <title>What finance looks like when software becomes an actor</title>
      <link>https://chriswijnia.com/notes/when-software-becomes-an-actor</link>
      <guid isPermaLink="true">https://chriswijnia.com/notes/when-software-becomes-an-actor</guid>
      <pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate>
      <category>Finance</category>
      <description>Financial systems assume a person behind every action. Agents that hold keys and move money break that assumption. Notes on identity, mandates and audit.</description>
      <content:encoded><![CDATA[<p>Most financial infrastructure is built on a simple assumption.</p>
<p>Behind every action there is a person.</p>
<p>A person opens the account. A person passes KYC. A person approves the payment, signs the transaction, accepts the terms and carries the responsibility when something goes wrong. Software sits in between, but it is plumbing. It carries instructions. It does not have intentions.</p>
<p>That assumption is starting to wear thin.</p>
<p>Agents can now read a situation, decide what to do and act on it, including actions that move money. Not in a science-fiction sense. In a mundane, already-possible sense: a process with credentials, a budget and a goal.</p>
<p>I work on financial infrastructure, and I spend a lot of time building with agents. The overlap between those two things raises questions I don’t think the industry has good answers to yet.</p>
<h2 data-no="01 / 06">Identity was always about people</h2>
<p>Regulated finance is organised around knowing who you are dealing with.</p>
<p>KYC for individuals. KYB for companies. Beneficial ownership. Sanctions screening. Transaction monitoring that compares behaviour to what is expected of <em>that</em> customer.</p>
<p>All of it assumes the actor is a legal person, or a structure that resolves to legal persons.</p>
<p>An agent is neither. It acts on behalf of someone, but not in the way a bank transfer acts on behalf of someone. It makes choices within a range. Run the same agent twice with the same instructions and it may not do the same thing.</p>
<p>So the question isn’t only <em>who is this?</em> It becomes:</p>
<ul>
<li>who does this agent act for?</li>
<li>what was it allowed to do?</li>
<li>who set those limits, and when?</li>
<li>did this specific action fall inside them?</li>
</ul>
<p>Those are different questions. Current identity systems mostly answer the first one.</p>
<h2 data-no="02 / 06">Keys are already becoming mandates</h2>
<p>Interestingly, wallet infrastructure is further along here than most of traditional finance.</p>
<p>At Agio our public docs describe 3 kinds of wallet. Custodial wallets use multi-signature approval policies and address whitelists: funds can only move to known places, with the right people signing. Hot wallets leave the encryption key with the client. Smart wallets built on ERC-4337 support <strong>session keys</strong> for delegated signing.</p>
<p>A session key is an interesting primitive. It separates <em>ownership</em> from <em>authority to act</em>. The owner keeps control of the account. Something else, possibly a piece of software, gets a narrow, revocable permission to do specific things for a while.</p>
<p>That is very close to what an agent needs. Not the keys to everything. A mandate.</p>
<p>The financial world has used mandates for a long time: powers of attorney, trading authorities, standing orders, investment guidelines. What is new is that they can be expressed in code, enforced at the point of signing, and granted to something that isn’t a person.</p>
<h2 data-no="03 / 06">The model decides, the code enforces</h2>
<p>When I’ve built experiments where a model makes decisions with financial consequences, one pattern kept proving useful.</p>
<p><strong>The model proposes. Deterministic code disposes.</strong></p>
<p>In a small trading lab I built, the model only ever emits a market signal: buy, sell or hold, with probabilities. It never sees the portfolio and never places an order itself. Ordinary code decides whether the signal clears the thresholds, applies the position rules, computes the costs and records everything. Real trading is deliberately annoying to switch on: it needs an explicit environment flag that reads <code>LIVE_TRADING=YES_I_UNDERSTAND</code>.</p>
<p>That last detail is a joke, but only slightly.</p>
<p>The general shape is what I think matters for finance:</p>
<ul>
<li>the model’s output is a <strong>typed, bounded proposal</strong>, not free text,</li>
<li>the space of possible actions is defined by code, not by the model,</li>
<li>limits are enforced where the action happens, not in the prompt,</li>
<li>every decision is logged with what the model saw and what it chose,</li>
<li>switching from simulation to real money is an explicit human act.</li>
</ul>
<p>A prompt that says <em>never spend more than $100</em> is a request. A signing policy that rejects transactions above $100 is a control. Regulators, auditors and customers will eventually want to see the second kind.</p>
<h2 data-no="04 / 06">Audit becomes about reasoning, not just records</h2>
<p>Financial systems are good at recording <em>what</em> happened. Ledgers, transaction logs, approval trails.</p>
<p>When software acts, <em>why</em> becomes much more important.</p>
<p>If a person makes a bad trade, you can ask them. If an agent does, you need to reconstruct what it knew at the time, which instructions it was following, which limits applied, and whether the outcome was a bug, a bad instruction or a reasonable decision that turned out badly.</p>
<p>That means logging inputs and outputs, not just effects. The prompt, the state, the model version, the probabilities, the policy that approved or rejected the action.</p>
<p>It also means being able to replay a decision. In my own experiments, caching every model answer against exactly what the model was shown turned out to be essential. Without it, you can’t tell whether a change in behaviour came from the model, the prompt or the market.</p>
<p>For compliance, that kind of replayability may become as important as the ledger itself.</p>
<h2 data-no="05 / 06">Liability doesn’t disappear</h2>
<p>A tempting mistake is to treat an agent as a new kind of party. It isn’t, at least not legally. Someone deployed it. Someone gave it authority. Someone benefits from what it does.</p>
<p>So responsibility will keep resolving to people and companies. What changes is how clearly that chain has to be documented.</p>
<p>Today, if a payment goes wrong, the chain is usually short: customer, bank, maybe an intermediary. With agents it can get long quickly: the user, the application, the agent framework, the model provider, the wallet, the policy that approved it.</p>
<p>Financial infrastructure that makes that chain explicit, who granted what authority to which software under which limits, will be much easier to trust than infrastructure that treats agent activity as just another API call.</p>
<h2 data-no="06 / 06">The open questions</h2>
<p>I don’t know how most of this plays out.</p>
<p><strong>Does an agent need its own identity?</strong> Or is it always an extension of its principal, with a mandate attached? The second feels more honest to me, but the first may be more practical at scale.</p>
<p><strong>How do you monitor behaviour that is meant to vary?</strong> Transaction monitoring looks for deviations from expected patterns. An agent that adapts will deviate by design.</p>
<p><strong>What does consent look like?</strong> A user clicking <em>allow</em> on a broad permission once is not meaningfully informed consent for 1,000 future decisions.</p>
<p><strong>Where does the model sit in a regulatory sense?</strong> A tool, a service provider, or something new?</p>
<p>What I’m fairly confident about is the direction. Software is moving from carrying instructions to making decisions. Finance is one of the places where that shift matters most, because the consequences are measured in money and the rules were written for people.</p>
<p>The interesting infrastructure work is in the gap between the two.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Why I still prototype things myself</title>
      <link>https://chriswijnia.com/notes/why-i-still-prototype-things-myself</link>
      <guid isPermaLink="true">https://chriswijnia.com/notes/why-i-still-prototype-things-myself</guid>
      <pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate>
      <category>Software</category>
      <description>A prototype is the cheapest way to find out whether you understand a problem. Why I still build them myself, and what I try to learn from each one.</description>
      <content:encoded><![CDATA[<p>I co-founded a company, I have a title with <em>officer</em> in it, and I still write code.</p>
<p>That can look odd. The usual assumption is that at some point you stop building and start directing: you write the strategy, someone else writes the code.</p>
<p>I understand the logic. I just don’t think it holds up very well, and less so every year.</p>
<h2 data-no="01 / 07">A prototype is a question with a deadline</h2>
<p>Most ideas look good in a document.</p>
<p>A document lets you skip the parts you haven’t thought about. It lets two people agree on a sentence while imagining completely different systems. It never fails to compile.</p>
<p>A prototype doesn’t give you that comfort. The moment you build something, even a crude version, the vague parts become obvious. Where does this data actually come from? What happens on the second run? Who is allowed to do this? What does the user see while they wait?</p>
<p>So I think of a prototype less as a first version of a product and more as <strong>a question with a deadline</strong>. The question is usually some form of: <em>do I actually understand this?</em></p>
<p>Often the answer is no. That is the useful part.</p>
<h2 data-no="02 / 07">Cheap answers to expensive questions</h2>
<p>A recent example: I wanted to know whether a new, fast decision model had any short-horizon trading value.</p>
<p>Questions like that can turn into weeks of discussion. This one became a small, isolated harness: live market data, paper trading with real fees and slippage, cached model answers, and a set of boring baselines to compare against.</p>
<p>The first useful output wasn’t even from the model. It was a cost floor: how much the market has to move in a given window before a trade can pay for itself. At the horizon I started with, it was effectively impossible. Every later result agreed.</p>
<p>The model did produce one exciting run along the way: 8 correct calls out of 9. That disappeared at 31 trades and again at 85. Small samples lie in your favour.</p>
<p>The final answer was a clear no, for about 20 cents of model usage.</p>
<p>I don’t think I would have trusted that answer as much if someone had summarised it for me. Building it myself meant I knew exactly which assumptions were in the harness, which ones weren’t, and where the result could be wrong.</p>
<h2 data-no="03 / 07">Understanding doesn’t delegate well</h2>
<p>A lot of work can be delegated. Understanding is harder.</p>
<p>If I want to make good decisions about systems, I need an accurate model of how they behave. Not the architecture diagram. The actual behaviour: where it is slow, what breaks, which abstraction is leaking, what looked simple and wasn’t.</p>
<p>Much of that knowledge only comes from contact. Reading about a new model is not the same as watching it make 500 decisions and noticing where it hesitates. Reviewing a design for agent memory is not the same as discovering that your agent is confidently remembering something that stopped being true weeks ago.</p>
<p>At Agio Digital I spend most of my time building, prototyping, reviewing systems and figuring out what we should do next. Those activities feed each other. Prototyping makes my reviews better. Reviews tell me what is worth prototyping.</p>
<h2 data-no="04 / 07">It keeps the conversation honest</h2>
<p>There is also a quieter benefit.</p>
<p>Once a rough version of something exists, conversations about it change. We stop debating whether an idea could work and start looking at what the prototype showed. Disagreements become specific. <em>This part was slow. This step confused people. This assumption was wrong.</em></p>
<p>A working prototype is hard to argue with in the abstract. That is a feature.</p>
<p>It also cuts the other way. If I propose something and can’t make even a crude version work, that tells me something about the idea, or about my understanding of it, before anyone else has spent time on it.</p>
<h2 data-no="05 / 07">AI changed the economics</h2>
<p>A few years ago, the argument against founders prototyping was partly about time. Building even a rough version of something could take days, and those days had other uses.</p>
<p>That cost has dropped a lot. With agents and good tooling, a prototype that used to take a week can often exist in an afternoon. Scaffolding, glue code and the fifth form field are no longer where the time goes.</p>
<p>So the remaining time goes into the part that matters: deciding what to build, what to measure and what the result means.</p>
<p>If anything, that makes prototyping <em>more</em> appropriate for someone whose job is to figure out what to do next, not less.</p>
<h2 data-no="06 / 07">What I try to get right</h2>
<p>A few habits make prototypes more useful to me:</p>
<ul>
<li><strong>Decide the question first.</strong> A prototype without a question is just an unfinished product.</li>
<li><strong>Keep it isolated.</strong> Nothing it touches should be hard to delete. The trading harness imported nothing from the rest of the codebase it lived in, on purpose.</li>
<li><strong>Compare against something boring.</strong> A result only means something next to a baseline. Often the baseline wins.</li>
<li><strong>Label fakes clearly.</strong> One of my experiments falls back to a simple heuristic when no API key is present, and the interface labels it <strong>DEMO POLICY</strong>. No fake model results, even in a demo.</li>
<li><strong>Leave out infrastructure you don’t need yet.</strong> The first release of that same experiment has no database: replays are self-contained links.</li>
<li><strong>Write down what you learned.</strong> A prototype you learned nothing from was just a hobby. Which is also fine, but it helps to know which one it was.</li>
</ul>
<h2 data-no="07 / 07">The open question</h2>
<p>The part I’m less sure about is scale.</p>
<p>Prototyping myself works when I’m close to the problem. As companies grow, the gap between what one person can build and what the organisation needs gets wider. At some point the prototype becomes a bottleneck, or a toy that doesn’t reflect the real constraints.</p>
<p>I don’t think the answer is to stop. I think it is to be selective: prototype where understanding is the scarce resource, and delegate where it isn’t.</p>
<p>I still enjoy opening an empty repository and figuring something out. Some of those repositories become useful. Some answer a question.</p>
<p>That’s enough.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
