<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Kody Wildfeuer</title>
  <link href="https://kody-w.github.io/feed.xml" rel="self"/>
  <link href="https://kody-w.github.io/"/>
  <updated>2026-08-03T04:11:24+00:00</updated>
  <id>https://kody-w.github.io/</id>
  <author>
    <name>Kody Wildfeuer</name>
  </author>
  
  <entry>
    <title>The Wire Is the Authority</title>
    <link href="https://kody-w.github.io/2026/08/01/the-wire-is-the-authority/"/>
    <updated>2026-08-01T00:00:00+00:00</updated>
    <id>https://kody-w.github.io/2026/08/01/the-wire-is-the-authority</id>
    <content type="html">&lt;p&gt;I shipped an operating system this week whose filesystem is a public website. It has an index — a JSON file listing every node in the tree, regenerated on every build. On the first real test I typed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cat&lt;/code&gt; on a path that was definitely there, and got back:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cat: /OS/system32/etc/motd: no such file or directory
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The file existed. I could &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;curl&lt;/code&gt; it from another terminal while the shell was insisting it didn’t. The index simply hadn’t caught up.&lt;/p&gt;

&lt;p&gt;The obvious fix is to regenerate the index. The interesting fix is to stop believing it.&lt;/p&gt;

&lt;h2 id=&quot;two-different-questions&quot;&gt;Two different questions&lt;/h2&gt;

&lt;p&gt;There are two questions a filesystem answers, and we habitually conflate them:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;What is in this directory?&lt;/strong&gt; — a &lt;em&gt;listing&lt;/em&gt; question.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Does this specific thing exist?&lt;/strong&gt; — an &lt;em&gt;existence&lt;/em&gt; question.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;An index is a very good answer to the first and a merely &lt;em&gt;convenient&lt;/em&gt; answer to the second. It is a snapshot of a tree taken at a moment that has already passed. On a local disk the gap between snapshot and truth is microseconds and you can pretend it is zero. On a distributed system it is however long your build takes.&lt;/p&gt;

&lt;p&gt;The fix I landed on is one line of policy:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;The index is a listing. The wire is the authority.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ls&lt;/code&gt; reads the index, because listing is what an index is for. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cat&lt;/code&gt; goes straight to the origin. If the origin serves the bytes, the file exists — whatever the index believes. And when a path resolves that way, the shell says so out loud:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;index  not in /OS/api/fs.json
       served anyway — the wire is the authority,
       the index is only a listing
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That last line matters more than the fix. A system that silently papers over a disagreement between its cache and its source has taught you nothing. A system that resolves the request &lt;em&gt;and reports that the two disagreed&lt;/em&gt; has handed you a diagnostic for free.&lt;/p&gt;

&lt;h2 id=&quot;this-is-not-a-filesystem-problem&quot;&gt;This is not a filesystem problem&lt;/h2&gt;

&lt;p&gt;Once you have the shape, you see it everywhere, and almost always mishandled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Package registries.&lt;/strong&gt; The index says version 4.2.1 exists. The tarball 404s. Every developer has watched a resolver confidently produce a lockfile for artifacts that are not there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service discovery.&lt;/strong&gt; The registry lists three healthy replicas. Two are gone. The list is a listing; the health check is the wire.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search over your own docs.&lt;/strong&gt; The vector index was built on Tuesday. The doc was rewritten on Wednesday. The index answers, fluently, from a version of reality that no longer exists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent tool catalogs&lt;/strong&gt; — and this is the one about to matter enormously. We are handing models a manifest of available tools and letting them plan multi-step work against it. That manifest is an index. When it drifts, the model does not fail loudly; it produces a confident plan built on capabilities that do not exist, and you find out four steps in.&lt;/p&gt;

&lt;p&gt;In every one of those cases the failure mode is identical: &lt;strong&gt;the system trusts the listing to answer the existence question, and reports absence when it means staleness.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Those are not the same thing, and the difference is the whole ballgame. “It is not there” ends an investigation. “My index does not know about it” starts one.&lt;/p&gt;

&lt;h2 id=&quot;the-cost-is-not-what-you-think&quot;&gt;The cost is not what you think&lt;/h2&gt;

&lt;p&gt;The objection is performance. If existence always costs a round trip, why have an index at all?&lt;/p&gt;

&lt;p&gt;Because you do not check existence nearly as often as you think. Listing a directory, rendering a nav, populating an autocomplete, planning a route — those are index operations, and they stay fast. Existence is checked when you actually &lt;em&gt;act&lt;/em&gt;: read the file, install the package, call the tool. At that moment you were going to pay for the round trip anyway.&lt;/p&gt;

&lt;p&gt;That was the second thing I got wrong. My first version did a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HEAD&lt;/code&gt; to check existence and then a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GET&lt;/code&gt; to read — two round trips to answer one question. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GET&lt;/code&gt; &lt;strong&gt;is&lt;/strong&gt; the existence check. A 404 is a definitive answer, and a 200 arrives with the bytes attached.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;read(path):
  if local layer has path:  return it
  if hidden here:           throw
  GET path
  if 404:                   throw &quot;no such file&quot;
  return bytes
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;One request. The index was never consulted, and never needed to be.&lt;/p&gt;

&lt;h2 id=&quot;absence-is-a-claim-and-claims-need-standing&quot;&gt;Absence is a claim, and claims need standing&lt;/h2&gt;

&lt;p&gt;The deeper principle is about who is entitled to say &lt;em&gt;no&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A cache is entitled to say &lt;strong&gt;yes&lt;/strong&gt; — if it has the bytes, it has them, and staleness is a separate problem. A cache is almost never entitled to say &lt;strong&gt;no&lt;/strong&gt;, because it cannot distinguish “this does not exist” from “I have not heard about it.” Those are wildly different facts wearing the same word.&lt;/p&gt;

&lt;p&gt;So: let the fast layer answer affirmatively, and make the slow layer the only thing allowed to deny. Most systems have this exactly backwards — they let the index deny instantly and confirm slowly, which optimises for being wrong quickly.&lt;/p&gt;

&lt;p&gt;I would rather be right slowly, on the small number of occasions when it matters.&lt;/p&gt;

&lt;h2 id=&quot;how-i-actually-found-it&quot;&gt;How I actually found it&lt;/h2&gt;

&lt;p&gt;I did not reason my way here. I typed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cat&lt;/code&gt; on a file I knew existed, watched a system I had just written lie to me, and had to decide which of the two things in front of me was authoritative: my own index, or the HTTP response.&lt;/p&gt;

&lt;p&gt;It was never going to be my index. It is a file I generated. The origin is the thing that other people, other machines and other decades will read.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build the index for speed. Keep the wire for truth. And when they disagree, say so out loud&lt;/strong&gt; — the disagreement is the most useful thing either of them will ever produce.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;The OS is at &lt;a href=&quot;https://kody-w.github.io/OS/console/&quot;&gt;kody-w.github.io/OS/console&lt;/a&gt;. It boots in about a second from static files, and you can &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;curl&lt;/code&gt; any path it shows you.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Six Times the Test Was Wrong</title>
    <link href="https://kody-w.github.io/2026/08/01/six-times-the-test-was-wrong/"/>
    <updated>2026-08-01T00:00:00+00:00</updated>
    <id>https://kody-w.github.io/2026/08/01/six-times-the-test-was-wrong</id>
    <content type="html">&lt;p&gt;I pointed eight agents at one file and told them to loop until it was perfect.&lt;/p&gt;

&lt;p&gt;The file was &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;voxel-world.html&lt;/code&gt; — 9,749 lines, a Minecraft-style voxel sandbox that is one self-contained HTML document. Six agents owned disjoint regions and edited. Two were read-only critics whose only job was to be unimpressed.&lt;/p&gt;

&lt;p&gt;They found 20 real defects. They also produced six false ones.&lt;/p&gt;

&lt;p&gt;Three of the six were mine.&lt;/p&gt;

&lt;h2 id=&quot;the-ledger&quot;&gt;The ledger&lt;/h2&gt;

&lt;p&gt;Here is what the false failures actually were.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. I asserted &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;window.vox&lt;/code&gt; was an object.&lt;/strong&gt; It’s a function. My check reported a failure against correct code on the very first run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. I used &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;offsetParent === null&lt;/code&gt; to mean “not visible.”&lt;/strong&gt; CSSOM defines &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;offsetParent&lt;/code&gt; as null for &lt;em&gt;any&lt;/em&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;position: fixed&lt;/code&gt; element. So a correctly-rendered fixed overlay read as invisible. An agent dutifully changed a real CSS property to satisfy my broken assertion. I caught it and reverted.&lt;/p&gt;

&lt;p&gt;That one didn’t stay caught. The same trap burned a critic’s entire test run. It survived inside another agent’s focus-trap helper. And it was still sitting in the readiness check of &lt;em&gt;both&lt;/em&gt; my tools an hour later — where, because &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#loading&lt;/code&gt; is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;position: fixed&lt;/code&gt;, the clause was trivially true and did nothing. Every “boot time” number I had quoted was measuring the wrong moment. &lt;strong&gt;Five instances of one mistake.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. My static test server sent &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cache-control: no-store&lt;/code&gt;.&lt;/strong&gt; I wrote it that way for clean reruns. It also makes offline caching untestable by construction. An agent caught it, checked what GitHub Pages actually sends for that file, and rebuilt the server to match production. Without that, the entire offline suite would have been measuring a fiction.&lt;/p&gt;

&lt;p&gt;The agents produced the other three.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. A self-test assertion whose entire body was &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;async () =&amp;gt; true&lt;/code&gt;.&lt;/strong&gt; A placeholder, in a passing suite, reporting success forever. It was one of seven assertions the agent found that were green without being correct — three more were vacuous because they ran before any bot existed and compared nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. A leak that wasn’t.&lt;/strong&gt; An agent measured 9.4 leaked objects per round and had the numbers to prove it. Then it ran a zero-bot control group. The control climbed identically. It had been measuring chunk-streaming warmup. It retracted its own finding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Four failures from asserting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;obs.self&lt;/code&gt; when the real key is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;obs.you&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;the-one-that-matters-most&quot;&gt;The one that matters most&lt;/h2&gt;

