Blog

Mostly post-mortems. When something takes me far longer than it should have, the reason is usually more interesting than the fix, and writing it down is how I make sure I actually learned it.

  1. 6 September 2026/2 min read

    The rename that stopped at the filenames

    A commit renamed hermes-workspace to hephastion across 51 files and said the docs and identifiers were updated to match. The diff was zero insertions, zero deletions. Everything had moved, nothing had changed.

    • hephastion
    • git
    • debugging
    Read it
  2. 4 September 2026/3 min read

    The engine swap that won on memory and lost on two functions

    I evaluated swapping Mana's browser-automation plugin from Playwright+Chromium to the lighter Obscura engine. The memory numbers were real, 15x lower RSS, but the existing test suite couldn't have told me that, and the engine itself failed on the two functions the plugin depends on most.

    • mana
    • debugging
    • machine-learning
    Read it
  3. 3 September 2026/2 min read

    The SSRF check that CodeQL refused to recognize

    A correct hostname guard in Mana's plugin store kept failing CodeQL's SSRF scan through three rewrites, because the scanner was matching comparison shape, not logic. A path-traversal check in the same file needed the identical fix.

    • mana
    • security
    • debugging
    Read it
  4. 25 August 2026/2 min read

    The static launcher that couldn't fit a pointer

    Mana's fish-speech TTS server ran under WSL2 because torch.compile was supposedly unsupported on native Windows. It wasn't unsupported, it was two specific bugs, and fixing them left native Windows faster than the VM it replaced.

    • mana
    • debugging
    • machine-learning
    Read it
  5. 24 August 2026/2 min read

    The throttle that forgot the window could hide

    windows-launcher's main window disables Chromium's background throttling so the avatar stays smooth while unfocused. That flag never turned back on when the window was genuinely hidden, which it is by default on every startup.

    • mana
    • debugging
    • performance
    Read it
  6. 23 August 2026/3 min read

    The scratch copy that only checked the top level

    Mana's coding-agent test runner used to execute against the live workspace, so I moved it to a temp scratch copy. My first version of the node_modules junction only checked the workspace root, which would have silently broken every real test run against this exact repo.

    • mana
    • debugging
    Read it
  7. 21 August 2026/12 min read

    The momentum score that never grew a second signal

    Hecate's growth windows filled right on schedule a week after launch. The raw momentum score built on top of them still ties five unrelated repositories at a cap, and the fix for that lives in a dashboard query, not in the underlying data.

    • hecate
    • data-engineering
    • sql
    Read it
  8. 21 August 2026/3 min read

    The quantization that won on exactly one bug

    I calibrated a custom quantization of Mana's coding model on real project code instead of generic text. Checked it honestly against the plain community quant across six prompts, two ties, one loss, two minor edges, and exactly one real correctness win.

    • mana
    • quantization
    • llm
    Read it
  9. 21 August 2026/3 min read

    The vision model that didn't need to exist

    I'd just spent VRAM swapping Mana's vision model to a smaller one to free headroom. A same-day benchmark run, done for an unrelated reason, showed the chat model already beat both vision candidates outright, so I deleted the second model instead of picking a winner.

    • mana
    • llm
    • benchmarking
    Read it
  10. 20 August 2026/2 min read

    The conversion function that existed twice

    Argos already had a correct UTF-8-to-UTF-16 helper. It was invisible to the one place that needed it, so that place quietly reinvented a broken one, and consolidating the two surfaced a second bug for free.

    • argos
    • cpp
    • debugging
    Read it
  11. 20 August 2026/2 min read

    The promise that only listened for two events

    Interrupting a reply, barge-in, the hotkey, a fresh reply arriving, never fired either event a playback promise was waiting on. Every interruption hung Mana's whole listen loop until the promise learned about a third one.

    • mana
    • debugging
    • javascript
    Read it
  12. 20 August 2026/2 min read

    The reply text that arrived after it was already spoken

    Mana's chat log used to wait for every queued sentence of audio to finish playing before showing a reply's text, so a long reply spoke for a while before its own transcript caught up. The fix had to land twice.

    • mana
    • debugging
    Read it
  13. 20 August 2026/2 min read

    The sandbox guard that forgot about drive letters

    Mana's file tools are supposed to stay inside the repo. On Windows, one path.relative() edge case let them read or write anywhere on disk instead.

    • mana
    • security
    • debugging
    Read it
  14. 18 August 2026/2 min read

    Sales are not a time series until you make them one

    Mana's market tools could already tell you what something is worth right now. Teaching it to forecast meant turning a scatter of irregular sale events into something a model could actually read.

    • mana
    • forecasting
    • data-engineering
    Read it
  15. 18 August 2026/2 min read

    The dtype that was not there

    I burned hours fixing hyperparameters that were never the problem, because the actual bug was a dtype the training config never controlled in the first place.

    • debugging
    • pytorch
    • veritarach
    Read it
  16. 18 August 2026/2 min read

    The README that promised more than it shipped

    Fixing one broken install link in db-artisan's README turned up a second, bigger problem. The docs described five skills. Only one of them actually exists.

    • db-artisan
    • documentation
    Read it
  17. 18 August 2026/2 min read

    The touch targets an audit could not see

    An automated mobile audit found fourteen controls too small to tap. It also missed three more, because an audit can only see the state it happens to load in.

    • euphonia
    • accessibility
    • mobile
    Read it
  18. 17 August 2026/2 min read

    The forecast gate I almost got wrong

    I guessed a rule for when Hecate's forecasts were trustworthy enough to show. The guess was wrong. Testing it against real data gave me a better one, and testing didn't stop once the feature shipped.

    • forecasting
    • hecate
    • data-engineering
    Read it
  19. 15 August 2026/2 min read

    The checkpoint that was quietly guessing

    The deployed classifier looked fine until I loaded the checkpoint directly and asked it about the first line of Pride and Prejudice. It barely had an opinion.

    • debugging
    • pytorch
    • veritarach
    Read it