<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Notes — Wisp</title>
  <subtitle>Write-ups of the traps hit while building Wisp, a desktop AI agent with a VRM body. Measurements and mistakes, not announcements.</subtitle>
  <link href="https://wisp-gules-mu.vercel.app/blog/feed.xml" rel="self"/>
  <link href="https://wisp-gules-mu.vercel.app/blog/"/>
  <id>https://wisp-gules-mu.vercel.app/blog/</id>
  <updated>2026-08-23T00:00:00Z</updated>
  <author><name>Renga</name></author>
  <entry>
    <title>The jitter wasn't in the interpolation. It was in the schedule.</title>
    <link href="https://wisp-gules-mu.vercel.app/blog/jitter-is-a-schedule-bug/"/>
    <id>https://wisp-gules-mu.vercel.app/blog/jitter-is-a-schedule-bug/</id>
    <updated>2026-08-23T00:00:00Z</updated>
    <summary>One symptom, three unrelated causes, and the order to check them in. Including a threshold-free test for telling a real kink from a smooth curve.</summary>
  </entry>
  <entry>
    <title>My VRM was rejected at upload and every viewer I own said it was fine</title>
    <link href="https://wisp-gules-mu.vercel.app/blog/accessor-bounds-drift/"/>
    <id>https://wisp-gules-mu.vercel.app/blog/accessor-bounds-drift/</id>
    <updated>2026-08-22T00:00:00Z</updated>
    <summary>The mesh data was correct. The declaration about the mesh data was wrong — and rendering never reads the declaration, so nothing local could see it.</summary>
  </entry>
  <entry>
    <title>I set the font to the largest size and found the same bug eleven times</title>
    <link href="https://wisp-gules-mu.vercel.app/blog/xxxl-broke-japanese-worse/"/>
    <id>https://wisp-gules-mu.vercel.app/blog/xxxl-broke-japanese-worse/</id>
    <updated>2026-08-16T00:00:00Z</updated>
    <summary>Reading the code found none of them. Screenshots found all eleven — and Japanese broke worse than English, because Japanese can wrap anywhere.</summary>
  </entry>
  <entry>
    <title>My dev environment was hiding eight production bugs</title>
    <link href="https://wisp-gules-mu.vercel.app/blog/dev-env-hid-eight-bugs/"/>
    <id>https://wisp-gules-mu.vercel.app/blog/dev-env-hid-eight-bugs/</id>
    <updated>2026-08-15T00:00:00Z</updated>
    <summary>Every convenience in my development setup was concealing a defect on the other side of it. Counting the conveniences found the bugs faster than looking for the bugs.</summary>
  </entry>
  <entry>
    <title>My evidence pipeline was saving Cloudflare block pages as evidence</title>
    <link href="https://wisp-gules-mu.vercel.app/blog/block-pages-as-evidence/"/>
    <id>https://wisp-gules-mu.vercel.app/blog/block-pages-as-evidence/</id>
    <updated>2026-08-15T00:00:00Z</updated>
    <summary>A third-party wrapper died, and the failure came back as a plausible-looking image with an HTTP 200 attached. What broke, and what I changed.</summary>
  </entry>
  <entry>
    <title>I redacted my username from a screen recording three times and missed it every time</title>
    <link href="https://wisp-gules-mu.vercel.app/blog/mask-screen-recording/"/>
    <id>https://wisp-gules-mu.vercel.app/blog/mask-screen-recording/</id>
    <updated>2026-08-14T00:00:00Z</updated>
    <summary>Fixed rectangles cannot hide a dialog that animates in. I tracked the text with an FFT correlation, missed it twice more, and finally scanned the finished file with a machine — which found one more frame nobody was looking at.</summary>
  </entry>
  <entry>
    <title>My approval dialog grew until the buttons went off screen</title>
    <link href="https://wisp-gules-mu.vercel.app/blog/approval-dialog/"/>
    <id>https://wisp-gules-mu.vercel.app/blog/approval-dialog/</id>
    <updated>2026-08-14T00:00:00Z</updated>
    <summary>Showing the user everything the agent is about to do, and letting them actually choose, are two different properties. I only had the first one, and it took a demo recording to find out.</summary>
  </entry>
  <entry>
    <title>Where to split a sentence for streaming TTS is decided by one number</title>
    <link href="https://wisp-gules-mu.vercel.app/blog/streaming-tts-split-point/"/>
    <id>https://wisp-gules-mu.vercel.app/blog/streaming-tts-split-point/</id>
    <updated>2026-08-11T00:00:00Z</updated>
    <summary>The split point for streaming text-to-speech follows from the real-time factor. I measured that factor on a machine with a full disk, got it 4x wrong, and shipped a constant that was never going to fail loudly enough to notice.</summary>
  </entry>
</feed>