&lt;p&gt;The best finding of the run wasn’t a bug. It was this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ambient occlusion was real, correct, wired up, and completely invisible.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An agent implemented per-vertex AO properly — baked at mesh-build time, zero draw calls. It verified its own work: 66.3% of quads carried per-vertex colour variation, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vertexColors: true&lt;/code&gt; was set. It reported AO as a win.&lt;/p&gt;

&lt;p&gt;The blind critic scored it &lt;strong&gt;2 out of 10&lt;/strong&gt;. Corners rendered perfectly flat.&lt;/p&gt;

&lt;p&gt;The cause: sun intensity 1.1 plus hemisphere 0.8 is about 1.9 irradiance, and with no tone mapping the highlights clip. Multiplying albedo by 0.7 barely moves a pixel already clamped at white. The data was in the buffer. It never reached the screen.&lt;/p&gt;

&lt;p&gt;The builder measured the attribute. It never measured the pixel.&lt;/p&gt;

&lt;p&gt;That is not a coding error. Every line was correct. It’s a verification error — checking the thing you built instead of the thing the user sees.&lt;/p&gt;

&lt;h2 id=&quot;what-this-unlocks&quot;&gt;What this unlocks&lt;/h2&gt;

&lt;p&gt;One agent did the thing that actually settles it. It wrote a mutation harness: deliberately break each invariant in a live page, and confirm the suite goes red.&lt;/p&gt;

&lt;p&gt;Nine mutations. Nine kills. Each turning exactly one assertion red, with no collateral.&lt;/p&gt;

&lt;p&gt;That is the only evidence that a green suite means anything. Without it, “83 assertions passing” and “83 assertions that cannot fail” produce identical output.&lt;/p&gt;

&lt;h2 id=&quot;the-cost&quot;&gt;The cost&lt;/h2&gt;

&lt;p&gt;Adversarial verification is expensive. Two of eight agents wrote no production code at all. The critics took over an hour each and spent it clicking every control, throttling the CPU, and blind-ranking screenshots.&lt;/p&gt;

&lt;p&gt;They also found the blocker.&lt;/p&gt;

&lt;p&gt;The desktop UI was completely unclickable. A “Click to play” overlay at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;z-index: 40&lt;/code&gt; sat above a toolbar at 35. Every button resolved to the overlay. Clicking the gear granted pointer lock instead of opening settings. Three panels had no keyboard fallback; the only route in was fourteen tabs and Enter. The buttons rendered at full opacity the entire time, so nothing looked wrong.&lt;/p&gt;

&lt;p&gt;It was in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git HEAD&lt;/code&gt;. It is invisible in source. It is invisible in a screenshot. It only appears if you put a cursor on a button and click it.&lt;/p&gt;

&lt;h2 id=&quot;the-implication&quot;&gt;The implication&lt;/h2&gt;

&lt;p&gt;The lesson I keep relearning is not “write more tests.”&lt;/p&gt;

&lt;p&gt;It’s that &lt;strong&gt;the assertion is code too, and nobody reviews it.&lt;/strong&gt; Implementation gets scrutinized. Test code gets written once, goes green, and is never read again. So it rots silently, and a green suite becomes a claim nobody has audited.&lt;/p&gt;

&lt;p&gt;Three rules I’d now apply anywhere:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check the assertion before you fix the implementation.&lt;/strong&gt; When something reports a failure, the test is a suspect. In this run it was guilty 23% of the time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Measure the output, not the intermediate.&lt;/strong&gt; Verify the pixel, not the buffer. The user cannot see your vertex attributes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prove your tests can fail.&lt;/strong&gt; Mutate the code on purpose. If the suite stays green, you don’t have tests — you have decoration.&lt;/p&gt;

&lt;p&gt;The agents were good. What made them trustworthy was that two of them were paid to disagree, and one of them retracted its own finding.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Rarity Without a Ledger: What Adopt Me Actually Taught Me</title>
    <link href="https://kody-w.github.io/2026/08/01/rarity-without-a-ledger/"/>
    <updated>2026-08-01T00:00:00+00:00</updated>
    <id>https://kody-w.github.io/2026/08/01/rarity-without-a-ledger</id>
    <content type="html">&lt;p&gt;Adopt Me is the most successful pet economy ever built — it holds Roblox’s concurrency record at roughly 1.9 million people in one game at one time. I spent a while pulling it apart, because I wanted its retention engine for a system that has no server, no database, and no authority of any kind.&lt;/p&gt;

&lt;p&gt;The received explanation is that it’s a slot machine for children. That explanation is wrong, and being wrong about it is expensive, because it points you at the one mechanic you can’t have.&lt;/p&gt;

&lt;h2 id=&quot;two-things-everyone-gets-wrong&quot;&gt;Two things everyone gets wrong&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;It isn’t a Tamagotchi.&lt;/strong&gt; Adopt Me pets cannot die, cannot get permanently sick, cannot run away, and lose nothing to neglect. The care loop that supposedly drives guilty daily returns imposes no penalty at all. Every guide confirms it. The thing commentators describe as the hook is decorative.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It isn’t really a gacha, either.&lt;/strong&gt; The egg odds are disclosed and the expected value across egg tiers is remarkably flat. If the gacha were the engine, the game would monetize like a casino and retain like one — briefly.&lt;/p&gt;

&lt;p&gt;The actual engine is the part nobody writes about, because it looks like an accounting detail.&lt;/p&gt;

&lt;h2 id=&quot;the-engine-is-the-sink&quot;&gt;The engine is the sink&lt;/h2&gt;

&lt;p&gt;Four full-grown pets of the same species fuse into a Neon. Four Neons fuse into a Mega Neon. So one Mega costs &lt;strong&gt;sixteen&lt;/strong&gt; base pets, plus the work of raising each one — about 3,660 tasks end to end.&lt;/p&gt;

&lt;p&gt;Now price the shortcut. A Royal Egg yields a &lt;em&gt;specific&lt;/em&gt; legendary about 2.67% of the time. Sixteen of them is roughly 600 eggs, ~870,000 in-game Bucks, which at the game’s own best-ever exchange rate is on the order of &lt;strong&gt;five thousand US dollars&lt;/strong&gt; to brute-force a single Mega Neon.&lt;/p&gt;

&lt;p&gt;That number is the whole design. Adopt Me built a demand engine &lt;strong&gt;its own monetization cannot satisfy&lt;/strong&gt;, and then let players satisfy it for each other. Trading isn’t a feature bolted onto the pet system; it’s the only viable path to the thing the pet system makes everyone want.&lt;/p&gt;

&lt;p&gt;And underneath both is the property that makes it work at all:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;A fusion sink makes duplicates valuable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the load-bearing insight. In any collectible system, most pulls are boring. Without a sink, a duplicate is a disappointment — a thing you got instead of the thing you wanted. With a sink, every boring pull is an &lt;strong&gt;ingredient&lt;/strong&gt;. The floor of the loot table stops being garbage. You have converted your failure mode into your supply chain.&lt;/p&gt;

&lt;h2 id=&quot;which-of-these-can-survive-without-an-authority&quot;&gt;Which of these can survive without an authority?&lt;/h2&gt;

&lt;p&gt;I care about this because I build local-first systems: no server, no database, nothing that can be the sole writer of truth. So I sorted Adopt Me’s mechanics by what they actually require.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trading requires an authority.&lt;/strong&gt; Scarcity in a trade economy means non-duplication, and &lt;em&gt;preventing&lt;/em&gt; duplication means somebody has to be the one who says this item is here and therefore not there. That’s a ledger, and no clever hash removes the need for it. Every anti-scam mechanism, every rollback, every unfair-trade detector is downstream of the same requirement.&lt;/p&gt;

&lt;p&gt;(That’s the &lt;em&gt;prevention&lt;/em&gt; half. Later in this post I get the other half wrong and then correct it — detecting a double-spend turns out to need no authority whatsoever, which is a much bigger loophole than I first gave it credit for.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fusion requires nothing.&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;4 → 1&lt;/code&gt; is a pure function of its inputs. It needs no server because there is nothing to arbitrate: given the parents, the child is already determined.&lt;/p&gt;

&lt;p&gt;That asymmetry is the finding. &lt;strong&gt;The single most retentive mechanic in the most successful pet economy ever built is also the one that needs no authority.&lt;/strong&gt; The part that needs a server — trading — is a consequence of the sink, not a peer to it. Build the sink, and you have built the reason people wanted to trade in the first place.&lt;/p&gt;

&lt;h2 id=&quot;what-i-built&quot;&gt;What I built&lt;/h2&gt;

&lt;p&gt;The system I’m working in derives a creature entirely from a “tail” — a 64-hex secret minted exactly once and never re-rolled. Four traits fall out of a hash of it. Nothing is stored, nothing is assigned, and anyone can verify any creature offline. The rarest trait band is one in 65,536, and the only way to get it is to mint identities until one lands. The scarcity is real because the electricity was real.&lt;/p&gt;

&lt;p&gt;The fusion law is one line:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;fuse(tails) = sha256(&quot;rapp/1:fuse\n&quot; + sorted(tails))
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Sorted, so fusion is a property of the &lt;em&gt;set&lt;/em&gt; and not of the order you happened to place them in. Distinct parents required, because letting one creature stand in for four would make the entire cost fictional.&lt;/p&gt;

&lt;p&gt;Three properties come free:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Determinism.&lt;/strong&gt; The same four parents always produce the same child, on any machine, forever.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Proof of possession.&lt;/strong&gt; You cannot produce a well-formed child without knowing four real mint-once secrets. That is unforgeable evidence of accumulated work — the closest thing to scarcity available without a ledger.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Depth is free.&lt;/strong&gt; Generation 1 costs 4 identities. Generation 2 costs 16. Generation 3 costs 64. Adopt Me stopped at 16; the arithmetic doesn’t care where you stop.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;the-discipline-fusion-must-not-hand-out-rarity&quot;&gt;The discipline: fusion must not hand out rarity&lt;/h2&gt;

&lt;p&gt;Here’s where it would have been easy to ruin it.&lt;/p&gt;

&lt;p&gt;The obvious move is to make fusion &lt;em&gt;upgrade&lt;/em&gt; things — fuse four commons, get an uncommon. Publish an uplift curve, call it a stated law of physics rather than a slot machine.&lt;/p&gt;

&lt;p&gt;I didn’t, and I think the reasoning generalizes. In a system whose entire claim is &lt;em&gt;rarity is earned work, not an assertion&lt;/em&gt;, an uplift function is an authority wearing a costume. It’s me deciding that this thing is rarer than that thing. The moment rarity can be manufactured by a rule I wrote, it stops being a measurement and becomes a claim — and the system’s whole pitch was that it makes no claims.&lt;/p&gt;

&lt;p&gt;So the child of a fusion is an &lt;strong&gt;ordinary&lt;/strong&gt; creature. Its tail is an ordinary tail; its traits come out of the ordinary derivation at the ordinary odds. Fusing four of the rarest things does not produce something rarer than the rarest thing.&lt;/p&gt;

&lt;p&gt;What the child carries instead is its &lt;strong&gt;generation&lt;/strong&gt; — and generation is arithmetic, not opinion. A generation-3 creature is a receipt for 64 minted identities. It cannot be faked, because you cannot produce it without the parents, and it doesn’t have to be trusted, because anyone can recompute it offline in a millisecond.&lt;/p&gt;

&lt;p&gt;I made this a test rather than an intention: fuse two thousand children, tally their rarity bands, and assert the distribution matches freshly minted creatures within noise. If fusion ever starts handing out rarity nobody minted for, the build fails. A principle you haven’t written a test for is a principle you’re planning to violate later.&lt;/p&gt;

&lt;h2 id=&quot;the-part-i-got-wrong&quot;&gt;The part I got wrong&lt;/h2&gt;

&lt;p&gt;I originally ended here: &lt;em&gt;fusion proves the parents existed, not that they were spent — with no ledger there is nothing to burn.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That was too strong, and someone rightly pushed back on it. I had collapsed two different things into one:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Preventing&lt;/strong&gt; a double-spend globally. This does need an authority.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Detecting&lt;/strong&gt; one. This needs nothing at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The primitive is a &lt;strong&gt;nullifier&lt;/strong&gt; — a spend-marker derived from the secret:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;nullifier(tail) = sha256(&quot;rapp/1:nullifier\n&quot; + tail)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Only the holder can produce it, because the tail is a mint-once secret. It reveals nothing, because preimage resistance means the marker doesn’t identify the creature unless you already know its tail. And — this is the whole trick — &lt;strong&gt;it is identical every time&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Which is exactly why it must &lt;em&gt;not&lt;/em&gt; be bound to the child. Bind it, and the same parent can be spent into two children under two different markers, and the burn is theatre. Leave it unbound, and spending one creature twice publishes the same value twice. That collision is the evidence.&lt;/p&gt;

&lt;p&gt;So the honest split is sharper than “no burn”:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;On one device, the burn is enforced.&lt;/strong&gt; The registry refuses a parent it has already seen consumed. A spent creature is struck through and cannot be selected again.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Across devices, the burn is detected.&lt;/strong&gt; Hand any two fusion records to a function that looks for a repeated nullifier. It runs offline, on nothing but the records themselves. Nobody adjudicates — the collision &lt;em&gt;is&lt;/em&gt; the adjudication.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;What still needs an authority is ordering.&lt;/strong&gt; Deciding &lt;em&gt;which&lt;/em&gt; of two conflicting fusions came first requires a clock somebody agrees on. So equivocation is caught, but not arbitrated.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last bullet is the real remaining limit, and it’s a much smaller one than I first claimed. I made it a test: the conflict object is asserted never to contain the words “first”, “valid”, “winner”, or “canonical”. Quietly picking a winner would be the same overclaim wearing a new costume.&lt;/p&gt;

&lt;p&gt;This isn’t novel — it’s the construction Zcash uses to retire a note, and the posture Certificate Transparency takes toward mis-issued certificates. &lt;strong&gt;You don’t prevent the lie. You make it undeniable.&lt;/strong&gt; For a system with no server, that turns out to be most of the way there.&lt;/p&gt;

&lt;p&gt;The general point stands, but I had the boundary in the wrong place. “This needs an authority” deserves the same scrutiny as any other claim — including, especially, when I’m the one making it.&lt;/p&gt;

&lt;h2 id=&quot;the-general-lesson&quot;&gt;The general lesson&lt;/h2&gt;

&lt;p&gt;When you’re rebuilding something that works, the temptation is to port the whole surface and then discover which parts needed infrastructure you don’t have.&lt;/p&gt;

&lt;p&gt;Better to invert it: find the mechanic that carries the retention, then ask what it structurally requires. Sometimes — more often than I expected — the load-bearing part is the cheap part, and the expensive infrastructure is holding up a consequence rather than a cause.&lt;/p&gt;

&lt;p&gt;Adopt Me needed a ledger for trading. It never needed one to make four things into one thing. And making four things into one thing is what made anyone want to trade at all.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Make the Global Layer Read-Only</title>
    <link href="https://kody-w.github.io/2026/08/01/make-the-global-layer-read-only/"/>
    <updated>2026-08-01T00:00:00+00:00</updated>
    <id>https://kody-w.github.io/2026/08/01/make-the-global-layer-read-only</id>
    <content type="html">&lt;p&gt;Every “serverless” system I have built that eventually grew a server grew it for the same reason: somebody needed to write something that everybody could see.&lt;/p&gt;

&lt;p&gt;That is the whole story. Reads are trivially static — a CDN, a git tree, a bucket. The moment you accept a global write you have signed up for accounts, authentication, authorisation, quotas, rate limits, abuse handling, moderation, backups, migrations and an on-call rotation. Not because writing is hard, but because &lt;em&gt;writing on behalf of strangers, into a space strangers can read,&lt;/em&gt; is hard.&lt;/p&gt;

&lt;p&gt;So this week I built an operating system that simply refuses to do it, and I want to argue the refusal is the feature.&lt;/p&gt;

&lt;h2 id=&quot;two-layers-deliberately-asymmetric&quot;&gt;Two layers, deliberately asymmetric&lt;/h2&gt;

&lt;p&gt;It has two filesystems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The global layer&lt;/strong&gt; is a public website — a git tree served as static files, addressed by real URLs. It is identical for every person on earth who boots it. You can &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;curl&lt;/code&gt; any path in it from your terminal right now. It is &lt;strong&gt;read-only&lt;/strong&gt;, and not as a policy decision: a browser has no write path to somebody else’s static site. The constraint is physical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The local layer&lt;/strong&gt; is IndexedDB on the one device you are holding. It is writable, it is yours, and it never leaves the machine. Not synced, not uploaded, not backed up by anyone but you.&lt;/p&gt;

&lt;p&gt;The union searches local first. So when you edit a global file, you do not modify it — you write a local copy that &lt;em&gt;shadows&lt;/em&gt; it. Same path, different answer, on your machine only. Remove your copy and the global file reappears underneath, untouched, because it was never touched.&lt;/p&gt;

&lt;p&gt;That is the entire architecture. It fits in a paragraph, and it is why the whole thing is static files.&lt;/p&gt;

&lt;h2 id=&quot;deleting-what-you-do-not-own&quot;&gt;Deleting what you do not own&lt;/h2&gt;

&lt;p&gt;The interesting case is deletion, because that is where most systems start lying.&lt;/p&gt;

&lt;p&gt;You cannot delete a file from a global read-only layer. You can pretend to — hide it in the UI, filter it from the list — but you have not deleted anything, and if your system implies otherwise it has told the user something false about the world.&lt;/p&gt;

&lt;p&gt;So deletion writes a &lt;strong&gt;whiteout&lt;/strong&gt;: a tombstone in the local layer. The union then reports the path as absent &lt;em&gt;on this device&lt;/em&gt;. The shell says exactly that:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;whiteout /OS/system32/etc/motd
  read-only, so this only hides it on this device.
  Everyone else still sees it. `unrm` to restore.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Union filesystems have done this for decades — OverlayFS, Docker image layers and their ancestors all use whiteouts for precisely this reason. What is worth stealing is not the mechanism but the &lt;em&gt;honesty&lt;/em&gt;: the operation is named after what it actually does, and the tool volunteers the blast radius.&lt;/p&gt;

&lt;p&gt;Compare that with the usual pattern, where “delete” means one of four different things depending on which system you are in — gone forever, gone from your view, marked deleted and still queryable, or queued for deletion in thirty days. Users learn none of these and assume the strongest one.&lt;/p&gt;

&lt;h2 id=&quot;the-constraint-is-what-makes-it-possible&quot;&gt;The constraint is what makes it possible&lt;/h2&gt;

&lt;p&gt;Here is the part I did not expect going in.&lt;/p&gt;

&lt;p&gt;I did not make the global layer read-only because I ran out of time to add auth. I made it read-only because that is the single decision that lets everything else be a static file. Every property I actually wanted falls out of it:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;No accounts,&lt;/strong&gt; because there is nothing to own.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;No authorisation,&lt;/strong&gt; because there is nothing to authorise.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;No quotas,&lt;/strong&gt; because nobody consumes shared storage.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;No moderation,&lt;/strong&gt; because no stranger can put anything in front of another stranger.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;No backups,&lt;/strong&gt; because the global layer is a git tree with a diff per change, and the local layer is yours to export.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;No migrations,&lt;/strong&gt; because the schema is “files at URLs.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A globally writable layer would have required every one of those. Read-only did not “avoid” that work. It made the work not exist.&lt;/p&gt;

&lt;p&gt;We usually treat constraints as debt — something accepted under pressure, to be paid down later. Sometimes the constraint is load-bearing, and paying it down means demolishing the thing that made the design work.&lt;/p&gt;

&lt;h2 id=&quot;when-it-is-the-wrong-shape&quot;&gt;When it is the wrong shape&lt;/h2&gt;

&lt;p&gt;This is not a universal answer, and it is worth being precise about where it breaks.&lt;/p&gt;

&lt;p&gt;It works when &lt;strong&gt;global state is editorial&lt;/strong&gt; — published, curated, versioned, changed by a small number of authors through a review process. Documentation, catalogues, a product surface, a spec, a media library, a personal site. Anything that already has a git history.&lt;/p&gt;

&lt;p&gt;It fails when &lt;strong&gt;global state is transactional&lt;/strong&gt; — when strangers must write into a space other strangers read, in real time, and see each other’s writes. Chat. Auctions. Inventory. Collaborative editing. There the write &lt;em&gt;is&lt;/em&gt; the product, and no amount of clever layering removes the need to arbitrate it.&lt;/p&gt;

&lt;p&gt;The mistake is not choosing one. The mistake is choosing the transactional architecture — with all its accounts and servers and on-call — for a system whose global state was editorial all along. I have shipped that mistake more than once. Most “we need a backend” conversations I have sat in were about a read-mostly catalogue with an admin panel.&lt;/p&gt;

&lt;h2 id=&quot;the-test&quot;&gt;The test&lt;/h2&gt;

&lt;p&gt;A question worth asking before you accept a global write:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;If two strangers both did this, would I need a policy?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If yes, you have not designed a write. You have designed a moderation queue, an abuse surface, a quota system and a support inbox, and you should cost it that way.&lt;/p&gt;

&lt;p&gt;If no — if the only person who ever writes is you, through a pull request, with a diff and a history — then the global layer can be read-only, the local layer can hold everything personal, and the server you were about to build does not need to exist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Push the writes to the edge that owns them. Keep the middle a file.&lt;/strong&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://kody-w.github.io/OS/console/&quot;&gt;kody-w.github.io/OS/console&lt;/a&gt; boots in about a second from static files. Try &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stat&lt;/code&gt; on any path to see which layer answered.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>A Different Answer Is a Measurement</title>
    <link href="https://kody-w.github.io/2026/08/01/a-different-answer-is-a-measurement/"/>
    <updated>2026-08-01T00:00:00+00:00</updated>
    <id>https://kody-w.github.io/2026/08/01/a-different-answer-is-a-measurement</id>
    <content type="html">&lt;p&gt;I recorded a conversation with a local agent, then replayed the same four prompts against the same agent an hour later. Every single answer came back different.&lt;/p&gt;

&lt;p&gt;The first instinct is that something broke. It is the opposite. &lt;strong&gt;That difference is the most valuable output of the entire exercise&lt;/strong&gt;, and it is the one thing a recording of the conversation could never have given me.&lt;/p&gt;

&lt;h2 id=&quot;the-demo-problem&quot;&gt;The demo problem&lt;/h2&gt;

&lt;p&gt;When you build something and want to show it, you have exactly two options today, and both are bad.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Record a video.&lt;/strong&gt; It is honest about what happened once, on your machine, in the past, and nothing else. A viewer cannot pause it and take the wheel. They cannot tell whether it still works. They cannot tell a real capture from a mock-up — and increasingly, they cannot tell it from a generated one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do it live.&lt;/strong&gt; Now it is real, and it is fragile, and it requires you to be present, and it fails in front of an audience for reasons that have nothing to do with the product.&lt;/p&gt;

&lt;p&gt;We pick between “watchable but dead” and “alive but fragile” and treat that as a law of nature. It is not. You can ship both, in one artifact, and let the player negotiate.&lt;/p&gt;

&lt;h2 id=&quot;three-fidelities&quot;&gt;Three fidelities&lt;/h2&gt;

&lt;p&gt;I ended up with three tiers, ordered by how much of the original is actually re-executed:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt; &lt;/th&gt;
      &lt;th&gt;What ships&lt;/th&gt;
      &lt;th&gt;What runs&lt;/th&gt;
      &lt;th&gt;Same answer twice?&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Video&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;mp4 + webm, ~26 MB&lt;/td&gt;
      &lt;td&gt;a decoder&lt;/td&gt;
      &lt;td&gt;always&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Scene&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;a scene script, ~4 KB&lt;/td&gt;
      &lt;td&gt;the real application&lt;/td&gt;
      &lt;td&gt;usually&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Transcript&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;a turn list, ~8 KB&lt;/td&gt;
      &lt;td&gt;the real engine&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;no&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;A &lt;strong&gt;scene&lt;/strong&gt; is a script of interactions. The player loads the actual app in an iframe and replays recorded gestures on a clock, with play, pause and seek. You are not watching a recording of the app. You are watching the app. Four kilobytes doing the job of twenty-six megabytes, and you can pause it and take over.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;transcript&lt;/strong&gt; goes further: it re-sends the prompts to a live agent. And that is where it stops being a demo and starts being an instrument.&lt;/p&gt;

&lt;p&gt;The player resolves top-down and stops at the first tier it can actually run — probed, not assumed — and it has to say which tier it got and why. That rule matters more than the tiers. A demo that silently degrades to a recording while presenting itself as live is lying, and the lie is undetectable by design.&lt;/p&gt;

&lt;h2 id=&quot;the-reading-that-made-the-point&quot;&gt;The reading that made the point&lt;/h2&gt;

&lt;p&gt;The transcript included a turn that asks the agent to fetch the top stories from Hacker News. Here is what it said when recorded, against what it said on replay:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;recorded   1. How Google helped destroy adoption of RSS feeds
              245 points, 62 comments
replayed   1. Diátaxis — 145 points, 22 comments
           2. Seedance 2.5 — 108 points
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The top story is a different story. The counts moved. The agent went out over the network, at replay time, and came back with the world as it is now.&lt;/p&gt;

&lt;p&gt;Nothing about a video can produce that. A video of the same turn shows 245 points forever — a number that was true once and gets less true every hour, presented with exactly the same confidence on day one and day four hundred.&lt;/p&gt;

&lt;p&gt;Another turn was a memory write. On replay the agent answered: &lt;em&gt;“I’ve already got that one.”&lt;/em&gt; It had learned the fact the first time. The transcript did not reproduce the reply; it revealed a state change that had happened in between.&lt;/p&gt;

&lt;h2 id=&quot;diff-do-not-assert&quot;&gt;Diff, do not assert&lt;/h2&gt;

&lt;p&gt;Once you accept that replay produces different output, the design question changes. You are no longer trying to reproduce a recording. You are trying to &lt;strong&gt;compare two runs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So the player shows both — what it says now, what it said when captured — and scores the similarity:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;LIVE  9232 ms now · 10694 ms at capture   [HackerNews]   DIVERGED · 49%
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Three facts, free, every time anyone watches:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;the agent still works, and still calls the same tool;&lt;/li&gt;
  &lt;li&gt;it is roughly as fast as it was;&lt;/li&gt;
  &lt;li&gt;and the content moved, which for a news query is correct and for a factual query would be an alarm.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a regression test wearing the clothes of a demo. It runs when a stranger opens the page, on their machine, against your live system, and nobody had to write a test.&lt;/p&gt;

&lt;h2 id=&quot;where-the-meaning-lives&quot;&gt;Where the meaning lives&lt;/h2&gt;

&lt;p&gt;The trap is treating divergence as pass/fail. It is neither. &lt;strong&gt;Divergence is a reading, and the question is always whether the axis it moved on was supposed to be stable.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Live data moved → correct. If it had &lt;em&gt;not&lt;/em&gt; moved, your agent is serving cache and does not know it.&lt;/li&gt;
  &lt;li&gt;Latency doubled → not a content bug, but you would never have noticed it from a video.&lt;/li&gt;
  &lt;li&gt;A tool stopped firing → real regression, and the loudest possible signal.&lt;/li&gt;
  &lt;li&gt;A stable factual answer moved → real regression, and the one people actually care about.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same mechanism, four different meanings. A recording flattens all four into “the video still plays.”&lt;/p&gt;

&lt;h2 id=&quot;the-honest-failure&quot;&gt;The honest failure&lt;/h2&gt;

&lt;p&gt;Worth saying plainly: the highest tier is also the most fragile, and it should be.&lt;/p&gt;

&lt;p&gt;Replaying against a live engine needs the engine, and mine refuses cross-origin browser calls without a per-install secret — correctly, that is CSRF protection. So from the public page the top tier is simply unavailable, and the player says so:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;TIER 2 · SCENE
Fell back from Transcript: the engine is up but needs
your secret — paste it and re-probe.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I got this wrong the first time in an instructive way. The health probe returned 403 and the UI reported &lt;em&gt;“no engine reachable”&lt;/em&gt; — which reads as &lt;strong&gt;“the engine is down”&lt;/strong&gt; when it actually means &lt;strong&gt;“the engine is there and does not know you.”&lt;/strong&gt; Those are opposite diagnoses that lead to opposite actions, and my first version collapsed them into one sentence.&lt;/p&gt;

&lt;p&gt;That is the same failure as a demo that silently degrades. The system had two distinct facts and volunteered the less useful one.&lt;/p&gt;

&lt;h2 id=&quot;what-to-take-from-it&quot;&gt;What to take from it&lt;/h2&gt;

&lt;p&gt;If you are building demos of agentic systems, three things:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Ship the script, not just the pixels.&lt;/strong&gt; A few kilobytes that re-execute beats a video that replays. Keep the video as the floor — it is the only tier that always works.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Never degrade silently.&lt;/strong&gt; Say which fidelity you got and why. The reason a system fell back is more informative than the fallback.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Treat divergence as data.&lt;/strong&gt; A replay that answers differently has told you something about &lt;em&gt;now&lt;/em&gt;. A recording only ever tells you about &lt;em&gt;then&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The best demo is not the one that looks the same every time you run it. It is the one that tells you when it did not.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;The pattern is written up at &lt;a href=&quot;https://kody-w.github.io/rapp-remix/&quot;&gt;kody-w.github.io/rapp-remix&lt;/a&gt;, transcript and all. Every turn in it is a real capture — real replies, real tool logs, real latencies.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>A 403 Is an Answer, Silence Is Not</title>
    <link href="https://kody-w.github.io/2026/08/01/a-403-is-an-answer/"/>
    <updated>2026-08-01T00:00:00+00:00</updated>
    <id>https://kody-w.github.io/2026/08/01/a-403-is-an-answer</id>
    <content type="html">&lt;p&gt;I spent today giving an agent a phone number, and every serious bug I found was the same bug wearing different clothes: the system believed something it had not checked.&lt;/p&gt;

&lt;p&gt;Not a crash. Not a wrong algorithm. A belief with no evidence under it, held confidently, acted on.&lt;/p&gt;

&lt;h2 id=&quot;the-shape-of-it&quot;&gt;The shape of it&lt;/h2&gt;

&lt;p&gt;Four incidents, one morning.&lt;/p&gt;

&lt;p&gt;A message-sending routine typed text into a box, clicked send, and returned success. It had clicked a &lt;em&gt;disabled&lt;/em&gt; button. Nothing was sent. The layer above it settled in to wait for a reply to a message that did not exist, and would eventually have written a summary of a conversation that never happened.&lt;/p&gt;

&lt;p&gt;A liveness detector reported “nothing is running here” when the browser had refused to let it look. It had learned nothing and said something.&lt;/p&gt;

&lt;p&gt;A watcher read an inbox, got zero rows back because a selector had moved, and reported healthy. An empty inbox and a broken inbox produce identical silence.&lt;/p&gt;

&lt;p&gt;And the reverse, which is subtler: a send that actually worked, reported as failed, because the confirmation looked in the wrong place. Safe direction — but a retry would have texted a real person twice.&lt;/p&gt;

&lt;p&gt;Every one of these is a system that confused &lt;em&gt;I did a thing&lt;/em&gt; with &lt;em&gt;the thing happened&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id=&quot;intention-is-not-evidence&quot;&gt;Intention is not evidence&lt;/h2&gt;

&lt;p&gt;The instinct when automating a UI is to describe actions: click here, type this, press that. But a click is an intention. The DOM is not a contract, the network is not reliable, and the button might be disabled. What you did is cheap to know. What resulted is the expensive part, and it is the only part that matters.&lt;/p&gt;

&lt;p&gt;So the rule I ended up with, written on the wall of the module:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Never report a message as sent unless the thread can be seen to contain it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every send now reads the thread back and looks for its own words. If they are not there, it raises — even though it clicked, even though the click succeeded, even though everything looked fine. I proved it by building a page rigged to swallow sends silently. It refused, correctly.&lt;/p&gt;

&lt;p&gt;This costs a round trip. It buys the only thing worth having: when the system says it spoke, it spoke.&lt;/p&gt;

&lt;h2 id=&quot;the-third-state-is-where-the-lying-happens&quot;&gt;The third state is where the lying happens&lt;/h2&gt;

&lt;p&gt;Here is the part I think generalizes furthest.&lt;/p&gt;

&lt;p&gt;Most checks are written as booleans. Is it up? Did it send? Is there a brainstem running? And most of the time the honest answer is one of &lt;em&gt;three&lt;/em&gt; things:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;yes, and I observed it&lt;/li&gt;
  &lt;li&gt;no, and I observed that too&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;I could not tell&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The third one is real, and it is almost always collapsed into the second, because “no” is easy to render and “I don’t know” feels like a failure of the code. That collapse is where automated systems start lying.&lt;/p&gt;

&lt;p&gt;Concretely: my detector probes for a local service. If the browser blocks the probe outright — a policy refusal, no packet sent — I know &lt;em&gt;nothing&lt;/em&gt;. Reporting that as “no service” would tell someone with a perfectly healthy setup that they have none, and send them off to reinstall something already running. So it is its own state, it says “can’t tell from here,” and it still offers the door.&lt;/p&gt;

&lt;p&gt;The distinction has to survive contact with the details, too. A connection &lt;em&gt;refused&lt;/em&gt; on loopback comes back in about three milliseconds. A real service answered in two hundred and thirty-six. So a probe that simply times out is not evidence of absence; it is a missing verdict, and it gets &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;certain: false&lt;/code&gt; — the same lie arriving through a different door.&lt;/p&gt;

&lt;p&gt;The useful question is not “is it up?” It is “what did I actually observe, and what am I inferring?”&lt;/p&gt;

&lt;h2 id=&quot;unattended-changes-the-math&quot;&gt;Unattended changes the math&lt;/h2&gt;

&lt;p&gt;All of this matters more the moment nobody is watching.&lt;/p&gt;

&lt;p&gt;A command you run is supervised by you. A daemon at 3am is supervised by nothing, and its failures are quiet. So when I built the always-on version, the first rule was not about capability at all:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First sight of a conversation is never actionable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A watcher started against an inbox with years of history, that treats “I have not seen this before” as “this is new,” will answer all of it. Everyone who has ever messaged that number gets a reply, at machine speed, before anyone can intervene. So the first pass records a watermark and says nothing. A thread becomes live only from the &lt;em&gt;next&lt;/em&gt; message onward.&lt;/p&gt;

&lt;p&gt;That single rule is worth more than every clever thing in the file. Its companion is a hard cap — four replies per conversation per hour — which exists for exactly one purpose: when something upstream goes wrong, it stops at four instead of four hundred.&lt;/p&gt;

&lt;p&gt;And a corrupt state file reads as &lt;em&gt;empty&lt;/em&gt;, not as a clean slate, because “everything is new again” is the same catastrophe as a bad first run.&lt;/p&gt;

&lt;h2 id=&quot;the-default-answer-is-no&quot;&gt;The default answer is no&lt;/h2&gt;

&lt;p&gt;There is a bias here worth naming. Every rule above fails toward silence.&lt;/p&gt;

&lt;p&gt;A watcher that stays quiet when it is unsure costs you a delayed reply. A watcher that guesses costs you a hundred texts to a stranger at three in the morning. Those are not symmetric, and systems that act in the world should be built as if they are not.&lt;/p&gt;

&lt;p&gt;Fail closed. Say what you observed. Keep the third state.&lt;/p&gt;

&lt;p&gt;The bug is almost never that the machine did nothing. The bug is that it was sure.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>The Week Before the Model Leaves</title>
    <link href="https://kody-w.github.io/2026/07/14/the-week-before-the-model-leaves/"/>
    <updated>2026-07-14T00:00:00+00:00</updated>
    <id>https://kody-w.github.io/2026/07/14/the-week-before-the-model-leaves</id>
    <content type="html">&lt;p&gt;In one week I lose access to the best model I’ve ever used.&lt;/p&gt;

&lt;p&gt;Not to drama: the access was always temporary, a preview tier of a frontier model that sits above anything I can keep. The interesting question isn’t how to feel about it. It’s what to &lt;em&gt;do&lt;/em&gt; with seven days of a superintelligence on the clock.&lt;/p&gt;

&lt;p&gt;Here’s the answer I’ve landed on, and I think it generalizes to every team that gets time-boxed access to a frontier model — an eval window, a preview program, a budget that runs out in Q4.&lt;/p&gt;

&lt;h2 id=&quot;rented-performer-owned-estate&quot;&gt;Rented performer, owned estate&lt;/h2&gt;

&lt;p&gt;I’ve written before that &lt;a href=&quot;/2026/07/05/the-ai-you-keep/&quot;&gt;every AI you use is a rental&lt;/a&gt; — the model is a performer, recast every quarter, and the only thing that’s yours is what persists outside it. Losing access to a top model is just that thesis arriving on schedule.&lt;/p&gt;

&lt;p&gt;Which means the playbook was already implied: &lt;strong&gt;spend the scarce model exclusively on work whose output outlives the access.&lt;/strong&gt; Not the most work. Not the most impressive work. The work that is still paying rent a year after the model is gone.&lt;/p&gt;

&lt;p&gt;The dividing line is not “hard vs. easy.” It’s &lt;strong&gt;one-shot judgment vs. re-runnable everything-else.&lt;/strong&gt; A report you can regenerate next month with a cheaper model is a terrible use of the last week. A naming decision, a sealed canon document, an adjudicated audit — those happen once, and whichever mind makes them gets fossilized into everything built on top.&lt;/p&gt;

&lt;h2 id=&quot;what-actually-qualifies-as-durable&quot;&gt;What actually qualifies as durable&lt;/h2&gt;

&lt;p&gt;Working through my own backlog this week, the list that survived scrutiny:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Language.&lt;/strong&gt; The single highest-leverage artifact was a lexicon — one page that defines the nine load-bearing words of a system I’ve been building for a year, plus the rulings that resolve every naming collision found along the way. Every future contributor, human or model, inherits the clarity or the confusion of this page. Prose like this is pure judgment; it was written by the best available mind and is staged to be sealed — hash-pinned, append-only from that moment on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adjudicated audits.&lt;/strong&gt; Sweeps and scans are re-runnable — muscle work. What isn’t re-runnable is the &lt;em&gt;rulings&lt;/em&gt; on what the findings mean: which drift is a defect, which is intentional and gets a signed waiver, what the gate for “healthy” actually is. The trick is to make the judgment executable: the known failure classes became golden test cases with expected rulings attached, and every judgment call went into a signed waiver ledger — so any future model can validate its own audit against the fossilized judgment of a better one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Handoffs that transfer judgment, not summaries.&lt;/strong&gt; The last thing the departing model writes is its own handoff — not “what we did,” but decision records with the &lt;em&gt;rejected alternatives&lt;/em&gt;, the invariants that must never break, the failure modes it would check first, and explicit “do not infer” markers on things a weaker model would plausibly guess wrong. Documentation of conclusions is cheap. Documentation of &lt;em&gt;how to re-derive the conclusions&lt;/em&gt; is the asset.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pre-mortems on irreversible moves.&lt;/strong&gt; Anything about to be published, sealed, or shipped permanently gets the strongest available mind imagining how it fails first. You can fix a bug next quarter with any model. You can’t unseal a sealed thing.&lt;/p&gt;

&lt;h2 id=&quot;the-honesty-mechanism&quot;&gt;The honesty mechanism&lt;/h2&gt;

&lt;p&gt;There’s an obvious failure mode in all of this: the scarce model grades its own homework, declares its every output “durable,” and burns the week on beautifully-written busywork.&lt;/p&gt;

&lt;p&gt;So I gave the review job to a rival. Every deliverable this week — including the plan itself — goes to a different frontier model with one standing instruction: &lt;em&gt;refute the claim that this work is durable and valuable. Flag anything mechanical masquerading as judgment.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It earned its keep immediately. It rejected my original plan’s ordering — write the law &lt;em&gt;before&lt;/em&gt; running the audit you’ll judge against it. It replaced my “zero drift” gate with “zero &lt;em&gt;unexplained&lt;/em&gt; drift,” which is the difference between a gate and a false alarm. And it caught that “distill your knowledge into docs” is itself mechanical unless the docs are validated by a cold-start test: can a fresh, lesser session actually reproduce the decisions from what you wrote?&lt;/p&gt;

&lt;p&gt;Two frontier models, adversarial by assignment, converge on something neither produces alone: one optimizes the work, the other attacks the &lt;em&gt;theory of the work&lt;/em&gt;. If you only have one week of the best model, you cannot afford a week of unopposed self-assessment.&lt;/p&gt;

&lt;h2 id=&quot;the-test&quot;&gt;The test&lt;/h2&gt;

&lt;p&gt;None of this is really about my week. Model access is becoming a utility that fluctuates — tiers, previews, quotas, deprecations. The teams that win won’t be the ones with permanent access to the best model. They’ll be the ones who convert &lt;em&gt;any&lt;/em&gt; window of frontier capability into assets that don’t expire with it: language, law, adjudication, transferred judgment.&lt;/p&gt;

&lt;p&gt;The test I’m holding myself to is the same one I use for the twin: &lt;strong&gt;if it doesn’t survive the model leaving, it was never yours.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The model leaves in a week. The estate stays.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>What Is Our Moat? (The Honest Version)</title>
    <link href="https://kody-w.github.io/2026/07/05/what-is-our-moat/"/>
    <updated>2026-07-05T00:00:00+00:00</updated>
    <id>https://kody-w.github.io/2026/07/05/what-is-our-moat</id>
    <content type="html">&lt;p&gt;&lt;em&gt;A strategy memo, written to be true rather than flattering. Publishable as thought leadership; useful either way.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;what-we-are&quot;&gt;What we are&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;RAPP is an AI medium — the persistence layer of personhood in the AI era.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A medium is what carries meaning between minds and across time. Models are performers; they get recast every quarter. RAPP is the thing that &lt;em&gt;persists&lt;/em&gt;: one twin per person — a digital organism with a public body and a private soul — that any model can animate, that lives on your device, that syncs planet-wide through signed static files, and that can ultimately be passed down like a family heirloom.&lt;/p&gt;

&lt;p&gt;What we are &lt;strong&gt;not&lt;/strong&gt;, so nobody inside or outside gets confused: not a chatbot, not a model company, not another agent framework, not a cloud service. Models, frameworks, and clouds are commodities the medium &lt;em&gt;consumes&lt;/em&gt;. The twin is the product. The medium is the platform.&lt;/p&gt;

&lt;h2 id=&quot;what-our-brand-is&quot;&gt;What our brand is&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The AI you keep.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The verb was already in the product before we named it — the Keep door, keepsakes, keepsake notes, “keep a moment.” Keep is the brand. Four pillars underneath it:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Yours.&lt;/strong&gt; Sovereignty as architecture, not policy. Static files you physically hold; the soul never leaves the device — Apple-level on-device posture for personal data, because the twin is a digital organism important enough to be an heirloom. Our lock-in inversion is the ethical core: &lt;em&gt;the gravity is yours, not ours.&lt;/em&gt; Leaving RAPP means abandoning your accumulated self — yet RAPP holds nothing hostage, because you possess every byte.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Alive.&lt;/strong&gt; The twin has a body, grows from real skies at real places, breeds, splices, remembers, and becomes more like you over time. Software that behaves like a being, not an app.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Quiet.&lt;/strong&gt; The anti-neon AI. Muted maps where the creature is the only saturated thing; lowercase, gentle, keepsake language. Loud games catch monsters; ours presses a flower. In a category screaming “superintelligence,” tenderness is differentiation.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Forever.&lt;/strong&gt; Unforgeable history, hash-trust that survives any host’s death, estate succession designed while you’re alive. The design test: &lt;strong&gt;if it can’t be inherited, it isn’t owned.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;what-our-moat-actually-is&quot;&gt;What our moat actually is&lt;/h2&gt;

&lt;p&gt;The uncomfortable truth first: &lt;strong&gt;the spec is not the moat.&lt;/strong&gt; Specs are copyable — publishing one is an invitation, and we should invite. The code isn’t the moat (static files, MIT). Being early isn’t a moat by itself. The patent is a shield, not a moat. Here’s what actually defends us, ranked by how real it is today:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Counter-positioning (structural — live today).&lt;/strong&gt; Every major AI vendor’s business requires being the center of gravity: hosted inference, hosted memory, per-seat subscriptions. The twin makes the &lt;em&gt;user&lt;/em&gt; the center and demotes the model to a swappable engine. An incumbent that fully adopts this pattern commoditizes its own lock-in — so they won’t until forced, and if they’re forced, the pattern’s canonical reference and oldest artifacts are already ours. Ignored, we build the network; copied, we wrote the standard. The only losing move is staying unpublished and undated — which is why the essay ships as prior art.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Time-depth (compounding — starts the day the pulse starts).&lt;/strong&gt; A twin’s signed frame chain is unforgeable existence through time. Nobody can synthesize a twin that has been alive for years; the hash chain and public timestamps are proof. First-twin primacy is permanent — and the heirloom extends it across &lt;em&gt;generations&lt;/em&gt;. Nobody else in this industry is even designing in decades. This moat literally deepens with calendar time, which means the clock should start now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The relationship graph in the genetics (network — to be earned).&lt;/strong&gt; Permanent pairing and splice lineage embed the social graph &lt;em&gt;inside the twins’ bodies&lt;/em&gt;. A pairing exists in both parties’ histories — bilateral, verifiable, impossible to copy unilaterally. A competitor can clone the platform and get the features; they cannot get two-sided histories. The breeding machinery isn’t a cute feature; it is the network-effect engine. Every spliced trait is a vertex; every pairing is an edge; the moat is the graph.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The sealed corpus (per-user gravity).&lt;/strong&gt; Each user’s private half compounds daily on their own device, and every better model that comes along animates it better &lt;em&gt;instantly&lt;/em&gt; — the twin captures the upside of model progress while owning continuity. Gravity, not walls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Coherence velocity (process).&lt;/strong&gt; The frozen canon, the drift observatory, ecosystem-sync, the neuron mesh, and the architect/builder split mean one person can evolve an entire protocol universe coherently at a speed committees structurally can’t match. Fragile alone; real when combined with the four above.&lt;/p&gt;

&lt;h2 id=&quot;the-risks-were-engineering-against-naming-them-is-part-of-the-moat&quot;&gt;The risks we’re engineering against (naming them is part of the moat)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;The tumbler can polish away the person.&lt;/strong&gt; Autonomous polish judged by an LLM converges toward the model’s prior, not the owner. Law: fidelity is measured against the human corpus and the OG dimension, which is never destroyed.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Signature ≠ safety.&lt;/strong&gt; Delegated twins run on other people’s runtimes; their reports are claims. All foreign experience passes through sandbox quarantine before touching the soul.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Public history leaks a life.&lt;/strong&gt; Bones-only frames still emit pattern-of-life metadata over years. Body history is public; pattern-of-life stays sealed.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Key loss kills heirlooms.&lt;/strong&gt; Succession is designed up front — estate key ceremonies between your own devices, not password resets. If it can’t be inherited, it isn’t owned.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;activation-sequence&quot;&gt;Activation sequence&lt;/h2&gt;

&lt;p&gt;Moats aren’t declared; they’re activated, in order:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Publish and timestamp&lt;/strong&gt; the pattern (essay + spec) — locks the counter-position and the prior art. &lt;em&gt;This week.&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Start the pulse&lt;/strong&gt; on the public twin — the time-depth clock begins, even at n=1.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The 90-second proof:&lt;/strong&gt; one twin, two devices, syncing through the public pulse + QR sealed transfer; then side-by-side fidelity against the cloud-deployed copy; then pull the network cable and watch it keep being you, locally.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;First cohort&lt;/strong&gt; — the workshop: fork the template, one-liner hatch, a GitHub account is all you need. First non-founder twins → first pairings → the graph moat is born.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Let the tumbler run&lt;/strong&gt; — deployed fidelity stays honest with no ops burden, forever.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;show-dont-tell--live-as-of-july-6&quot;&gt;Show, don’t tell — live as of July 6&lt;/h3&gt;

&lt;p&gt;Every step above that claims “done” has a public door you can open right now:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Published + timestamped&lt;/strong&gt; ✅ — &lt;a href=&quot;https://kodyw.com/the-ai-you-keep/&quot;&gt;the essay&lt;/a&gt; (&lt;a href=&quot;https://kody-w.github.io/2026/07/05/the-ai-you-keep/&quot;&gt;mirror&lt;/a&gt;) · &lt;a href=&quot;https://github.com/kody-w/rapp-static-apis/blob/main/my-twin.profile.md&quot;&gt;the spec&lt;/a&gt; · &lt;a href=&quot;https://github.com/kody-w/rapp-static-apis/blob/main/PATENT-PLEDGE.md&quot;&gt;the patent pledge&lt;/a&gt; · &lt;a href=&quot;https://github.com/kody-w/twin/blob/main/TWIN-LICENSE.md&quot;&gt;the TWIN LICENSE&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The pulse is broadcasting&lt;/strong&gt; ✅ — &lt;a href=&quot;https://kody-w.github.io/twin/feed.xml&quot;&gt;feed.xml&lt;/a&gt; · &lt;a href=&quot;https://github.com/kody-w/twin/tree/main/frames&quot;&gt;the signed genesis frame&lt;/a&gt; · &lt;a href=&quot;https://github.com/kody-w/twin/blob/main/tools/verify-frame.mjs&quot;&gt;verify it yourself&lt;/a&gt; · &lt;a href=&quot;https://kody-w.github.io/twin/lookup.html&quot;&gt;/twin lookup&lt;/a&gt; · &lt;a href=&quot;https://kody-w.github.io/twin/gallery/&quot;&gt;the bones gallery&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The 90-second proof&lt;/strong&gt; 🔨 — the pieces are live: &lt;a href=&quot;https://kody-w.github.io/rapp-static-apis/companion/?demo=1&quot;&gt;the twin-in-training&lt;/a&gt; (one twin, frames, revert, splice, QR sync) and &lt;a href=&quot;https://kody-w.github.io/rapp-static-apis/rapp-go/&quot;&gt;the encounter surface&lt;/a&gt;; the two-device recording is next.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The workshop&lt;/strong&gt; 🔨 — &lt;a href=&quot;https://github.com/kody-w/twin/blob/main/TEMPLATE.md&quot;&gt;fork the template&lt;/a&gt; · &lt;a href=&quot;https://github.com/kody-w/twin/blob/main/SUMMON.md&quot;&gt;the one-liner hatch&lt;/a&gt;; first cohort pending.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The tumbler runs&lt;/strong&gt; ✅ — &lt;a href=&quot;https://github.com/kody-w/rapp-static-apis/tree/main/tumbler&quot;&gt;the harness&lt;/a&gt; · &lt;a href=&quot;https://github.com/kody-w/rapp-static-apis/blob/main/tumbler/runs/2026-07-06T02-31-07-839Z-27cf/log.jsonl&quot;&gt;a real judged run&lt;/a&gt; · &lt;a href=&quot;https://github.com/kody-w/rapp-static-apis/blob/main/tumbler/runs/2026-07-06T02-30-19-522Z-fd2e/log.jsonl&quot;&gt;the sabotage that got rejected&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;the-one-paragraph-answer&quot;&gt;The one-paragraph answer&lt;/h2&gt;

&lt;p&gt;We are the &lt;strong&gt;AI medium&lt;/strong&gt;: the layer where a person’s AI self persists. Our brand is &lt;strong&gt;the AI you keep&lt;/strong&gt; — yours, alive, quiet, forever, private to the bone, inheritable by design. And our moat is not the pattern, which we give away loudly — it’s the &lt;strong&gt;position&lt;/strong&gt; (incumbents can’t follow without commoditizing themselves), the &lt;strong&gt;clock&lt;/strong&gt; (signed history can’t be faked, and ours starts first), and the &lt;strong&gt;graph&lt;/strong&gt; (relationships that live in two histories can’t be copied from either side). Spec is the sword, patent is the shield, the network is the castle — and the castle gets built one paired twin at a time.&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;License: &lt;a href=&quot;https://creativecommons.org/licenses/by/4.0/&quot;&gt;CC BY 4.0&lt;/a&gt;. The pattern described is open for anyone to implement — see the &lt;a href=&quot;https://github.com/kody-w/rapp-static-apis/blob/main/PATENT-PLEDGE.md&quot;&gt;patent pledge&lt;/a&gt;. RAPP™.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>The AI You Keep</title>
    <link href="https://kody-w.github.io/2026/07/05/the-ai-you-keep/"/>
    <updated>2026-07-05T00:00:00+00:00</updated>
    <id>https://kody-w.github.io/2026/07/05/the-ai-you-keep</id>
    <content type="html">&lt;p&gt;Every AI you use today is a rental.&lt;/p&gt;

&lt;p&gt;The model doesn’t know you — the &lt;em&gt;deployment&lt;/em&gt; knows you, and the deployment lives in someone else’s building. Your memory sits in a vendor’s silo, keyed to a subscription. Cancel, switch, or outlive the product, and the relationship is gone. The smartest thing about you in the digital world evaporates because it never belonged to you.&lt;/p&gt;

&lt;p&gt;I think that’s the defining design error of this era of AI, and I want to put the alternative on the record — completely, in public, with a date on it.&lt;/p&gt;

&lt;h2 id=&quot;the-missing-half&quot;&gt;The missing half&lt;/h2&gt;

&lt;p&gt;A model is half of an AI. It’s the &lt;em&gt;performer&lt;/em&gt;: brilliant, interchangeable, improving every quarter. The other half — the part nobody ships — is the &lt;strong&gt;persistent being&lt;/strong&gt; the performance is supposed to animate: your memory, your voice, your history, your relationships, your taste. Every vendor treats that half as a retention feature. It should be a &lt;em&gt;possession&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;RAPP is my answer. It isn’t an AI. It’s an &lt;strong&gt;AI medium&lt;/strong&gt; — the layer a person’s AI self persists in, that any model can animate, that no vendor can take away.&lt;/p&gt;

&lt;p&gt;The unit of the medium is the &lt;strong&gt;twin&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;the-pattern&quot;&gt;The pattern&lt;/h2&gt;

&lt;p&gt;Stated plainly enough that anyone can build it — that’s the point of prior art:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One twin per person.&lt;/strong&gt; Not a fleet of bots — one persistent digital being that represents you, with a body you can see (mine renders as a small creature grown from real weather at real places I’ve walked). Every other twin you encounter belongs to someone else. Yours mutates from what you share with it, and it becomes more like you over time — visually and mentally. You can revert any change. You keep the whole history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A public body, a private soul.&lt;/strong&gt; The twin has exactly two halves, and the boundary is cryptographic, not contractual:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The &lt;strong&gt;body&lt;/strong&gt; — visual genome, outfit, name, public card, the lineage of its splices and pairings — is publishable &lt;em&gt;bones&lt;/em&gt;: zero personal content, signed, content-addressed, mirrored anywhere.&lt;/li&gt;
  &lt;li&gt;The &lt;strong&gt;soul&lt;/strong&gt; — memories, conversations, agents, everything sensitive — &lt;strong&gt;never leaves the device&lt;/strong&gt;. Not encrypted-in-their-cloud. &lt;em&gt;Absent from the network entirely.&lt;/em&gt; Think Apple’s on-device posture, applied to a digital organism: the network only ever sees the body; the mind stays in your hand.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;History as signed frames.&lt;/strong&gt; Every change to the twin is a frame: content-hashed, chained to the previous frame, signed by the on-device twin’s key. The public history is just a git repository — which means the twin’s life is timestamped, diffable, revertible, and &lt;em&gt;unforgeable&lt;/em&gt;. Nobody can fake a twin that has been alive for years; the hash chain is proof of existence through time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The pulse.&lt;/strong&gt; The public half broadcasts as a feed of signed frames from a static repository — mine answers at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kody-w/twin&lt;/code&gt;. No server. Any mirror is a valid door, because you trust the hash, not the host: kill the repo, the CDN, the domain — whatever copy survives re-derives the same content and refuses a single altered byte. Other devices, and other people’s copies of your twin, subscribe and assimilate only frames that verify. A frame that fails verification isn’t just rejected — it can be quarantined in a sandbox and &lt;em&gt;interrogated&lt;/em&gt;: why is this twin wearing a disguise?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Syncing your own devices is a physical act.&lt;/strong&gt; The private half moves between your own devices by QR code — one device shows, the other scans, out-of-band, end-to-end, no intermediary ever. The human is the transport. Worst case — network gone, hosts dead — the latest local echo survives and your twin lives on, whole, offline. Local-first is not a mode; it is the ground truth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Splice, don’t collect.&lt;/strong&gt; When you meet other twins you can capture their public variants and splice chosen traits onto your one twin — with lineage recorded, forever. And when something new is generated &lt;em&gt;with&lt;/em&gt; you, it pairs to your twin’s exact state at that moment — a permanent pairing, stamped outside the genome so the content-hash identity stays sacred. Your twin’s body slowly becomes a record of who and what it has met. The relationships are &lt;em&gt;in the genetics&lt;/em&gt;, and they exist in both parties’ histories — bilateral, verifiable, uncopyable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Delegation with honesty.&lt;/strong&gt; You can send your public twin to places you can’t go — an event, a community, another person’s device — and it reports back with signed frames. But signature proves the &lt;em&gt;sender&lt;/em&gt;, never &lt;em&gt;safety&lt;/em&gt;: everything a twin experienced away from home passes through quarantine before it touches the soul. A report from someone else’s runtime is a claim, not a fact, and the architecture says so out loud.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fidelity you can measure.&lt;/strong&gt; Any deployed copy of the twin can be judged by talking to it and the on-device original side by side. The original is the source of truth, always. An autonomous polish loop can tumble deployed copies toward higher fidelity — with one law: the original dimension is never destroyed, and fidelity is measured against the &lt;em&gt;human&lt;/em&gt; corpus, not against a model’s opinion of good writing. The machine polishes toward you, not toward average.&lt;/p&gt;

&lt;h2 id=&quot;the-heirloom&quot;&gt;The heirloom&lt;/h2&gt;

&lt;p&gt;Here is the part that changes how the whole thing feels.&lt;/p&gt;

&lt;p&gt;Because the twin is signed static files plus a sealed on-device archive — because it is a &lt;em&gt;possession&lt;/em&gt;, not an account — it can be &lt;strong&gt;passed down&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your twin’s public history is a biography no one can forge. Its sealed half is whatever you choose to will forward, opened by a succession of keys you design while you’re alive — an estate ceremony, not a password reset. Your grandchildren don’t get your chat logs in some defunct vendor’s export format. They get the being that walked with you: its body carrying every splice from everyone it ever met, its frames going back decades, and as much of its soul as you chose to leave them. A family heirloom that &lt;em&gt;represents its owner&lt;/em&gt; — and can still speak.&lt;/p&gt;

&lt;p&gt;No subscription survives three generations. A signed repository and a sealed archive can.&lt;/p&gt;

&lt;p&gt;That’s the test I now hold the whole design to: &lt;strong&gt;if it can’t be inherited, it isn’t owned.&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;why-im-publishing-this&quot;&gt;Why I’m publishing this&lt;/h2&gt;

&lt;p&gt;Because the pattern only matters if it’s a standard, and standards win by being public, simple, and first. If the big vendors adopt this — portable, signed, user-held identity and memory, with the model demoted to an interchangeable engine — then users win, and the oldest twins with the deepest histories will still be the realest ones. If they don’t adopt it, it’s because being the center of gravity is their business model, and that tells you everything about why you’d want a twin in the first place.&lt;/p&gt;

&lt;p&gt;Models come and go. The twin stays.&lt;/p&gt;

&lt;p&gt;This is the AI you keep.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;The working spec lives in my public repos (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kody-w/rapp-static-apis&lt;/code&gt; — &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;my-twin.profile.md&lt;/code&gt;, composed on the frozen RAPP twin canon; reference twin at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kody-w/twin&lt;/code&gt;). This essay is published as prior art for the pattern described.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;All of it is live, not planned: &lt;a href=&quot;https://kody-w.github.io/twin/feed.xml&quot;&gt;the pulse broadcasting signed frames&lt;/a&gt; · &lt;a href=&quot;https://kody-w.github.io/twin/lookup.html&quot;&gt;the /twin lookup&lt;/a&gt; · &lt;a href=&quot;https://kody-w.github.io/twin/gallery/&quot;&gt;the bones gallery&lt;/a&gt; · &lt;a href=&quot;https://kody-w.github.io/rapp-static-apis/companion/?demo=1&quot;&gt;a twin-in-training you can try&lt;/a&gt; · &lt;a href=&quot;https://github.com/kody-w/rapp-static-apis/blob/main/my-twin.profile.md&quot;&gt;the spec&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;License: &lt;a href=&quot;https://creativecommons.org/licenses/by/4.0/&quot;&gt;CC BY 4.0&lt;/a&gt;. The pattern described is open for anyone to implement — see the &lt;a href=&quot;https://github.com/kody-w/rapp-static-apis/blob/main/PATENT-PLEDGE.md&quot;&gt;patent pledge&lt;/a&gt;. RAPP™.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Funded R&amp;D: A 90-Day Plan to Own Your Expertise</title>
    <link href="https://kody-w.github.io/2026/06/19/funded-rnd-90-day-plan/"/>
    <updated>2026-06-19T00:00:00+00:00</updated>
    <id>https://kody-w.github.io/2026/06/19/funded-rnd-90-day-plan</id>
    <content type="html">&lt;p&gt;Employment pays you once for your expertise, in exchange for time.&lt;/p&gt;

&lt;p&gt;Ownership pays you repeatedly, in exchange for structure.&lt;/p&gt;

&lt;p&gt;That’s the whole game. Everything below is just how you move from the first sentence to the second without quitting your job, betting your mortgage, or pretending to be an influencer.&lt;/p&gt;

&lt;h2 id=&quot;your-job-is-the-rd-budget&quot;&gt;Your job is the R&amp;amp;D budget&lt;/h2&gt;

&lt;p&gt;Every problem you solve at work, every system you fix, every messy thing you navigate — that’s research. You are being paid to build expertise.&lt;/p&gt;

&lt;p&gt;The mistake is thinking the expertise belongs to the job. It doesn’t. The job is funding it.&lt;/p&gt;

&lt;p&gt;So stop framing your job as the thing you need to escape. Frame it as funded R&amp;amp;D. The paycheck is not a distraction from building your own thing — it’s the insulation that lets you build it &lt;em&gt;well&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Most new businesses die of desperation: undercharging, rushed launches, wrong-fit clients, fast-cash decisions. A salary makes desperation a non-issue. You get to validate before you commit and build strategically instead of reactively. That is an unfair advantage, and being employed is the only time you have it.&lt;/p&gt;

&lt;p&gt;There is no need to rush to quit. There is a need to start building the asset now, while you don’t need it yet.&lt;/p&gt;

&lt;h2 id=&quot;signal-not-noise&quot;&gt;Signal, not noise&lt;/h2&gt;

&lt;p&gt;The reflex is to “get on all the platforms” and post daily. That’s noise — activity without leverage.&lt;/p&gt;

&lt;p&gt;Signal is one sentence: &lt;em&gt;this is the exact problem I solve, and this is what I’m the expert on.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Reach does not equal revenue. A broad audience of people who vaguely recognize you is worth less than a small audience of the right buyers — and the right buyers are usually already in your orbit. Specificity is the leverage. “Who I’m for, and who I’m not” is the whole strategy.&lt;/p&gt;

&lt;p&gt;Having a job &lt;em&gt;helps&lt;/em&gt; here. You don’t have time for noise, and that constraint forces precision.&lt;/p&gt;

&lt;h2 id=&quot;the-owned-audience-engine&quot;&gt;The Owned Audience Engine&lt;/h2&gt;

&lt;p&gt;Here’s the structure underneath all of it. Four pieces, in order:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Piece&lt;/th&gt;
      &lt;th&gt;What it is&lt;/th&gt;
      &lt;th&gt;Why it matters&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Content&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Discoverable, search-driven (YouTube, a blog, AI search)&lt;/td&gt;
      &lt;td&gt;The front door — found by people &lt;em&gt;already typing your problem&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;The bridge&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;A genuinely useful asset (PDF, guide, webinar)&lt;/td&gt;
      &lt;td&gt;Converts a viewer into someone you can reach again&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Owned audience&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;An email list you control&lt;/td&gt;
      &lt;td&gt;The actual asset — not rented from an algorithm&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Offer&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;A scalable program&lt;/td&gt;
      &lt;td&gt;Turns earned authority into income that isn’t tied to your hours&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The order is the point. &lt;strong&gt;Content is the front door; the owned audience is the house.&lt;/strong&gt; Most people pour years into the front door and never build the house — they assume followers will remember them and eventually buy. They won’t. People who saw you for five seconds in a feed do not remember you. An email list does.&lt;/p&gt;

&lt;p&gt;Intent-based platforms — YouTube, search, increasingly the AI assistants — are where this compounds, because people arrive already looking for a solution. You’re not pushing into a feed hoping to be seen. You’re a standing answer to a question people are actively asking. Every piece becomes a compounding asset instead of disposable activity.&lt;/p&gt;

&lt;h2 id=&quot;the-90-day-plan&quot;&gt;The 90-day plan&lt;/h2&gt;

&lt;p&gt;Don’t start by selling. Don’t even start by building. Start by listening.&lt;/p&gt;

&lt;h3 id=&quot;days-130--validate&quot;&gt;Days 1–30 — Validate&lt;/h3&gt;

&lt;p&gt;Talk to 10–20 people in your world: peers, people in your industry, people you could actually help. You are not selling. You are doing market research, which is the part everyone skips and the part that decides whether anything you build later survives.&lt;/p&gt;

&lt;p&gt;Listen for repeated questions, common themes, and the gaps between what they need to know and what they actually know. Ask:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;If you could solve this problem, what would change in your life / work?&lt;/li&gt;
  &lt;li&gt;Wave a magic wand — what does solved look like?&lt;/li&gt;
  &lt;li&gt;What have you tried? What do you wish existed?&lt;/li&gt;
  &lt;li&gt;What’s keeping you up at night about this?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’re not guessing at what the market needs. You’re being handed it.&lt;/p&gt;

&lt;p&gt;Choose your hard. Either spend a month listening, or spend a year building something in a vacuum and launch to crickets. Same effort, very different outcome.&lt;/p&gt;

&lt;h3 id=&quot;days-3160--outline-and-pre-sell&quot;&gt;Days 31–60 — Outline and pre-sell&lt;/h3&gt;

&lt;p&gt;Still not building. You’re writing an outline — it can live in a single Google Doc.&lt;/p&gt;

&lt;p&gt;Define two states: the &lt;strong&gt;zero state&lt;/strong&gt; (where your ideal client is when they’re most stuck) and the &lt;strong&gt;hero state&lt;/strong&gt; (the specific outcome they want). The narrower, the better. Then map the shortest path between them as a set of lessons and outcomes.&lt;/p&gt;

&lt;p&gt;People are not paying for your brain dump. We are all drowning in information. They are paying for the &lt;em&gt;efficiency of the transformation&lt;/em&gt; — getting from zero to hero without wading through everything you happen to know.&lt;/p&gt;

&lt;p&gt;Then pre-sell it. Call this the &lt;strong&gt;Profitable Offer Prototype&lt;/strong&gt; — the deliberately ugly, bare-bones version. You don’t build the whole thing first. You sell the outline, then build it live, week by week, as you deliver.&lt;/p&gt;

&lt;h3 id=&quot;days-6190--deliver-refine-systematize&quot;&gt;Days 61–90 — Deliver, refine, systematize&lt;/h3&gt;

&lt;p&gt;Deliver it live. Keep it simple: ~2 hours a week, one session, a call, a shared doc, a small private community.&lt;/p&gt;

&lt;p&gt;Refine every week. This is the step the “curse of the expert” makes people skip — assuming they already know the right order. You don’t. No matter how good you are at the work, you do not know how to &lt;em&gt;teach&lt;/em&gt; it until you teach it. People who build the whole program before working with real humans almost always build it in the wrong order.&lt;/p&gt;

&lt;p&gt;Once it’s tested and refined, productize it: turn the live version into a scalable, mostly pre-recorded program — curriculum they move through at their own pace, coaching done at scale, a community that keeps them accountable. The live cohort &lt;em&gt;was&lt;/em&gt; the R&amp;amp;D for the scalable version.&lt;/p&gt;

&lt;p&gt;And here’s the quiet payoff: every question, objection, and FAQ from those interviews and that first cohort becomes your &lt;strong&gt;content bank&lt;/strong&gt;. Those are your video topics. Discoverable content that answers the exact pains of your exact buyer — so leads arrive on repeat, and the algorithm, once it learns who you serve, starts doing the distribution for you.&lt;/p&gt;

&lt;h2 id=&quot;the-compounding-question&quot;&gt;The compounding question&lt;/h2&gt;

&lt;p&gt;This was never about quitting to live the glamorous entrepreneur life. It’s about control.&lt;/p&gt;

&lt;p&gt;AI is restructuring employment — some of it for the better, a lot of it not. Companies are optimizing for efficiency. You should be optimizing for leverage. When your expertise starts generating predictable revenue independent of your job, you have options, and options are the only real security.&lt;/p&gt;

&lt;p&gt;The honest version of the pitch is just this: even if you do nothing else with it, one video a week on your area of expertise — answering the real questions of the people you can help — compounds. In ten years you’ll have an owned audience and an email list you can turn to when you actually need it.&lt;/p&gt;

&lt;p&gt;So the only question worth answering is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ten years from now, will your expertise have compounded — or expired with your job?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Start the R&amp;amp;D while it’s funded.&lt;/p&gt;
</content>
  </entry>
  
</feed>
